]> wagnertech.de Git - mfinanz.git/blobdiff - SL/WH.pm
IC: Umstellung IC::save auf single dbh
[mfinanz.git] / SL / WH.pm
index cd748d413e6757132b54ed544643b9fed60a7b84..af66e3bac7afc984ea9781ba14ca410588ed8df8 100644 (file)
--- a/SL/WH.pm
+++ b/SL/WH.pm
@@ -211,11 +211,15 @@ sub transfer_assembly {
     my $partsQTY          = $hash_ref->{qty} * $params{qty}; # benötigte teile * anzahl erzeugnisse
     my $currentPart_ID    = $hash_ref->{parts_id};
 
+    my $currentPart_WH_ID = $use_default_warehouse && $hash_ref->{warehouse_id} ? $hash_ref->{warehouse_id} : $params{dst_warehouse_id};
+    my $no_check = 0;
+
     # Prüfen ob Erzeugnis-Teile Standardlager haben.
     if ($use_default_warehouse && ! $hash_ref->{warehouse_id}) {
       # Prüfen ob in Mandantenkonfiguration ein Standardlager aktiviert isti.
       if ($::instance_conf->get_transfer_default_ignore_onhand) {
-        $hash_ref->{warehouse_id} = $::instance_conf->get_warehouse_id_ignore_onhand;
+        $currentPart_WH_ID = $::instance_conf->get_warehouse_id_ignore_onhand;
+        $no_check = 1;
       } else {
         $kannNichtFertigen .= "Kein Standardlager: " .
                             " Die Ware " . $self->get_part_description(parts_id => $currentPart_ID) .
@@ -224,10 +228,21 @@ sub transfer_assembly {
         next;
       }
     }
-    my $currentPart_WH_ID = $use_default_warehouse ? $hash_ref->{warehouse_id} : $params{dst_warehouse_id};
     my $warehouse_info    = $self->get_basic_warehouse_info('id'=> $currentPart_WH_ID);
     my $warehouse_desc    = $warehouse_info->{"warehouse_description"};
 
+    # Fertigen ohne Prüfung nach Bestand
+    if ($no_check) {
+      my $temppart_bin_id       = $::instance_conf->get_bin_id_ignore_onhand;
+      my $temppart_chargenumber = "";
+      my $temppart_bestbefore   = localtime();
+      my $temppart_qty          = $partsQTY * -1;
+
+      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);
+      next;
+    }
     # Überprüfen, ob diese Anzahl gefertigt werden kann
     my $max_parts = $self->get_max_qty_parts(parts_id     => $currentPart_ID, # $self->method() == this.method()
                                              warehouse_id => $currentPart_WH_ID);
@@ -237,7 +252,7 @@ sub transfer_assembly {
       # 25.4.09 Antwort: Ja.  Aber erst wenn im Frontend die locales-Funktion aufgerufen wird
 
       $kannNichtFertigen .= "Zum Fertigen fehlen: " . abs($partsQTY - $max_parts) .
-                            " Einheiten der Ware: " . $self->get_part_description(parts_id => $currentPart_ID) . 
+                            " Einheiten der Ware: " . $self->get_part_description(parts_id => $currentPart_ID) .
                             " im Lager: " . $warehouse_desc .
                             ", um das Erzeugnis herzustellen. <br>"; # Konnte die Menge nicht mit der aktuellen Anzahl der Waren fertigen
       next; # die weiteren Überprüfungen sind unnötig, daher das nächste elemente prüfen (genaue Ausgabe, was noch fehlt)
@@ -1145,6 +1160,106 @@ An expiration date. Note that this is not by default used by C<warehouse_report>
 
 =back
 
+=head2 create_assembly \%PARAMS, [ \%PARAMS, ... ]
+
+Creates an assembly if all defined items are available.
+
+Assembly item(s) will be stocked out and the assembly will be stocked in,
+taking into account the qty and units which can be defined for each
+assembly item seperately.
+
+The calling params originate from C<transfer> but only parts_id with the
+attribute assembly are processed.
+
+The typical params would be:
+
+  my %TRANSFER = (
+    'login'            => $::myconfig{login},
+    'dst_warehouse_id' => $form->{warehouse_id},
+    'dst_bin_id'       => $form->{bin_id},
+    'chargenumber'     => $form->{chargenumber},
+    'bestbefore'       => $form->{bestbefore},
+    'assembly_id'      => $form->{parts_id},
+    'qty'              => $form->{qty},
+    'comment'          => $form->{comment}
+  );
+
+=head3 Prerequisites
+
+All of these prerequisites have to be trueish, otherwise the function will exit
+unsuccessfully with a return value of undef.
+
+=over 4
+
+=item Mandantory params
+
+  assembly_id, qty, login, dst_warehouse_id and dst_bin_id are mandatory.
+
+=item Subset named 'Assembly' of data set 'Part'
+
+  assembly_id has to be an id in the table parts with the valid subset assembly.
+
+=item Assembly is composed of assembly item(s)
+
+  There has to be at least one data set in the table assembly referenced to this assembly_id.
+
+=item Assembly cannot be destroyed or disassembled
+
+  Assemblies are like cakes. You cannot disassemble it. NEVER.
+  No negative nor zero qty's are valid inputs.
+
+=item The assembly item(s) have to be in the same warehouse
+
+  inventory.warehouse_id equals dst_warehouse_id (client configurable).
+
+=item The assembly item(s) have to be in stock with the qty needed
+
+  I can only make a cake by receipt if I have ALL ingredients and
+  in the needed stock amount.
+  The qty of stocked in assembly item(s) has to fit into the
+  number of the qty of the assemblies, which are going to be created (client configurable).
+
+=item assembly item(s) with the parts set 'service' are ignored
+
+  The subset 'Services' of part will not transferred for assembly item(s).
+
+=back
+
+Client configurable prerequisites can be changed with different
+prerequisites as described in client_config (s.a. next chapter).
+
+
+=head2 default creation of assembly
+
+The valid state of the assembly item(s) used for the assembly process are
+'out' for the general direction and 'used' as the specific reason.
+The valid state of the assembly is 'in' for the direction and 'assembled'
+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
+
+=over 2
+
+=item  $::instance_conf->get_transfer_default_warehouse_for_assembly
+
+  If trueish we try to get all the items form the default bins defined in parts
+  and do not try to find them in the destination warehouse. Returns an
+  error if not all items have set a default bin in parts.
+
+=item  $::instance_conf->get_bin_id_ignore_onhand
+
+  If trueish we can create assemblies even if we do not have enough items in stock.
+  The needed qty will be booked in a special bin, which has to be configured in
+  the client config.
+
+=back
+
+
+
+
 =head1 BUGS
 
 None yet.