]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/DeliveryOrder.pm
CsvImport: Anpassungen für order_type in Lieferscheinen
[mfinanz.git] / SL / Controller / DeliveryOrder.pm
index 80a215566a9f15f77fd7211d84b4b3106ff1366f..33b35bbabb8ba7b48ece5f759dd7168d1cd54420 100644 (file)
@@ -53,7 +53,8 @@ use Rose::Object::MakeMethods::Generic
 
 
 # safety
-__PACKAGE__->run_before('check_auth');
+__PACKAGE__->run_before('check_auth',
+                        except => [ qw(pack_stock_information) ]);
 
 __PACKAGE__->run_before('get_unalterable_data',
                         only => [ qw(save save_as_new save_and_delivery_order save_and_invoice save_and_ap_transaction
@@ -889,10 +890,12 @@ sub action_return_from_create_part {
 sub action_stock_in_out_dialog {
   my ($self) = @_;
 
-  my $part = SL::DB::Part->load_cached($::form->{parts_id}) or die "need parts_id";
-  my $stock = $::form->{stock};
-  my $unit = $::form->{unit};
-  my $qty = _parse_number($::form->{qty_as_number});
+  my $part    = SL::DB::Part->load_cached($::form->{parts_id}) or die "need parts_id";
+  my $stock   = $::form->{stock};
+  my $unit    = $::form->{unit};
+  my $row     = $::form->{row};
+  my $item_id = $::form->{item_id};
+  my $qty     = _parse_number($::form->{qty_as_number});
 
   my $inout = $self->type_data->transfer;
 
@@ -903,11 +906,25 @@ sub action_stock_in_out_dialog {
 
   $self->render("delivery_order/stock_dialog", { layout => 0 },
     WHCONTENTS => $self->order->delivered ? $stock_info : \@contents,
-    part  => $part,
-    do_qty => $qty,
-    do_unit => $unit,
+    part       => $part,
+    do_qty     => $qty,
+    do_unit    => $unit,
+    delivered  => $self->order->delivered,
+    row        => $row,
+    item_id    => $item_id,
   );
+}
+
+# we're using the old YAML based stock packing, but don't want to do this in
+# the frontend so we're doing a tiny roundtrip to the backend, back the info in
+# perl, serve it back to the frontend and store it in the DOM there
+sub action_pack_stock_information {
+  my ($self) = @_;
+
+  my $stock_info = $::form->{stock_info};
+  my $yaml = SL::YAML::Dump($stock_info);
 
+  $self->render(\$yaml, { layout => 0, process => 0 });
 }
 
 sub merge_stock_data {
@@ -1255,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;
 }
 
@@ -1304,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;
@@ -1326,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) {
@@ -1411,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) = @_;