X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/1bbcb32cff12865da20d6f2dabc85d7683dca31e..79b75e0750039323bc8a931c653c6b0964f35c0e:/SL/WH.pm diff --git a/SL/WH.pm b/SL/WH.pm index 3c3f65420..1519d6f4d 100644 --- a/SL/WH.pm +++ b/SL/WH.pm @@ -35,9 +35,13 @@ package WH; +use Carp qw(croak); + use SL::AM; use SL::DBUtils; +use SL::DB::Inventory; use SL::Form; +use SL::Locale::String qw(t8); use SL::Util qw(trim); use warnings; @@ -56,7 +60,6 @@ sub transfer { require SL::DB::TransferType; require SL::DB::Part; require SL::DB::Employee; - require SL::DB::Inventory; my $employee = SL::DB::Manager::Employee->find_by(login => $::myconfig{login}); my ($now) = selectrow_query($::form, $::form->get_standard_dbh, qq|SELECT current_date|); @@ -99,15 +102,21 @@ sub transfer { $direction |= 1 if $src_bin; $direction |= 2 if $dst_bin; - my $transfer_type = $objectify->($transfer, 'transfer_type', 'SL::DB::TransferType', direction => $directions[$direction], - description => $transfer->{transfer_type}); + my $transfer_type_id; + if ($transfer->{transfer_type_id}) { + $transfer_type_id = $transfer->{transfer_type_id}; + } else { + my $transfer_type = $objectify->($transfer, 'transfer_type', 'SL::DB::TransferType', direction => $directions[$direction], + description => $transfer->{transfer_type}); + $transfer_type_id = $transfer_type->id; + } my $stocktaking_qty = $transfer->{stocktaking_qty}; my %params = ( part => $part, employee => $employee, - trans_type => $transfer_type, + trans_type_id => $transfer_type_id, project => $project, trans_id => $trans_id, shippingdate => !$transfer->{shippingdate} || $transfer->{shippingdate} eq 'current_date' @@ -189,8 +198,6 @@ sub transfer_assembly { my %params = @_; Common::check_params(\%params, qw(assembly_id dst_warehouse_id login qty unit dst_bin_id chargenumber bestbefore comment)); -# my $maxcreate=WH->check_assembly_max_create(assembly_id =>$params{'assembly_id'}, dbh => $my_dbh); - my $myconfig = \%main::myconfig; my $form = $main::form; my $kannNichtFertigen =""; # Falls leer dann erfolgreich @@ -225,10 +232,15 @@ sub transfer_assembly { my $sth_part_qty_assembly = prepare_execute_query($form, $dbh, $query, $params{assembly_id}); + my @trans_ids; + my $query_trans_id = qq|SELECT nextval('inventory_id_seq')|; + my $query_trans_ids = qq|INSERT INTO assembly_inventory_part (inventory_assembly_id, inventory_part_id) VALUES (?, ?)|; + my $sth_query_trans_ids = prepare_query($form, $dbh, $query_trans_ids); + # Hier wird das prepared Statement für die Schleife über alle Lagerplätze vorbereitet my $transferPartSQL = qq|INSERT INTO inventory (parts_id, warehouse_id, bin_id, chargenumber, bestbefore, comment, employee_id, qty, - trans_id, trans_type_id, shippingdate) - VALUES (?, ?, ?, ?, ?, ?, (SELECT id FROM employee WHERE login = ?), ?, nextval('id'), + trans_id, id, trans_type_id, shippingdate) + VALUES (?, ?, ?, ?, ?, ?, (SELECT id FROM employee WHERE login = ?), ?, nextval('id'), ?, (SELECT id FROM transfer_type WHERE direction = 'out' AND description = 'used'), (SELECT current_date))|; my $sthTransferPartSQL = prepare_query($form, $dbh, $transferPartSQL); @@ -269,9 +281,12 @@ sub transfer_assembly { my $temppart_bestbefore = localtime(); my $temppart_qty = $partsQTY * -1; + my ($trans_id) = selectrow_query($form, $dbh, $query_trans_id); + push @trans_ids, $trans_id; do_statement($form, $sthTransferPartSQL, $transferPartSQL, $currentPart_ID, $currentPart_WH_ID, $temppart_bin_id, $temppart_chargenumber, $temppart_bestbefore, 'Verbraucht für ' . - $self->get_part_description(parts_id => $params{assembly_id}), $params{login}, $temppart_qty); + $self->get_part_description(parts_id => $params{assembly_id}), $params{login}, $temppart_qty, + $trans_id); next; } # Überprüfen, ob diese Anzahl gefertigt werden kann @@ -316,9 +331,11 @@ sub transfer_assembly { # wenn * -1 als berechnung in der parameter-übergabe angegeben wird. # Dieser Wert IST und BLEIBT positiv!! Hilfe. # Liegt das daran, dass dieser Wert aus einem SQL-Statement stammt? + my ($trans_id) = selectrow_query($form, $dbh, $query_trans_id); + push @trans_ids, $trans_id; do_statement($form, $sthTransferPartSQL, $transferPartSQL, $currentPart_ID, $currentPart_WH_ID, $temppart_bin_id, $temppart_chargenumber, $temppart_bestbefore, 'Verbraucht für ' . - $self->get_part_description(parts_id => $params{assembly_id}), $params{login}, $temppart_qty); + $self->get_part_description(parts_id => $params{assembly_id}), $params{login}, $temppart_qty, $trans_id); # hier ist noch ein fehler am besten mit definierten erzeugnissen debuggen 02/2009 jb # idee: ausbuch algorithmus mit rekursion lösen und an- und abschaltbar machen @@ -326,9 +343,11 @@ sub transfer_assembly { # auf jeden fall war der internal-server-error nach aktivierung von strict und warnings plus ein paar my-definitionen weg } else { # okay, wir haben weniger oder gleich Waren die wir wegbuchen müssen, wir können also aufhören $tmpPartsQTY *=-1; + my ($trans_id) = selectrow_query($form, $dbh, $query_trans_id); + push @trans_ids, $trans_id; do_statement($form, $sthTransferPartSQL, $transferPartSQL, $currentPart_ID, $currentPart_WH_ID, $temppart_bin_id, $temppart_chargenumber, $temppart_bestbefore, 'Verbraucht für ' . - $self->get_part_description(parts_id => $params{assembly_id}), $params{login}, $tmpPartsQTY); + $self->get_part_description(parts_id => $params{assembly_id}), $params{login}, $tmpPartsQTY, $trans_id); last; # beendet die schleife (springt zum letzten element) } } # ende while SELECT SUM(qty), bin_id, chargenumber, bestbefore FROM inventory WHERE warehouse_id @@ -345,13 +364,20 @@ sub transfer_assembly { # soweit alles gut. Jetzt noch die wirkliche Lagerbewegung für das Erzeugnis ausführen ... my $transferAssemblySQL = qq|INSERT INTO inventory (parts_id, warehouse_id, bin_id, chargenumber, bestbefore, - comment, employee_id, qty, trans_id, trans_type_id, shippingdate) - VALUES (?, ?, ?, ?, ?, ?, (SELECT id FROM employee WHERE login = ?), ?, nextval('id'), + comment, employee_id, qty, trans_id, id, trans_type_id, shippingdate) + VALUES (?, ?, ?, ?, ?, ?, (SELECT id FROM employee WHERE login = ?), ?, nextval('id'), ?, (SELECT id FROM transfer_type WHERE direction = 'in' AND description = 'assembled'), (select current_date))|; my $sthTransferAssemblySQL = prepare_query($form, $dbh, $transferAssemblySQL); + my ($assembly_trans_id) = selectrow_query($form, $dbh, $query_trans_id); do_statement($form, $sthTransferAssemblySQL, $transferAssemblySQL, $params{assembly_id}, $params{dst_warehouse_id}, - $params{dst_bin_id}, $params{chargenumber}, conv_date($params{bestbefore}), $params{comment}, $params{login}, $params{qty}); + $params{dst_bin_id}, $params{chargenumber}, conv_date($params{bestbefore}), $params{comment}, $params{login}, $params{qty}, $assembly_trans_id); + + # save inventory transactions for this assembly + for my $part_id (@trans_ids) { + do_statement($form, $sth_query_trans_ids, $query_trans_ids, $assembly_trans_id, $part_id); + } + 1; }) or do { return $kannNichtFertigen }; @@ -493,6 +519,7 @@ sub get_warehouse_journal { "comment" => "i1.comment", "trans_type" => "tt.description", "trans_id" => "i1.trans_id", + "id" => "i1.id", "oe_id" => "COALESCE(i1.oe_id, i2.oe_id)", "invoice_id" => "COALESCE(i1.invoice_id, i2.invoice_id)", "date" => "i1.shippingdate", @@ -513,6 +540,7 @@ sub get_warehouse_journal { }; $form->{l_classification_id} = 'Y'; + $form->{l_id} = 'Y'; $form->{l_part_type} = 'Y'; $form->{l_itime} = 'Y'; $form->{l_invoice_id} = $form->{l_oe_id} if $form->{l_oe_id}; @@ -801,8 +829,9 @@ sub get_warehouse_report { "chargeid" => "c.id", "warehousedescription" => "w.description", "partunit" => "p.unit", - "stock_value" => "p.lastcost / COALESCE(pfac.factor, 1)", + "stock_value" => ($form->{stock_value_basis} // '') eq 'list_price' ? "p.listprice / COALESCE(pfac.factor, 1)" : "p.lastcost / COALESCE(pfac.factor, 1)", "purchase_price" => "p.lastcost", + "list_price" => "p.listprice", ); $form->{l_classification_id} = 'Y'; $form->{l_part_type} = 'Y'; @@ -1120,6 +1149,31 @@ $main::lxdebug->enter_sub(); return ($max_qty_parts, $error); } +sub get_wh_and_bin_for_charge { + $main::lxdebug->enter_sub(); + + my $self = shift; + my %params = @_; + my %bin_qty; + + croak t8('Need charge number!') unless $params{chargenumber}; + + my $inv_items = SL::DB::Manager::Inventory->get_all(where => [chargenumber => $params{chargenumber} ]); + + croak t8("Invalid charge number: #1", $params{chargenumber}) unless (ref @{$inv_items}[0] eq 'SL::DB::Inventory'); + # add all qty for one bin and add wh_id + ($bin_qty{$_->bin_id}{qty}, $bin_qty{$_->bin_id}{wh}) = ($bin_qty{$_->bin_id}{qty} + $_->qty, $_->warehouse_id) for @{ $inv_items }; + + while (my ($bin, $value) = each (%bin_qty)) { + if ($value->{qty} > 0) { + $main::lxdebug->leave_sub(); + return ($value->{qty}, $value->{wh}, $bin, $params{chargenumber}); + } + } + + $main::lxdebug->leave_sub(); + return undef; +} 1; __END__ @@ -1273,6 +1327,16 @@ The typical params would be: 'comment' => $form->{comment} ); + +=head2 get_wh_and_bin_for_charge C<$params{chargenumber}> + +Gets the current qty from the inventory entries with the mandatory chargenumber: C<$params{chargenumber}>. +Croaks if the chargenumber is missing or no entry currently exists. +If there is one bin and warehouse with a positive qty, this fields are returned: +C C, C, C. +Otherwise returns undef. + + =head3 Prerequisites All of these prerequisites have to be trueish, otherwise the function will exit @@ -1328,7 +1392,7 @@ as the specific reason. The method is transaction safe, in case of errors not a single entry will be made in inventory. -Two prerequisites can be changed with this global parameters +Two prerequisites can be changed with these global parameters =over 2