DeliveryOrder: stock roundtrip
[kivitendo-erp.git] / SL / Controller / DeliveryOrder.pm
index 61e614e..33b35bb 100644 (file)
@@ -911,7 +911,7 @@ sub action_stock_in_out_dialog {
     do_unit    => $unit,
     delivered  => $self->order->delivered,
     row        => $row,
-    itme_id    => $item_id,
+    item_id    => $item_id,
   );
 }
 
@@ -1272,6 +1272,8 @@ sub load_order {
   # You need a custom shipto object to call cvars_by_config to get the cvars.
   $self->order->custom_shipto(SL::DB::Shipto->new(module => 'OE', custom_variables => [])) if !$self->order->custom_shipto;
 
+  $self->prepare_stock_info($_) for $self->order->items;
+
   return $self->order;
 }
 
@@ -1321,6 +1323,9 @@ sub make_order {
     push @items, $item;
     $pos++;
   }
+
+  $self->prepare_stock_info($_) for $order->items, @items;
+
   $order->add_items(grep {!$_->id} @items);
 
   return $order;
@@ -1343,6 +1348,26 @@ sub make_item {
   # saved. Adding empty custom_variables to new orderitem here solves this problem.
   $item ||= SL::DB::DeliveryOrderItem->new(custom_variables => []);
 
+  # handle stock info
+  if (my $stock_info = delete $attr->{stock_info}) {
+    my %existing = map { $_->id => $_ } $item->delivery_order_stock_entries;
+    my @save;
+
+    for my $line (@{ DO->unpack_stock_information(packed => $stock_info) }) {
+      # lookup existing or make new
+      my $obj = delete $existing{$line->{delivery_order_items_stock_id}}
+             // SL::DB::DeliveryOrderItemsStock->new;
+
+      # assign attributes
+      $obj->$_($line->{$_}) for qw(bin_id warehouse_id chargenumber qty unit);
+      $obj->bestbefore_as_date($line->{bestfbefore})
+        if $line->{bestbefore} && $::instance_conf->get_show_bestbefore;
+      push @save, $obj;
+    }
+
+    $item->delivery_order_stock_entries(@save);
+  }
+
   $item->assign_attributes(%$attr);
 
   if ($is_new) {
@@ -1428,6 +1453,21 @@ sub new_item {
   return $item;
 }
 
+sub prepare_stock_info {
+  my ($self, $item) = @_;
+
+  $item->{stock_info} = SL::YAML::Dump([
+    map +{
+      delivery_order_items_stock_id => $_->id,
+      qty                           => $_->qty,
+      warehouse_id                  => $_->warehouse_id,
+      bin_id                        => $_->bin_id,
+      chargenumber                  => $_->chargenumber,
+      unit                          => $_->unit,
+    }, $item->delivery_order_stock_entries
+  ]);
+}
+
 sub setup_order_from_cv {
   my ($order) = @_;