Beim Verschicken von Emails überprüfen, ob es im Vorlagenverzeichnis eine Vorlage...
[kivitendo-erp.git] / SL / Form.pm
index a6ce5af..d4c1fdf 100644 (file)
@@ -41,7 +41,7 @@ use Data::Dumper;
 use CGI;
 use CGI::Ajax;
 use Cwd;
-use List::Util qw(min max);
+use IO::File;
 use SL::Auth;
 use SL::Auth::DB;
 use SL::Auth::LDAP;
@@ -471,7 +471,7 @@ sub isblank {
   my ($self, $name, $msg) = @_;
 
   my $curr = $self;
-  foreach my $part (split '.', $name) {
+  foreach my $part (split m/\./, $name) {
     if (!$curr->{$part} || ($curr->{$part} =~ /^\s*$/)) {
       $self->error($msg);
     }
@@ -512,7 +512,7 @@ sub create_http_response {
   }
 
   my %cgi_params = ('-type' => $params{content_type});
-  $cgi_params{'-charset'} = $params{charset} if ($parmas{charset});
+  $cgi_params{'-charset'} = $params{charset} if ($params{charset});
 
   my $output = $cgi->header('-cookie' => $session_cookie,
                             %cgi_params);
@@ -577,6 +577,7 @@ sub header {
     if ($self->{jsscript} == 1) {
 
       $jsscript = qq|
+        <script type="text/javascript" src="js/common.js"></script>
         <style type="text/css">\@import url(js/jscalendar/calendar-win2k-1.css);</style>
         <script type="text/javascript" src="js/jscalendar/calendar.js"></script>
         <script type="text/javascript" src="js/jscalendar/lang/calendar-de.js"></script>
@@ -598,11 +599,11 @@ sub header {
                                       'charset'      => $db_charset,);
     print qq|${doctype}<html>
 <head>
+  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=${db_charset}">
   <title>$self->{titlebar}</title>
   $stylesheet
   $pagelayout
   $favicon
-  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=${db_charset}">
   $jsscript
   $ajax
 
@@ -638,6 +639,20 @@ sub header {
   $main::lxdebug->leave_sub();
 }
 
+sub ajax_response_header {
+  $main::lxdebug->enter_sub();
+
+  my ($self) = @_;
+
+  my $db_charset = $main::dbcharset ? $main::dbcharset : Common::DEFAULT_CHARSET;
+  my $cgi        = $main::cgi || CGI->new('');
+  my $output     = $cgi->header('-charset' => $db_charset);
+
+  $main::lxdebug->leave_sub();
+
+  return $output;
+}
+
 sub _prepare_html_template {
   $main::lxdebug->enter_sub();
 
@@ -690,6 +705,7 @@ sub _prepare_html_template {
     $additional_params->{"myconfig_jsc_dateformat"} = $jsc_dateformat;
   }
 
+  $additional_params->{"conf_dbcharset"}              = $main::dbcharset;
   $additional_params->{"conf_webdav"}                 = $main::webdav;
   $additional_params->{"conf_lizenzen"}               = $main::lizenzen;
   $additional_params->{"conf_latex_templates"}        = $main::latex;
@@ -729,13 +745,26 @@ sub parse_html_template {
 
   map { $additional_params->{$_} ||= $self->{$_} } keys %{ $self };
 
+  my $in = IO::File->new($file, 'r');
+
+  if (!$in) {
+    print STDERR "Error opening template file: $!";
+    $main::lxdebug->leave_sub();
+    return '';
+  }
+
+  my $input = join('', <$in>);
+  $in->close();
+
+  if ($main::locale) {
+    $input = $main::locale->{iconv}->convert($input);
+  }
+
   my $output;
-  if (!$template->process($file, $additional_params, \$output)) {
+  if (!$template->process(\$input, $additional_params, \$output)) {
     print STDERR $template->error();
   }
 
-  $output = $main::locale->{iconv}->convert($output) if ($main::locale);
-
   $main::lxdebug->leave_sub();
 
   return $output;
@@ -919,16 +948,19 @@ sub format_amount_units {
   my $self             = shift;
   my %params           = @_;
 
-  Common::check_params(\%params, qw(amount part_unit));
-
   my $myconfig         = \%main::myconfig;
-  my $amount           = $params{amount};
+  my $amount           = $params{amount} * 1;
   my $places           = $params{places};
   my $part_unit_name   = $params{part_unit};
   my $amount_unit_name = $params{amount_unit};
   my $conv_units       = $params{conv_units};
   my $max_places       = $params{max_places};
 
+  if (!$part_unit_name) {
+    $main::lxdebug->leave_sub();
+    return '';
+  }
+
   AM->retrieve_all_units();
   my $all_units        = $main::all_units;
 
@@ -1411,6 +1443,11 @@ sub get_standard_dbh {
 
   my ($self, $myconfig) = @_;
 
+  if ($standard_dbh && !$standard_dbh->{Active}) {
+    $main::lxdebug->message(LXDebug::INFO, "get_standard_dbh: \$standard_dbh is defined but not Active anymore");
+    undef $standard_dbh;
+  }
+
   $standard_dbh ||= $self->dbconnect_noauto($myconfig);
 
   $main::lxdebug->leave_sub(2);
@@ -1418,6 +1455,21 @@ sub get_standard_dbh {
   return $standard_dbh;
 }
 
+sub date_closed {
+  $main::lxdebug->enter_sub();
+
+  my ($self, $date, $myconfig) = @_;
+  my $dbh = $self->dbconnect($myconfig);
+
+  my $query = "SELECT 1 FROM defaults WHERE ? < closedto";
+  my $sth = prepare_execute_query($self, $dbh, $query, $date);
+  my ($closed) = $sth->fetchrow_array;
+
+  $main::lxdebug->leave_sub();
+
+  return $closed;
+}
+
 sub update_balance {
   $main::lxdebug->enter_sub();
 
@@ -1578,8 +1630,6 @@ sub check_exchangerate {
 
   my ($exchangerate) = selectrow_query($self, $dbh, $query, $currency, $transdate);
 
-  $exchangerate = 1 if ($exchangerate eq "");
-
   $main::lxdebug->leave_sub();
 
   return $exchangerate;
@@ -1840,21 +1890,15 @@ sub get_salesman {
 
   $main::lxdebug->leave_sub() and return unless $salesman_id;
 
-  my $dbh = $self->get_standard_dbh($myconfig);
-
-  my ($login) =
-    selectrow_query($self, $dbh, qq|SELECT login FROM employee WHERE id = ?|,
-                    $salesman_id);
+  my $dbh     = $self->get_standard_dbh($myconfig);
+  my ($login) = selectrow_query($self, $dbh, qq|SELECT login FROM employee WHERE id = ?|, $salesman_id);
 
   if ($login) {
-    my $user = new User($main::memberfile, $login);
-    map({ $self->{"salesman_$_"} = $user->{$_}; }
-        qw(address businessnumber co_ustid company duns email fax name
-           taxnumber tel));
-    $self->{salesman_login} = $login;
+    my $user = User->new($login);
+    map { $self->{"salesman_$_"} = $user->{$_}; } qw(address businessnumber co_ustid company duns email fax name signature taxnumber tel);
 
-    $self->{salesman_name} = $login
-      if ($self->{salesman_name} eq "");
+    $self->{salesman_login}   = $login;
+    $self->{salesman_name}  ||= $login;
   }
 
   $main::lxdebug->leave_sub();
@@ -1879,6 +1923,12 @@ sub _get_contacts {
 
   $key = "all_contacts" unless ($key);
 
+  if (!$id) {
+    $self->{$key} = [];
+    $main::lxdebug->leave_sub();
+    return;
+  }
+
   my $query =
     qq|SELECT cp_id, cp_cv_id, cp_name, cp_givenname, cp_abteilung | .
     qq|FROM contacts | .
@@ -1947,10 +1997,15 @@ sub _get_shipto {
 
   $key = "all_shipto" unless ($key);
 
-  # get shipping addresses
-  my $query = qq|SELECT * FROM shipto WHERE trans_id = ?|;
+  if ($vc_id) {
+    # get shipping addresses
+    my $query = qq|SELECT * FROM shipto WHERE trans_id = ?|;
+
+    $self->{$key} = selectall_hashref_query($self, $dbh, $query, $vc_id);
 
-  $self->{$key} = selectall_hashref_query($self, $dbh, $query, $vc_id);
+  } else {
+    $self->{$key} = [];
+  }
 
   $main::lxdebug->leave_sub();
 }
@@ -2148,41 +2203,22 @@ sub _get_warehouses {
 
   my ($self, $dbh, $param) = @_;
 
-  my ($key, $bins_key, $q_access, @values);
+  my ($key, $bins_key);
 
   if ('' eq ref $param) {
     $key = $param;
+
   } else {
     $key      = $param->{key};
     $bins_key = $param->{bins};
-
-    if ($param->{access}) {
-      $q_access =
-        qq| AND EXISTS (
-              SELECT wa.employee_id
-              FROM warehouse_access wa
-              WHERE (wa.employee_id  = (SELECT id FROM employee WHERE login = ?))
-                AND (wa.warehouse_id = w.id)
-                AND (wa.access IN ('ro', 'rw')))|;
-      push @values, $param->{access};
-    }
-
-    if ($param->{no_personal}) {
-      $q_access .= qq| AND (w.personal_warehouse_of IS NULL)|;
-
-    } elsif ($param->{personal}) {
-      $q_access .= qq| AND (w.personal_warehouse_of = ?)|;
-      push @values, conv_i($param->{personal});
-    }
   }
 
   my $query = qq|SELECT w.* FROM warehouse w
                  WHERE (NOT w.invalid) AND
                    ((SELECT COUNT(b.*) FROM bin b WHERE b.warehouse_id = w.id) > 0)
-                   $q_access
                  ORDER BY w.sortkey|;
 
-  $self->{$key} = selectall_hashref_query($self, $dbh, $query, @values);
+  $self->{$key} = selectall_hashref_query($self, $dbh, $query);
 
   if ($bins_key) {
     $query = qq|SELECT id, description FROM bin WHERE warehouse_id = ?|;
@@ -2330,6 +2366,9 @@ sub get_lists {
   if ($params{groups}) {
     $self->_get_groups($dbh, $params{groups});
   }
+  if ($params{partsgroup}) {
+    $self->get_partsgroup(\%main::myconfig, { all => 1, target => $params{partsgroup} });
+  }
 
   $main::lxdebug->leave_sub();
 }
@@ -2745,36 +2784,52 @@ sub lastname_used {
 
   my ($self, $dbh, $myconfig, $table, $module) = @_;
 
-  my $arap  = ($table eq 'customer') ? "ar" : "ap";
-  $table = $table eq "customer" ? "customer" : "vendor";
-  my $where = "1 = 1";
+  my ($arap, $where);
+
+  $table         = $table eq "customer" ? "customer" : "vendor";
+  my %column_map = ("a.curr"                  => "currency",
+                    "a.${table}_id"           => "${table}_id",
+                    "a.department_id"         => "department_id",
+                    "d.description"           => "department",
+                    "ct.name"                 => $table,
+                    "current_date + ct.terms" => "duedate",
+    );
+
+  if ($self->{type} =~ /delivery_order/) {
+    $arap  = 'delivery_orders';
+    delete $column_map{"a.curr"};
 
-  if ($self->{type} =~ /_order/) {
+  } elsif ($self->{type} =~ /_order/) {
     $arap  = 'oe';
     $where = "quotation = '0'";
-  }
-  if ($self->{type} =~ /_quotation/) {
+
+  } elsif ($self->{type} =~ /_quotation/) {
     $arap  = 'oe';
     $where = "quotation = '1'";
+
+  } elsif ($table eq 'customer') {
+    $arap  = 'ar';
+
+  } else {
+    $arap  = 'ap';
+
   }
 
-  my $query = qq|SELECT MAX(id) FROM $arap
-                 WHERE $where AND ${table}_id > 0|;
-  my ($trans_id) = selectrow_query($self, $dbh, $query);
+  $where           = "($where) AND" if ($where);
+  my $query        = qq|SELECT MAX(id) FROM $arap
+                        WHERE $where ${table}_id > 0|;
+  my ($trans_id)   = selectrow_query($self, $dbh, $query);
+  $trans_id       *= 1;
 
-  $trans_id *= 1;
-  $query =
-    qq|SELECT
-         a.curr, a.${table}_id, a.department_id,
-         d.description AS department,
-         ct.name, current_date + ct.terms AS duedate
-       FROM $arap a
-       LEFT JOIN $table ct ON (a.${table}_id = ct.id)
-       LEFT JOIN department d ON (a.department_id = d.id)
-       WHERE a.id = ?|;
-  ($self->{currency},   $self->{"${table}_id"}, $self->{department_id},
-   $self->{department}, $self->{$table},        $self->{duedate})
-    = selectrow_query($self, $dbh, $query, $trans_id);
+  my $column_spec  = join(', ', map { "${_} AS $column_map{$_}" } keys %column_map);
+  $query           = qq|SELECT $column_spec
+                        FROM $arap a
+                        LEFT JOIN $table     ct ON (a.${table}_id = ct.id)
+                        LEFT JOIN department d  ON (a.department_id = d.id)
+                        WHERE a.id = ?|;
+  my $ref          = selectfirst_hashref_query($self, $dbh, $query, $trans_id);
+
+  map { $self->{$_} = $ref->{$_} } values %column_map;
 
   $main::lxdebug->leave_sub();
 }
@@ -3119,6 +3174,7 @@ sub get_partsgroup {
   $main::lxdebug->enter_sub();
 
   my ($self, $myconfig, $p) = @_;
+  my $target = $p->{target} || 'all_partsgroup';
 
   my $dbh = $self->get_standard_dbh($myconfig);
 
@@ -3157,7 +3213,7 @@ sub get_partsgroup {
     @values = ($p->{language_code});
   }
 
-  $self->{all_partsgroup} = selectall_hashref_query($self, $dbh, $query, @values);
+  $self->{$target} = selectall_hashref_query($self, $dbh, $query, @values);
 
   $main::lxdebug->leave_sub();
 }
@@ -3223,4 +3279,25 @@ sub all_years {
   $main::lxdebug->leave_sub();
 }
 
+sub backup_vars {
+  $main::lxdebug->enter_sub();
+  my $self = shift;
+  my @vars = @_;
+
+  map { $self->{_VAR_BACKUP}->{$_} = $self->{$_} if $self->{$_} } @vars;
+
+  $main::lxdebug->leave_sub();
+}
+
+sub restore_vars {
+  $main::lxdebug->enter_sub();
+
+  my $self = shift;
+  my @vars = @_;
+
+  map { $self->{$_} = $self->{_VAR_BACKUP}->{$_} if $self->{_VAR_BACKUP}->{$_} } @vars;
+
+  $main::lxdebug->leave_sub();
+}
+
 1;