1 package SL::DB::OrderItem;
5 use List::Util qw(sum);
7 use SL::DB::MetaSetup::OrderItem;
8 use SL::DB::Manager::OrderItem;
9 use SL::DB::DeliveryOrderItemsStock;
10 use SL::DB::Helper::ActsAsList;
11 use SL::DB::Helper::LinkedRecords;
12 use SL::DB::Helper::RecordItem;
13 use SL::DB::Helper::CustomVariables (
14 sub_module => 'orderitems',
18 class => 'SL::DB::Part',
24 __PACKAGE__->meta->initialize;
26 __PACKAGE__->configure_acts_as_list(group_by => [qw(trans_id)]);
28 sub is_price_update_available {
30 return $self->origprice > $self->part->sellprice;
36 my $d_orders = $self->order->linked_records(direction => 'to', to => 'SL::DB::DeliveryOrder');
37 my @doi = grep { $_->parts_id == $self->parts_id } map { $_->orderitems } @$d_orders;
40 return sum(map { AM->convert_unit($_->unit => $self->unit) * $_->qty } @doi);
43 sub linked_delivery_order_items {
46 return $self->linked_records(direction => 'to', to => 'SL::DB::DeliveryOrderItem');
50 # checks for delivery_order_stock_id entries, which have been converted to inventory entries
51 # uses several rose relationships
52 # doesn't differentiate between sales and orders
55 my $delivered_qty = 0;
56 foreach my $doi ( @{$self->linked_delivery_order_items} ) {
57 next unless scalar @{$doi->delivery_order_stock_entries};
58 $delivered_qty += sum map { $_->inventory ? $_->qty : 0 } @{$doi->delivery_order_stock_entries};
60 return $delivered_qty;
63 sub delivered_qty_sql {
64 # checks for delivery_order_stock_id entries, which have been converted to inventory entries
68 SELECT (sum(i.qty) * CASE WHEN oe.customer_id IS NULL THEN 1 ELSE -1 END) AS delivered
70 INNER JOIN record_links rl ON ( oi.id = rl.FROM_id
71 and rl.FROM_table = 'orderitems'
72 and rl.to_table::text = 'delivery_order_items'::text
74 INNER JOIN delivery_order_items doi ON (doi.id =rl.to_id)
75 INNER JOIN delivery_order_items_stock dois ON (dois.delivery_order_item_id = doi.id)
76 INNER JOIN inventory i ON (dois.id = i.delivery_order_items_stock_id)
77 INNER JOIN oe ON (oe.id = oi.trans_id)
81 my ($delivered_qty) = selectfirst_array_query($::form, $self->db->dbh, $query, $self->id);
83 return $delivered_qty;
86 sub delivered_qty_sql_multi {
87 # checks for delivery_order_stock_id entries, which have been converted to inventory entries
91 SELECT sum(dois.qty) from delivery_order_items_stock dois
92 LEFT OUTER JOIN inventory i ON (dois.id = i.delivery_order_items_stock_id)
94 dois.delivery_order_item_id in (
102 from_table = 'orderitems' AND
103 to_table = 'delivery_order_items'
107 my ($delivered_qty) = selectfirst_array_query($::form, $self->db->dbh, $query, $self->id);
109 return $delivered_qty;
112 sub record { goto &order }
122 SL::DB::OrderItems: Rose model for orderitems
132 returns the number of orderitems which are already linked to Delivery Orders.
133 The linked key is parts_id and not orderitems (id) -> delivery_order_items (id).
134 Therefore this function is not safe for identical parts_id.
136 C<$::form-E<gt>format_amount(\%::myconfig, $_[0]-E<gt>shipped_qty);>
138 =item C<delivered_qty>
140 Returns the amount of this orderitem that has been delivered, meaning it
141 appears in a delivery order AND has been transferred. The delivery order items
142 are found by direct record_links from orderitems to delivery order items.
143 Delivery order items that were added manually and not via the record workflow
144 will therefore not be calculated correctly.
146 Orders that were created before the individual items were linked (this feature
147 was added in kivitendo 3.2.0) will therefore return incorrect results.
149 =item C<delivered_qty_sql>
151 Does the same as delivered_qty, but via sql.
155 =item C<delivered_qty_sql>
157 Returns the amount of the orderitem that has actually been shipped, not just where delivery_order_items exist (how delivered_qty works).
159 Doesn't deal with different units yet.
165 Older versions of OrderItem.pm had more functions which where used for calculating the
166 qty for the different states of the Delivery Order.
167 For example to get the qty in already marked as delivered Delivery Orders:
171 return $self-E<gt>_delivered_qty;
175 my @d_orders_delivered = grep { $_-E<gt>delivered } @$d_orders;
176 my @doi_delivered = grep { $_-E<gt>parts_id == $self-E<gt>parts_id } map { $_-E<gt>orderitems } @d_orders_delivered;
179 In general the function C<shipped_qty> and all (project) related functions should be marked deprecate,
180 because of the better linked item to item data in the record_links table.
184 G. Richardson E<lt>grichardson@kivitendo-premium.deE<gt>