Feature: Auslagern über Rechnung inkl. Seriennummer Lagermenge berücksichtigen
authorJan Büren <jan@kivitendo.de>
Fri, 28 Aug 2020 15:20:38 +0000 (17:20 +0200)
committerJan Büren <jan@kivitendo.de>
Fri, 28 Aug 2020 15:20:38 +0000 (17:20 +0200)
SL/IS.pm
SL/WH.pm
locale/de/all

index c743f3b..a99b43f 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -1462,7 +1462,7 @@ sub transfer_out {
   foreach my $i (1 .. $form->{rowcount}) {
     next if !$form->{"id_$i"};
 
-    my ($err, $wh_id, $bin_id, $chargenumber);
+    my ($err, $qty, $wh_id, $bin_id, $chargenumber);
 
     if ($::instance_conf->get_sales_serial_eq_charge) {
       next unless $form->{"serialnumber_$i"};
@@ -1472,8 +1472,11 @@ sub transfer_out {
         last;
       }
       foreach my $serial (@serials) {
-        ($wh_id, $bin_id, $chargenumber) = WH->get_wh_and_bin_for_charge(chargenumber => $serial);
-
+        ($qty, $wh_id, $bin_id, $chargenumber) = WH->get_wh_and_bin_for_charge(chargenumber => $serial);
+        if (!$qty) {
+          push @errors, $::locale->text("Not enough in stock for the serial number #1", $serial);
+          last;
+        }
         push @transfers, {
             'parts_id'         => $form->{"id_$i"},
             'qty'              => 1,
index 979d4de..158b216 100644 (file)
--- a/SL/WH.pm
+++ b/SL/WH.pm
@@ -1135,15 +1135,25 @@ sub get_wh_and_bin_for_charge {
 
   my $self     = shift;
   my %params   = @_;
+  my %bin_qty;
 
   croak t8('Need charge number!') unless $params{chargenumber};
 
-  my $inv_item= SL::DB::Manager::Inventory->get_first(where => [chargenumber => $params{chargenumber} ]);
+  my $inv_items = SL::DB::Manager::Inventory->get_all(where => [chargenumber => $params{chargenumber} ]);
 
-  croak t8("Invalid charge number: #1", $params{chargenumber}) unless (ref $inv_item eq 'SL::DB::Inventory');
+  croak t8("Invalid charge number: #1", $params{chargenumber}) unless (ref @{$inv_items}[0] eq 'SL::DB::Inventory');
+  # add all qty for one bin and add wh_id
+  ($bin_qty{$_->bin_id}{qty}, $bin_qty{$_->bin_id}{wh}) = ($bin_qty{$_->bin_id}{qty} + $_->qty, $_->warehouse_id) for @{ $inv_items };
+
+  while (my ($bin, $value) = each (%bin_qty)) {
+    if ($value->{qty} > 0) {
+      $main::lxdebug->leave_sub();
+      return ($value->{qty}, $value->{wh}, $bin, $params{chargenumber});
+    }
+  }
 
   $main::lxdebug->leave_sub();
-  return ($inv_item->warehouse_id, $inv_item->bin_id, $inv_item->chargenumber);
+  return undef;
 }
 1;
 
@@ -1301,10 +1311,11 @@ The typical params would be:
 
 =head2 get_wh_and_bin_for_charge C<$params{chargenumber}>
 
-Gets the first inventory entry with the mandatory chargenumber: C<$params{chargenumber}>.
+Gets the current qty from the inventory entries with the mandatory chargenumber: C<$params{chargenumber}>.
 Croaks if the chargenumber is missing or no entry currently exists.
-From the found inventory entry the following values and in this order are returned:
-C<warehouse_id>, C<bin_id>, C<chargenumber>.
+If there is one bin and warehouse with a positive qty, this fields are returned:
+C<qty> C<warehouse_id>, C<bin_id>, C<chargenumber>.
+Otherwise returns undef.
 
 
 =head3 Prerequisites
index 04b0e24..859b7bd 100755 (executable)
@@ -2123,6 +2123,7 @@ $self->{texts} = {
   'Not Discountable'            => 'Nicht rabattierfähig',
   'Not delivered'               => 'Nicht geliefert',
   'Not done yet'                => 'Noch nicht fertig',
+  'Not enough in stock for the serial number #1' => 'Nicht genug auf Lager von der Seriennummer #1',
   'Not obsolete'                => 'Gültig',
   'Note'                        => 'Hinweis',
   'Note that parameter names must not be quoted.' => 'Beachten Sie, dass Parameternamen nicht in Anführungszeichen stehen dürfen.',