Die Funktionen in Template.pm zum Ersetzen von Schleifenvariablen so erweitert, dass...
[kivitendo-erp.git] / SL / WH.pm
index 2c4d759..59fdfc5 100644 (file)
--- a/SL/WH.pm
+++ b/SL/WH.pm
@@ -138,24 +138,25 @@ sub transfer_assembly {
   my $dbh      = $params{dbh} || $form->get_standard_dbh($myconfig);
 
 
-# Ablauferklärung
-#
-# ... Standard-Check oben Ende. Hier die eigentliche SQL-Abfrage
-# select parts_id,qty from assembly where id=1064;
-# Erweiterung für bug 935 am 23.4.09 - Erzeugnisse können Dienstleistungen enthalten, die ja nicht 'lagerbar' sind.
-# select parts_id,qty from assembly inner join parts on assembly.parts_id = parts.id  where assembly.id=1066 and inventory_accno_id IS NOT NULL;
-# Erweiterung für bug 23.4.09 -2 Erzeugnisse in Erzeugnissen können nicht ausgelagert werden, wenn assembly nicht überprüft wird ...
-# select parts_id,qty from assembly inner join parts on assembly.parts_id = parts.id  where assembly.id=1066 and parts.inventory_accno_id IS NOT NULL and parts.assembly=false;
+  # Ablauferklärung
+  #
+  # ... Standard-Check oben Ende. Hier die eigentliche SQL-Abfrage
+  # select parts_id,qty from assembly where id=1064;
+  # Erweiterung für bug 935 am 23.4.09 - Erzeugnisse können Dienstleistungen enthalten, die ja nicht 'lagerbar' sind.
+  # select parts_id,qty from assembly inner join parts on assembly.parts_id = parts.id  where assembly.id=1066 and inventory_accno_id IS NOT NULL;
+  # Erweiterung für bug 23.4.09 -2 Erzeugnisse in Erzeugnissen können nicht ausgelagert werden, wenn assembly nicht überprüft wird ...
+  # patch von joachim eingespielt 24.4.2009:
+  # my $query    = qq|select parts_id,qty from assembly inner join parts
+  # on assembly.parts_id = parts.id  where assembly.id = ? and
+  # (inventory_accno_id IS NOT NULL or parts.assembly = TRUE)|;
 
-# 
-# 
 
   # my $query    = qq|select parts_id,qty from assembly where id = ?|;
-  my $query    = qq|select parts_id,qty from assembly inner join parts on assembly.parts_id = parts.id  where assembly.id = ? and inventory_accno_id IS NOT NULL and parts.assembly = FALSE|;
+  my $query    = qq|select parts_id,qty from assembly inner join parts on assembly.parts_id = parts.id  where assembly.id = ? and (inventory_accno_id IS NOT NULL or parts.assembly = TRUE)|;
 
   my $sth_part_qty_assembly      = prepare_execute_query($form, $dbh, $query, $params{assembly_id});
 
-# Hier wird das prepared Statement für die Schleife über alle Lagerplätze vorbereitet
+  # 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, comment, employee_id, qty, trans_id, trans_type_id)
                            VALUES (?, ?, ?, ?, ?,(SELECT id FROM employee WHERE login = ?), ?, nextval('id'), 
                                    (SELECT id FROM transfer_type WHERE direction = 'out' AND description = 'used'))|;
@@ -172,17 +173,17 @@ sub transfer_assembly {
     my $max_parts = get_max_qty_parts($self, parts_id => $currentPart_ID, warehouse_id => $params{dst_warehouse_id}); #$self angeben, damit die Standardkonvention (Name, Parameter) eingehalten wird
 
     if ($partsQTY  > $max_parts){
-
-      # Gibt es hier ein Problem mit nicht "escapten" Zeichen?
-       $kannNichtFertigen .= "Zum Fertigen fehlen:" . abs($partsQTY) . " Stueck der Ware:" . get_part_description($self, parts_id => $currentPart_ID) . ", um das Erzeugnis herzustellen. <br>";       # Konnte die Menge nicht mit der aktuellen Anzahl der Waren fertigen
+      # Gibt es hier ein Problem mit nicht "escapten" Zeichen? 25.4.09 Antwort: Ja.  Aber erst wenn im Frontend die locales-Funktion aufgerufen wird
+      $kannNichtFertigen .= "Zum Fertigen fehlen:" . abs($partsQTY - $max_parts) . " Stueck der Ware:" . get_part_description($self, parts_id => $currentPart_ID) . ", um das Erzeugnis herzustellen. <br>";   # Konnte die Menge nicht mit der aktuellen Anzahl der Waren fertigen
+      next;    # die weiteren Überprüfungen sind unnötig
     }
 
-# Eine kurze Vorabfrage, um den Lagerplatz und die Chargennummber zu bestimmen
-# Offen: Die Summe über alle Lagerplätze wird noch nicht gebildet
-# Gelöst: Wir haben vorher schon die Abfrage durchgeführt, ob wir fertigen können.
-# Noch besser gelöst: Wir laufen durch alle benötigten Waren zum Fertigen und geben eine Rückmeldung an den Benutzer was noch fehlt
-# und lösen den Rest dann so wie bei xplace im Barcode-Programm
-# S.a. Kommentar im bin/mozilla-Code mb übernimmt und macht das in ordentlich
+    # Eine kurze Vorabfrage, um den Lagerplatz und die Chargennummber zu bestimmen
+    # Offen: Die Summe über alle Lagerplätze wird noch nicht gebildet
+    # Gelöst: Wir haben vorher schon die Abfrage durchgeführt, ob wir fertigen können.
+    # Noch besser gelöst: Wir laufen durch alle benötigten Waren zum Fertigen und geben eine Rückmeldung an den Benutzer was noch fehlt
+    # und lösen den Rest dann so wie bei xplace im Barcode-Programm
+    # S.a. Kommentar im bin/mozilla-Code mb übernimmt und macht das in ordentlich
 
     my $tempquery =    qq|SELECT SUM(qty), bin_id, chargenumber   FROM inventory  WHERE warehouse_id = ? AND parts_id = ?  GROUP BY bin_id, chargenumber having SUM(qty)>0|;
     my $tempsth          =     prepare_execute_query($form, $dbh, $tempquery, $params{dst_warehouse_id}, $currentPart_ID);
@@ -300,11 +301,14 @@ sub get_warehouse_journal {
   $filter{na} = '-' unless $filter{na};
 
   # make order, search in $filter and $form
-  $form->{sort}   = $filter{sort}             unless $form->{sort};
-  $form->{order}  = ($form->{sort} = 'itime') unless $form->{sort};
-  $form->{sort}   = 'itime'                   if     $form->{sort} eq "date";
-  $form->{order}  = $filter{order}            unless $form->{order};
-  $form->{sort}  .= (($form->{order}) ? " DESC" : " ASC");
+  my $sort_col   = $form->{sort};
+  my $sort_order = $form->{order};
+
+  $sort_col      = $filter{sort}         unless $sort_col;
+  $sort_order    = ($sort_col = 'itime') unless $sort_col;
+  $sort_col      = 'itime'               if     $sort_col eq 'date';
+  $sort_order    = $filter{order}        unless $sort_order;
+  my $sort_spec  = "${sort_col} " . ($sort_order ? " DESC" : " ASC");
 
   my $where_clause = join(" AND ", @filter_ary) . " AND " if (@filter_ary);
 
@@ -399,7 +403,7 @@ sub get_warehouse_journal {
     WHERE $where_clause i1.qty > 0 AND
           i1.trans_id IN ( SELECT i.trans_id FROM inventory i GROUP BY i.trans_id HAVING COUNT(i.trans_id) = 1 )
     GROUP BY $group_clause
-    ORDER BY r_$form->{sort}|;
+    ORDER BY r_${sort_spec}|;
 
   my $sth = prepare_execute_query($form, $dbh, $query, @filter_vars, @filter_vars, @filter_vars);
 
@@ -437,6 +441,7 @@ sub get_warehouse_journal {
 #  - partsid      - will return matches with this parts_id only
 #  - description  - will return only matches where the given string is a substring of the description
 #  - chargenumber - will return only matches where the given string is a substring of the chargenumber
+#  - ean         - will return only matches where the given string is a substring of the ean as stored in the table parts (article)
 #  - charge_ids   - must be an arrayref. will return contents with these ids only
 #  - expires_in   - will only return matches that expire within the given number of days
 #                   will also add a column named 'has_expired' containing if the match has already expired or not
@@ -498,6 +503,10 @@ sub get_warehouse_report {
     push @filter_ary,  "i.chargenumber ILIKE ?";
     push @filter_vars, '%' . $filter{chargenumber} . '%';
   }
+  if ($filter{ean}) {
+    push @filter_ary,  "p.ean ILIKE ?";
+    push @filter_vars, '%' . $filter{ean} . '%';
+  }
 
   # prepare qty comparison for later filtering
   my ($f_qty_op, $f_qty, $f_qty_base_unit);
@@ -515,12 +524,15 @@ sub get_warehouse_report {
   map { $form->{"l_${_}id"} = "Y" if ($form->{"l_${_}description"} || $form->{"l_${_}number"}); } qw(warehouse bin);
 
   # make order, search in $filter and $form
-  $form->{sort}  =  $filter{sort}  unless $form->{sort};
-  $form->{sort}  =  "parts_id"     unless $form->{sort};
-  $form->{order} =  $filter{order} unless $form->{order};
-  $form->{sort}  =~ s/ASC|DESC//; # kill stuff left in from previous queries
-  my $orderby    =  $form->{sort};
-  $form->{sort} .=  (($form->{order}) ? " DESC" : " ASC");
+  my $sort_col    =  $form->{sort};
+  my $sort_order  = $form->{order};
+
+  $sort_col       =  $filter{sort}  unless $sort_col;
+  $sort_col       =  "parts_id"     unless $sort_col;
+  $sort_order     =  $filter{order} unless $sort_order;
+  $sort_col       =~ s/ASC|DESC//; # kill stuff left in from previous queries
+  my $orderby     =  $sort_col;
+  my $sort_spec   =  "${sort_col} " . ($sort_order ? " DESC" : " ASC");
 
   my $where_clause = join " AND ", ("1=1", @filter_ary);
 
@@ -533,6 +545,7 @@ sub get_warehouse_report {
      "bindescription"       => "b.description",
      "binid"                => "b.id",
      "chargenumber"         => "i.chargenumber",
+     "ean"                 => "p.ean",
      "chargeid"             => "c.id",
      "warehousedescription" => "w.description",
      "partunit"             => "p.unit",
@@ -564,7 +577,7 @@ sub get_warehouse_report {
       $joins
       WHERE $where_clause
       GROUP BY $group_clause $group_by
-      ORDER BY $form->{sort}|;
+      ORDER BY $sort_spec|;
 
   my $sth = prepare_execute_query($form, $dbh, $query, @filter_vars);