Ansprechpartner: cp_greeting durch cp_gender ersetzt
[kivitendo-erp.git] / SL / IS.pm
index c1ab0b6..f1c95e9 100644 (file)
--- a/SL/IS.pm
+++ b/SL/IS.pm
@@ -44,6 +44,7 @@ use SL::CVar;
 use SL::Common;
 use SL::DBUtils;
 use SL::DO;
+use SL::GenericTranslations;
 use SL::MoreCommon;
 use SL::IC;
 use Data::Dumper;
@@ -63,6 +64,7 @@ sub invoice_details {
   ($form->{terms}) = selectrow_query($form, $dbh, $query);
 
   my (@project_ids, %projectnumbers);
+  $form->{TEMPLATE_ARRAYS} = {};
 
   push(@project_ids, $form->{"globalproject_id"}) if ($form->{"globalproject_id"});
 
@@ -145,17 +147,20 @@ sub invoice_details {
        linetotal  nodiscount_linetotal tax_rate projectnumber
        price_factor price_factor_name partsgroup);
 
-  my @tax_arrays =
-    qw(taxbase tax taxdescription taxrate taxnumber);
+  my @tax_arrays = qw(taxbase tax taxdescription taxrate taxnumber);
+
+  my @payment_arrays = qw(payment paymentaccount paymentdate paymentsource paymentmemo);
+
+  map { $form->{TEMPLATE_ARRAYS}{$_} => [] } (@arrays, @tax_arrays, @payment_arrays);
 
   foreach $item (sort { $a->[1] cmp $b->[1] } @partsgroup) {
     $i = $item->[0];
 
     if ($item->[1] ne $sameitem) {
-      push(@{ $form->{description} }, qq|$item->[1]|);
+      push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, qq|$item->[1]|);
       $sameitem = $item->[1];
 
-      map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
+      map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays));
     }
 
     $form->{"qty_$i"} = $form->parse_amount($myconfig, $form->{"qty_$i"});
