Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision c9cace86

Von Jan Büren vor mehr als 3 Jahren hinzugefügt

  • ID c9cace869bcf939c42de9c142df65d7c214ecdbc
  • Vorgänger bde97469
  • Nachfolger 01e8c002

Feature: Auslagern über Rechnung inkl. Seriennummer == Chargennummer

Prüft, ob die kommaseparierte Liste in serialnumber mit
der Stückzahl in der Position übereinstimmt
Prüft, ob die Seriennummer als Chargennummer vorhanden sind.
Bei Erfolg werden diese Chargen dann ausgelagert.

Unterschiede anzeigen:

SL/IS.pm
1461 1461

  
1462 1462
  foreach my $i (1 .. $form->{rowcount}) {
1463 1463
    next if !$form->{"id_$i"};
1464
    my ($err, $wh_id, $bin_id) = _determine_wh_and_bin($dbh, $::instance_conf,
1465
                                                       $form->{"id_$i"},
1466
                                                       $form->{"qty_$i"},
1467
                                                       $form->{"unit_$i"});
1468
    if (!@{ $err } && $wh_id && $bin_id) {
1469
      push @transfers, {
1470
        'parts_id'         => $form->{"id_$i"},
1471
        'qty'              => $form->{"qty_$i"},
1472
        'unit'             => $form->{"unit_$i"},
1473
        'transfer_type'    => 'shipped',
1474
        'src_warehouse_id' => $wh_id,
1475
        'src_bin_id'       => $bin_id,
1476
        'project_id'       => $form->{"project_id_$i"},
1477
        'invoice_id'       => $form->{"invoice_id_$i"},
1478
        'comment'          => $::locale->text("Default transfer invoice"),
1479
      };
1480
    }
1481 1464

  
1465
    my ($err, $wh_id, $bin_id, $chargenumber);
1466

  
1467
    if ($::instance_conf->get_sales_serial_eq_charge) {
1468
      next unless $form->{"serialnumber_$i"};
1469
      my @serials = split(" ", $form->{"serialnumber_$i"});
1470
      if (scalar @serials != $form->{"qty_$i"}) {
1471
        push @errors, $::locale->text("Cannot transfer #1 qty with #2 serial number(s)", $form->{"qty_$i"}, scalar @serials);
1472
        last;
1473
      }
1474
      foreach my $serial (@serials) {
1475
        ($wh_id, $bin_id, $chargenumber) = WH->get_wh_and_bin_for_charge(chargenumber => $serial);
1476

  
1477
        push @transfers, {
1478
            'parts_id'         => $form->{"id_$i"},
1479
            'qty'              => 1,
1480
            'unit'             => $form->{"unit_$i"},
1481
            'transfer_type'    => 'shipped',
1482
            'src_warehouse_id' => $wh_id,
1483
            'src_bin_id'       => $bin_id,
1484
            'chargenumber'     => $chargenumber,
1485
            'project_id'       => $form->{"project_id_$i"},
1486
            'invoice_id'       => $form->{"invoice_id_$i"},
1487
            'comment'          => $::locale->text("Default transfer invoice with charge number"),
1488
        };
1489
      }
1490
      $err = []; # error handling uses @errors direct
1491
    } else {
1492
      ($err, $wh_id, $bin_id)    = _determine_wh_and_bin($dbh, $::instance_conf,
1493
                                                         $form->{"id_$i"},
1494
                                                         $form->{"qty_$i"},
1495
                                                         $form->{"unit_$i"});
1496
      if (!@{ $err } && $wh_id && $bin_id) {
1497
        push @transfers, {
1498
          'parts_id'         => $form->{"id_$i"},
1499
          'qty'              => $form->{"qty_$i"},
1500
          'unit'             => $form->{"unit_$i"},
1501
          'transfer_type'    => 'shipped',
1502
          'src_warehouse_id' => $wh_id,
1503
          'src_bin_id'       => $bin_id,
1504
          'project_id'       => $form->{"project_id_$i"},
1505
          'invoice_id'       => $form->{"invoice_id_$i"},
1506
          'comment'          => $::locale->text("Default transfer invoice"),
1507
        };
1508
      }
1509
    }
1482 1510
    push @errors, @{ $err };
1483
  }
1511
  } # end form rowcount
