Schreibfehler in Variable.
[kivitendo-erp.git] / SL / Form.pm
index 74e7ff2..7803fc3 100644 (file)
@@ -45,6 +45,7 @@ use CGI::Ajax;
 use SL::DBUtils;
 use SL::Menu;
 use SL::User;
+use SL::Common;
 use CGI;
 
 sub _input_to_hash {
@@ -132,6 +133,11 @@ sub new {
 
   my $self = {};
 
+  if ($LXDebug::watch_form) {
+    require SL::Watchdog;
+    tie %{ $self }, 'SL::Watchdog';
+  }
+
   read(STDIN, $_, $ENV{CONTENT_LENGTH});
 
   if ($ENV{QUERY_STRING}) {
@@ -252,6 +258,8 @@ sub hide_form {
 sub error {
   $main::lxdebug->enter_sub();
 
+  $main::lxdebug->show_backtrace();
+
   my ($self, $msg) = @_;
   if ($ENV{HTTP_USER_AGENT}) {
     $msg =~ s/\n/<br>/g;
@@ -347,7 +355,7 @@ sub header {
     return;
   }
 
-  my ($stylesheet, $favicon, $charset);
+  my ($stylesheet, $favicon);
 
   if ($ENV{HTTP_USER_AGENT}) {
 
@@ -365,23 +373,15 @@ sub header {
   |;
     }
 
-    if ($self->{charset}) {
-      $charset =
-        qq|<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$self->{charset}">
-  |;
-    }
+    my $db_charset = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET;
+
     if ($self->{landscape}) {
       $pagelayout = qq|<style type="text/css">
                         \@page { size:landscape; }
                         </style>|;
     }
-    if ($self->{fokus}) {
-      $fokus = qq|<script type="text/javascript">
-<!--
-function fokus(){document.$self->{fokus}.focus();}
-//-->
-</script>|;
-    }
+
+    my $fokus = qq|  document.$self->{fokus}.focus();| if ($self->{"fokus"});
 
     #Set Calendar
     my $jsscript = "";
@@ -404,7 +404,7 @@ function fokus(){document.$self->{fokus}.focus();}
     foreach $item (@ { $self->{AJAX} }) {
       $ajax .= $item->show_javascript();
     }
-    print qq|Content-Type: text/html
+    print qq|Content-Type: text/html; charset=${db_charset};
 
 <html>
 <head>
@@ -412,10 +412,18 @@ function fokus(){document.$self->{fokus}.focus();}
   $stylesheet
   $pagelayout
   $favicon
-  $charset
+  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=${db_charset}">
   $jsscript
   $ajax
-  $fokus
+
+  <script type="text/javascript">
+  <!--
+    function fokus() {
+      $fokus
+    }
+  //-->
+  </script>
+
   <meta name="robots" content="noindex,nofollow" />
   <script type="text/javascript" src="js/highlight_input.js"></script>
   <link rel="stylesheet" type="text/css" href="css/tabcontent.css" />
@@ -446,18 +454,19 @@ sub parse_html_template {
   my ($self, $file, $additional_params) = @_;
   my $language;
 
-  if (!defined($main::myconfig) || !defined($main::myconfig{"countrycode"})) {
+  if (!defined(%main::myconfig) || !defined($main::myconfig{"countrycode"})) {
     $language = $main::language;
   } else {
     $language = $main::myconfig{"countrycode"};
   }
+  $language = "de" unless ($language);
 
   if (-f "templates/webpages/${file}_${language}.html") {
     if ((-f ".developer") &&
         (-f "templates/webpages/${file}_master.html") &&
         ((stat("templates/webpages/${file}_master.html"))[9] >
          (stat("templates/webpages/${file}_${language}.html"))[9])) {
-      my $info = "Developper information: templates/webpages/${file}_master.html is newer than the localized version.\n" .
+      my $info = "Developer information: templates/webpages/${file}_master.html is newer than the localized version.\n" .
         "Please re-run 'locales.pl' in 'locale/${language}'.";
       print(qq|<pre>$info</pre>|);
       die($info);
@@ -499,9 +508,9 @@ sub parse_html_template {
     $additional_params->{"myconfig_jsc_dateformat"} = $jsc_dateformat;
   }
 
-  $additional_params->{"conf_jscalendar"} = $main::jscalendar;
-  $additional_params->{"conf_lizenzen"} = $main::lizenzen;
-  $additional_params->{"conf_latex_templates"} = $main::latex;
+  $additional_params->{"conf_webdav"}                 = $main::webdav;
+  $additional_params->{"conf_lizenzen"}               = $main::lizenzen;
+  $additional_params->{"conf_latex_templates"}        = $main::latex;
   $additional_params->{"conf_opendocument_templates"} = $main::opendocument_templates;
 
   my @additional_param_names = keys(%{$additional_params});
@@ -722,7 +731,9 @@ sub parse_template {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig, $userspath) = @_;
-  my $template;
+  my ($template, $out);
+
+  local (*IN, *OUT);
 
   $self->{"cwd"} = getcwd();
   $self->{"tmpdir"} = $self->{cwd} . "/${userspath}";
@@ -765,7 +776,19 @@ sub parse_template {
   # OUT is used for the media, screen, printer, email
   # for postscript we store a copy in a temporary file
   my $fileid = time;
-  $self->{tmpfile} = "$userspath/${fileid}.$self->{IN}" if ( $self->{tmpfile} eq '' );
+  my $prepend_userspath;
+
+  if (!$self->{tmpfile}) {
+    $self->{tmpfile}   = "${fileid}.$self->{IN}";
+    $prepend_userspath = 1;
+  }
+
+  $prepend_userspath = 1 if substr($self->{tmpfile}, 0, length $userspath) eq $userspath;
+
+  $self->{tmpfile} =~ s|.*/||;
+  $self->{tmpfile} =~ s/[^a-zA-Z0-9\._\ \-]//g;
+  $self->{tmpfile} = "$userspath/$self->{tmpfile}" if $prepend_userspath;
+
   if ($template->uses_temp_file() || $self->{media} eq 'email') {
     $out = $self->{OUT};
     $self->{OUT} = ">$self->{tmpfile}";
@@ -794,8 +817,9 @@ sub parse_template {
       my $mail = new Mailer;
 
       map { $mail->{$_} = $self->{$_} }
-        qw(cc bcc subject message version format charset);
-      $mail->{to}     = qq|$self->{email}|;
+        qw(cc bcc subject message version format);
+      $mail->{charset} = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET;
+      $mail->{to} = $self->{EMAIL_RECIPIENT} ? $self->{EMAIL_RECIPIENT} : $self->{email};
       $mail->{from}   = qq|"$myconfig->{name}" <$myconfig->{email}>|;
       $mail->{fileid} = "$fileid.";
       $myconfig->{signature} =~ s/\\r\\n/\\n/g;
@@ -831,7 +855,7 @@ sub parse_template {
 
       }
 
-      my $err = $mail->send($out);
+      my $err = $mail->send();
       $self->error($self->cleanup . "$err") if ($err);
 
     } else {
@@ -852,7 +876,10 @@ sub parse_template {
           open(OUT, $self->{OUT})
             or $self->error($self->cleanup . "$self->{OUT} : $!");
         } else {
-          $self->{attachment_filename} = $self->{tmpfile} if ($self->{attachment_filename} eq '');
+          $self->{attachment_filename} = ($self->{attachment_filename}) 
+                                       ? $self->{attachment_filename}
+                                       : $self->generate_attachment_filename();
+
           # launch application
           print qq|Content-Type: | . $template->get_mime_type() . qq|
 Content-Disposition: attachment; filename="$self->{attachment_filename}"
@@ -884,6 +911,48 @@ Content-Length: $numbytes
   $main::lxdebug->leave_sub();
 }
 
+sub generate_attachment_filename {
+  my ($self) = @_;
+
+  my %formname_translations = (
+     bin_list            => $main::locale->text('Bin List'),
+     credit_note         => $main::locale->text('Credit Note'),
+     invoice             => $main::locale->text('Invoice'),
+     packing_list        => $main::locale->text('Packing List'),
+     pick_list           => $main::locale->text('Pick List'),
+     proforma            => $main::locale->text('Proforma Invoice'),
+     purchase_order      => $main::locale->text('Purchase Order'),
+     request_quotation   => $main::locale->text('RFQ'),
+     sales_order         => $main::locale->text('Confirmation'),
+     sales_quotation     => $main::locale->text('Quotation'),
+     storno_invoice      => $main::locale->text('Storno Invoice'),
+     storno_packing_list => $main::locale->text('Storno Packing List'),
+  );
+
+  my $attachment_filename = $formname_translations{$self->{"formname"}};
+  my $prefix = 
+      (grep { $self->{"type"} eq $_ } qw(invoice credit_note)) ? "inv"
+    : ($self->{"type"} =~ /_quotation$/)                       ? "quo"
+    :                                                            "ord";
+
+  if ($attachment_filename && $self->{"${prefix}number"}) {
+    $attachment_filename .= "_" . $self->{"${prefix}number"}
+                            . (  $self->{format} =~ /pdf/i          ? ".pdf"
+                               : $self->{format} =~ /postscript/i   ? ".ps"
+                               : $self->{format} =~ /opendocument/i ? ".odt"
+                               : $self->{format} =~ /html/i         ? ".html"
+                               :                                      "");
+    $attachment_filename =~ s/ /_/g;
+    my %umlaute = ( "ä" => "ae", "ö" => "oe", "ü" => "ue", 
+                    "Ä" => "Ae", "Ö" => "Oe", "Ü" => "Ue", "ß" => "ss");
+    map { $attachment_filename =~ s/$_/$umlaute{$_}/g } keys %umlaute;
+  } else {
+    $attachment_filename = "";
+  }
+
+  return $attachment_filename;
+}
+
 sub cleanup {
   $main::lxdebug->enter_sub();
 
@@ -1451,10 +1520,7 @@ sub _get_shipto {
   $key = "all_shipto" unless ($key);
 
   # get shipping addresses
-  my $query =
-    qq|SELECT shipto_id, shiptoname, shiptodepartment_1 | .
-    qq|FROM shipto | .
-    qq|WHERE trans_id = ?|;
+  my $query = qq|SELECT * FROM shipto WHERE trans_id = ?|;
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query, $vc_id);
 
@@ -1468,7 +1534,7 @@ sub _get_printers {
 
   $key = "all_printers" unless ($key);
 
-  my $query = qq|SELECT id, printer_description, printer_command FROM printers|;
+  my $query = qq|SELECT id, printer_description, printer_command, template_code FROM printers|;
 
   $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
@@ -1513,6 +1579,20 @@ sub _get_taxcharts {
   $main::lxdebug->leave_sub();
 }
 
+sub _get_taxzones {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_taxzones" unless ($key);
+
+  my $query = qq|SELECT * FROM tax_zones ORDER BY id|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
 sub _get_employees {
   $main::lxdebug->enter_sub();
 
@@ -1537,6 +1617,104 @@ sub _get_business_types {
   $main::lxdebug->leave_sub();
 }
 
+sub _get_languages {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_languages" unless ($key);
+
+  my $query = qq|SELECT * FROM language ORDER BY id|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_dunning_configs {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_dunning_configs" unless ($key);
+
+  my $query = qq|SELECT * FROM dunning_config ORDER BY dunning_level|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_currencies {
+$main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_currencies" unless ($key);
+
+  my $query = qq|SELECT curr AS currency FROM defaults|;
+  $self->{$key} = [split(/\:/ , selectfirst_hashref_query($self, $dbh, $query)->{currency})];
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_payments {
+$main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_payments" unless ($key);
+
+  my $query = qq|SELECT * FROM payment_terms ORDER BY id|;
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_customers {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_customers" unless ($key);
+
+  my $query = qq|SELECT * FROM customer|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_vendors {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_vendors" unless ($key);
+
+  my $query = qq|SELECT * FROM vendor|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
+sub _get_departments {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $dbh, $key) = @_;
+
+  $key = "all_departments" unless ($key);
+
+  my $query = qq|SELECT * FROM department|;
+
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+
+  $main::lxdebug->leave_sub();
+}
+
 sub get_lists {
   $main::lxdebug->enter_sub();
 
@@ -1567,6 +1745,10 @@ sub get_lists {
     $self->_get_printers($dbh, $params{"printers"});
   }
 
+  if ($params{"languages"}) {
+    $self->_get_languages($dbh, $params{"languages"});
+  }
+
   if ($params{"charts"}) {
     $self->_get_charts($dbh, $params{"charts"});
   }
@@ -1575,6 +1757,10 @@ sub get_lists {
     $self->_get_taxcharts($dbh, $params{"taxcharts"});
   }
 
+  if ($params{"taxzones"}) {
+    $self->_get_taxzones($dbh, $params{"taxzones"});
+  }
+
   if ($params{"employees"}) {
     $self->_get_employees($dbh, $params{"employees"});
   }
@@ -1583,6 +1769,30 @@ sub get_lists {
     $self->_get_business_types($dbh, $params{"business_types"});
   }
 
+  if ($params{"dunning_configs"}) {
+    $self->_get_dunning_configs($dbh, $params{"dunning_configs"});
+  }
+  
+  if($params{"currencies"}) {
+    $self->_get_currencies($dbh, $params{"currencies"});
+  }
+  
+  if($params{"customers"}) {
+    $self->_get_customers($dbh, $params{"customers"});
+  }
+  
+  if($params{"vendors"}) {
+    $self->_get_vendors($dbh, $params{"vendors"});
+  }
+  
+  if($params{"payments"}) {
+    $self->_get_payments($dbh, $params{"payments"});
+  }
+
+  if($params{"departments"}) {
+    $self->_get_departments($dbh, $params{"departments"});
+  }
+
   $dbh->disconnect();
 
   $main::lxdebug->leave_sub();
@@ -1821,7 +2031,7 @@ sub create_links {
 
     $sth = $dbh->prepare($query);
 
-    do_statement($form, $sth, $query, '%' . $module . '%');
+    do_statement($self, $sth, $query, '%' . $module . '%');
 
     $self->{accounts} = "";
     while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
@@ -1846,16 +2056,12 @@ sub create_links {
 
   # get taxkeys and description
   $query = qq|SELECT id, taxkey, taxdescription FROM tax|;
-  $self->{TAXKEY} = selectall_hashref_query($form, $dbh, $query);
-
-  # get tax zones
-  $query = qq|SELECT id, description FROM tax_zones|;
-  $self->{TAXZONE} = selectall_hashref_query($form, $dbh, $query);
+  $self->{TAXKEY} = selectall_hashref_query($self, $dbh, $query);
 
   if (($module eq "AP") || ($module eq "AR")) {
     # get tax rates and description
     $query = qq|SELECT * FROM tax|;
-    $self->{TAX} = selectall_hashref_query($form, $dbh, $query);
+    $self->{TAX} = selectall_hashref_query($self, $dbh, $query);
   }
 
   if ($self->{id}) {
@@ -1885,17 +2091,16 @@ sub create_links {
     }
 
     # now get the account numbers
-    $query = qq|
-      SELECT
-        c.accno, c.description, c.link, c.taxkey_id,
-        tk.tax_id
-      FROM chart c
-      LEFT JOIN taxkeys tk ON (tk.chart_id = c.id)
-      WHERE (c.link LIKE ?) AND (tk.chart_id = c.id) AND NOT (c.link LIKE '%_tax%')
-      ORDER BY c.accno|;
+    $query = qq|SELECT c.accno, c.description, c.link, c.taxkey_id, tk.tax_id
+                FROM chart c
+                LEFT JOIN taxkeys tk ON (tk.chart_id = c.id)
+                WHERE c.link LIKE ?
+                  AND (tk.id = (SELECT id FROM taxkeys WHERE taxkeys.chart_id = c.id AND startdate <= $transdate ORDER BY startdate DESC LIMIT 1)
+                    OR c.link LIKE '%_tax%')
+                ORDER BY c.accno|;
 
     $sth = $dbh->prepare($query);
-    do_statement($form, $sth, $query, "%" . $module . "%");
+    do_statement($self, $sth, $query, "%$module%");
 
     $self->{accounts} = "";
     while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
@@ -1940,7 +2145,7 @@ sub create_links {
          AND a.fx_transaction = '0'
          ORDER BY a.oid, a.transdate|;
     $sth = $dbh->prepare($query);
-    do_statement($form, $sth, $query, $self->{id});
+    do_statement($self, $sth, $query, $self->{id});
 
     # get exchangerate for currency
     $self->{exchangerate} =
@@ -2239,6 +2444,7 @@ sub save_status {
 # $main::locale->text('PRINTED')
 # $main::locale->text('MAILED')
 # $main::locale->text('SCREENED')
+# $main::locale->text('CANCELED')
 # $main::locale->text('invoice')
 # $main::locale->text('proforma')
 # $main::locale->text('sales_order')
@@ -2260,10 +2466,10 @@ sub save_history {
   }
 
   my $query =
-    qq|INSERT INTO history_erp (trans_id, employee_id, addition, what_done) | .
-    qq|VALUES (?, ?, ?, ?)|;
+    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}),
-                $self->{addition}, $self->{what_done});
+                $self->{addition}, $self->{what_done}, "$self->{snumbers}");
   do_query($self, $dbh, $query, @values);
 
   $main::lxdebug->leave_sub();
@@ -2272,30 +2478,31 @@ sub save_history {
 sub get_history {
   $main::lxdebug->enter_sub();
 
-  my $self = shift();
-  my $dbh = shift();
-  my $trans_id = shift();
-  my $restriction = shift();
+  my ($self, $dbh, $trans_id, $restriction, $order) = @_;
+  my ($orderBy, $desc) = split(/\-\-/, $order);
+  $order = " ORDER BY " . ($order eq "" ? " h.itime " : ($desc == 1 ? $orderBy . " DESC " : $orderBy . " "));
   my @tempArray;
   my $i = 0;
   if ($trans_id ne "") {
     my $query =
-      qq|SELECT h.employee_id, h.itime::timestamp(0) AS itime, h.addition, h.what_done, emp.name | .
+      qq|SELECT h.employee_id, h.itime::timestamp(0) AS itime, h.addition, h.what_done, emp.name, h.snumbers, h.trans_id AS id | .
       qq|FROM history_erp h | .
       qq|LEFT JOIN employee emp ON (emp.id = h.employee_id) | .
-      qq|WHERE trans_id = ? |
-      . $restriction;
-
+      qq|WHERE trans_id = | . $trans_id
+      . $restriction . qq| |
+      . $order;
+      
     my $sth = $dbh->prepare($query) || $self->dberror($query);
 
-    $sth->execute($trans_id) || $self->dberror("$query ($trans_id)");
+    $sth->execute() || $self->dberror("$query");
 
     while(my $hash_ref = $sth->fetchrow_hashref()) {
       $hash_ref->{addition} = $main::locale->text($hash_ref->{addition});
       $hash_ref->{what_done} = $main::locale->text($hash_ref->{what_done});
+      $hash_ref->{snumbers} =~ s/^.+_(.*)$/$1/g;
       $tempArray[$i++] = $hash_ref;
     }
-    $main::lxdebug->leave_sub() and return \@tempArray
+    $main::lxdebug->leave_sub() and return \@tempArray 
       if ($i > 0 && $tempArray[0] ne "");
   }
   $main::lxdebug->leave_sub();
@@ -2320,11 +2527,8 @@ sub update_defaults {
   my ($var) = $sth->fetchrow_array;
   $sth->finish;
 
-  if ($var =~ /^(.*?)(\d+)$/) {
-    $var = "$1" . ($2 + 1);
-  } else {
-    $var++;
-  }
+  $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e;
+  $var ||= 1;
 
   $query = qq|UPDATE defaults SET $fld = ?|;
   do_query($self, $dbh, $query, $var);
@@ -2355,13 +2559,8 @@ sub update_business {
        WHERE id = ? FOR UPDATE|;
   my ($var) = selectrow_query($self, $dbh, $query, $business_id);
 
-  if ($var ne "") {
-    if ($var =~ /^(.*?)(\d+)$/) {
-      $var = "$1" . ($2 + 1);
-    } else {
-      $var++;
-    }
-  }
+  $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e;
+  
   $query = qq|UPDATE business
               SET customernumberinit = ?
               WHERE id = ?|;
@@ -2419,7 +2618,7 @@ sub get_partsgroup {
     @values = ($p->{language_code});
   }
 
-  $self->{all_partsgroups} = selectall_hashref_query($self, $dbh, $query, @values);
+  $self->{all_partsgroup} = selectall_hashref_query($self, $dbh, $query, @values);
 
   $dbh->disconnect;
   $main::lxdebug->leave_sub();