X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FWH.pm;h=3c3f65420b989e3976854b58a737d6c0c52d939e;hb=c13f301e71da717b09f3c7364a9f0c87c4f7a4ea;hp=bcdffa5118abc6cc6c30b2882d91ede7246d3acb;hpb=d51b3011755b4a7e006f433d9fe5836a22a69638;p=kivitendo-erp.git diff --git a/SL/WH.pm b/SL/WH.pm index bcdffa511..3c3f65420 100644 --- a/SL/WH.pm +++ b/SL/WH.pm @@ -80,7 +80,8 @@ sub transfer { my $db = SL::DB::Inventory->new->db; $db->with_transaction(sub{ while (my $transfer = shift @args) { - my ($trans_id) = selectrow_query($::form, $::form->get_standard_dbh, qq|SELECT nextval('id')|); + my $trans_id; + ($trans_id) = selectrow_query($::form, $::form->get_standard_dbh, qq|SELECT nextval('id')|) if $transfer->{qty}; my $part = $objectify->($transfer, 'parts', 'SL::DB::Part'); my $unit = $objectify->($transfer, 'unit', 'SL::DB::Unit', name => $transfer->{unit}); @@ -101,6 +102,8 @@ sub transfer { my $transfer_type = $objectify->($transfer, 'transfer_type', 'SL::DB::TransferType', direction => $directions[$direction], description => $transfer->{transfer_type}); + my $stocktaking_qty = $transfer->{stocktaking_qty}; + my %params = ( part => $part, employee => $employee, @@ -113,13 +116,15 @@ sub transfer { ); if ($unit) { - $qty = $unit->convert_to($qty, $part->unit_obj); + $qty = $unit->convert_to($qty, $part->unit_obj); + $stocktaking_qty = $unit->convert_to($stocktaking_qty, $part->unit_obj); } $params{chargenumber} ||= ''; - if ($direction & 1) { - SL::DB::Inventory->new( + my @inventories; + if ($qty && $direction & 1) { + push @inventories, SL::DB::Inventory->new( %params, warehouse => $src_wh, bin => $src_bin, @@ -127,8 +132,8 @@ sub transfer { )->save; } - if ($direction & 2) { - SL::DB::Inventory->new( + if ($qty && $direction & 2) { + push @inventories, SL::DB::Inventory->new( %params, warehouse => $dst_wh->id, bin => $dst_bin->id, @@ -140,6 +145,30 @@ sub transfer { } } + # Record stocktaking if requested. + # This is only possible if transfer was a stock in or stock out, + # but not both (transfer). + if ($transfer->{record_stocktaking}) { + die 'Stocktaking can only be recorded for stock in or stock out, but not on a transfer.' if scalar @inventories > 1; + + my $inventory_id; + $inventory_id = $inventories[0]->id if $inventories[0]; + + SL::DB::Stocktaking->new( + inventory_id => $inventory_id, + warehouse => $src_wh || $dst_wh, + bin => $src_bin || $dst_bin, + parts_id => $part->id, + employee_id => $employee->id, + qty => $stocktaking_qty, + comment => $transfer->{comment}, + cutoff_date => $transfer->{stocktaking_cutoff_date}, + chargenumber => $transfer->{chargenumber}, + bestbefore => $transfer->{bestbefore}, + )->save; + + } + push @trans_ids, $trans_id; } @@ -567,19 +596,6 @@ sub get_warehouse_journal { my ($h_oe_id, $q_oe_id); if ($form->{l_oe_id}) { $q_oe_id = <{oe_id} || $ref->{invoice_id})) { - my $id = $ref->{oe_id} ? $ref->{oe_id} : $ref->{invoice_id}; - do_statement($form, $h_oe_id, $q_oe_id, ($id) x 6); + do_statement($form, $h_oe_id, $q_oe_id, $ref->{oe_id}, ($ref->{invoice_id}) x 2); $ref->{oe_id_info} = $h_oe_id->fetchrow_hashref() || {}; } @@ -1159,6 +1162,13 @@ transfer accepts more than one transaction parameter, each being a hash ref. If more than one is supplied, it is guaranteed, that all are processed in the same transaction. +It is possible to record stocktakings within this transaction as well. +This is useful if the transfer is the result of stocktaking (see also +C). To do so the parameters C, +C and C hava to be given. +If stocktaking should be saved, then the transfer quantity can be zero. In this +case no entry in inventory will be made, but only the stocktaking entry. + Here is a full list of parameters. All "_id" parameters except oe and orderitems can be called without id with RDB objects as well. @@ -1225,6 +1235,18 @@ An optional comment. An expiration date. Note that this is not by default used by C. +=item record_stocktaking + +A boolean flag to indicate that a stocktaking entry should be saved. + +=item stocktaking_qty + +The quantity for the stocktaking entry. + +=item stocktaking_cutoff_date + +The cutoff date for the stocktaking entry. + =back =head2 create_assembly \%PARAMS, [ \%PARAMS, ... ]