X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/kivitendo-erp.git/blobdiff_plain/9f4ef62c42dceef5a27ad3a0d8c8d260ffef9848..d32410ac096b:/SL/Controller/CsvImport/DeliveryOrder.pm diff --git a/SL/Controller/CsvImport/DeliveryOrder.pm b/SL/Controller/CsvImport/DeliveryOrder.pm index 62ecb11fe..b93455a4e 100644 --- a/SL/Controller/CsvImport/DeliveryOrder.pm +++ b/SL/Controller/CsvImport/DeliveryOrder.pm @@ -21,6 +21,7 @@ use SL::DB::Unit; use SL::DB::Inventory; use SL::DB::TransferType; use SL::DBUtils; +use SL::Helper::ShippedQty; use SL::PriceSource; use SL::TransNumber; use SL::Util qw(trim); @@ -710,6 +711,10 @@ sub handle_order_sources { push @{ $entry->{errors} }, $::locale->text('Error: More than one source order found'); } + foreach my $order (@$orders) { + $self->{remaining_source_qtys_by_item_id} = { map { $_->id => $_->qty } @{ $order->items } }; + } + $record->{source_orders} = $orders; } @@ -721,9 +726,38 @@ sub handle_item_source { return if !@{ $record->{source_orders} }; + # Todo: units? + foreach my $order (@{ $record->{source_orders} }) { - $item->{source_item} = first { $item->parts_id == $_->parts_id && $item->qty == $_->qty} @{ $order->items_sorted }; - last if $item->{source_item}; + # First: Excact matches and source order position is still complete. + $item->{source_item} = first { + $item->parts_id == $_->parts_id + && $item->qty == $_->qty + && $self->{remaining_source_qtys_by_item_id}->{$_->id} == $_->qty + } @{ $order->items_sorted }; + if ($item->{source_item}) { + $self->{remaining_source_qtys_by_item_id}->{$item->{source_item}->id} -= $item->qty; + last; + } + + # Second: Smallest remaining order qty greater or equal delivery order qty. + $item->{source_item} = first { + $item->parts_id == $_->parts_id + && $self->{remaining_source_qtys_by_item_id}->{$_->id} >= $item->qty + } sort { $self->{remaining_source_qtys_by_item_id}->{$a->id} <=> $self->{remaining_source_qtys_by_item_id}->{$b->id} } @{ $order->items_sorted }; + if ($item->{source_item}) { + $self->{remaining_source_qtys_by_item_id}->{$item->{source_item}->id} -= $item->qty; + last; + } + + # Last: Overdelivery? + # $item->{source_item} = first { + # $item->parts_id == $_->parts_id + # } @{ $order->items_sorted }; + # if ($item->{source_item}) { + # $self->{remaining_source_qtys_by_item_id}->{$item->{source_item}->id} -= $item->qty; + # last; + # } } } @@ -1112,18 +1146,8 @@ sub save_additions { # delivery order for all positions created? if (scalar(@$orders)) { - foreach my $order (@{ $orders }) { - my $all_deliverd; - foreach my $orderitem (@{ $order->items }) { - my $delivered_qty = 0; - foreach my $do_item (@{$orderitem->linked_records(to => 'DeliveryOrderItem')}) { - $delivered_qty += $do_item->unit_obj->convert_to($do_item->qty, $orderitem->unit_obj); - } - $all_deliverd = $orderitem->qty <= $delivered_qty; - last if !$all_deliverd; - } - $order->update_attributes(delivered => !!$all_deliverd); - } + SL::Helper::ShippedQty->new->calculate($orders)->write_to_objects; + $_->update_attributes(delivered => $_->delivered) for @{ $orders }; } # inventory (or use WH->transfer?)