Revision 52d18c01
Von Jan Büren vor mehr als 11 Jahren hinzugefügt
bin/mozilla/do.pl | ||
---|---|---|
340 | 340 |
|
341 | 341 |
$form->{PRINT_OPTIONS} = print_options('inline' => 1); |
342 | 342 |
|
343 |
print $form->parse_html_template('do/form_footer'); |
|
343 |
print $form->parse_html_template('do/form_footer', |
|
344 |
{transfer_default => ($::instance_conf->get_transfer_default)}); |
|
344 | 345 |
|
345 | 346 |
$main::lxdebug->leave_sub(); |
346 | 347 |
} |
... | ... | |
1520 | 1521 |
my $form = $main::form; |
1521 | 1522 |
my $locale = $main::locale; |
1522 | 1523 |
|
1523 |
foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_in mark_closed save_as_new invoice delete)) { |
|
1524 |
foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_out_default |
|
1525 |
transfer_in transfer_in_default mark_closed save_as_new invoice delete)) { |
|
1524 | 1526 |
if ($form->{"action_${action}"}) { |
1525 | 1527 |
call_sub($action); |
1526 | 1528 |
return; |
... | ... | |
1529 | 1531 |
|
1530 | 1532 |
$form->error($locale->text('No action defined.')); |
1531 | 1533 |
} |
1534 |
|
|
1535 |
sub transfer_out_default { |
|
1536 |
$main::lxdebug->enter_sub(); |
|
1537 |
|
|
1538 |
my $form = $main::form; |
|
1539 |
|
|
1540 |
transfer_in_out_default('direction' => 'out'); |
|
1541 |
|
|
1542 |
$main::lxdebug->leave_sub(); |
|
1543 |
} |
|
1544 |
|
|
1545 |
sub transfer_in_default { |
|
1546 |
$main::lxdebug->enter_sub(); |
|
1547 |
|
|
1548 |
my $form = $main::form; |
|
1549 |
|
|
1550 |
transfer_in_out_default('direction' => 'in'); |
|
1551 |
|
|
1552 |
$main::lxdebug->leave_sub(); |
|
1553 |
} |
|
1554 |
|
|
1555 |
# Falls das Standardlagerverfahren aktiv ist, wird |
|
1556 |
# geprüft, ob alle Standardlagerplätze für die Auslager- |
|
1557 |
# artikel vorhanden sind UND ob die Warenmenge ausreicht zum |
|
1558 |
# Auslagern. Falls nicht wird entsprechend eine Fehlermeldung |
|
1559 |
# generiert. Offen Chargennummer / bestbefore wird nicht berücksichtigt |
|
1560 |
sub transfer_in_out_default { |
|
1561 |
$main::lxdebug->enter_sub(); |
|
1562 |
|
|
1563 |
my $form = $main::form; |
|
1564 |
my %myconfig = %main::myconfig; |
|
1565 |
my $locale = $main::locale; |
|
1566 |
my %params = @_; |
|
1567 |
|
|
1568 |
my (%missing_default_bins, %qty_parts, @all_requests, %part_info_map, $default_warehouse_id, $default_bin_id); |
|
1569 |
|
|
1570 |
Common::check_params(\%params, qw(direction)); |
|
1571 |
|
|
1572 |
# entsprechende defaults holen, falls standardlagerplatz verwendet werden soll |
|
1573 |
if ($::instance_conf->get_transfer_default_use_master_default_bin) { |
|
1574 |
$default_warehouse_id = $::instance_conf->get_default_warehouse_id; |
|
1575 |
$default_bin_id = $::instance_conf->get_default_bin_id; |
|
1576 |
} |
|
1577 |
|
|
1578 |
|
|
1579 |
my @part_ids = map { $form->{"id_${_}"} } (1 .. $form->{rowcount}); |
|
1580 |
if (@part_ids) { |
|
1581 |
my $units = AM->retrieve_units(\%myconfig, $form); |
|
1582 |
%part_info_map = IC->get_basic_part_info('id' => \@part_ids); |
|
1583 |
foreach my $i (1 .. $form->{rowcount}) { |
|
1584 |
next unless ($form->{"id_$i"}); |
|
1585 |
my $base_unit_factor = $units->{ $part_info_map{$form->{"id_$i"}}->{unit} }->{factor} || 1; |
|
1586 |
my $qty = $form->parse_amount(\%myconfig, $form->{"qty_$i"}) * $units->{$form->{"unit_$i"}}->{factor} / $base_unit_factor; |
|
1587 |
$qty_parts{$form->{"id_$i"}} += $qty; |
|
1588 |
|
|
1589 |
|
|
1590 |
$part_info_map{$form->{"id_$i"}}{bin_id} ||= $default_bin_id; |
|
1591 |
$part_info_map{$form->{"id_$i"}}{warehouse_id} ||= $default_warehouse_id; |
|
1592 |
|
|
1593 |
push @all_requests, { |
|
1594 |
'chargenumber' => '', #?? die müsste entsprechend geholt werden |
|
1595 |
#'bestbefore' => undef, # TODO wird nicht berücksichtigt |
|
1596 |
'bin_id' => $part_info_map{$form->{"id_$i"}}{bin_id}, |
|
1597 |
'qty' => $qty, |
|
1598 |
'parts_id' => $form->{"id_$i"}, |
|
1599 |
'comment' => 'Default transfer DO', |
|
1600 |
'ok' => 1, |
|
1601 |
'unit' => $part_info_map{$form->{"id_$i"}}{unit}, |
|
1602 |
'warehouse_id' => $part_info_map{$form->{"id_$i"}}{warehouse_id}, |
|
1603 |
'oe_id' => $form->{id}, |
|
1604 |
'project_id' => $form->{"project_id_$i"} ? $form->{"project_id_$i"} : $form->{globalproject_id} |
|
1605 |
}; |
|
1606 |
} |
|
1607 |
|
|
1608 |
# jetzt wird erst überprüft, ob die Stückzahl entsprechend stimmt. |
|
1609 |
if ($params{direction} eq 'out') { # wird nur für ausgehende Mengen benötigit |
|
1610 |
foreach my $key (keys %qty_parts) { |
|
1611 |
|
|
1612 |
$missing_default_bins{$key}{missing_bin} = 1 unless ($part_info_map{$key}{bin_id}); |
|
1613 |
next unless ($part_info_map{$key}{bin_id}); # abbruch |
|
1614 |
|
|
1615 |
my ($max_qty, $error) = WH->get_max_qty_parts_bin(parts_id => $key, bin_id => $part_info_map{$key}{bin_id}); |
|
1616 |
if ($error == 1) { |
|
1617 |
# wir können nicht entscheiden, welche charge oder mhd (bestbefore) ausgewählt sein soll |
|
1618 |
# deshalb rückmeldung nach oben geben, manuell auszulagern |
|
1619 |
# TODO Bei nur einem Treffer mit Charge oder bestbefore wäre das noch möglich |
|
1620 |
$missing_default_bins{$key}{chargenumber} = 1; |
|
1621 |
} |
|
1622 |
if ($max_qty < $qty_parts{$key}){ |
|
1623 |
$missing_default_bins{$key}{missing_qty} = $max_qty - $qty_parts{$key}; |
|
1624 |
} |
|
1625 |
} |
|
1626 |
} |
|
1627 |
} # if @parts_id |
|
1628 |
|
|
1629 |
# Abfrage für Fehlerbehandlung (nur bei direction == out) |
|
1630 |
if (scalar (keys %missing_default_bins)) { |
|
1631 |
my $fehlertext; |
|
1632 |
foreach my $fehler (keys %missing_default_bins) { |
|
1633 |
|
|
1634 |
my $ware = WH->get_part_description(parts_id => $fehler); |
|
1635 |
if ($missing_default_bins{$fehler}{missing_bin}){ |
|
1636 |
$fehlertext .= "Kein Standardlagerplatz definiert bei $ware <br>"; |
|
1637 |
} |
|
1638 |
if ($missing_default_bins{$fehler}{missing_qty}) { # missing_qty |
|
1639 |
$fehlertext .= "Es fehlen " . $missing_default_bins{$fehler}{missing_qty}*-1 . |
|
1640 |
" von $ware auf dem Standard-Lagerplatz " . $part_info_map{$fehler}{bin} . " zum Auslagern<br>"; |
|
1641 |
} |
|
1642 |
if ($missing_default_bins{$fehler}{chargenumber}){ |
|
1643 |
$fehlertext .= "Die Ware hat eine Chargennummer oder eine Mindesthaltbarkeit definiert. |
|
1644 |
Hier kann man nicht automatisch entscheiden. |
|
1645 |
Bitte diesen Lieferschein manuell auslagern. |
|
1646 |
Bei: $ware"; |
|
1647 |
} |
|
1648 |
# auslagern soll immer gehen, auch wenn nicht genügend auf lager ist. |
|
1649 |
# der lagerplatz ist hier extra konfigurierbar, bspw. Lager-Korrektur mit |
|
1650 |
# Lagerplatz Lagerplatz-Korrektur |
|
1651 |
my $default_warehouse_id_ignore_onhand = $::instance_conf->get_default_warehouse_id_ignore_onhand; |
|
1652 |
my $default_bin_id_ignore_onhand = $::instance_conf->get_default_bin_id_ignore_onhand; |
|
1653 |
if ($::instance_conf->get_transfer_default_ignore_onhand && $default_bin_id_ignore_onhand) { |
|
1654 |
# entsprechende defaults holen |
|
1655 |
# falls chargenumber, bestbefore oder anzahl nicht stimmt, auf automatischen |
|
1656 |
# lagerplatz wegbuchen! |
|
1657 |
foreach (@all_requests) { |
|
1658 |
if ($_->{parts_id} eq $fehler){ |
|
1659 |
$_->{bin_id} = $default_bin_id_ignore_onhand; |
|
1660 |
$_->{warehouse_id} = $default_warehouse_id_ignore_onhand; |
|
1661 |
} |
|
1662 |
} |
|
1663 |
} else { |
|
1664 |
#$main::lxdebug->message(0, 'Fehlertext: ' . $fehlertext); |
|
1665 |
$form->show_generic_error($locale->text("Cannot transfer. <br> Reason:<br>#1", $fehlertext ), 'back_button' => 1); |
|
1666 |
} |
|
1667 |
} |
|
1668 |
} |
|
1669 |
|
|
1670 |
|
|
1671 |
# hier der eigentliche fallunterschied für in oder out |
|
1672 |
my $prefix = $params{direction} eq 'in' ? 'in' : 'out'; |
|
1673 |
|
|
1674 |
# dieser array_ref ist für DO->save da: |
|
1675 |
# einmal die all_requests in YAML verwandeln, damit delivery_order_items_stock |
|
1676 |
# gefüllt werden kann. |
|
1677 |
my $i = 1; |
|
1678 |
foreach (@all_requests){ |
|
1679 |
$form->{"stock_${prefix}_$i"} = YAML::Dump([$_]); |
|
1680 |
$i++; |
|
1681 |
} |
|
1682 |
|
|
1683 |
save(no_redirect => 1); # Wir können auslagern, deshalb beleg speichern |
|
1684 |
# und in delivery_order_items_stock speichern |
|
1685 |
DO->transfer_in_out('direction' => $prefix, |
|
1686 |
'requests' => \@all_requests); |
|
1687 |
|
|
1688 |
SL::DB::DeliveryOrder->new(id => $form->{id})->load->update_attributes(delivered => 1); |
|
1689 |
|
|
1690 |
$form->{callback} = 'do.pl?action=edit&type=sales_delivery_order&id=' . $form->escape($form->{id}) if $params{direction} eq 'out'; |
|
1691 |
$form->{callback} = 'do.pl?action=edit&type=purchase_delivery_order&id=' . $form->escape($form->{id}) if $params{direction} eq 'in'; |
|
1692 |
$form->redirect; |
|
1693 |
|
|
1694 |
} |
Auch abrufbar als: Unified diff
Verkaufs- und Einkaufslieferschein um Standardlagerverfahren erweitert (#2284)
s.a. Changelog, bzw. Trac-Eintrag 2284 hierzu.