]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Helper/Inventory.pm
Inventory: allocate bevorzugt jetzt früherere Lagerbewegung
[mfinanz.git] / SL / Helper / Inventory.pm
index 14d4d161939686653f0d9f6cd016cfc1070fde66..a1a142803bf515bc674b1628ee949fdba33102a2 100644 (file)
@@ -24,7 +24,10 @@ sub _get_stock_onhand {
 
   my $onhand_mode = !!$params{onhand};
 
-  my @selects = ('SUM(qty) as qty');
+  my @selects = (
+    'SUM(qty) AS qty',
+    'MIN(EXTRACT(epoch FROM inventory.itime)) AS itime',
+  );
   my @values;
   my @where;
   my @groups;
@@ -168,9 +171,9 @@ sub allocate {
   return () if $qty <= 0;
 
   my $results = get_stock(part => $part, by => 'for_allocate');
-  my %bin_whitelist = map { (ref $_ ? $_->id : $_) => 1 } listify($params{bin});
-  my %wh_whitelist  = map { (ref $_ ? $_->id : $_) => 1 } listify($params{warehouse});
-  my %chargenumbers = map { (ref $_ ? $_->id : $_) => 1 } listify($params{chargenumber});
+  my %bin_whitelist = map { (ref $_ ? $_->id : $_) => 1 } grep defined, listify($params{bin});
+  my %wh_whitelist  = map { (ref $_ ? $_->id : $_) => 1 } grep defined, listify($params{warehouse});
+  my %chargenumbers = map { (ref $_ ? $_->id : $_) => 1 } grep defined, listify($params{chargenumber});
   my %reserve_whitelist;
   if ($params{reserve_for}) {
     $reserve_whitelist{ $_->meta->table }{ $_->id } = 1 for listify($params{reserve_for});
@@ -192,6 +195,7 @@ sub allocate {
     || exists $chargenumbers{$b->{chargenumber}}  <=> exists $chargenumbers{$a->{chargenumber}} # then prefer wanted chargenumbers
     || exists $bin_whitelist{$b->{bin_id}}        <=> exists $bin_whitelist{$a->{bin_id}}       # then prefer wanted bins
     || exists $wh_whitelist{$b->{warehouse_id}}   <=> exists $wh_whitelist{$a->{warehouse_id}}  # then prefer wanted bins
+    || $a->{itime}                                <=> $b->{itime}                               # and finally prefer earlier charges
   } @filtered_results;
   my @allocations;
   my $rest_qty = $qty;
@@ -429,32 +433,32 @@ SL::WH - Warehouse and Inventory API
 
   # See description for an intro to the concepts used here.
 
-  use SL::Helper::Inventory;
+  use SL::Helper::Inventory qw(:ALL);
 
   # stock, get "what's there" for a part with various conditions:
-  my $qty = SL::Helper::Inventory->get_stock(part => $part);                              # how much is on stock?
-  my $qty = SL::Helper::Inventory->get_stock(part => $part, date => $date);               # how much was on stock at a specific time?
-  my $qty = SL::Helper::Inventory->get_stock(part => $part, bin => $bin);                 # how is on stock in a specific bin?
-  my $qty = SL::Helper::Inventory->get_stock(part => $part, warehouse => $warehouse);     # how is on stock in a specific warehouse?
-  my $qty = SL::Helper::Inventory->get_stock(part => $part, chargenumber => $chargenumber); # how is on stock of a specific chargenumber?
+  my $qty = get_stock(part => $part);                              # how much is on stock?
+  my $qty = get_stock(part => $part, date => $date);               # how much was on stock at a specific time?
+  my $qty = get_stock(part => $part, bin => $bin);                 # how is on stock in a specific bin?
+  my $qty = get_stock(part => $part, warehouse => $warehouse);     # how is on stock in a specific warehouse?
+  my $qty = get_stock(part => $part, chargenumber => $chargenumber); # how is on stock of a specific chargenumber?
 
   # onhand, get "what's available" for a part with various conditions:
-  my $qty = SL::Helper::Inventory->get_onhand(part => $part);                              # how much is available?
-  my $qty = SL::Helper::Inventory->get_onhand(part => $part, date => $date);               # how much was available at a specific time?
-  my $qty = SL::Helper::Inventory->get_onhand(part => $part, bin => $bin);                 # how much is available in a specific bin?
-  my $qty = SL::Helper::Inventory->get_onhand(part => $part, warehouse => $warehouse);     # how much is available in a specific warehouse?
-  my $qty = SL::Helper::Inventory->get_onhand(part => $part, chargenumber => $chargenumber); # how much is availbale of a specific chargenumber?
-  my $qty = SL::Helper::Inventory->get_onhand(part => $part, reserve_for => $order);       # how much is available if you include this reservation?
+  my $qty = get_onhand(part => $part);                              # how much is available?
+  my $qty = get_onhand(part => $part, date => $date);               # how much was available at a specific time?
+  my $qty = get_onhand(part => $part, bin => $bin);                 # how much is available in a specific bin?
+  my $qty = get_onhand(part => $part, warehouse => $warehouse);     # how much is available in a specific warehouse?
+  my $qty = get_onhand(part => $part, chargenumber => $chargenumber); # how much is availbale of a specific chargenumber?
+  my $qty = get_onhand(part => $part, reserve_for => $order);       # how much is available if you include this reservation?
 
   # onhand batch mode:
-  my $data = SL::Helper::Inventory->get_onhand(
+  my $data = get_onhand(
     warehouse    => $warehouse,
     by           => [ qw(bin part chargenumber reserve_for) ],
     with_objects => [ qw(bin part) ],
   );
 
   # allocate:
-  my @allocations, SL::Helper::Inventory->allocate(
+  my @allocations, allocate(
     part         => $part,          # part_id works too
     qty          => $qty,           # must be positive
     chargenumber => $chargenumber,  # optional, may be arrayref. if provided these charges will be used first
@@ -464,7 +468,7 @@ SL::WH - Warehouse and Inventory API
   );
 
   # shortcut to allocate all that is needed for producing an assembly, will use chargenumbers as appropriate
-  my @allocations, SL::Helper::Inventory->allocate_for_assembly(
+  my @allocations, allocate_for_assembly(
     part         => $assembly,      # part_id works too
     qty          => $qty,           # must be positive
   );
@@ -483,7 +487,7 @@ SL::WH - Warehouse and Inventory API
   );
 
   # produce_assembly:
-  SL::Helper::Inventory->produce_assembly(
+  produce_assembly(
     part         => $part,           # target assembly
     qty          => $qty,            # qty
     allocations  => \@allocations,   # allocations to use. alternatively use "auto_allocate => 1,"