1484 1512

  
1485 1513
  if (!@errors) {
1486 1514
    WH->transfer(@transfers);
SL/WH.pm
35 35

  
36 36
package WH;
37 37

  
38
use Carp qw(croak);
39

  
38 40
use SL::AM;
39 41
use SL::DBUtils;
42
use SL::DB::Inventory;
40 43
use SL::Form;
44
use SL::Locale::String qw(t8);
41 45
use SL::Util qw(trim);
42 46

  
43 47
use warnings;
......
56 60
  require SL::DB::TransferType;
57 61
  require SL::DB::Part;
58 62
  require SL::DB::Employee;
59
  require SL::DB::Inventory;
60 63

  
61 64
  my $employee   = SL::DB::Manager::Employee->find_by(login => $::myconfig{login});
62 65
  my ($now)      = selectrow_query($::form, $::form->get_standard_dbh, qq|SELECT current_date|);
......
1127 1130
  return ($max_qty_parts, $error);
1128 1131
}
1129 1132

  
1133
sub get_wh_and_bin_for_charge {
1134
  $main::lxdebug->enter_sub();
1135

  
1136
  my $self     = shift;
1137
  my %params   = @_;
1138

  
1139
  croak t8('Need charge number!') unless $params{chargenumber};
1140

  
1141
  my $inv_item= SL::DB::Manager::Inventory->get_first(where => [chargenumber => $params{chargenumber} ]);
1142

  
1143
  croak t8("Invalid charge number: #1", $params{chargenumber}) unless (ref $inv_item eq 'SL::DB::Inventory');
1144

  
1145
  $main::lxdebug->leave_sub();
1146
  return ($inv_item->warehouse_id, $inv_item->bin_id, $inv_item->chargenumber);
1147
}
1130 1148
1;
1131 1149

  
1132 1150
__END__
......
1280 1298
    'comment'          => $form->{comment}
1281 1299
  );
1282 1300

  
1301

  
1302
=head2 get_wh_and_bin_for_charge C<$params{chargenumber}>
1303

  
1304
Gets the first inventory entry with the mandatory chargenumber: C<$params{chargenumber}>.
1305
Croaks if the chargenumber is missing or no entry currently exists.
1306
From the found inventory entry the following values and in this order are returned:
1307
C<warehouse_id>, C<bin_id>, C<chargenumber>.
1308

  
1309

  
1283 1310
=head3 Prerequisites
1284 1311

  
1285 1312
All of these prerequisites have to be trueish, otherwise the function will exit
locale/de/all
573 573
  'Cannot stock without amount' => 'Kann nicht ohne Menge einlagern!',
574 574
  'Cannot storno invoice for a closed period!' => 'Das Rechnungsdatum der zu stornierenden Rechnung fällt in einen abgeschlossenen Zeitraum!',
575 575
  'Cannot storno storno invoice!' => 'Kann eine Stornorechnung nicht stornieren',
576
  'Cannot transfer #1 qty with #2 serial number(s)' => 'Kann nicht die Menge von #1 mit #2 Seriennummer auslagern.',
576 577
  'Cannot transfer negative entries.' => 'Kann keine negativen Mengen auslagern.',
577 578
  'Cannot transfer negative quantities.' => 'Negative Mengen können nicht ausgelagert werden.',
578 579
  'Cannot transfer. <br> Reason:<br>#1' => 'Kann nicht ein-/auslagern. <br>Grund:<br>#1',
......
957 958
  'Default template format'     => 'Standardvorlagenformat',
958 959
  'Default transfer delivery order' => 'Standard-Auslagern über Lieferschein',
959 960
  'Default transfer invoice'    => 'Standard-Auslagern über Rechnung',
961
  'Default transfer invoice with charge number' => 'Standard-Auslagern über Rechnung mit Chargennummer',
960 962
  'Default transport article number' => 'Standard Versand / Transport-Erinnerungs-Artikel',
961 963
  'Default unit'                => 'Standardeinheit',
962 964
  'Default value'               => 'Standardwert',
......
1620 1622
  'If item not found, allow creation of new item' => 'Falls Artikel nicht gefunden, erlaube Erfassen eines Neuen',
1621 1623
  'If left empty the default sender from the kivitendo configuration will be used (key \'email_from\' in section \'periodic_invoices\'; current value: #1).' => 'Falls leer, so wird der Standardabsender aus der kivitendo-Konfiguration genutzt (Schlüssel »email_from« in Abschnitt »periodic_invoices«; aktueller Wert: #1).',