@@ -179,40 +184,41 @@ sub invoice_details {
 
       my $price_factor = $price_factors{$form->{"price_factor_id_$i"}} || { 'factor' => 1 };
 
-      push @{ $form->{runningnumber} },     $position;
-      push @{ $form->{number} },            $form->{"partnumber_$i"};
-      push @{ $form->{serialnumber} },      $form->{"serialnumber_$i"};
-      push @{ $form->{bin} },               $form->{"bin_$i"};
-      push @{ $form->{"partnotes"} },       $form->{"partnotes_$i"};
-      push @{ $form->{description} },       $form->{"description_$i"};
-      push @{ $form->{longdescription} },   $form->{"longdescription_$i"};
-      push @{ $form->{qty} },               $form->format_amount($myconfig, $form->{"qty_$i"});
-      push @{ $form->{unit} },              $form->{"unit_$i"};
-      push @{ $form->{deliverydate_oe} },   $form->{"deliverydate_$i"};
-      push @{ $form->{sellprice} },         $form->{"sellprice_$i"};
-      push @{ $form->{ordnumber_oe} },      $form->{"ordnumber_$i"};
-      push @{ $form->{transdate_oe} },      $form->{"transdate_$i"};
-      push @{ $form->{invnumber} },         $form->{"invnumber"};
-      push @{ $form->{invdate} },           $form->{"invdate"};
-      push @{ $form->{price_factor} },      $price_factor->{formatted_factor};
-      push @{ $form->{price_factor_name} }, $price_factor->{description};
-      push @{ $form->{partsgroup} },        $form->{"partsgroup_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{runningnumber} },     $position;
+      push @{ $form->{TEMPLATE_ARRAYS}->{number} },            $form->{"partnumber_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{serialnumber} },      $form->{"serialnumber_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{bin} },               $form->{"bin_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{partnotes} },         $form->{"partnotes_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{description} },       $form->{"description_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{longdescription} },   $form->{"longdescription_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{qty} },               $form->format_amount($myconfig, $form->{"qty_$i"});
+      push @{ $form->{TEMPLATE_ARRAYS}->{unit} },              $form->{"unit_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{deliverydate_oe} },   $form->{"deliverydate_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{sellprice} },         $form->{"sellprice_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{ordnumber_oe} },      $form->{"ordnumber_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{transdate_oe} },      $form->{"transdate_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{invnumber} },         $form->{"invnumber"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{invdate} },           $form->{"invdate"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{price_factor} },      $price_factor->{formatted_factor};
+      push @{ $form->{TEMPLATE_ARRAYS}->{price_factor_name} }, $price_factor->{description};
+      push @{ $form->{TEMPLATE_ARRAYS}->{partsgroup} },        $form->{"partsgroup_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{reqdate} },           $form->{"reqdate_$i"};
 
       if ($form->{lizenzen}) {
         if ($form->{"licensenumber_$i"}) {
           $query = qq|SELECT licensenumber, validuntil FROM license WHERE id = ?|;
           my ($licensenumber, $validuntil) = selectrow_query($form, $dbh, $query, conv_i($form->{"licensenumber_$i"}));
-          push(@{ $form->{licensenumber} }, $licensenumber);
-          push(@{ $form->{validuntil} }, $locale->date($myconfig, $validuntil, 0));
+          push(@{ $form->{TEMPLATE_ARRAYS}->{licensenumber} }, $licensenumber);
+          push(@{ $form->{TEMPLATE_ARRAYS}->{validuntil} }, $locale->date($myconfig, $validuntil, 0));
 
         } else {
-          push(@{ $form->{licensenumber} }, "");
-          push(@{ $form->{validuntil} },    "");
+          push(@{ $form->{TEMPLATE_ARRAYS}->{licensenumber} }, "");
+          push(@{ $form->{TEMPLATE_ARRAYS}->{validuntil} },    "");
         }
       }
 
       # listprice
-      push(@{ $form->{listprice} }, $form->{"listprice_$i"});
+      push(@{ $form->{TEMPLATE_ARRAYS}->{listprice} }, $form->{"listprice_$i"});
 
       my $sellprice     = $form->parse_amount($myconfig, $form->{"sellprice_$i"});
       my ($dec)         = ($sellprice =~ /\.(\d+)/);
@@ -226,12 +232,12 @@ sub invoice_details {
       my $nodiscount_linetotal = $form->round_amount($form->{"qty_$i"} * $sellprice / $price_factor->{factor}, 2);
       $form->{"netprice_$i"}   = $form->round_amount($form->{"qty_$i"} ? ($linetotal / $form->{"qty_$i"}) : 0, 2);
 
-      push @{ $form->{netprice} }, ($form->{"netprice_$i"} != 0) ? $form->format_amount($myconfig, $form->{"netprice_$i"}, $decimalplaces) : '';
+      push @{ $form->{TEMPLATE_ARRAYS}->{netprice} }, ($form->{"netprice_$i"} != 0) ? $form->format_amount($myconfig, $form->{"netprice_$i"}, $decimalplaces) : '';
 
       $linetotal = ($linetotal != 0) ? $linetotal : '';
 
-      push @{ $form->{discount} },   ($discount  != 0) ? $form->format_amount($myconfig, $discount * -1, 2) : '';
-      push @{ $form->{p_discount} }, $form->{"discount_$i"};
+      push @{ $form->{TEMPLATE_ARRAYS}->{discount} },   ($discount  != 0) ? $form->format_amount($myconfig, $discount * -1, 2) : '';
+      push @{ $form->{TEMPLATE_ARRAYS}->{p_discount} }, $form->{"discount_$i"};
 
       $form->{total}            += $linetotal;
       $form->{nodiscount_total} += $nodiscount_linetotal;
@@ -243,26 +249,26 @@ sub invoice_details {
       }
 
       if ($form->{"subtotal_$i"} && $subtotal_header && ($subtotal_header != $i)) {
-        push @{ $form->{discount_sub} },   $form->format_amount($myconfig, $discount_subtotal,   2);
-        push @{ $form->{nodiscount_sub} }, $form->format_amount($myconfig, $nodiscount_subtotal, 2);
+        push @{ $form->{TEMPLATE_ARRAYS}->{discount_sub} },   $form->format_amount($myconfig, $discount_subtotal,   2);
+        push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_sub} }, $form->format_amount($myconfig, $nodiscount_subtotal, 2);
 
         $discount_subtotal   = 0;
         $nodiscount_subtotal = 0;
         $subtotal_header     = 0;
 
       } else {
-        push @{ $form->{discount_sub} },   "";
-        push @{ $form->{nodiscount_sub} }, "";
+        push @{ $form->{TEMPLATE_ARRAYS}->{discount_sub} },   "";
+        push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_sub} }, "";
       }
 
       if (!$form->{"discount_$i"}) {
         $nodiscount += $linetotal;
       }
 
-      push @{ $form->{linetotal} }, $form->format_amount($myconfig, $linetotal, 2);
-      push @{ $form->{nodiscount_linetotal} }, $form->format_amount($myconfig, $nodiscount_linetotal, 2);
+      push @{ $form->{TEMPLATE_ARRAYS}->{linetotal} }, $form->format_amount($myconfig, $linetotal, 2);
+      push @{ $form->{TEMPLATE_ARRAYS}->{nodiscount_linetotal} }, $form->format_amount($myconfig, $nodiscount_linetotal, 2);
 
-      push(@{ $form->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}});
+      push(@{ $form->{TEMPLATE_ARRAYS}->{projectnumber} }, $projectnumbers{$form->{"project_id_$i"}});
 
       @taxaccounts = split(/ /, $form->{"taxaccounts_$i"});
       $taxrate     = 0;
