# $locale->text('found')
# $locale->text('missing')
# $locale->text('stock')
+# $locale->text('shipped')
# $locale->text('transfer')
# $locale->text('used')
# $locale->text('return_material')
show_no_warehouses_error() if (!scalar @{ $form->{WAREHOUSES} });
- my $units = AM->retrieve_units(\%myconfig, $form, 'dimension');
+ my $units = AM->retrieve_units(\%myconfig, $form);
$form->{UNITS} = AM->unit_select_data($units, $form->{unit}, 0, $form->{partunit});
if (scalar @{ $form->{WAREHOUSES} }) {
$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();
$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));
- my $all_units = AM->retrieve_units(\%myconfig, $form, 'dimension');
+ my $all_units = AM->retrieve_units(\%myconfig, $form);
foreach (@contents) {
$_->{qty} = $form->format_amount_units('amount' => $_->{qty},
$form->{sort} = 'bindescription';
my @contents = WH->get_warehouse_report("warehouse_id" => $form->{warehouse_id});
- my $all_units = AM->retrieve_units(\%myconfig, $form, 'dimension');
+ my $all_units = AM->retrieve_units(\%myconfig, $form);
my @transfers;
} elsif (($form->{partnumber} && ($form->{partnumber} ne $form->{old_partnumber})) || $form->{description}) {
$form->{no_services} = 1;
- $form->{no_assemblies} = 1;
- $form->{stockable} = 1;
+ $form->{no_assemblies} = 0; # assemblies duerfen eingelagert werden (z.B. bei retouren)
my $parts = Common->retrieve_parts(\%myconfig, $form, 'description', 1);
$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();
$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();
$form->{sort} = 'bindescription';
my @contents = WH->get_warehouse_report("warehouse_id" => $form->{warehouse_id});
- my $all_units = AM->retrieve_units(\%myconfig, $form, 'dimension');
+ my $all_units = AM->retrieve_units(\%myconfig, $form);
my @transfers;
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', });
show_no_warehouses_error() if (!scalar @{ $form->{WAREHOUSES} });
- $form->{onload} .= "fokus('partnumber');";
+ $form->{fokus} = "partnumber";
+ $form->{onload} .= "focus();";
$form->{title} = $locale->text("Report about wareouse contents");
$form->header();
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);
'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;
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 } ];
|| ($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;
}
$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();
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".');