1622 1624
  'If missing then the start date will be used.' => 'Falls es fehlt, so wird die erste Rechnung für das Startdatum erzeugt.',
1625
  'If one or more space separated serial numbers are assigned in a sales invoice, match the charge number of the inventory item. Assumes that Serial Number and Charge Number have 1:1 relation. Otherwise throw a error message for the default sales invoice transfer.' => 'Falls eine oder mehrere Leerzeichen separierte Seriennummern in Verkaufsrechnungen definiert sind, nutz diese als Chargennummern fürs Standard-Auslagern über Rechnung. Seriennummern und eingelagerte Chargen kommen jeweils exakt nur einmal vor. Falls die Chargennummer oder das Mengenverhältnis (1:1) in keinem Lagerort existiert wird eine Fehlermeldung beim Auslagern generiert.',
1623 1626
  'If searching a part from a document and no part is found then offer to create a new part.' => 'Wenn bei der Artikelsuche aus einem Dokument heraus kein Artikel gefunden wird, dann wird ermöglicht, von dort aus einen neuen Artikel anzulegen.',
1624 1627
  'If the article type is set to \'mixed\' then a column called \'part_type\' or called \'pclass\' must be present.' => 'Falls der Artikeltyp auf \'mixed\' gesetzt ist muss entweder eine Spalte \'part_type\' oder \'pclass\' im Import vorhanden sein',
1625 1628
  'If the automatic creation of invoices for fees and interest is switched on for a dunning level then the following accounts will be used for the invoice.' => 'Wenn das automatische Erstellen einer Rechnung über Mahngebühren und Zinsen für ein Mahnlevel aktiviert ist, so werden die folgenden Konten für die Rechnung benutzt.',
......
1707 1710
  'Introduction of clients'     => 'Einführung von Mandanten',
1708 1711
  'Inv. Duedate'                => 'Rg. Fälligkeit',
1709 1712
  'Invalid'                     => 'Ungültig',
1713
  'Invalid charge number: #1'   => 'Ungültige Chargennummer: #1',
1710 1714
  'Invalid combination of ledger account number length. Mismatch length of #1 with length of #2. Please check your account settings. ' => 'Ungültige Kombination der Nummernkreislänge der Sachkonten. Kann nicht eine Länge von #1 und eine Länge von #2 verarbeiten. Bitte entsprechend die Konteneinstellungen überprüfen.',
1711 1715
  'Invalid duration format'     => 'Falsches Format für Zeitdauer',
1712 1716
  'Invalid follow-up ID.'       => 'Ungültige Wiedervorlage-ID.',
......
1925 1929
  'Mass Create Print Sales Invoice from Delivery Order' => 'Massenerstellen und Ausdruck von Rechnungen aus Lieferscheinen',
1926 1930
  'Master Data'                 => 'Stammdaten',
1927 1931
  'Master Data Bin Text Deleted' => 'Gelöschte Stammdaten Freitext-Lagerplätze',
1932
  'Match Sales Invoice Serial numbers with inventory charge numbers?' => 'Gleiche die Seriennummern aus der VK-Rechnung mit den eingelagerten Chargennummern ab?',
1928 1933
  'Matching Price Rules can apply in one of three types:' => 'Preisregeln können Preise in drei Varianten vorschlagen:',
1929 1934
  'Max. Dunning Level'          => 'höchste Mahnstufe',
1930 1935
  'Maximal amount difference'   => 'maximale Betragsabweichung',
......
1983 1988
  'Name does not make sense without any bsooqr options' => 'Option "Name in gewählten Belegen" wird ignoriert.',
1984 1989
  'Name in Selected Records'    => 'Name in gewählten Belegen',
1985 1990
  'Name of the goal/source (if field names remote_name and remote_name_1 exist they will be combined into field "remote_name")' => 'Name des Ziel- oder Quellkontos (wenn die Spalten remote_name und remote_name_1 existieren werden diese zu Feld "remote_name" zusammengefügt)',
1991
  'Need charge number!'         => 'Benötige Chargennummer!',
1986 1992
  'Negative reductions are possible to model price increases.' => 'Negative Abschläge sind möglich um Aufschläge zu modellieren.',
1987 1993
  'Neither sections nor function blocks have been created yet.' => 'Es wurden bisher weder Abschnitte noch Funktionsblöcke angelegt.',
1988 1994
  'Net Income Statement'        => 'Einnahmenüberschußrechnung',

Auch abrufbar als: Unified diff