@@ -304,7 +310,7 @@ sub invoice_details {
         }
       }
       my $tax_rate = $taxrate * 100;
-      push(@{ $form->{tax_rate} }, qq|$tax_rate|);
+      push(@{ $form->{TEMPLATE_ARRAYS}->{tax_rate} }, qq|$tax_rate|);
       if ($form->{"assembly_$i"}) {
         $sameitem = "";
 
@@ -327,18 +333,18 @@ sub invoice_details {
 
         while (my $ref = $sth->fetchrow_hashref('NAME_lc')) {
           if ($form->{groupitems} && $ref->{partsgroup} ne $sameitem) {
-            map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
+            map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays));
             $sameitem = ($ref->{partsgroup}) ? $ref->{partsgroup} : "--";
-            push(@{ $form->{description} }, $sameitem);
+            push(@{ $form->{TEMPLATE_ARRAYS}->{description} }, $sameitem);
           }
 
           map { $form->{"a_$_"} = $ref->{$_} } qw(partnumber description);
 
-          push(@{ $form->{description} },
+          push(@{ $form->{TEMPLATE_ARRAYS}->{description} },
                $form->format_amount($myconfig, $ref->{qty} * $form->{"qty_$i"}
                  )
                  . qq| -- $form->{"a_partnumber"}, $form->{"a_description"}|);
-          map({ push(@{ $form->{$_} }, "") } grep({ $_ ne "description" } @arrays));
+          map({ push(@{ $form->{TEMPLATE_ARRAYS}->{$_} }, "") } grep({ $_ ne "description" } @arrays));
 
         }
         $sth->finish;
@@ -347,25 +353,24 @@ sub invoice_details {
   }
 
   foreach my $item (sort keys %taxaccounts) {
-    push(@{ $form->{taxbase} },
-          $form->format_amount($myconfig, $taxbase{$item}, 2));
-
     $tax += $taxamount = $form->round_amount($taxaccounts{$item}, 2);
 
-    push(@{ $form->{tax} }, $form->format_amount($myconfig, $taxamount, 2));
-    push(@{ $form->{taxdescription} }, $form->{"${item}_description"}  . q{ } . 100 * $form->{"${item}_rate"} . q{%});
-    push(@{ $form->{taxrate} },
-          $form->format_amount($myconfig, $form->{"${item}_rate"} * 100));
-    push(@{ $form->{taxnumber} }, $form->{"${item}_taxnumber"});
+    push(@{ $form->{TEMPLATE_ARRAYS}->{taxbase} },        $form->format_amount($myconfig, $taxbase{$item}, 2));
+    push(@{ $form->{TEMPLATE_ARRAYS}->{tax} },            $form->format_amount($myconfig, $taxamount,      2));
+    push(@{ $form->{TEMPLATE_ARRAYS}->{taxrate} },        $form->format_amount($myconfig, $form->{"${item}_rate"} * 100));
+    push(@{ $form->{TEMPLATE_ARRAYS}->{taxdescription} }, $form->{"${item}_description"} . q{ } . 100 * $form->{"${item}_rate"} . q{%});
+    push(@{ $form->{TEMPLATE_ARRAYS}->{taxnumber} },      $form->{"${item}_taxnumber"});
   }
 
   for my $i (1 .. $form->{paidaccounts}) {
     if ($form->{"paid_$i"}) {
-      push(@{ $form->{payment} }, $form->{"paid_$i"});
       my ($accno, $description) = split(/--/, $form->{"AR_paid_$i"});
-      push(@{ $form->{paymentaccount} }, $description);
-      push(@{ $form->{paymentdate} },    $form->{"datepaid_$i"});
-      push(@{ $form->{paymentsource} },  $form->{"source_$i"});
+
+      push(@{ $form->{TEMPLATE_ARRAYS}->{payment} },        $form->{"paid_$i"});
+      push(@{ $form->{TEMPLATE_ARRAYS}->{paymentaccount} }, $description);
+      push(@{ $form->{TEMPLATE_ARRAYS}->{paymentdate} },    $form->{"datepaid_$i"});
+      push(@{ $form->{TEMPLATE_ARRAYS}->{paymentsource} },  $form->{"source_$i"});
+      push(@{ $form->{TEMPLATE_ARRAYS}->{paymentmemo} },    $form->{"memo_$i"});
 
       $form->{paid} += $form->parse_amount($myconfig, $form->{"paid_$i"});
     }
@@ -419,6 +424,8 @@ sub customer_details {
   # connect to database
   my $dbh = $form->dbconnect($myconfig);
 
+  my $language_id = $form->{language_id};
+
   # get contact id, set it if nessessary
   $form->{cp_id} *= 1;
 
@@ -480,6 +487,12 @@ sub customer_details {
                                                     'trans_id' => $form->{customer_id});
   map { $form->{"vc_cvar_$_->{name}"} = $_->{value} } @{ $custom_variables };
 
+  $form->{cp_greeting} = GenericTranslations->get('dbh'              => $dbh,
+                                                  'translation_type' => 'greetings::' . ($form->{cp_gender} eq 'f' ? 'female' : 'male'),
+                                                  'language_id'      => $language_id,
+                                                  'allow_fallback'   => 1);
+
+
   $dbh->disconnect;
 
   $main::lxdebug->leave_sub();
@@ -550,6 +563,7 @@ sub post_invoice {
   my %price_factors = map { $_->{id} => $_->{factor} } @{ $form->{ALL_PRICE_FACTORS} };
   my $price_factor;
 
+  $form->{amount}      = {};
   $form->{amount_cogs} = {};
 
   foreach my $i (1 .. $form->{rowcount}) {
@@ -1060,34 +1074,34 @@ sub _delete_payments {
 
   my ($self, $form, $dbh) = @_;
 
-  my @delete_oids;
+  my @delete_acc_trans_ids;
 
   # Delete old payment entries from acc_trans.
   my $query =
-    qq|SELECT oid
+    qq|SELECT acc_trans_id
        FROM acc_trans
        WHERE (trans_id = ?) AND fx_transaction
 
        UNION
 
-       SELECT at.oid
+       SELECT at.acc_trans_id
        FROM acc_trans at
        LEFT JOIN chart c ON (at.chart_id = c.id)
        WHERE (trans_id = ?) AND (c.link LIKE '%AR_paid%')|;
-  push @delete_oids, selectall_array_query($form, $dbh, $query, conv_i($form->{id}), conv_i($form->{id}));
+  push @delete_acc_trans_ids, selectall_array_query($form, $dbh, $query, conv_i($form->{id}), conv_i($form->{id}));
 
   $query =
-    qq|SELECT at.oid
+    qq|SELECT at.acc_trans_id
        FROM acc_trans at
        LEFT JOIN chart c ON (at.chart_id = c.id)
        WHERE (trans_id = ?)
          AND ((c.link = 'AR') OR (c.link LIKE '%:AR') OR (c.link LIKE 'AR:%'))
-       ORDER BY at.oid
+       ORDER BY at.acc_trans_id
        OFFSET 1|;
-  push @delete_oids, selectall_array_query($form, $dbh, $query, conv_i($form->{id}));
+  push @delete_acc_trans_ids, selectall_array_query($form, $dbh, $query, conv_i($form->{id}));
 
-  if (@delete_oids) {
-    $query = qq|DELETE FROM acc_trans WHERE oid IN (| . join(", ", @delete_oids) . qq|)|;
+  if (@delete_acc_trans_ids) {
+    $query = qq|DELETE FROM acc_trans WHERE acc_trans_id IN (| . join(", ", @delete_acc_trans_ids) . qq|)|;
     do_query($form, $dbh, $query);
   }
 
@@ -1144,7 +1158,7 @@ sub post_payment {
        LEFT JOIN chart c ON (at.chart_id = c.id)
        WHERE (trans_id = ?)
          AND ((c.link = 'AR') OR (c.link LIKE '%:AR') OR (c.link LIKE 'AR:%'))
-       ORDER BY at.oid
+       ORDER BY at.acc_trans_id
        LIMIT 1|;
 
   ($form->{AR}) = selectfirst_array_query($form, $dbh, $query, conv_i($form->{id}));
@@ -1212,6 +1226,9 @@ sub cogs {
   $main::lxdebug->enter_sub();
 
   my ($dbh, $form, $id, $totalqty, $basefactor, $row) = @_;
+
+  $basefactor ||= 1;
+
   $form->{taxzone_id} *=1;
   my $transdate  = $form->{invdate} ? $dbh->quote($form->{invdate}) : "current_date";
   my $taxzone_id = $form->{"taxzone_id"} * 1;
@@ -1242,7 +1259,7 @@ sub cogs {
 
     # total expenses and inventory
     # sellprice is the cost of the item
-    my $linetotal = $form->round_amount(($ref->{sellprice} * $qty) / $basefactor, 2);
+    my $linetotal = $form->round_amount(($ref->{sellprice} * $qty) / ( $basefactor || 1 ), 2);
 
     if (!$main::eur) {
       $ref->{expense_accno} = ($form->{"expense_accno_$row"}) ? $form->{"expense_accno_$row"} : $ref->{expense_accno};
@@ -1568,7 +1585,7 @@ sub get_customer {
   # get customer
   $query =
     qq|SELECT
-         c.id AS customer_id, c.name AS customer, c.discount, c.creditlimit, c.terms,
+         c.id AS customer_id, c.name AS customer, c.discount as customer_discount, c.creditlimit, c.terms,
          c.email, c.cc, c.bcc, c.language_id, c.payment_id,
          c.street, c.zipcode, c.city, c.country,
          c.notes AS intnotes, c.klass as customer_klass, c.taxzone_id, c.salesman_id,
@@ -1580,6 +1597,9 @@ sub get_customer {
        WHERE c.id = ?|;
   push @values, $cid;
   $ref = selectfirst_hashref_query($form, $dbh, $query, @values);
+
+  delete $ref->{salesman_id} if !$ref->{salesman_id};
+
   map { $form->{$_} = $ref->{$_} } keys %$ref;
 
   $query =
@@ -1694,13 +1714,19 @@ sub retrieve_item {
   my $where = qq|NOT p.obsolete = '1'|;
   my @values;
 
-  foreach my $column (qw(p.partnumber p.description pgpartsgroup)) {
+  foreach my $column (qw(p.partnumber p.description pgpartsgroup )) {
     my ($table, $field) = split m/\./, $column;
     next if !$form->{"${field}_${i}"};
     $where .= qq| AND lower(${column}) ILIKE ?|;
     push @values, '%' . $form->{"${field}_${i}"} . '%';
   }
 
+  #Es soll auch nach EAN gesucht werden, ohne Einschränkung durch Beschreibung
+  if ($form->{"partnumber_$i"} && !$form->{"description_$i"}) {
+       $where .= qq| OR (NOT p.obsolete = '1' AND p.ean = ? )|;
+       push @values, $form->{"partnumber_$i"};
+  }
+
   if ($form->{"description_$i"}) {
     $where .= qq| ORDER BY p.description|;
   } else {
@@ -2012,7 +2038,8 @@ sub get_pricegroups_for_parts {
 
           } else {
 
-            $form->{"sellprice_$i"} = $pkr->{price};
+# this sub should not set anything and only return. --sschoeling, 20090506
+#            $form->{"sellprice_$i"} = $pkr->{price};
           }
 
         } elsif ($pkr->{price} == $pkr->{default_sellprice}) {