Merge branch 'master' of ssh://git-grichardson@lx-office.linet-services.de/~/lx-offic...
[kivitendo-erp.git] / SL / IC.pm
index 13cf55e..ad17036 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -1,4 +1,4 @@
-#=====================================================================
+  #=====================================================================
 # LX-Office ERP
 # Copyright (C) 2004
 # Based on SQL-Ledger Version 2.1.9
@@ -167,14 +167,17 @@ sub get_part {
 
     # get makes
     if ($form->{makemodel}) {
-      $query = qq|SELECT m.make, m.model FROM makemodel m | .
-               qq|WHERE m.parts_id = ?|;
+    #hli
+      $query = qq|SELECT m.make, m.model,m.lastcost,m.lastcost,m.lastupdate,m.sortorder FROM makemodel m | .
+               qq|WHERE m.parts_id = ? order by m.sortorder asc|;
       my @values = ($form->{id});
       $sth = $dbh->prepare($query);
       $sth->execute(@values) || $form->dberror("$query (" . join(', ', @values) . ")");
 
       my $i = 1;
-      while (($form->{"make_$i"}, $form->{"model_$i"}) = $sth->fetchrow_array)
+
+      while (($form->{"make_$i"}, $form->{"model_$i"}, $form->{"old_lastcost_$i"}, 
+                $form->{"lastcost_$i"}, $form->{"lastupdate_$i"}, $form->{"sortorder_$i"}) = $sth->fetchrow_array)
       {
         $i++;
       }
@@ -350,7 +353,7 @@ sub save {
     }
 
     ($form->{id}) = selectrow_query($form, $dbh, qq|SELECT nextval('id')|);
-    do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber) VALUES (?, '')|, $form->{id});
+    do_query($form, $dbh, qq|INSERT INTO parts (id, partnumber, unit) VALUES (?, '', '')|, $form->{id});
 
     $form->{orphaned} = 1;
     if ($form->{partnumber} eq "" && $form->{"item"} eq "service") {
@@ -493,12 +496,25 @@ sub save {
 
   # insert makemodel records
   unless ($form->{item} eq 'service') {
+    my $lastupdate = '';
+    my $value = 0;
     for my $i (1 .. $form->{makemodel_rows}) {
       if (($form->{"make_$i"}) || ($form->{"model_$i"})) {
-
-        $query = qq|INSERT INTO makemodel (parts_id, make, model) | .
-                 qq|VALUES (?, ?, ?)|;
-        @values = (conv_i($form->{id}), conv_i($form->{"make_$i"}), $form->{"model_$i"});
+        #hli
+        $value = $form->parse_amount($myconfig, $form->{"lastcost_$i"});
+        if ($value == $form->{"old_lastcost_$i"}) 
+        {
+            if ($form->{"lastupdate_$i"} eq "") { 
+                $lastupdate = 'now()';
+            } else {
+                $lastupdate = $dbh->quote($form->{"lastupdate_$i"});
+            }
+        } else {
+            $lastupdate = 'now()';
+        }
+        $query = qq|INSERT INTO makemodel (parts_id, make, model, lastcost, lastupdate, sortorder) | .
+                 qq|VALUES (?, ?, ?, ?, ?, ?)|;
+        @values = (conv_i($form->{id}), conv_i($form->{"make_$i"}), $form->{"model_$i"}, $value, $lastupdate, conv_i($form->{"sortorder_$i"}) );
 
         do_query($form, $dbh, $query, @values);
       }
@@ -818,7 +834,7 @@ sub all_parts {
      ordnumber    => 'apoe.', make         => 'mm.',
      quonumber    => 'apoe.', model        => 'mm.',
      invnumber    => 'apoe.', partsgroup   => 'pg.',
-     lastcost     => ' ',   , soldtotal    => ' ',
+     lastcost     => 'p.',  , soldtotal    => ' ',
      factor       => 'pfac.',
      'SUM(ioi.qty)' => ' ',
      description  => 'p.',
@@ -1453,17 +1469,17 @@ sub follow_account_chain {
 
   my ($query, $sth);
 
-  $query =
-    qq|SELECT c.new_chart_id, date($transdate) >= c.valid_from AS is_valid, | .
-    qq|  cnew.accno | .
-    qq|FROM chart c | .
-    qq|LEFT JOIN chart cnew ON c.new_chart_id = cnew.id | .
-    qq|WHERE (c.id = ?) AND NOT c.new_chart_id IS NULL AND (c.new_chart_id > 0)|;
-  $sth = prepare_query($form, $dbh, $query);
+  $form->{ACCOUNT_CHAIN_BY_ID} ||= {
+    map { $_->{id} => $_ }
+      selectall_hashref_query($form, $dbh, <<SQL, $transdate) };
+    SELECT c.id, c.new_chart_id, date(?) >= c.valid_from AS is_valid, cnew.accno
+    FROM chart c
+    LEFT JOIN chart cnew ON c.new_chart_id = cnew.id
+    WHERE NOT c.new_chart_id IS NULL AND (c.new_chart_id > 0)
+SQL
 
   while (1) {
-    do_statement($form, $sth, $query, $accno_id);
-    my $ref = $sth->fetchrow_hashref();
+    my $ref = $form->{ACCOUNT_CHAIN_BY_ID}->{$accno_id};
     last unless ($ref && $ref->{"is_valid"} &&
                  !grep({ $_ == $ref->{"new_chart_id"} } @visited_accno_ids));
     $accno_id = $ref->{"new_chart_id"};
@@ -1477,18 +1493,18 @@ sub follow_account_chain {
 }
 
 sub retrieve_accounts {
-  $main::lxdebug->enter_sub(2);
+  $main::lxdebug->enter_sub;
 
   my $self     = shift;
   my $myconfig = shift;
   my $form     = shift;
   my $dbh      = $form->get_standard_dbh;
-  my %args     = @_;     # part_id => index
-
-  my ($query, $sth);
+  my %args     = @_;     # index => part_id
 
   $form->{taxzone_id} *= 1;
 
+  return unless grep $_, values %args; # shortfuse if no part_id supplied
+
   # transdate madness.
   my $transdate = "";
   if ($form->{type} eq "invoice") {
@@ -1509,10 +1525,15 @@ sub retrieve_accounts {
     $transdate = $dbh->quote($transdate);
   }
   #/transdate
+  my $inc_exp = $form->{"vc"} eq "customer" ? "income_accno_id" : "expense_accno_id";
+
+  my @part_ids = grep { $_ } values %args;
+  my $in       = join ',', ('?') x @part_ids;
 
-  my $sth_accno = prepare_query($::form, $dbh, <<SQL);
+  my %accno_by_part = map { $_->{id} => $_ }
+    selectall_hashref_query($form, $dbh, <<SQL, @part_ids);
     SELECT
-      p.inventory_accno_id AS is_part,
+      p.id, p.inventory_accno_id AS is_part,
       bg.inventory_accno_id,
       bg.income_accno_id_$form->{taxzone_id} AS income_accno_id,
       bg.expense_accno_id_$form->{taxzone_id} AS expense_accno_id,
@@ -1524,10 +1545,10 @@ sub retrieve_accounts {
     LEFT JOIN chart c1 ON bg.inventory_accno_id = c1.id
     LEFT JOIN chart c2 ON bg.income_accno_id_$form->{taxzone_id} = c2.id
     LEFT JOIN chart c3 ON bg.expense_accno_id_$form->{taxzone_id} = c3.id
-    WHERE p.id = ?
+    WHERE p.id IN ($in)
 SQL
 
-  my $sth_tx = prepare_query($::form, $dbh, <<SQL);
+  my $sth_tax = prepare_query($::form, $dbh, <<SQL);
     SELECT c.accno, t.taxdescription AS description, t.rate, t.taxnumber
     FROM tax t
     LEFT JOIN chart c ON c.id = t.chart_id
@@ -1538,8 +1559,8 @@ SQL
        ORDER BY startdate DESC LIMIT 1)
 SQL
 
-  while (my ($part_id, $index) = each %args) {
-    my $ref = $sth_accno->fetchrow_hashref($part_id) or next;
+  while (my ($index => $part_id) = each %args) {
+    my $ref = $accno_by_part{$part_id} or next;
 
     $ref->{"inventory_accno_id"} = undef unless $ref->{"is_part"};
 
@@ -1552,8 +1573,8 @@ SQL
 
     $form->{"${_}_accno_$index"} = $accounts{"${_}_accno"} for qw(inventory income expense);
 
-    my $inc_exp = $form->{"vc"} eq "customer" ? "income" : "expense";
-    $ref = $sth->fetchrow_hashref($accounts{"${inc_exp}_accno_id"}, quote_db_date($transdate)) or next;
+    $sth_tax->execute($accounts{$inc_exp}, quote_db_date($transdate));
+    $ref = $sth_tax->fetchrow_hashref or next;
 
     $form->{"taxaccounts_$index"} = $ref->{"accno"};
     $form->{"taxaccounts"} .= "$ref->{accno} "if $form->{"taxaccounts"} !~ /$ref->{accno}/;
@@ -1561,7 +1582,9 @@ SQL
     $form->{"$ref->{accno}_${_}"} = $ref->{$_} for qw(rate description taxnumber);
   }
 
-  $::lxdebug->leave_sub(2);
+  $sth_tax->finish;
+
+  $::lxdebug->leave_sub;
 }
 
 sub get_basic_part_info {
@@ -1626,7 +1649,7 @@ sub prepare_parts_for_printing {
   my $placeholders = join ', ', ('?') x scalar(@part_ids);
   my $query        = qq|SELECT mm.parts_id, mm.model, v.name AS make
                         FROM makemodel mm
-                        LEFT JOIN vendor v ON (mm.make = cast (v.id as text))
+                        LEFT JOIN vendor v ON (mm.make = v.id)
                         WHERE mm.parts_id IN ($placeholders)|;
 
   my %makemodel    = ();