Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 52d18c01

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

  • ID 52d18c0134db2b418fe119723958efe8e79ac4f3
  • Vorgänger e0df6dc5
  • Nachfolger 7c452458

Verkaufs- und Einkaufslieferschein um Standardlagerverfahren erweitert (#2284)
s.a. Changelog, bzw. Trac-Eintrag 2284 hierzu.

Unterschiede anzeigen:

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