Projekt

Allgemein

Profil

Herunterladen (4,89 KB) Statistiken
| Zweig: | Markierung: | Revision:
package SL::DB::DeliveryOrderItem;

use strict;

use Carp;

use Rose::DB::Object::Helpers qw(as_tree strip);

use SL::DB::MetaSetup::DeliveryOrderItem;
use SL::DB::Manager::DeliveryOrderItem;
use SL::DB::Helper::ActsAsList;
use SL::DB::Helper::LinkedRecords;
use SL::DB::Helper::RecordLink qw(RECORD_ITEM_ID RECORD_ITEM_TYPE_REF);
use SL::DB::Helper::RecordItem;
use SL::DB::Helper::CustomVariables (
sub_module => 'delivery_order_items',
cvars_alias => 1,
overloads => {
parts_id => {
class => 'SL::DB::Part',
module => 'IC',
}
},
);

__PACKAGE__->meta->add_relationship(
delivery_order_stock_entries => {
type => 'one to many',
class => 'SL::DB::DeliveryOrderItemsStock',
column_map => { id => 'delivery_order_item_id' },
manager_args => {
with_objects => [ 'inventory' ]
},
},
);

__PACKAGE__->meta->initialize;

__PACKAGE__->configure_acts_as_list(group_by => [qw(delivery_order_id)]);

# methods

sub new_from {
my ($class, $source, %params) = @_;

my %allowed_sources = map { $_ => 1 } qw(
SL::DB::ReclamationItem
SL::DB::OrderItem
SL::DB::DeliveryOrderItem
);
unless( $allowed_sources{ref $source} ) {
croak("Unsupported source object type '" . ref($source) . "'");
}

my @custom_variables = map { _clone_cvar_for_delivery_order_item($_) } @{ $source->custom_variables };

my %item_args;
if (ref($source) eq 'SL::DB::ReclamationItem') {
map { $item_args{$_} = $source->$_ } # {{{ for vim folds
qw(
active_discount_source
active_price_source
base_qty
description
discount
lastcost
longdescription
parts_id
position
price_factor
price_factor_id
pricegroup_id
project_id
qty
reqdate
sellprice
serialnumber
unit
);
$item_args{custom_variables} = \@custom_variables;
# }}} for vim folds
} elsif (ref($source) eq 'SL::DB::OrderItem') {
map { $item_args{$_} = $source->$_ } # {{{ for vim folds
qw(
active_discount_source
active_price_source
base_qty
cusordnumber
description
discount
lastcost
longdescription
marge_price_factor
parts_id
position
price_factor
price_factor_id
project_id
qty
reqdate
sellprice
serialnumber
transdate
unit
);
$item_args{custom_variables} = \@custom_variables;
$item_args{ordnumber} = ref($source->record) eq 'SL::DB::Order' ? $source->record->ordnumber : $source->ordnumber;
# }}} for vim folds
} elsif (ref($source) eq 'SL::DB::DeliveryOrderItem') {
map { $item_args{$_} = $source->$_ } # {{{ for vim folds
qw(
active_discount_source
active_price_source
base_qty
cusordnumber
description
discount
lastcost
longdescription
marge_price_factor
parts_id
position
price_factor
price_factor_id
project_id
qty
reqdate
sellprice
serialnumber
transdate
unit
);
$item_args{custom_variables} = \@custom_variables;
# }}} for vim folds
}

my $item = $class->new(%item_args);

unless ($params{no_linked_records}) {
$item->{ RECORD_ITEM_ID() } = $source->id;
$item->{ RECORD_ITEM_TYPE_REF() } = ref $source;
}

return $item;
}

sub _clone_cvar_for_delivery_order_item {
my ($cvar) = @_;

my $cloned = $_->clone_and_reset;
$cloned->sub_module('delivery_order_items');

return $cloned;
}

sub record { goto &delivery_order }
sub record_id { goto &delivery_order_id }

sub displayable_delivery_order_info {
my ($self, $dec) = @_;

$dec //= 2;

$self->delivery_order->presenter->sales_delivery_order(display => 'inline')
. " " . $::form->format_amount(\%::myconfig, $self->qty, $dec) . " " . $self->unit
. " (" . $self->delivery_order->transdate->to_kivitendo . ")";
};

sub effective_project {
my ($self) = @_;

$self->project // $self->delivery_order->globalproject;
}

__END__

=pod

=encoding utf-8

=head1 NAME

SL::DB::DeliveryOrderItem Model for the 'delivery_order_items' table

=head1 SYNOPSIS

This is a standard Rose::DB::Object based model and can be used as one.

=head1 METHODS

=over 4

=item C<displayable_delivery_order_info DEC>

Returns a string with information about the delivery order item in relation to
its delivery order, specifically

* the (HTML-linked) delivery order number

* the qty and unit of the part in the delivery order

* the date of the delivery order

Doesn't include any part information, it is assumed that is already shown elsewhere.

The method takes an optional argument "dec" which determines how many decimals to
round to, as used by format_amount.

SL::DB::Manager::DeliveryOrderItem->get_first->displayable_delivery_order_info(0);
# 201601234 5 Stck (12.12.2016)

=back

=head1 AUTHORS

G. Richardson E<lt>grichardson@kivitendo-premium.deE<gt>

=cut

1;
(47-47/158)