Tabelle parts: Fremdschlüssel für Konten - bessere Namen
[kivitendo-erp.git] / SL / IC.pm
index e25e13e..09b9bdb 100644 (file)
--- a/SL/IC.pm
+++ b/SL/IC.pm
@@ -42,6 +42,7 @@ use SL::CVar;
 use SL::DBUtils;
 use SL::HTML::Restrict;
 use SL::TransNumber;
+use SL::Util qw(trim);
 
 use strict;
 
@@ -72,6 +73,8 @@ sub get_part {
   # copy to $form variables
   map { $form->{$_} = $ref->{$_} } (keys %{$ref});
 
+  $form->{mtime} = $form->{itime} if !$form->{mtime};
+  $form->{lastmtime} = $form->{mtime};
   $form->{onhand} *= 1;
 
   # part or service item
@@ -190,8 +193,7 @@ sub get_pricegroups {
 
   my $i = 1;
   foreach my $pg (@{ $pricegroups }) {
-    $form->{"klass_$i"} = "$pg->{id}";
-    $form->{"price_$i"} = $form->format_amount($myconfig, $form->{"price_$i"}, -2);
+    $form->{"price_$i"}         = $form->format_amount($myconfig, $form->{"price_$i"}, -2);
     $form->{"pricegroup_id_$i"} = "$pg->{id}";
     $form->{"pricegroup_$i"}    = "$pg->{pricegroup}";
     $i++;
@@ -259,16 +261,8 @@ sub save {
     }
 
     # get old price
-    $query = qq|SELECT sellprice, weight FROM parts WHERE id = ?|;
-    my ($sellprice, $weight) = selectrow_query($form, $dbh, $query, conv_i($form->{id}));
-
-    # if item is part of an assembly adjust all assemblies
-    $query = qq|SELECT id, qty FROM assembly WHERE parts_id = ?|;
-    $sth = prepare_execute_query($form, $dbh, $query, conv_i($form->{id}));
-    while (my ($id, $qty) = $sth->fetchrow_array) {
-      &update_assembly($dbh, $form, $id, $qty, $sellprice * 1, $weight * 1);
-    }
-    $sth->finish;
+    $query = qq|SELECT sellprice FROM parts WHERE id = ?|;
+    my ($sellprice) = selectrow_query($form, $dbh, $query, conv_i($form->{id}));
 
     # delete makemodel records
     do_query($form, $dbh, qq|DELETE FROM makemodel WHERE parts_id = ?|, conv_i($form->{id}));
@@ -333,7 +327,6 @@ sub save {
          partnumber = ?,
          description = ?,
          makemodel = ?,
-         alternate = 'f',
          assembly = ?,
          listprice = ?,
          sellprice = ?,
@@ -397,6 +390,8 @@ sub save {
   );
   do_query($form, $dbh, $query, @values);
 
+  $form->new_lastmtime('parts');
+
   # delete translation records
   do_query($form, $dbh, qq|DELETE FROM translation WHERE parts_id = ?|, conv_i($form->{id}));
 
@@ -548,29 +543,6 @@ SQL
   return $rc;
 }
 
-sub update_assembly {
-  $main::lxdebug->enter_sub();
-
-  my ($dbh, $form, $id, $qty, $sellprice, $weight) = @_;
-
-  my $query = qq|SELECT id, qty FROM assembly WHERE parts_id = ?|;
-  my $sth = prepare_execute_query($form, $dbh, $query, conv_i($id));
-
-  while (my ($pid, $aqty) = $sth->fetchrow_array) {
-    &update_assembly($dbh, $form, $pid, $aqty * $qty, $sellprice, $weight);
-  }
-  $sth->finish;
-
-  $query =
-    qq|UPDATE parts SET sellprice = sellprice + ?, weight = weight + ?
-       WHERE id = ?|;
-  my @values = ($qty * ($form->{sellprice} - $sellprice),
-             $qty * ($form->{weight} - $weight), conv_i($id));
-  do_query($form, $dbh, $query, @values);
-
-  $main::lxdebug->leave_sub();
-}
-
 sub retrieve_assemblies {
   $main::lxdebug->enter_sub();
 
@@ -584,12 +556,12 @@ sub retrieve_assemblies {
 
   if ($form->{partnumber}) {
     $where .= qq| AND (p.partnumber ILIKE ?)|;
-    push(@values, '%' . $form->{partnumber} . '%');
+    push(@values, like($form->{partnumber}));
   }
 
   if ($form->{description}) {
     $where .= qq| AND (p.description ILIKE ?)|;
-    push(@values, '%' . $form->{description} . '%');
+    push(@values, like($form->{description}));
   }
 
   # retrieve assembly items
@@ -645,7 +617,7 @@ sub assembly_item {
   while (my ($column, $table) = each(%columns)) {
     next unless ($form->{"${column}_$i"});
     $where .= qq| AND ${table}.${column} ILIKE ?|;
-    push(@values, '%' . $form->{"${column}_$i"} . '%');
+    push(@values, like($form->{"${column}_$i"}));
   }
 
   if ($form->{id}) {
@@ -671,7 +643,7 @@ sub assembly_item {
   my $query =
     qq|SELECT p.id, p.partnumber, p.description, p.sellprice,
        p.weight, p.onhand, p.unit, pg.partsgroup, p.lastcost,
-       p.price_factor_id, pfac.factor AS price_factor
+       p.price_factor_id, pfac.factor AS price_factor, p.notes as longdescription
        FROM parts p
        LEFT JOIN partsgroup pg ON (p.partsgroup_id = pg.id)
        LEFT JOIN price_factors pfac ON pfac.id = p.price_factor_id
@@ -856,18 +828,26 @@ sub all_parts {
   #===== switches and simple filters ========#
 
   # special case transdate
-  if (grep { $form->{$_} } qw(transdatefrom transdateto)) {
+  if (grep { trim($form->{$_}) } qw(transdatefrom transdateto)) {
     $form->{"l_transdate"} = 1;
     push @select_tokens, 'transdate';
     for (qw(transdatefrom transdateto)) {
-      next unless $form->{$_};
+      my $value = trim($form->{$_});
+      next unless $value;
       push @where_tokens, sprintf "transdate %s ?", /from$/ ? '>=' : '<=';
-      push @bind_vars,    $form->{$_};
+      push @bind_vars,    $value;
     }
   }
 
+  # special case smart search
+  if ($form->{all}) {
+    $form->{"l_$_"} = 1 for qw(partnumber description unit sellprice lastcost cvar_packaging linetotal);
+    push @where_tokens, "p.partnumber ILIKE ? OR p.description ILIKE ?";
+    push @bind_vars,    (like($form->{all})) x 2;
+  }
+
   # special case insertdate
-  if (grep { $form->{$_} } qw(insertdatefrom insertdateto)) {
+  if (grep { trim($form->{$_}) } qw(insertdatefrom insertdateto)) {
     $form->{"l_insertdate"} = 1;
     push @select_tokens, 'insertdate';
 
@@ -875,9 +855,10 @@ sub all_parts {
     my $token = $token_builder->('insertdate');
 
     for (qw(insertdatefrom insertdateto)) {
-      next unless $form->{$_};
+      my $value = trim($form->{$_});
+      next unless $value;
       push @where_tokens, sprintf "$token %s ?", /from$/ ? '>=' : '<=';
-      push @bind_vars,    $form->{$_};
+      push @bind_vars,    $value;
     }
   }
 
@@ -901,7 +882,7 @@ sub all_parts {
     next unless $form->{$_};
     $form->{"l_$_"} = '1'; # show the column
     push @where_tokens, "$table_prefix{$_}$_ ILIKE ?";
-    push @bind_vars,    "%$form->{$_}%";
+    push @bind_vars,    like($form->{$_});
   }
 
   foreach (@simple_l_switches) {
@@ -942,11 +923,11 @@ sub all_parts {
   # fortunately makemodel doesn't need to be displayed later, so adding a special clause to where_token is sufficient.
   if ($form->{make}) {
     push @where_tokens, 'mv.name ILIKE ?';
-    push @bind_vars, "%$form->{make}%";
+    push @bind_vars, like($form->{make});
   }
   if ($form->{model}) {
     push @where_tokens, 'mm.model ILIKE ?';
-    push @bind_vars, "%$form->{model}%";
+    push @bind_vars, like($form->{model});
   }
 
   # special case: sorting by partnumber
@@ -1140,14 +1121,14 @@ sub _create_filter_for_priceupdate {
     next unless ($form->{$column});
 
     $where .= qq| AND $item ILIKE ?|;
-    push(@where_values, '%' . $form->{$column} . '%');
+    push(@where_values, like($form->{$column}));
   }
 
   foreach my $item (qw(description serialnumber)) {
     next unless ($form->{$item});
 
     $where .= qq| AND (${item} ILIKE ?)|;
-    push(@where_values, '%' . $form->{$item} . '%');
+    push(@where_values, like($form->{$item}));
   }
 
 
@@ -1181,7 +1162,7 @@ sub _create_filter_for_priceupdate {
   foreach my $column (qw(make model)) {
     next unless ($form->{$column});
     $where .= qq| AND p.id IN (SELECT DISTINCT parts_id FROM makemodel WHERE $column ILIKE ?|;
-    push(@where_values, '%' . $form->{$column} . '%');
+    push(@where_values, like($form->{$column}));
   }
 
   $main::lxdebug->leave_sub();
@@ -1326,7 +1307,7 @@ sub create_links {
   # connect to database
   my $dbh = $form->get_standard_dbh;
 
-  my @values = ('%' . $module . '%');
+  my @values = like($module);
   my $query;
 
   if ($form->{id}) {
@@ -1395,15 +1376,15 @@ sub get_parts {
 
   if ($sortorder eq "all") {
     $where .= qq| AND (partnumber ILIKE ?) AND (description ILIKE ?)|;
-    push(@values, '%' . $form->{partnumber} . '%', '%' . $form->{description} . '%');
+    push(@values, like($form->{partnumber}), like($form->{description}));
 
   } elsif ($sortorder eq "partnumber") {
     $where .= qq| AND (partnumber ILIKE ?)|;
-    push(@values, '%' . $form->{partnumber} . '%');
+    push(@values, like($form->{partnumber}));
 
   } elsif ($sortorder eq "description") {
     $where .= qq| AND (description ILIKE ?)|;
-    push(@values, '%' . $form->{description} . '%');
+    push(@values, like($form->{description}));
     $order = "description";
 
   }
@@ -1713,7 +1694,7 @@ sub prepare_parts_for_printing {
 
   $sth->finish();
 
-  my @columns = qw(ean image microfiche drawing weight);
+  my @columns = qw(ean image microfiche drawing);
 
   $query      = qq|SELECT id, | . join(', ', @columns) . qq|
                    FROM parts
@@ -1721,7 +1702,8 @@ sub prepare_parts_for_printing {
 
   my %data    = selectall_as_map($form, $dbh, $query, 'id', \@columns, @part_ids);
 
-  map { $form->{TEMPLATE_ARRAYS}{$_} = [] } (qw(make model), @columns);
+  my %template_arrays;
+  map { $template_arrays{$_} = [] } (qw(make model), @columns);
 
   foreach my $i (1 .. $rowcount) {
     my $id = $form->{"${prefix}${i}"};
@@ -1729,16 +1711,16 @@ sub prepare_parts_for_printing {
     next if (!$id);
 
     foreach (@columns) {
-      push @{ $form->{TEMPLATE_ARRAYS}{$_} }, $data{$id}->{$_};
+      push @{ $template_arrays{$_} }, $data{$id}->{$_};
     }
 
-    push @{ $form->{TEMPLATE_ARRAYS}{make} },  [];
-    push @{ $form->{TEMPLATE_ARRAYS}{model} }, [];
+    push @{ $template_arrays{make} },  [];
+    push @{ $template_arrays{model} }, [];
 
     next if (!$makemodel{$id});
 
     foreach my $ref (@{ $makemodel{$id} }) {
-      map { push @{ $form->{TEMPLATE_ARRAYS}{$_}->[-1] }, $ref->{$_} } qw(make model);
+      map { push @{ $template_arrays{$_}->[-1] }, $ref->{$_} } qw(make model);
     }
   }
 
@@ -1749,9 +1731,10 @@ sub prepare_parts_for_printing {
     my $id = $form->{"${prefix}${i}"};
     next unless $id;
 
-    push @{ $form->{TEMPLATE_ARRAYS}{part_type} },  $parts_by_id{$id}->type;
+    push @{ $template_arrays{part_type} },  $parts_by_id{$id}->type;
   }
 
+  return %template_arrays;
   $main::lxdebug->leave_sub();
 }