Beim Versenden per Email eine anständige Überschrift anzeigen und nicht "email oe".
[kivitendo-erp.git] / SL / Form.pm
index 3719515..d1dbfb6 100644 (file)
@@ -40,6 +40,7 @@ use Data::Dumper;
 
 use Cwd;
 use HTML::Template;
+use Template;
 use SL::Template;
 use CGI::Ajax;
 use SL::DBUtils;
@@ -49,6 +50,15 @@ use SL::User;
 use SL::Common;
 use CGI;
 
+my $standard_dbh;
+
+sub DESTROY {
+  if ($standard_dbh) {
+    $standard_dbh->disconnect();
+    undef $standard_dbh;
+  }
+}
+
 sub _input_to_hash {
   $main::lxdebug->enter_sub(2);
 
@@ -171,7 +181,7 @@ sub new {
   $self->{action} = lc $self->{action};
   $self->{action} =~ s/( |-|,|\#)/_/g;
 
-  $self->{version}   = "2.4.2";
+  $self->{version}   = "2.4.3";
 
   $main::lxdebug->leave_sub();
 
@@ -465,7 +475,7 @@ sub header {
   $main::lxdebug->leave_sub();
 }
 
-sub parse_html_template {
+sub _prepare_html_template {
   $main::lxdebug->enter_sub();
 
   my ($self, $file, $additional_params) = @_;
@@ -499,14 +509,6 @@ sub parse_html_template {
     die($info);
   }
 
-  my $template = HTML::Template->new("filename" => $file,
-                                     "die_on_bad_params" => 0,
-                                     "strict" => 0,
-                                     "case_sensitive" => 1,
-                                     "loop_context_vars" => 1,
-                                     "global_vars" => 1);
-
-  $additional_params = {} unless ($additional_params);
   if ($self->{"DEBUG"}) {
     $additional_params->{"DEBUG"} = $self->{"DEBUG"};
   }
@@ -530,16 +532,68 @@ sub parse_html_template {
   $additional_params->{"conf_latex_templates"}        = $main::latex;
   $additional_params->{"conf_opendocument_templates"} = $main::opendocument_templates;
 
-  my @additional_param_names = keys(%{$additional_params});
+  if (%main::debug_options) {
+    map { $additional_params->{'DEBUG_' . uc($_)} = $main::debug_options{$_} } keys %main::debug_options;
+  }
+
+  $main::lxdebug->leave_sub();
+
+  return $file;
+}
+
+sub parse_html_template {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $file, $additional_params) = @_;
+
+  $additional_params ||= { };
+
+  $file = $self->_prepare_html_template($file, $additional_params);
+
+  my $template = HTML::Template->new("filename" => $file,
+                                     "die_on_bad_params" => 0,
+                                     "strict" => 0,
+                                     "case_sensitive" => 1,
+                                     "loop_context_vars" => 1,
+                                     "global_vars" => 1);
+
   foreach my $key ($template->param()) {
-    my $param = $self->{$key};
-    $param = $additional_params->{$key} if (grep(/^${key}$/, @additional_param_names));
+    my $param = $additional_params->{$key} || $self->{$key};
     $param = [] if (($template->query("name" => $key) eq "LOOP") && (ref($param) ne "ARRAY"));
     $template->param($key => $param);
   }
 
   my $output = $template->output();
 
+  $output = $main::locale->{iconv}->convert($output) if ($main::locale);
+
+  $main::lxdebug->leave_sub();
+
+  return $output;
+}
+
+sub parse_html_template2 {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $file, $additional_params) = @_;
+
+  $additional_params ||= { };
+
+  $file = $self->_prepare_html_template($file, $additional_params);
+
+  my $template = Template->new({ 'INTERPOLATE' => 0,
+                                 'EVAL_PERL'   => 0,
+                                 'ABSOLUTE'    => 1,
+                                 'CACHE_SIZE'  => 0,
+                               }) || die;
+
+  map { $additional_params->{$_} ||= $self->{$_} } keys %{ $self };
+
+  my $output;
+  $template->process($file, $additional_params, \$output);
+
+  $output = $main::locale->{iconv}->convert($output) if ($main::locale);
+
   $main::lxdebug->leave_sub();
 
   return $output;
@@ -636,7 +690,9 @@ sub redirect {
 
   if ($self->{callback}) {
 
-    ($script, $argv) = split(/\?/, $self->{callback});
+    ($script, $argv) = split(/\?/, $self->{callback}, 2);
+    $script =~ s|.*/||;
+    $script =~ s|[^a-zA-Z_\.]||g;
     exec("perl", "$script", $argv);
 
   } else {
@@ -926,8 +982,10 @@ Content-Length: $numbytes
   $main::lxdebug->leave_sub();
 }
 
-sub generate_attachment_filename {
-  my ($self) = @_;
+sub get_formname_translation {
+  my ($self, $formname) = @_;
+
+  $formname ||= $self->{formname};
 
   my %formname_translations = (
      bin_list            => $main::locale->text('Bin List'),
@@ -944,7 +1002,13 @@ sub generate_attachment_filename {
      storno_packing_list => $main::locale->text('Storno Packing List'),
   );
 
-  my $attachment_filename = $formname_translations{$self->{"formname"}};
+  return $formname_translations{$formname}
+}
+
+sub generate_attachment_filename {
+  my ($self) = @_;
+
+  my $attachment_filename = $self->get_formname_translation();
   my $prefix = 
       (grep { $self->{"type"} eq $_ } qw(invoice credit_note)) ? "inv"
     : ($self->{"type"} =~ /_quotation$/)                       ? "quo"
@@ -1057,7 +1121,7 @@ sub dbconnect_noauto {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig) = @_;
-
+  
   # connect to database
   $dbh =
     DBI->connect($myconfig->{dbconnect}, $myconfig->{dbuser},
@@ -1074,6 +1138,18 @@ sub dbconnect_noauto {
   return $dbh;
 }
 
+sub get_standard_dbh {
+  $main::lxdebug->enter_sub(2);
+
+  my ($self, $myconfig) = @_;
+
+  $standard_dbh ||= $self->dbconnect_noauto($myconfig);
+
+  $main::lxdebug->leave_sub(2);
+
+  return $standard_dbh;
+}
+
 sub update_balance {
   $main::lxdebug->enter_sub();
 
@@ -1106,6 +1182,16 @@ sub update_exchangerate {
   if ($curr eq '') {
     $main::lxdebug->leave_sub();
     return;
+  }  
+  my $query = qq|SELECT curr FROM defaults|;
+
+  my ($currency) = selectrow_query($self, $dbh, $query);
+  my ($defaultcurrency) = split m/:/, $currency;
+
+
+  if ($curr eq $defaultcurrency) {
+    $main::lxdebug->leave_sub();
+    return;
   }
 
   my $query = qq|SELECT e.curr FROM exchangerate e
@@ -1113,6 +1199,16 @@ sub update_exchangerate {
                  FOR UPDATE|;
   my $sth = prepare_execute_query($self, $dbh, $query, $curr, $transdate);
 
+  if ($buy == 0) {
+    $buy = "";
+  }
+  if ($sell == 0) {
+    $sell = "";
+  }
+
+  $buy = conv_i($buy, "NULL");
+  $sell = conv_i($sell, "NULL");
+
   my $set;
   if ($buy != 0 && $sell != 0) {
     $set = "buy = $buy, sell = $sell";
@@ -1127,6 +1223,7 @@ sub update_exchangerate {
                 SET $set
                 WHERE curr = ?
                 AND transdate = ?|;
+    
   } else {
     $query = qq|INSERT INTO exchangerate (curr, buy, sell, transdate)
                 VALUES (?, $buy, $sell, ?)|;
@@ -1144,12 +1241,15 @@ sub save_exchangerate {
 
   my $dbh = $self->dbconnect($myconfig);
 
-  my ($buy, $sell) = (0, 0);
+  my ($buy, $sell);
+
   $buy  = $rate if $fld eq 'buy';
   $sell = $rate if $fld eq 'sell';
 
+
   $self->update_exchangerate($dbh, $currency, $transdate, $buy, $sell);
 
+
   $dbh->disconnect;
 
   $main::lxdebug->leave_sub();
@@ -1165,13 +1265,21 @@ sub get_exchangerate {
     return 1;
   }
 
+  my $query = qq|SELECT curr FROM defaults|;
+
+  my ($currency) = selectrow_query($self, $dbh, $query);
+  my ($defaultcurrency) = split m/:/, $currency;
+
+  if ($currency eq $defaultcurrency) {
+    $main::lxdebug->leave_sub();
+    return 1;
+  }
+
   my $query = qq|SELECT e.$fld FROM exchangerate e
                  WHERE e.curr = ? AND e.transdate = ?|;
   my ($exchangerate) = selectrow_query($self, $dbh, $query, $curr, $transdate);
 
-  if (!$exchangerate) {
-    $exchangerate = 1;
-  }
+
 
   $main::lxdebug->leave_sub();
 
@@ -1188,103 +1296,125 @@ sub check_exchangerate {
     return "";
   }
 
-  my $dbh = $self->dbconnect($myconfig);
+  my ($defaultcurrency) = $self->get_default_currency($myconfig);
 
+  if ($currency eq $defaultcurrency) {
+    $main::lxdebug->leave_sub();
+    return 1;
+  }
+
+  my $dbh   = $self->get_standard_dbh($myconfig);
   my $query = qq|SELECT e.$fld FROM exchangerate e
                  WHERE e.curr = ? AND e.transdate = ?|;
+
   my ($exchangerate) = selectrow_query($self, $dbh, $query, $currency, $transdate);
-  $dbh->disconnect;
+
+  $exchangerate = 1 if ($exchangerate eq "");
 
   $main::lxdebug->leave_sub();
 
   return $exchangerate;
 }
 
+sub get_default_currency {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $myconfig) = @_;
+  my $dbh = $self->get_standard_dbh($myconfig);
+
+  my $query = qq|SELECT curr FROM defaults|;
+
+  my ($curr)            = selectrow_query($self, $dbh, $query);
+  my ($defaultcurrency) = split m/:/, $curr;
+
+  $main::lxdebug->leave_sub();
+
+  return $defaultcurrency;
+}
+
+
 sub set_payment_options {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig, $transdate) = @_;
 
-  if ($self->{payment_id}) {
+  return $main::lxdebug->leave_sub() unless ($self->{payment_id});
 
-    my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
 
-    my $query =
-      qq|SELECT p.terms_netto, p.terms_skonto, p.percent_skonto, p.description_long | .
-      qq|FROM payment_terms p | .
-      qq|WHERE p.id = ?|;
+  my $query =
+    qq|SELECT p.terms_netto, p.terms_skonto, p.percent_skonto, p.description_long | .
+    qq|FROM payment_terms p | .
+    qq|WHERE p.id = ?|;
 
-    ($self->{terms_netto}, $self->{terms_skonto}, $self->{percent_skonto},
-     $self->{payment_terms}) =
-       selectrow_query($self, $dbh, $query, $self->{payment_id});
+  ($self->{terms_netto}, $self->{terms_skonto}, $self->{percent_skonto},
+   $self->{payment_terms}) =
+     selectrow_query($self, $dbh, $query, $self->{payment_id});
 
-    if ($transdate eq "") {
-      if ($self->{invdate}) {
-        $transdate = $self->{invdate};
-      } else {
-        $transdate = $self->{transdate};
-      }
+  if ($transdate eq "") {
+    if ($self->{invdate}) {
+      $transdate = $self->{invdate};
+    } else {
+      $transdate = $self->{transdate};
     }
+  }
 
-    $query =
-      qq|SELECT ?::date + ?::integer AS netto_date, ?::date + ?::integer AS skonto_date | .
-      qq|FROM payment_terms|;
-    ($self->{netto_date}, $self->{skonto_date}) =
-      selectrow_query($self, $dbh, $query, $transdate, $self->{terms_netto}, $transdate, $self->{terms_skonto});
-
-    my $total = ($self->{invtotal}) ? $self->{invtotal} : $self->{ordtotal};
-    my $skonto_amount = $self->parse_amount($myconfig, $total) *
-      $self->{percent_skonto};
-
-    $self->{skonto_amount} =
-      $self->format_amount($myconfig, $skonto_amount, 2);
-
-    if ($self->{"language_id"}) {
-      $query =
-        qq|SELECT t.description_long, l.output_numberformat, l.output_dateformat, l.output_longdates | .
-        qq|FROM translation_payment_terms t | .
-        qq|LEFT JOIN language l ON t.language_id = l.id | .
-        qq|WHERE (t.language_id = ?) AND (t.payment_terms_id = ?)|;
-      my ($description_long, $output_numberformat, $output_dateformat,
-        $output_longdates) =
-        selectrow_query($self, $dbh, $query,
-                        $self->{"language_id"}, $self->{"payment_id"});
-
-      $self->{payment_terms} = $description_long if ($description_long);
-
-      if ($output_dateformat) {
-        foreach my $key (qw(netto_date skonto_date)) {
-          $self->{$key} =
-            $main::locale->reformat_date($myconfig, $self->{$key},
-                                         $output_dateformat,
-                                         $output_longdates);
-        }
-      }
+  $query =
+    qq|SELECT ?::date + ?::integer AS netto_date, ?::date + ?::integer AS skonto_date | .
+    qq|FROM payment_terms|;
+  ($self->{netto_date}, $self->{skonto_date}) =
+    selectrow_query($self, $dbh, $query, $transdate, $self->{terms_netto}, $transdate, $self->{terms_skonto});
 
-      if ($output_numberformat &&
-          ($output_numberformat ne $myconfig->{"numberformat"})) {
-        my $saved_numberformat = $myconfig->{"numberformat"};
-        $myconfig->{"numberformat"} = $output_numberformat;
-        $self->{skonto_amount} =
-          $self->format_amount($myconfig, $skonto_amount, 2);
-        $myconfig->{"numberformat"} = $saved_numberformat;
+  my $total = ($self->{invtotal}) ? $self->{invtotal} : $self->{ordtotal};
+  my $skonto_amount = $self->parse_amount($myconfig, $total) *
+    $self->{percent_skonto};
+
+  $self->{skonto_amount} =
+    $self->format_amount($myconfig, $skonto_amount, 2);
+
+  if ($self->{"language_id"}) {
+    $query =
+      qq|SELECT t.description_long, l.output_numberformat, l.output_dateformat, l.output_longdates | .
+      qq|FROM translation_payment_terms t | .
+      qq|LEFT JOIN language l ON t.language_id = l.id | .
+      qq|WHERE (t.language_id = ?) AND (t.payment_terms_id = ?)|;
+    my ($description_long, $output_numberformat, $output_dateformat,
+      $output_longdates) =
+      selectrow_query($self, $dbh, $query,
+                      $self->{"language_id"}, $self->{"payment_id"});
+
+    $self->{payment_terms} = $description_long if ($description_long);
+
+    if ($output_dateformat) {
+      foreach my $key (qw(netto_date skonto_date)) {
+        $self->{$key} =
+          $main::locale->reformat_date($myconfig, $self->{$key},
+                                       $output_dateformat,
+                                       $output_longdates);
       }
     }
 
-    $self->{payment_terms} =~ s/<%netto_date%>/$self->{netto_date}/g;
-    $self->{payment_terms} =~ s/<%skonto_date%>/$self->{skonto_date}/g;
-    $self->{payment_terms} =~ s/<%skonto_amount%>/$self->{skonto_amount}/g;
-    $self->{payment_terms} =~ s/<%total%>/$self->{total}/g;
-    $self->{payment_terms} =~ s/<%invtotal%>/$self->{invtotal}/g;
-    $self->{payment_terms} =~ s/<%currency%>/$self->{currency}/g;
-    $self->{payment_terms} =~ s/<%terms_netto%>/$self->{terms_netto}/g;
-    $self->{payment_terms} =~ s/<%account_number%>/$self->{account_number}/g;
-    $self->{payment_terms} =~ s/<%bank%>/$self->{bank}/g;
-    $self->{payment_terms} =~ s/<%bank_code%>/$self->{bank_code}/g;
-
-    $dbh->disconnect;
+    if ($output_numberformat &&
+        ($output_numberformat ne $myconfig->{"numberformat"})) {
+      my $saved_numberformat = $myconfig->{"numberformat"};
+      $myconfig->{"numberformat"} = $output_numberformat;
+      $self->{skonto_amount} =
+        $self->format_amount($myconfig, $skonto_amount, 2);
+      $myconfig->{"numberformat"} = $saved_numberformat;
+    }
   }
 
+  $self->{payment_terms} =~ s/<%netto_date%>/$self->{netto_date}/g;
+  $self->{payment_terms} =~ s/<%skonto_date%>/$self->{skonto_date}/g;
+  $self->{payment_terms} =~ s/<%skonto_amount%>/$self->{skonto_amount}/g;
+  $self->{payment_terms} =~ s/<%total%>/$self->{total}/g;
+  $self->{payment_terms} =~ s/<%invtotal%>/$self->{invtotal}/g;
+  $self->{payment_terms} =~ s/<%currency%>/$self->{currency}/g;
+  $self->{payment_terms} =~ s/<%terms_netto%>/$self->{terms_netto}/g;
+  $self->{payment_terms} =~ s/<%account_number%>/$self->{account_number}/g;
+  $self->{payment_terms} =~ s/<%bank%>/$self->{bank}/g;
+  $self->{payment_terms} =~ s/<%bank_code%>/$self->{bank_code}/g;
+
   $main::lxdebug->leave_sub();
 
 }
@@ -1297,10 +1427,9 @@ sub get_template_language {
   my $template_code = "";
 
   if ($self->{language_id}) {
-    my $dbh = $self->dbconnect($myconfig);
+    my $dbh = $self->get_standard_dbh($myconfig);
     my $query = qq|SELECT template_code FROM language WHERE id = ?|;
     ($template_code) = selectrow_query($self, $dbh, $query, $self->{language_id});
-    $dbh->disconnect;
   }
 
   $main::lxdebug->leave_sub();
@@ -1316,10 +1445,9 @@ sub get_printer_code {
   my $template_code = "";
 
   if ($self->{printer_id}) {
-    my $dbh = $self->dbconnect($myconfig);
+    my $dbh = $self->get_standard_dbh($myconfig);
     my $query = qq|SELECT template_code, printer_command FROM printers WHERE id = ?|;
     ($template_code, $self->{printer_command}) = selectrow_query($self, $dbh, $query, $self->{printer_id});
-    $dbh->disconnect;
   }
 
   $main::lxdebug->leave_sub();
@@ -1335,11 +1463,10 @@ sub get_shipto {
   my $template_code = "";
 
   if ($self->{shipto_id}) {
-    my $dbh = $self->dbconnect($myconfig);
+    my $dbh = $self->get_standard_dbh($myconfig);
     my $query = qq|SELECT * FROM shipto WHERE shipto_id = ?|;
     my $ref = selectfirst_hashref_query($self, $dbh, $query, $self->{shipto_id});
     map({ $self->{$_} = $ref->{$_} } keys(%$ref));
-    $dbh->disconnect;
   }
 
   $main::lxdebug->leave_sub();
@@ -1352,6 +1479,7 @@ sub add_shipto {
 
   my $shipto;
   my @values;
+
   foreach my $item (qw(name department_1 department_2 street zipcode city country
                        contact phone fax email)) {
     if ($self->{"shipto$item"}) {
@@ -1359,6 +1487,7 @@ sub add_shipto {
     }
     push(@values, $self->{"shipto${item}"});
   }
+
   if ($shipto) {
     if ($self->{shipto_id}) {
       my $query = qq|UPDATE shipto set
@@ -1387,8 +1516,10 @@ sub add_shipto {
                        shiptocontact = ? AND
                        shiptophone = ? AND
                        shiptofax = ? AND
-                       shiptoemail = ?|;
-      my $insert_check = selectfirst_hashref_query($self, $dbh, $query, @values);
+                       shiptoemail = ? AND
+                       module = ? AND 
+                       trans_id = ?|;
+      my $insert_check = selectfirst_hashref_query($self, $dbh, $query, @values, $module, $id);
       if(!$insert_check){
         $query =
           qq|INSERT INTO shipto (trans_id, shiptoname, shiptodepartment_1, shiptodepartment_2,
@@ -1396,7 +1527,7 @@ sub add_shipto {
                                  shiptocontact, shiptophone, shiptofax, shiptoemail, module)
              VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)|;
         do_query($self, $dbh, $query, $id, @values, $module);
-     }
+      }
     }
   }
 
@@ -1409,8 +1540,8 @@ sub get_employee {
   my ($self, $dbh) = @_;
 
   my $query = qq|SELECT id, name FROM employee WHERE login = ?|;
-  ($self->{employee_id}, $self->{employee}) = selectrow_query($self, $dbh, $query, $self->{login});
-  $self->{employee_id} *= 1;
+  ($self->{"employee_id"}, $self->{"employee"}) = selectrow_query($self, $dbh, $query, $self->{login});
+  $self->{"employee_id"} *= 1;
 
   $main::lxdebug->leave_sub();
 }
@@ -1422,7 +1553,7 @@ sub get_salesman {
 
   $main::lxdebug->leave_sub() and return unless $salesman_id;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
 
   my ($login) =
     selectrow_query($self, $dbh, qq|SELECT login FROM employee WHERE id = ?|,
@@ -1441,8 +1572,6 @@ sub get_salesman {
     map({ $self->{"salesman_$_"} =~ s/\\n/\n/g; } qw(address company));
   }
 
-  $dbh->disconnect();
-
   $main::lxdebug->leave_sub();
 }
 
@@ -1451,10 +1580,9 @@ sub get_duedate {
 
   my ($self, $myconfig) = @_;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
   my $query = qq|SELECT current_date + terms_netto FROM payment_terms WHERE id = ?|;
   ($self->{duedate}) = selectrow_query($self, $dbh, $query, $self->{payment_id});
-  $dbh->disconnect();
 
   $main::lxdebug->leave_sub();
 }
@@ -1611,11 +1739,10 @@ sub _get_taxzones {
 sub _get_employees {
   $main::lxdebug->enter_sub();
 
-  my ($self, $dbh, $key) = @_;
+  my ($self, $dbh, $default_key, $key) = @_;
 
-  $key = "all_employees" unless ($key);
-  $self->{$key} =
-    selectall_hashref_query($self, $dbh, qq|SELECT * FROM employee|);
+  $key = $default_key unless ($key);
+  $self->{$key} = selectall_hashref_query($self, $dbh, qq|SELECT * FROM employee ORDER BY name|);
 
   $main::lxdebug->leave_sub();
 }
@@ -1695,7 +1822,7 @@ sub _get_customers {
 
   $key = "all_customers" unless ($key);
 
-  my $query = qq|SELECT * FROM customer|;
+  my $query = qq|SELECT * FROM customer WHERE NOT obsolete ORDER BY name|;
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
@@ -1709,7 +1836,7 @@ sub _get_vendors {
 
   $key = "all_vendors" unless ($key);
 
-  my $query = qq|SELECT * FROM vendor|;
+  my $query = qq|SELECT * FROM vendor WHERE NOT obsolete ORDER BY name|;
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
@@ -1723,7 +1850,7 @@ sub _get_departments {
 
   $key = "all_departments" unless ($key);
 
-  my $query = qq|SELECT * FROM department|;
+  my $query = qq|SELECT * FROM department ORDER BY description|;
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
@@ -1736,7 +1863,7 @@ sub get_lists {
   my $self = shift;
   my %params = @_;
 
-  my $dbh = $self->dbconnect(\%main::myconfig);
+  my $dbh = $self->get_standard_dbh(\%main::myconfig);
   my ($sth, $query, $ref);
 
   my $vc = $self->{"vc"} eq "customer" ? "customer" : "vendor";
@@ -1777,7 +1904,11 @@ sub get_lists {
   }
 
   if ($params{"employees"}) {
-    $self->_get_employees($dbh, $params{"employees"});
+    $self->_get_employees($dbh, "all_employees", $params{"employees"});
+  }
+  
+  if ($params{"salesmen"}) {
+    $self->_get_employees($dbh, "all_salesmen", $params{"salesmen"});
   }
 
   if ($params{"business_types"}) {
@@ -1808,8 +1939,6 @@ sub get_lists {
     $self->_get_departments($dbh, $params{"departments"});
   }
 
-  $dbh->disconnect();
-
   $main::lxdebug->leave_sub();
 }
 
@@ -1820,7 +1949,7 @@ sub get_name {
   my ($self, $myconfig, $table) = @_;
 
   # connect to database
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
 
   $table = $table eq "customer" ? "customer" : "vendor";
   my $arap = $self->{arap} eq "ar" ? "ar" : "ap";
@@ -1869,7 +1998,7 @@ sub all_vc {
   my ($self, $myconfig, $table, $module) = @_;
 
   my $ref;
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
 
   $table = $table eq "customer" ? "customer" : "vendor";
 
@@ -1939,8 +2068,6 @@ sub all_vc {
 
   $self->{payment_terms} = selectall_hashref_query($self, $dbh, $query);
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 }
 
@@ -1949,7 +2076,7 @@ sub language_payment {
 
   my ($self, $myconfig) = @_;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
   # get languages
   my $query = qq|SELECT id, description
                  FROM language
@@ -1977,7 +2104,6 @@ sub language_payment {
 
   $self->{BUCHUNGSGRUPPEN} = selectall_hashref_query($self, $dbh, $query);
 
-  $dbh->disconnect;
   $main::lxdebug->leave_sub();
 }
 
@@ -1987,7 +2113,7 @@ sub all_departments {
 
   my ($self, $myconfig, $table) = @_;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
   my $where;
 
   if ($table eq 'customer') {
@@ -2002,15 +2128,13 @@ sub all_departments {
 
   delete($self->{all_departments}) unless (@{ $self->{all_departments} });
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 }
 
 sub create_links {
   $main::lxdebug->enter_sub();
 
-  my ($self, $module, $myconfig, $table) = @_;
+  my ($self, $module, $myconfig, $table, $provided_dbh) = @_;
 
   my ($fld, $arap);
   if ($table eq "customer") {
@@ -2027,7 +2151,7 @@ sub create_links {
   # get last customers or vendors
   my ($query, $sth, $ref);
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $provided_dbh ? $provided_dbh : $self->get_standard_dbh($myconfig);
   my %xkeyref = ();
 
   if (!$self->{id}) {
@@ -2221,8 +2345,6 @@ sub create_links {
 
   }
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 }
 
@@ -2270,7 +2392,7 @@ sub current_date {
 
   my ($self, $myconfig, $thisdate, $days) = @_;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
   my $query;
 
   $days *= 1;
@@ -2285,8 +2407,6 @@ sub current_date {
 
   ($thisdate) = selectrow_query($self, $dbh, $query);
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 
   return $thisdate;
@@ -2481,9 +2601,9 @@ sub save_history {
   }
 
   my $query =
-    qq|INSERT INTO history_erp (trans_id, employee_id, addition, what_done, snumbers) | .
-    qq|VALUES (?, ?, ?, ?, ?)|;
-  my @values = (conv_i($self->{id}), conv_i($self->{employee_id}),
+   qq|INSERT INTO history_erp (trans_id, employee_id, addition, what_done, snumbers) | .
+   qq|VALUES (?, (SELECT id FROM employee WHERE login = ?), ?, ?, ?)|;
+  my @values = (conv_i($self->{id}), $self->{login},
                 $self->{addition}, $self->{what_done}, "$self->{snumbers}");
   do_query($self, $dbh, $query, @values);
 
@@ -2542,8 +2662,14 @@ sub update_defaults {
   my ($var) = $sth->fetchrow_array;
   $sth->finish;
 
-  $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e;
-  $var ||= 1;
+  if ($var =~ m/\d+$/) {
+    my $new_var  = (substr $var, $-[0]) * 1 + 1;
+    my $len_diff = length($var) - $-[0] - length($new_var);
+    $var         = substr($var, 0, $-[0]) . ($len_diff > 0 ? '0' x $len_diff : '') . $new_var;
+
+  } else {
+    $var = $var . '1';
+  }
 
   $query = qq|UPDATE defaults SET $fld = ?|;
   do_query($self, $dbh, $query, $var);
@@ -2574,8 +2700,15 @@ sub update_business {
        WHERE id = ? FOR UPDATE|;
   my ($var) = selectrow_query($self, $dbh, $query, $business_id);
 
-  $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e;
-  
+  if ($var =~ m/\d+$/) {
+    my $new_var  = (substr $var, $-[0]) * 1 + 1;
+    my $len_diff = length($var) - $-[0] - length($new_var);
+    $var         = substr($var, 0, $-[0]) . ($len_diff > 0 ? '0' x $len_diff : '') . $new_var;
+
+  } else {
+    $var = $var . '1';
+  }
+
   $query = qq|UPDATE business
               SET customernumberinit = ?
               WHERE id = ?|;
@@ -2596,7 +2729,7 @@ sub get_partsgroup {
 
   my ($self, $myconfig, $p) = @_;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
 
   my $query = qq|SELECT DISTINCT pg.id, pg.partsgroup
                  FROM partsgroup pg
@@ -2635,7 +2768,6 @@ sub get_partsgroup {
 
   $self->{all_partsgroup} = selectall_hashref_query($self, $dbh, $query, @values);
 
-  $dbh->disconnect;
   $main::lxdebug->leave_sub();
 }
 
@@ -2644,7 +2776,7 @@ sub get_pricegroup {
 
   my ($self, $myconfig, $p) = @_;
 
-  my $dbh = $self->dbconnect($myconfig);
+  my $dbh = $self->get_standard_dbh($myconfig);
 
   my $query = qq|SELECT p.id, p.pricegroup
                  FROM pricegroup p|;
@@ -2658,8 +2790,6 @@ sub get_pricegroup {
 
   $self->{all_pricegroup} = selectall_hashref_query($self, $dbh, $query);
 
-  $dbh->disconnect;
-
   $main::lxdebug->leave_sub();
 }
 
@@ -2672,11 +2802,7 @@ sub all_years {
 
   my ($self, $myconfig, $dbh) = @_;
 
-  my $disconnect = 0;
-  if (! $dbh) {
-    $dbh = $self->dbconnect($myconfig);
-    $disconnect = 1;
-  }
+  $dbh ||= $self->get_standard_dbh($myconfig);
 
   # get years
   my $query = qq|SELECT (SELECT MIN(transdate) FROM acc_trans),
@@ -2701,12 +2827,9 @@ sub all_years {
     push @all_years, $enddate--;
   }
 
-  $dbh->disconnect if $disconnect;
-
   return @all_years;
 
   $main::lxdebug->leave_sub();
 }
 
-
 1;