X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fdo.pl;h=b8b169f976dc33951a4b0d8a336eb88f8c0be806;hb=841d44c00aae1166a0721e40dc2f9ffb7b9ac5b5;hp=570c7c35832cd0cee8b5772c4b41954660edaff9;hpb=5a23fdf6ec3cce197baaccad11b60bfe36005428;p=kivitendo-erp.git diff --git a/bin/mozilla/do.pl b/bin/mozilla/do.pl index 570c7c358..b8b169f97 100644 --- a/bin/mozilla/do.pl +++ b/bin/mozilla/do.pl @@ -305,7 +305,7 @@ sub form_header { # emulate click for resubmitting actions $dispatch_to_popup .= "document.do.${_}.click(); " for grep { /^action_/ } keys %$form; $dispatch_to_popup .= "document.do.submit();"; - $::request->{layout}->add_javascripts_inline("\$(function(){$dispatch_to_popup)"); + $::request->{layout}->add_javascripts_inline("\$(function(){$dispatch_to_popup})"); } my $follow_up_vc = $form->{ $form->{vc} eq 'customer' ? 'customer' : 'vendor' }; @@ -340,7 +340,8 @@ sub form_footer { $form->{PRINT_OPTIONS} = print_options('inline' => 1); - print $form->parse_html_template('do/form_footer'); + print $form->parse_html_template('do/form_footer', + {transfer_default => ($::instance_conf->get_transfer_default)}); $main::lxdebug->leave_sub(); } @@ -489,7 +490,7 @@ sub orders { $form->{rowcount} = scalar @{ $form->{DO} }; my @columns = qw( - ids transdate + ids transdate reqdate id donumber ordnumber customernumber name employee salesman @@ -516,6 +517,7 @@ sub orders { my %column_defs = ( 'ids' => { 'text' => '', }, 'transdate' => { 'text' => $locale->text('Date'), }, + 'reqdate' => { 'text' => $locale->text('Reqdate'), }, 'id' => { 'text' => $locale->text('ID'), }, 'donumber' => { 'text' => $locale->text('Delivery Order'), }, 'ordnumber' => { 'text' => $locale->text('Order'), }, @@ -531,7 +533,7 @@ sub orders { 'department' => { 'text' => $locale->text('Department'), }, ); - foreach my $name (qw(id transdate donumber ordnumber name employee salesman shipvia transaction_description department)) { + foreach my $name (qw(id transdate reqdate donumber ordnumber name employee salesman shipvia transaction_description department)) { my $sortdir = $form->{sort} eq $name ? 1 - $form->{sortdir} : $form->{sortdir}; $column_defs{$name}->{link} = $href . "&sort=$name&sortdir=$sortdir"; } @@ -667,17 +669,7 @@ sub save { } $form->{id} = 0 if $form->{saveasnew}; - # best case fix für bug 1079. Einkaufsrabatt wird nicht richtig - # aus Lieferantenauftrag -> Lieferschein -> Rechnung übernommen - # Tritt nur auf, wenn man direkt über Lieferschein -> speichern -> - # Workflow Rechnung geht (beim Aufruf über edit() i.O.) - # Gut. DO-save() speichert den Discount im DB-Format 0.12 für - # 12%, die Konvertierung wird leider in $form gemacht und daher - # wird die Maske mit dem falschen Rabatt wieder aufgebaut. - # Wie immer: backup_vars verwenden um nichts anderes kaputt zu - # machen. jan 03.03.2010 - # nicht mehr notwendig da für bug 1284 der backend aufruf entsprechend - # geändert wurde + DO->save(); # saving the history if(!exists $form->{addition}) { @@ -976,7 +968,7 @@ sub save_as_new { map { delete $form->{$_} } qw(printed emailed queued); delete @{ $form }{ grep { m/^stock_(?:in|out)_\d+/ } keys %{ $form } }; - # Let Lx-Office assign a new order number if the user hasn't changed the + # Let kivitendo assign a new order number if the user hasn't changed the # previous one. If it has been changed manually then use it as-is. $form->{donumber} =~ s/^\s*//g; $form->{donumber} =~ s/\s*$//g; @@ -1139,6 +1131,12 @@ sub display_stock_in_form { my $part_info = IC->get_basic_part_info('id' => $form->{parts_id}); + # Standardlagerplatz für Standard-Auslagern verwenden, falls keiner für die Ware explizit definiert wurde + if ($::instance_conf->get_transfer_default_use_master_default_bin) { + $part_info->{warehouse_id} ||= $::instance_conf->get_default_warehouse_id; + $part_info->{bin_id} ||= $::instance_conf->get_default_bin_id; + } + my $units = AM->retrieve_units(\%myconfig, $form); # der zweite Parameter von unit_select_data gibt den default-Namen (selected) vor my $units_data = AM->unit_select_data($units, $form->{do_unit}, undef, $part_info->{unit}); @@ -1519,7 +1517,8 @@ sub dispatcher { my $form = $main::form; my $locale = $main::locale; - foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_in mark_closed save_as_new invoice delete)) { + foreach my $action (qw(update ship_to print e_mail save transfer_out transfer_out_default + transfer_in transfer_in_default mark_closed save_as_new invoice delete)) { if ($form->{"action_${action}"}) { call_sub($action); return; @@ -1528,3 +1527,164 @@ sub dispatcher { $form->error($locale->text('No action defined.')); } + +sub transfer_out_default { + $main::lxdebug->enter_sub(); + + my $form = $main::form; + + transfer_in_out_default('direction' => 'out'); + + $main::lxdebug->leave_sub(); +} + +sub transfer_in_default { + $main::lxdebug->enter_sub(); + + my $form = $main::form; + + transfer_in_out_default('direction' => 'in'); + + $main::lxdebug->leave_sub(); +} + +# Falls das Standardlagerverfahren aktiv ist, wird +# geprüft, ob alle Standardlagerplätze für die Auslager- +# artikel vorhanden sind UND ob die Warenmenge ausreicht zum +# Auslagern. Falls nicht wird entsprechend eine Fehlermeldung +# generiert. Offen Chargennummer / bestbefore wird nicht berücksichtigt +sub transfer_in_out_default { + $main::lxdebug->enter_sub(); + + my $form = $main::form; + my %myconfig = %main::myconfig; + my $locale = $main::locale; + my %params = @_; + + my (%missing_default_bins, %qty_parts, @all_requests, %part_info_map, $default_warehouse_id, $default_bin_id); + + Common::check_params(\%params, qw(direction)); + + # entsprechende defaults holen, falls standardlagerplatz verwendet werden soll + if ($::instance_conf->get_transfer_default_use_master_default_bin) { + $default_warehouse_id = $::instance_conf->get_default_warehouse_id; + $default_bin_id = $::instance_conf->get_default_bin_id; + } + + + my @part_ids = map { $form->{"id_${_}"} } (1 .. $form->{rowcount}); + if (@part_ids) { + my $units = AM->retrieve_units(\%myconfig, $form); + %part_info_map = IC->get_basic_part_info('id' => \@part_ids); + foreach my $i (1 .. $form->{rowcount}) { + next unless ($form->{"id_$i"}); + my $base_unit_factor = $units->{ $part_info_map{$form->{"id_$i"}}->{unit} }->{factor} || 1; + my $qty = $form->parse_amount(\%myconfig, $form->{"qty_$i"}) * $units->{$form->{"unit_$i"}}->{factor} / $base_unit_factor; + $qty_parts{$form->{"id_$i"}} += $qty; + + + $part_info_map{$form->{"id_$i"}}{bin_id} ||= $default_bin_id; + $part_info_map{$form->{"id_$i"}}{warehouse_id} ||= $default_warehouse_id; + + push @all_requests, { + 'chargenumber' => '', #?? die müsste entsprechend geholt werden + #'bestbefore' => undef, # TODO wird nicht berücksichtigt + 'bin_id' => $part_info_map{$form->{"id_$i"}}{bin_id}, + 'qty' => $qty, + 'parts_id' => $form->{"id_$i"}, + 'comment' => 'Default transfer DO', + 'ok' => 1, + 'unit' => $part_info_map{$form->{"id_$i"}}{unit}, + 'warehouse_id' => $part_info_map{$form->{"id_$i"}}{warehouse_id}, + 'oe_id' => $form->{id}, + 'project_id' => $form->{"project_id_$i"} ? $form->{"project_id_$i"} : $form->{globalproject_id} + }; + } + + # jetzt wird erst überprüft, ob die Stückzahl entsprechend stimmt. + if ($params{direction} eq 'out') { # wird nur für ausgehende Mengen benötigit + foreach my $key (keys %qty_parts) { + + $missing_default_bins{$key}{missing_bin} = 1 unless ($part_info_map{$key}{bin_id}); + next unless ($part_info_map{$key}{bin_id}); # abbruch + + my ($max_qty, $error) = WH->get_max_qty_parts_bin(parts_id => $key, bin_id => $part_info_map{$key}{bin_id}); + if ($error == 1) { + # wir können nicht entscheiden, welche charge oder mhd (bestbefore) ausgewählt sein soll + # deshalb rückmeldung nach oben geben, manuell auszulagern + # TODO Bei nur einem Treffer mit Charge oder bestbefore wäre das noch möglich + $missing_default_bins{$key}{chargenumber} = 1; + } + if ($max_qty < $qty_parts{$key}){ + $missing_default_bins{$key}{missing_qty} = $max_qty - $qty_parts{$key}; + } + } + } + } # if @parts_id + + # Abfrage für Fehlerbehandlung (nur bei direction == out) + if (scalar (keys %missing_default_bins)) { + my $fehlertext; + foreach my $fehler (keys %missing_default_bins) { + + my $ware = WH->get_part_description(parts_id => $fehler); + if ($missing_default_bins{$fehler}{missing_bin}){ + $fehlertext .= "Kein Standardlagerplatz definiert bei $ware
"; + } + if ($missing_default_bins{$fehler}{missing_qty}) { # missing_qty + $fehlertext .= "Es fehlen " . $missing_default_bins{$fehler}{missing_qty}*-1 . + " von $ware auf dem Standard-Lagerplatz " . $part_info_map{$fehler}{bin} . " zum Auslagern
"; + } + if ($missing_default_bins{$fehler}{chargenumber}){ + $fehlertext .= "Die Ware hat eine Chargennummer oder eine Mindesthaltbarkeit definiert. + Hier kann man nicht automatisch entscheiden. + Bitte diesen Lieferschein manuell auslagern. + Bei: $ware"; + } + # auslagern soll immer gehen, auch wenn nicht genügend auf lager ist. + # der lagerplatz ist hier extra konfigurierbar, bspw. Lager-Korrektur mit + # Lagerplatz Lagerplatz-Korrektur + my $default_warehouse_id_ignore_onhand = $::instance_conf->get_default_warehouse_id_ignore_onhand; + my $default_bin_id_ignore_onhand = $::instance_conf->get_default_bin_id_ignore_onhand; + if ($::instance_conf->get_transfer_default_ignore_onhand && $default_bin_id_ignore_onhand) { + # entsprechende defaults holen + # falls chargenumber, bestbefore oder anzahl nicht stimmt, auf automatischen + # lagerplatz wegbuchen! + foreach (@all_requests) { + if ($_->{parts_id} eq $fehler){ + $_->{bin_id} = $default_bin_id_ignore_onhand; + $_->{warehouse_id} = $default_warehouse_id_ignore_onhand; + } + } + } else { + #$main::lxdebug->message(0, 'Fehlertext: ' . $fehlertext); + $form->show_generic_error($locale->text("Cannot transfer.
Reason:
#1", $fehlertext ), 'back_button' => 1); + } + } + } + + + # hier der eigentliche fallunterschied für in oder out + my $prefix = $params{direction} eq 'in' ? 'in' : 'out'; + + # dieser array_ref ist für DO->save da: + # einmal die all_requests in YAML verwandeln, damit delivery_order_items_stock + # gefüllt werden kann. + my $i = 1; + foreach (@all_requests){ + $form->{"stock_${prefix}_$i"} = YAML::Dump([$_]); + $i++; + } + + save(no_redirect => 1); # Wir können auslagern, deshalb beleg speichern + # und in delivery_order_items_stock speichern + DO->transfer_in_out('direction' => $prefix, + 'requests' => \@all_requests); + + SL::DB::DeliveryOrder->new(id => $form->{id})->load->update_attributes(delivered => 1); + + $form->{callback} = 'do.pl?action=edit&type=sales_delivery_order&id=' . $form->escape($form->{id}) if $params{direction} eq 'out'; + $form->{callback} = 'do.pl?action=edit&type=purchase_delivery_order&id=' . $form->escape($form->{id}) if $params{direction} eq 'in'; + $form->redirect; + +}