]> wagnertech.de Git - mfinanz.git/blob - SL/DB/DeliveryOrderItem.pm
restart apache2 in postinst
[mfinanz.git] / SL / DB / DeliveryOrderItem.pm
1 package SL::DB::DeliveryOrderItem;
2
3 use strict;
4
5 use Carp;
6
7 use Rose::DB::Object::Helpers qw(as_tree strip);
8
9 use SL::DB::MetaSetup::DeliveryOrderItem;
10 use SL::DB::Manager::DeliveryOrderItem;
11 use SL::DB::Helper::ActsAsList;
12 use SL::DB::Helper::LinkedRecords;
13 use SL::DB::Helper::RecordLink qw(RECORD_ITEM_ID RECORD_ITEM_TYPE_REF);
14 use SL::DB::Helper::RecordItem;
15 use SL::DB::Helper::CustomVariables (
16   sub_module  => 'delivery_order_items',
17   cvars_alias => 1,
18   overloads   => {
19     parts_id => {
20       class => 'SL::DB::Part',
21       module => 'IC',
22     }
23   },
24 );
25
26 __PACKAGE__->meta->add_relationship(
27   delivery_order_stock_entries => {
28     type         => 'one to many',
29     class        => 'SL::DB::DeliveryOrderItemsStock',
30     column_map   => { id => 'delivery_order_item_id' },
31     manager_args => {
32       with_objects => [ 'inventory' ]
33     },
34   },
35 );
36
37 __PACKAGE__->meta->initialize;
38
39 __PACKAGE__->configure_acts_as_list(group_by => [qw(delivery_order_id)]);
40
41 # methods
42
43 sub new_from {
44   my ($class, $source, %params) = @_;
45
46   my %allowed_sources = map { $_ => 1 } qw(
47       SL::DB::ReclamationItem
48       SL::DB::OrderItem
49       SL::DB::DeliveryOrderItem
50   );
51   unless( $allowed_sources{ref $source} ) {
52     croak("Unsupported source object type '" . ref($source) . "'");
53   }
54
55   my @custom_variables = map { _clone_cvar_for_delivery_order_item($_) } @{ $source->custom_variables };
56
57   my %item_args;
58   if (ref($source) eq 'SL::DB::ReclamationItem') {
59     map { $item_args{$_} = $source->$_ } # {{{ for vim folds
60     qw(
61       active_discount_source
62       active_price_source
63       base_qty
64       description
65       discount
66       lastcost
67       longdescription
68       parts_id
69       position
70       price_factor
71       price_factor_id
72       pricegroup_id
73       project_id
74       qty
75       reqdate
76       sellprice
77       serialnumber
78       unit
79     );
80     $item_args{custom_variables} = \@custom_variables;
81     # }}} for vim folds
82   } elsif (ref($source) eq 'SL::DB::OrderItem') {
83     map { $item_args{$_} = $source->$_ } # {{{ for vim folds
84     qw(
85       active_discount_source
86       active_price_source
87       base_qty
88       cusordnumber
89       description
90       discount
91       lastcost
92       longdescription
93       marge_price_factor
94       parts_id
95       position
96       price_factor
97       price_factor_id
98       project_id
99       qty
100       reqdate
101       sellprice
102       serialnumber
103       transdate
104       unit
105     );
106     $item_args{custom_variables} = \@custom_variables;
107     $item_args{ordnumber}        = ref($source->record) eq 'SL::DB::Order' ? $source->record->ordnumber : $source->ordnumber;
108     # }}} for vim folds
109   } elsif (ref($source) eq 'SL::DB::DeliveryOrderItem') {
110     map { $item_args{$_} = $source->$_ } # {{{ for vim folds
111     qw(
112       active_discount_source
113       active_price_source
114       base_qty
115       cusordnumber
116       description
117       discount
118       lastcost
119       longdescription
120       marge_price_factor
121       parts_id
122       position
123       price_factor
124       price_factor_id
125       project_id
126       qty
127       reqdate
128       sellprice
129       serialnumber
130       transdate
131       unit
132     );
133     $item_args{custom_variables} = \@custom_variables;
134     # }}} for vim folds
135   }
136
137   my $item = $class->new(%item_args);
138
139   unless ($params{no_linked_records}) {
140     $item->{ RECORD_ITEM_ID() } = $source->id;
141     $item->{ RECORD_ITEM_TYPE_REF() } = ref $source;
142   }
143
144   return $item;
145 }
146
147 sub _clone_cvar_for_delivery_order_item {
148   my ($cvar) = @_;
149
150   my $cloned = $_->clone_and_reset;
151   $cloned->sub_module('delivery_order_items');
152
153   return $cloned;
154 }
155
156 sub record { goto &delivery_order }
157 sub record_id { goto &delivery_order_id }
158
159 sub displayable_delivery_order_info {
160   my ($self, $dec) = @_;
161
162   $dec //= 2;
163
164   $self->delivery_order->presenter->sales_delivery_order(display => 'inline')
165          . " " . $::form->format_amount(\%::myconfig, $self->qty, $dec) . " " . $self->unit
166          . " (" . $self->delivery_order->transdate->to_kivitendo . ")";
167 };
168
169 sub effective_project {
170   my ($self) = @_;
171
172   $self->project // $self->delivery_order->globalproject;
173 }
174
175 __END__
176
177 =pod
178
179 =encoding utf-8
180
181 =head1 NAME
182
183 SL::DB::DeliveryOrderItem Model for the 'delivery_order_items' table
184
185 =head1 SYNOPSIS
186
187 This is a standard Rose::DB::Object based model and can be used as one.
188
189 =head1 METHODS
190
191 =over 4
192
193 =item C<displayable_delivery_order_info DEC>
194
195 Returns a string with information about the delivery order item in relation to
196 its delivery order, specifically
197
198 * the (HTML-linked) delivery order number
199
200 * the qty and unit of the part in the delivery order
201
202 * the date of the delivery order
203
204 Doesn't include any part information, it is assumed that is already shown elsewhere.
205
206 The method takes an optional argument "dec" which determines how many decimals to
207 round to, as used by format_amount.
208
209   SL::DB::Manager::DeliveryOrderItem->get_first->displayable_delivery_order_info(0);
210   # 201601234 5 Stck (12.12.2016)
211
212 =back
213
214 =head1 AUTHORS
215
216 G. Richardson E<lt>grichardson@kivitendo-premium.deE<gt>
217
218 =cut
219
220 1;