X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FWH.pm;h=3c3f65420b989e3976854b58a737d6c0c52d939e;hb=bbb58258bd516c262fb9e20b94ec801538a5ba99;hp=895db95e5e2745a4c01766107cdf050a7fa52403;hpb=4c01b1b28e9a7c871e9da06e1c9aee960ce04f64;p=kivitendo-erp.git
diff --git a/SL/WH.pm b/SL/WH.pm
index 895db95e5..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;
}
@@ -312,9 +341,7 @@ sub transfer_assembly {
}
# gibt die Fehlermeldung zurück. A.) Keine Teile definiert
# B.) Artikel und Anzahl der fehlenden Teile/Dienstleistungen
- if ($kannNichtFertigen) {
- return 0;
- }
+ die "
" . $kannNichtFertigen if ($kannNichtFertigen);
# 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,
@@ -569,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() || {};
}
@@ -1161,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.
@@ -1227,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, ... ]