Revision c9cace86
Von Jan Büren vor mehr als 4 Jahren hinzugefügt
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
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.