X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=bin%2Fmozilla%2Fwh.pl;h=d632d5d961962e29e47b22726ce44c882b1311d1;hb=b29783a3f0cff568b5d344d4fd34fe65840bea46;hp=5326cfb52c5115f7b7021a485a2fd6b525889d47;hpb=752642dd833d795ac8d97bfe2fd6e6d97e3de496;p=kivitendo-erp.git diff --git a/bin/mozilla/wh.pl b/bin/mozilla/wh.pl index 5326cfb52..d632d5d96 100644 --- a/bin/mozilla/wh.pl +++ b/bin/mozilla/wh.pl @@ -104,6 +104,9 @@ sub transfer_warehouse_selection { $form->{title} = $locale->text('Transfer'); $content = $form->parse_html_template('wh/warehouse_selection'); + } elsif ($form->{trans_type} eq 'assembly') { + $form->{title} = $locale->text('Produce Assembly'); + $content = $form->parse_html_template('wh/warehouse_selection_assembly'); } $form->header(); @@ -147,13 +150,14 @@ sub transfer_or_removal_prepare_contents { $form->show_generic_error($locale->text("The source warehouse does not contain any bins.")) if (0 == scalar @{ $warehouse->{BINS} }); - map { $form->{"l_$_"} = 'Y' } qw(parts_id qty warehouseid binid partnumber partdescription bindescription chargenumber partunit); + map { $form->{"l_$_"} = 'Y' } qw(parts_id qty warehouseid binid partnumber partdescription bindescription chargenumber partunit ean); $form->{sort} = 'bindescription'; my @contents = WH->get_warehouse_report("warehouse_id" => $form->{warehouse_id}, "bin_id" => $form->{bin_id}, "chargenumber" => $form->{chargenumber}, - "partnumber" => $form->{partnumber}, + "partnumber" => $form->{partnumber}, + "ean" => $form->{ean}, "description" => $form->{description}); $form->show_generic_error($locale->text("The selected warehouse is empty.")) if (0 == scalar(@contents)); @@ -277,19 +281,19 @@ sub transfer_stock_update_part { $form->{trans_type} = 'stock'; $form->{qty} = $form->parse_amount(\%myconfig, $form->{qty}); - if (!$form->{partnumber} && !$form->{description}) { - delete @{$form}{qw(parts_id partunit)}; + if (!$form->{partnumber} && !$form->{description} && !$form->{ean}) { + delete @{$form}{qw(parts_id partunit ean)}; transfer_warehouse_selection(); - } elsif (($form->{partnumber} && ($form->{partnumber} ne $form->{old_partnumber})) || $form->{description}) { + } elsif (($form->{partnumber} && ($form->{partnumber} ne $form->{old_partnumber})) || $form->{description} || $form->{ean}) { $form->{no_services} = 1; - $form->{no_assemblies} = 1; + $form->{no_assemblies} = 0; # assemblies duerfen eingelagert werden (z.B. bei retouren) my $parts = Common->retrieve_parts(\%myconfig, $form, 'description', 1); if (scalar @{ $parts } == 1) { - @{$form}{qw(parts_id partnumber description)} = @{$parts->[0]}{qw(id partnumber description)}; + @{$form}{qw(parts_id partnumber description ean)} = @{$parts->[0]}{qw(id partnumber description ean)}; transfer_stock_get_partunit(); transfer_warehouse_selection(); @@ -305,12 +309,51 @@ sub transfer_stock_update_part { $lxdebug->leave_sub(); } +# -------------------------------------------------------------------- +# Transfer: assemblies +# Dies ist die Auswahlmaske für ein assembly. +# Die ist einfach von transfer_assembly_update_part kopiert und nur um den trans_type (assembly) korrigiert worden +# Es wäre schön, hier nochmal check_assembly_max_create auf, um die max. Fertigungszahl herauszufinden. +# Ich lass das mal als auskommentierte Idee bestehen jb 18.3.09 +# -------------------------------------------------------------------- + +sub transfer_assembly_update_part { + $lxdebug->enter_sub(); + + $form->{trans_type} = 'assembly'; + $form->{qty} = $form->parse_amount(\%myconfig, $form->{qty}); + + if (!$form->{partnumber} && !$form->{description}) { + delete @{$form}{qw(parts_id partunit)}; + transfer_warehouse_selection(); + + } elsif (($form->{partnumber} && ($form->{partnumber} ne $form->{old_partnumber})) || $form->{description}) { + $form->{assemblies} = 1; + $form->{no_assemblies} = 0; + my $parts = Common->retrieve_parts(\%myconfig, $form, 'description', 1); + if (scalar @{ $parts } == 1) { + @{$form}{qw(parts_id partnumber description)} = @{$parts->[0]}{qw(id partnumber description)}; + transfer_stock_get_partunit(); + transfer_warehouse_selection(); + } else { + select_part('transfer_stock_part_selected', @{ $parts }); + } + + } else { + transfer_stock_get_partunit(); + transfer_warehouse_selection(); + } + +# hier die oben benannte idee +# my $maxcreate = Common->check_assembly_max_create(assembly_id => $form->{parts_id}, dbh => $my_dbh); + $lxdebug->leave_sub(); +} sub transfer_stock_part_selected { $lxdebug->enter_sub(); my $part = shift; - @{$form}{qw(parts_id partnumber description)} = @{$part}{qw(id partnumber description)}; + @{$form}{qw(parts_id partnumber description ean)} = @{$part}{qw(id partnumber description ean)}; transfer_stock_get_partunit(); transfer_warehouse_selection(); @@ -329,6 +372,62 @@ sub transfer_stock_get_partunit { $lxdebug->leave_sub(); } +# vorüberlegung jb 22.2.2009 +# wir benötigen für diese funktion, die anzahl die vom erzeugnis hergestellt werden soll. vielleicht direkt per js fehleingaben verhindern? +# ferner dann nochmal mit check_asssembly_max_create gegenprüfen und dann transaktionssicher wegbuchen. +# wir brauchen eine hilfsfunktion, die nee. brauchen wir nicht. der algorithmus läuft genau wie bei check max_create, nur dass hier auch eine lagerbewegung (verbraucht) stattfindet +# Manko ist derzeit noch, dass unterschiedliche Lagerplätze, bzw. das Quelllager an sich nicht ausgewählt werden können. +# Laut Absprache in KW11 09 übernimmt mb hier den rest im April ... jb 18.3.09 + +sub create_assembly { + $lxdebug->enter_sub(); + + $form->{qty} = $form->parse_amount(\%myconfig, $form->{qty}); + if ($form->{qty} <= 0) { + $form->show_generic_error($locale->text('Invalid quantity.'), 'back_button' => 1); + } + # TODO Es wäre schön, hier schon die maximale Anzahl der zu fertigenden Erzeugnisse zu haben + #else { if ($form->{qty} > $maxcreate) { #s.o. + # $form->show_generic_error($locale->text('Can not create that quantity with current stock'), 'back_button' => 1); + # $form->show_generic_error('Maximale Stückzahl' . $maxcreate , 'back_button' => 1); + # } + # } + + if (!$form->{warehouse_id} || !$form->{bin_id}) { + $form->error($locale->text('The warehouse or the bin is missing.')); + } + # WIESO war das nicht vorher schon ein %HASH?? ein hash ist ein hash! das hat mich mehr als eine Stunde gekostet herauszufinden. grr. jb 3.3.2009 + # Anm. jb 18.3. vielleicht auch nur meine unwissenheit in perl-datenstrukturen + my %TRANSFER = ( + 'transfer_type' => 'assembly', + 'login' => $form->{login}, + 'dst_warehouse_id' => $form->{warehouse_id}, + 'dst_bin_id' => $form->{bin_id}, + 'chargenumber' => $form->{chargenumber}, + 'assembly_id' => $form->{parts_id}, + 'qty' => $form->{qty}, + 'unit' => $form->{unit}, + 'comment' => $form->{comment} + ); + + my $ret = WH->transfer_assembly (%TRANSFER); + # Frage: Ich pack in den return-wert auch gleich die Fehlermeldung. Irgendwelche Nummern als Fehlerkonstanten definieren find ich auch nicht besonders schick... + # Ideen? jb 18.3.09 + if ($ret ne "1"){ + # Die locale-Funktion kann keine Double-Quotes escapen, deswegen hier erstmal so (ein wahrscheinlich immerwährender Hotfix) s.a. Frage davor jb 25.4.09 + $form->show_generic_error($ret, 'back_button' => 1); + } + + delete @{$form}{qw(parts_id partnumber description qty unit chargenumber comment)}; + + $form->{saved_message} = $locale->text('The assembly has been created.'); + $form->{trans_type} = 'assembly'; + + transfer_warehouse_selection(); + + $lxdebug->leave_sub(); +} + sub transfer_stock { $lxdebug->enter_sub(); @@ -546,13 +645,13 @@ sub generate_journal { $report->set_columns(%column_defs); $report->set_column_order(@columns); - $report->set_export_options('generate_journal', @hidden_variables); + $report->set_export_options('generate_journal', @hidden_variables, qw(sort order)); $report->set_sort_indicator($form->{sort}, $form->{order}); $report->set_options('output_format' => 'HTML', 'title' => $form->{title}, - 'attachment_basename' => strftime('warehouse_journal_%Y%m%d', localtime time)); + 'attachment_basename' => strftime($locale->text('warehouse_journal_list') . '_%Y%m%d', localtime time)); $report->set_options_from_form(); my $all_units = AM->retrieve_units(\%myconfig, $form); @@ -595,7 +694,7 @@ sub generate_journal { sub report { $lxdebug->enter_sub(); - $auth->assert('warehouse_content | warehouse_management'); + $auth->assert('warehouse_contents | warehouse_management'); $form->get_lists('warehouses' => { 'key' => 'WAREHOUSES', 'bins' => 'BINS', }); @@ -618,14 +717,14 @@ sub report { sub generate_report { $lxdebug->enter_sub(); - $auth->assert('warehouse_content | warehouse_management'); + $auth->assert('warehouse_contents | warehouse_management'); $form->{title} = $locale->text("Report about wareouse contents"); $form->{sort} ||= 'partnumber'; my $sort_col = $form->{sort}; my %filter; - my @columns = qw(warehousedescription bindescription partnumber partdescription chargenumber qty); + my @columns = qw(warehousedescription bindescription partnumber partdescription chargenumber qty stock_value); # filter stuff map { $filter{$_} = $form->{$_} if ($form->{$_}) } qw(warehouse_id bin_id partnumber description chargenumber); @@ -655,38 +754,46 @@ sub generate_report { 'partdescription' => { 'text' => $locale->text('Description'), }, 'chargenumber' => { 'text' => $locale->text('Charge Number'), }, 'qty' => { 'text' => $locale->text('Qty'), }, + 'stock_value' => { 'text' => $locale->text('Stock value'), }, ); my $href = build_std_url('action=generate_report', grep { $form->{$_} } @hidden_variables); map { $column_defs{$_}->{link} = $href . "&sort=${_}&order=" . Q($_ eq $sort_col ? 1 - $form->{order} : $form->{order}) } @columns; - my %column_alignment = map { $_ => 'right' } qw(qty); + my %column_alignment = map { $_ => 'right' } qw(qty stock_value); map { $column_defs{$_}->{visible} = $form->{"l_${_}"} ? 1 : 0 } @columns; $report->set_columns(%column_defs); $report->set_column_order(@columns); - $report->set_export_options('generate_report', @hidden_variables); + $report->set_export_options('generate_report', @hidden_variables, qw(sort order)); $report->set_sort_indicator($sort_col, $form->{order}); $report->set_options('output_format' => 'HTML', 'title' => $form->{title}, - 'attachment_basename' => strftime('warehouse_report_%Y%m%d', localtime time)); + 'attachment_basename' => strftime($locale->text('warehouse_report_list') . '_%Y%m%d', localtime time)); $report->set_options_from_form(); my $all_units = AM->retrieve_units(\%myconfig, $form); my @contents = WH->get_warehouse_report(%filter); - my $subtotal = 0; my $idx = 0; + my @subtotals_columns = qw(qty stock_value); + my %subtotals = map { $_ => 0 } @subtotals_columns; + + my $total_stock_value = 0; + foreach $entry (@contents) { - $subtotal += $entry->{qty}; - $entry->{qty} = $form->format_amount_units('amount' => $entry->{qty}, - 'part_unit' => $entry->{partunit}, - 'conv_units' => 'convertible'); + map { $subtotals{$_} += $entry->{$_} } @subtotals_columns; + $total_stock_value += $entry->{stock_value} * 1; + + $entry->{qty} = $form->format_amount_units('amount' => $entry->{qty}, + 'part_unit' => $entry->{partunit}, + 'conv_units' => 'convertible'); + $entry->{stock_value} = $form->format_amount(\%myconfig, $entry->{stock_value} * 1, 2); $row_set = [ { map { $_ => { 'data' => $entry->{$_}, 'align' => $column_alignment{$_} } } @columns } ]; @@ -695,10 +802,12 @@ sub generate_report { || ($entry->{$sort_col} ne $contents[$idx + 1]->{$sort_col}))) { my $row = { map { $_ => { 'data' => '', 'class' => 'listsubtotal', 'align' => $column_alignment{$_}, } } @columns }; - $row->{qty}->{data} = $form->format_amount_units('amount' => $subtotal, - 'part_unit' => $entry->{partunit}, - 'conv_units' => 'convertible'); - $subtotal = 0; + $row->{qty}->{data} = $form->format_amount_units('amount' => $subtotals{qty} * 1, + 'part_unit' => $entry->{partunit}, + 'conv_units' => 'convertible'); + $row->{stock_value}->{data} = $form->format_amount(\%myconfig, $subtotals{stock_value} * 1, 2); + + %subtotals = map { $_ => 0 } @subtotals_columns; push @{ $row_set }, $row; } @@ -708,6 +817,20 @@ sub generate_report { $idx++; } + if ($column_defs{stock_value}->{visible}) { + $report->add_separator(); + + my $row = { map { $_ => { 'data' => '', 'class' => 'listsubtotal', } } @columns }; + + my $left_col = first { $column_defs{$_}->{visible} } @columns; + + $row->{$left_col}->{data} = $locale->text('Total stock value'); + $row->{stock_value}->{data} = $form->format_amount(\%myconfig, $total_stock_value, 2); + $row->{stock_value}->{align} = 'right'; + + $report->add_data($row); + } + $report->generate_with_headers(); $lxdebug->leave_sub(); @@ -720,7 +843,7 @@ sub generate_report { sub show_no_warehouses_error { $lxdebug->enter_sub(); - my $msg = $locale->text('No warehouse has been created yet.') . ' '; + my $msg = $locale->text('No warehouse has been created yet or the quantity of the bins is not configured yet.') . ' '; if ($auth->check_right($form->{login}, 'config')) { $msg .= $locale->text('You can create warehouses and bins via the menu "System -> Warehouses".');