X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=inline;f=SL%2FForm.pm;h=d155a0d7f13d9c775b8f54e8b1137ef40bc8bd54;hb=5df2b57a097f66f6cecba0aa577c7aaba3422ab6;hp=290eb754ecc23d3d22ea02f7d5f9c7ed001ea05a;hpb=0884406403ce36af3484924086527ba689807329;p=kivitendo-erp.git
diff --git a/SL/Form.pm b/SL/Form.pm
index 290eb754e..d155a0d7f 100644
--- a/SL/Form.pm
+++ b/SL/Form.pm
@@ -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;
@@ -376,53 +376,6 @@ sub unquote {
}
-sub quote_html {
- $main::lxdebug->enter_sub(2);
-
- my ($self, $str) = @_;
-
- my %replace =
- ('order' => ['&', '"', '<', '>'],
- '<' => '<',
- '>' => '>',
- '"' => '"',
- '&' => '&',
- );
-
- map({ $str =~ s/$_/$replace{$_}/g; } @{ $replace{"order"} });
-
- $main::lxdebug->leave_sub(2);
-
- return $str;
-}
-
-sub unquote_html {
- $main::lxdebug->enter_sub(2);
-
- my ($self, $str) = @_;
-
- my %replace =
- ('ä' => 'ä',
- 'ö' => 'ö',
- 'ü' => 'ü',
- 'Ä' => 'Ä',
- 'Ö' => 'Ö',
- 'Ü' => 'Ü',
- 'ß' => 'ß',
- '>' => '>',
- '<' => '<',
- '"' => '"',
- );
-
- map { $str =~ s/\Q$_\E/$replace{$_}/g; } keys %replace;
- $str =~ s/\&/\&/g;
-
- $main::lxdebug->leave_sub(2);
-
- return $str;
-}
-
-
sub hide_form {
my $self = shift;
@@ -518,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);
}
@@ -528,6 +481,48 @@ sub isblank {
$main::lxdebug->leave_sub();
}
+sub create_http_response {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+ my %params = @_;
+
+ my $cgi = $main::cgi;
+ $cgi ||= CGI->new('');
+
+ my $base_path;
+
+ if ($ENV{HTTP_X_FORWARDED_FOR}) {
+ $base_path = $ENV{HTTP_REFERER};
+ $base_path =~ s|^.*?://.*?/|/|;
+ } else {
+ $base_path = $ENV{REQUEST_URI};
+ }
+ $base_path =~ s|[^/]+$||;
+ $base_path =~ s|/$||;
+
+ my $session_cookie;
+ if (defined $main::auth) {
+ my $session_cookie_value = $main::auth->get_session_id();
+ $session_cookie_value ||= 'NO_SESSION';
+
+ $session_cookie = $cgi->cookie('-name' => $main::auth->get_session_cookie_name(),
+ '-value' => $session_cookie_value,
+ '-path' => $base_path);
+ }
+
+ my %cgi_params = ('-type' => $params{content_type});
+ $cgi_params{'-charset'} = $params{charset} if ($params{charset});
+
+ my $output = $cgi->header('-cookie' => $session_cookie,
+ %cgi_params);
+
+ $main::lxdebug->leave_sub();
+
+ return $output;
+}
+
+
sub header {
$main::lxdebug->enter_sub();
@@ -538,9 +533,6 @@ sub header {
return;
}
- my $cgi = $main::cgi;
- $cgi ||= CGI->new('');
-
my ($stylesheet, $favicon);
if ($ENV{HTTP_USER_AGENT}) {
@@ -585,6 +577,7 @@ sub header {
if ($self->{jsscript} == 1) {
$jsscript = qq|
+
@@ -602,30 +595,8 @@ sub header {
$ajax .= $item->show_javascript();
}
- my $base_path;
-
- if ($ENV{HTTP_X_FORWARDED_FOR}) {
- $base_path = $ENV{HTTP_REFERER};
- $base_path =~ s|^.*?://.*?/|/|;
- } else {
- $base_path = $ENV{REQUEST_URI};
- }
- $base_path =~ s|[^/]+$||;
- $base_path =~ s|/$||;
-
- my $session_cookie;
- if (defined $main::auth) {
- my $session_cookie_value = $main::auth->get_session_id();
- $session_cookie_value ||= 'NO_SESSION';
-
- $session_cookie = $cgi->cookie('-name' => $main::auth->get_session_cookie_name(),
- '-value' => $session_cookie_value,
- '-path' => $base_path);
- }
-
- print $cgi->header('-type' => 'text/html',
- '-charset' => $db_charset,
- '-cookie' => $session_cookie);
+ print $self->create_http_response('content_type' => 'text/html',
+ 'charset' => $db_charset,);
print qq|${doctype}
$self->{titlebar}
@@ -759,13 +730,25 @@ 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();
}
- $main::lxdebug->message(0, "err " . $template->error());
-
- $output = $main::locale->{iconv}->convert($output) if ($main::locale);
$main::lxdebug->leave_sub();
@@ -950,16 +933,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;
@@ -1277,27 +1263,40 @@ sub get_formname_translation {
return $formname_translations{$formname}
}
-sub generate_attachment_filename {
+sub get_number_prefix_for_type {
my ($self) = @_;
- my $attachment_filename = $self->unquote_html($self->get_formname_translation());
my $prefix =
(first { $self->{type} eq $_ } qw(invoice credit_note)) ? 'inv'
: ($self->{type} =~ /_quotation$/) ? 'quo'
: ($self->{type} =~ /_delivery_order$/) ? 'do'
: 'ord';
+ return $prefix;
+}
+
+sub get_extension_for_format {
+ my ($self) = @_;
+
+ my $extension = $self->{format} =~ /pdf/i ? ".pdf"
+ : $self->{format} =~ /postscript/i ? ".ps"
+ : $self->{format} =~ /opendocument/i ? ".odt"
+ : $self->{format} =~ /html/i ? ".html"
+ : "";
+
+ return $extension;
+}
+
+sub generate_attachment_filename {
+ my ($self) = @_;
+
+ my $attachment_filename = $main::locale->unquote_special_chars('HTML', $self->get_formname_translation());
+ my $prefix = $self->get_number_prefix_for_type();
+
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;
+ $attachment_filename .= "_" . $self->{"${prefix}number"} . $self->get_extension_for_format();
+ $attachment_filename = $main::locale->quote_special_chars('filenames', $attachment_filename);
+ $attachment_filename =~ s|[\s/\\]+|_|g;
} else {
$attachment_filename = "";
}
@@ -1305,6 +1304,19 @@ sub generate_attachment_filename {
return $attachment_filename;
}
+sub generate_email_subject {
+ my ($self) = @_;
+
+ my $subject = $main::locale->unquote_special_chars('HTML', $self->get_formname_translation());
+ my $prefix = $self->get_number_prefix_for_type();
+
+ if ($subject && $self->{"${prefix}number"}) {
+ $subject .= " " . $self->{"${prefix}number"}
+ }
+
+ return $subject;
+}
+
sub cleanup {
$main::lxdebug->enter_sub();
@@ -1416,6 +1428,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);
@@ -1423,6 +1440,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();
@@ -1583,8 +1615,6 @@ sub check_exchangerate {
my ($exchangerate) = selectrow_query($self, $dbh, $query, $currency, $transdate);
- $exchangerate = 1 if ($exchangerate eq "");
-
$main::lxdebug->leave_sub();
return $exchangerate;
@@ -1884,6 +1914,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 | .
@@ -1952,10 +1988,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();
}
@@ -2153,41 +2194,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 = ?|;
@@ -2335,6 +2357,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();
}
@@ -2750,36 +2775,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);
- if ($self->{type} =~ /_order/) {
+ $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"};
+
+ } 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();
}
@@ -3124,6 +3165,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);
@@ -3162,7 +3204,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();
}
@@ -3228,4 +3270,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;