X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=71af15e1dcf2c748d58edf0ebe2ddef2c78eed0e;hb=5d5572546c7e33b5f573227f23973ec7668bafe2;hp=0aa7fb69cb92785acd061699cdbe9b06500af282;hpb=eff7e11288b8365a3f03c78af19470ed4032ec9d;p=kivitendo-erp.git
diff --git a/SL/Form.pm b/SL/Form.pm
index 0aa7fb69c..71af15e1d 100644
--- a/SL/Form.pm
+++ b/SL/Form.pm
@@ -36,6 +36,9 @@
#======================================================================
package Form;
+
+#use strict;
+
use Data::Dumper;
use CGI;
@@ -57,7 +60,7 @@ use List::Util qw(first max min sum);
my $standard_dbh;
-sub DESTROY {
+END {
if ($standard_dbh) {
$standard_dbh->disconnect();
undef $standard_dbh;
@@ -67,12 +70,10 @@ sub DESTROY {
sub _store_value {
$main::lxdebug->enter_sub(2);
- my $self = shift;
+ my $curr = shift;
my $key = shift;
my $value = shift;
- my $curr = $self;
-
while ($key =~ /\[\+?\]\.|\./) {
substr($key, 0, $+[0]) = '';
@@ -100,14 +101,14 @@ sub _store_value {
sub _input_to_hash {
$main::lxdebug->enter_sub(2);
- my $self = shift;
- my $input = shift;
+ my $params = shift;
+ my $input = shift;
- my @pairs = split(/&/, $input);
+ my @pairs = split(/&/, $input);
foreach (@pairs) {
my ($key, $value) = split(/=/, $_, 2);
- $self->_store_value($self->unescape($key), $self->unescape($value));
+ _store_value($params, unescape(undef, $key), unescape(undef, $value));
}
$main::lxdebug->leave_sub(2);
@@ -116,13 +117,13 @@ sub _input_to_hash {
sub _request_to_hash {
$main::lxdebug->enter_sub(2);
- my $self = shift;
- my $input = shift;
+ my $params = shift;
+ my $input = shift;
if (!$ENV{'CONTENT_TYPE'}
|| ($ENV{'CONTENT_TYPE'} !~ /multipart\/form-data\s*;\s*boundary\s*=\s*(.+)$/)) {
- $self->_input_to_hash($input);
+ _input_to_hash($params, $input);
$main::lxdebug->leave_sub(2);
return;
@@ -170,8 +171,8 @@ sub _request_to_hash {
substr $line, $-[0], $+[0] - $-[0], "";
}
- $previous = $self->_store_value($name, '');
- $self->{FILENAME} = $filename if ($filename);
+ $previous = _store_value($params, $name, '');
+ $params->{FILENAME} = $filename if ($filename);
next;
}
@@ -193,6 +194,29 @@ sub _request_to_hash {
$main::lxdebug->leave_sub(2);
}
+sub _recode_recursively {
+ my ($iconv, $param) = @_;
+
+ if (ref $param eq 'HASH') {
+ foreach my $key (keys %{ $param }) {
+ if (!ref $param->{$key}) {
+ $param->{$key} = $iconv->convert($param->{$key});
+ } else {
+ _recode_recursively($iconv, $param->{$key});
+ }
+ }
+
+ } elsif (ref $param eq 'ARRAY') {
+ foreach my $idx (0 .. scalar(@{ $param }) - 1) {
+ if (!ref $param->[$idx]) {
+ $param->[$idx] = $iconv->convert($param->[$idx]);
+ } else {
+ _recode_recursively($iconv, $param->[$idx]);
+ }
+ }
+ }
+}
+
sub new {
$main::lxdebug->enter_sub();
@@ -217,12 +241,27 @@ sub new {
bless $self, $type;
- $self->_request_to_hash($_);
+ my $parameters = { };
+ _request_to_hash($parameters, $_);
+
+ my $db_charset = $main::dbcharset;
+ $db_charset ||= Common::DEFAULT_CHARSET;
+
+ if ($parameters->{INPUT_ENCODING} && (lc $parameters->{INPUT_ENCODING} ne $db_charset)) {
+ require Text::Iconv;
+ my $iconv = Text::Iconv->new($parameters->{INPUT_ENCODING}, $db_charset);
+
+ _recode_recursively($iconv, $parameters);
+
+ delete $parameters{INPUT_ENCODING};
+ }
+
+ map { $self->{$_} = $parameters->{$_}; } keys %{ $parameters };
$self->{action} = lc $self->{action};
$self->{action} =~ s/( |-|,|\#)/_/g;
- $self->{version} = "2.4.3";
+ $self->{version} = "2.6.0 beta 1";
$main::lxdebug->leave_sub();
@@ -471,7 +510,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);
}
@@ -533,7 +572,7 @@ sub header {
return;
}
- my ($stylesheet, $favicon);
+ my ($stylesheet, $favicon, $pagelayout);
if ($ENV{HTTP_USER_AGENT}) {
my $doctype;
@@ -591,7 +630,7 @@ sub header {
? "$self->{title} - $self->{titlebar}"
: $self->{titlebar};
my $ajax = "";
- foreach $item (@ { $self->{AJAX} }) {
+ foreach my $item (@ { $self->{AJAX} }) {
$ajax .= $item->show_javascript();
}
@@ -599,17 +638,17 @@ sub header {
'charset' => $db_charset,);
print qq|${doctype}
+
$self->{titlebar}
$stylesheet
$pagelayout
$favicon
-
$jsscript
$ajax
-
+
@@ -639,6 +678,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();
@@ -691,6 +744,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;
@@ -756,6 +810,8 @@ sub parse_html_template {
}
sub show_generic_error {
+ $main::lxdebug->enter_sub();
+
my ($self, $error, %params) = @_;
my $add_params = {
@@ -777,15 +833,19 @@ sub show_generic_error {
$add_params->{SHOW_BACK_BUTTON} = 1;
}
- $self->{title} = $title if ($title);
+ $self->{title} = $params{title} if $params{title};
$self->header();
print $self->parse_html_template("generic/error", $add_params);
+ $main::lxdebug->leave_sub();
+
die("Error: $error\n");
}
sub show_generic_information {
+ $main::lxdebug->enter_sub();
+
my ($self, $text, $title) = @_;
my $add_params = {
@@ -798,7 +858,9 @@ sub show_generic_information {
$self->header();
print $self->parse_html_template("generic/information", $add_params);
- die("Information: $error\n");
+ $main::lxdebug->leave_sub();
+
+ die("Information: $text\n");
}
# write Trigger JavaScript-Code ($qty = quantity of Triggers)
@@ -821,8 +883,8 @@ sub write_trigger {
"yyyy-mm-dd" => "%Y-%m-%d",
);
- my $ifFormat = defined($dateformats{$myconfig{"dateformat"}}) ?
- $dateformats{$myconfig{"dateformat"}} : "%d.%m.%Y";
+ my $ifFormat = defined($dateformats{$myconfig->{"dateformat"}}) ?
+ $dateformats{$myconfig->{"dateformat"}} : "%d.%m.%Y";
my @triggers;
while ($#_ >= 2) {
@@ -855,7 +917,7 @@ sub redirect {
if ($self->{callback}) {
- ($script, $argv) = split(/\?/, $self->{callback}, 2);
+ my ($script, $argv) = split(/\?/, $self->{callback}, 2);
$script =~ s|.*/||;
$script =~ s|[^a-zA-Z0-9_\.]||g;
exec("perl", "$script", $argv);
@@ -888,12 +950,12 @@ sub format_amount {
if ($amount eq "") {
$amount = 0;
}
-
+
# Hey watch out! The amount can be an exponential term like 1.13686837721616e-13
-
+
my $neg = ($amount =~ s/^-//);
my $exp = ($amount =~ m/[e]/) ? 1 : 0;
-
+
if (defined($places) && ($places ne '')) {
if (not $exp) {
if ($places < 0) {
@@ -965,6 +1027,7 @@ sub format_amount_units {
$amount *= $conv_unit->{factor};
my @values;
+ my $num;
foreach my $unit (@$conv_units) {
my $last = $unit->{name} eq $part_unit->{name};
@@ -1092,13 +1155,11 @@ sub parse_template {
# Copy the notes from the invoice/sales order etc. back to the variable "notes" because that is where most templates expect it to be.
$self->{"notes"} = $self->{ $self->{"formname"} . "notes" };
- map({ $self->{"employee_${_}"} = $myconfig->{$_}; }
- qw(email tel fax name signature company address businessnumber
- co_ustid taxnumber duns));
+ if (!$self->{employee_id}) {
+ map { $self->{"employee_${_}"} = $myconfig->{$_}; } qw(email tel fax name signature company address businessnumber co_ustid taxnumber duns);
+ }
- map({ $self->{"${_}"} = $myconfig->{$_}; }
- qw(co_ustid));
-
+ map { $self->{"${_}"} = $myconfig->{$_}; } qw(co_ustid);
$self->{copies} = 1 if (($self->{copies} *= 1) <= 0);
@@ -1203,7 +1264,7 @@ sub parse_template {
open(OUT, $self->{OUT})
or $self->error($self->cleanup . "$self->{OUT} : $!");
} else {
- $self->{attachment_filename} = ($self->{attachment_filename})
+ $self->{attachment_filename} = ($self->{attachment_filename})
? $self->{attachment_filename}
: $self->generate_attachment_filename();
@@ -1293,14 +1354,19 @@ sub generate_attachment_filename {
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"}) {
+ if ($self->{preview} && (first { $self->{type} eq $_ } qw(invoice credit_note))) {
+ $attachment_filename .= ' (' . $main::locale->text('Preview') . ')' . $self->get_extension_for_format();
+
+ } elsif ($attachment_filename && $self->{"${prefix}number"}) {
$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 = "";
}
+ $attachment_filename = $main::locale->quote_special_chars('filenames', $attachment_filename);
+ $attachment_filename =~ s|[\s/\\]+|_|g;
+
return $attachment_filename;
}
@@ -1350,6 +1416,7 @@ sub datetonum {
$main::lxdebug->enter_sub();
my ($self, $date, $myconfig) = @_;
+ my ($yy, $mm, $dd);
if ($date && $date =~ /\D/) {
@@ -1406,9 +1473,9 @@ sub dbconnect_noauto {
$main::lxdebug->enter_sub();
my ($self, $myconfig) = @_;
-
+
# connect to database
- $dbh =
+ my $dbh =
DBI->connect($myconfig->{dbconnect}, $myconfig->{dbuser},
$myconfig->{dbpasswd}, { AutoCommit => 0 })
or $self->dberror;
@@ -1487,7 +1554,7 @@ sub update_exchangerate {
if ($curr eq '') {
$main::lxdebug->leave_sub();
return;
- }
+ }
$query = qq|SELECT curr FROM defaults|;
my ($currency) = selectrow_query($self, $dbh, $query);
@@ -1528,7 +1595,7 @@ sub update_exchangerate {
SET $set
WHERE curr = ?
AND transdate = ?|;
-
+
} else {
$query = qq|INSERT INTO exchangerate (curr, buy, sell, transdate)
VALUES (?, $buy, $sell, ?)|;
@@ -1597,6 +1664,10 @@ sub check_exchangerate {
my ($self, $myconfig, $currency, $transdate, $fld) = @_;
+ if ($fld !~/^buy|sell$/) {
+ $self->error('Fatal: check_exchangerate called with invalid buy/sell argument');
+ }
+
unless ($transdate) {
$main::lxdebug->leave_sub();
return "";
@@ -1839,7 +1910,7 @@ sub add_shipto {
shiptophone = ? AND
shiptofax = ? AND
shiptoemail = ? AND
- module = ? AND
+ module = ? AND
trans_id = ?|;
my $insert_check = selectfirst_hashref_query($self, $dbh, $query, @values, $module, $id);
if(!$insert_check){
@@ -1868,28 +1939,31 @@ sub get_employee {
$main::lxdebug->leave_sub();
}
-sub get_salesman {
+sub get_employee_data {
$main::lxdebug->enter_sub();
- my ($self, $myconfig, $salesman_id) = @_;
+ my $self = shift;
+ my %params = @_;
- $main::lxdebug->leave_sub() and return unless $salesman_id;
+ Common::check_params(\%params, qw(prefix));
+ Common::check_params_x(\%params, qw(id));
- my $dbh = $self->get_standard_dbh($myconfig);
+ if (!$params{id}) {
+ $main::lxdebug->leave_sub();
+ return;
+ }
- my ($login) =
- selectrow_query($self, $dbh, qq|SELECT login FROM employee WHERE id = ?|,
- $salesman_id);
+ my $myconfig = \%main::myconfig;
+ my $dbh = $params{dbh} || $self->get_standard_dbh($myconfig);
+
+ my ($login) = selectrow_query($self, $dbh, qq|SELECT login FROM employee WHERE id = ?|, conv_i($params{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->{$params{prefix} . "_${_}"} = $user->{$_}; } qw(address businessnumber co_ustid company duns email fax name signature taxnumber tel);
- $self->{salesman_name} = $login
- if ($self->{salesman_name} eq "");
+ $self->{$params{prefix} . '_login'} = $login;
+ $self->{$params{prefix} . '_name'} ||= $login;
}
$main::lxdebug->leave_sub();
@@ -2019,6 +2093,7 @@ sub _get_charts {
$main::lxdebug->enter_sub();
my ($self, $dbh, $params) = @_;
+ my ($key);
$key = $params->{key};
$key = "all_charts" unless ($key);
@@ -2042,11 +2117,27 @@ sub _get_charts {
sub _get_taxcharts {
$main::lxdebug->enter_sub();
- my ($self, $dbh, $key) = @_;
+ my ($self, $dbh, $params) = @_;
+
+ my $key = "all_taxcharts";
+ my @where;
+
+ if (ref $params eq 'HASH') {
+ $key = $params->{key} if ($params->{key});
+ if ($params->{module} eq 'AR') {
+ push @where, 'taxkey NOT IN (8, 9, 18, 19)';
+
+ } elsif ($params->{module} eq 'AP') {
+ push @where, 'taxkey NOT IN (1, 2, 3, 12, 13)';
+ }
+
+ } elsif ($params) {
+ $key = $params;
+ }
- $key = "all_taxcharts" unless ($key);
+ my $where = ' WHERE ' . join(' AND ', map { "($_)" } @where) if (@where);
- my $query = qq|SELECT * FROM tax ORDER BY taxkey|;
+ my $query = qq|SELECT * FROM tax $where ORDER BY taxkey|;
$self->{$key} = selectall_hashref_query($self, $dbh, $query);
@@ -2126,7 +2217,7 @@ $main::lxdebug->enter_sub();
$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();
@@ -2140,7 +2231,7 @@ $main::lxdebug->enter_sub();
$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();
@@ -2152,7 +2243,7 @@ sub _get_customers {
my ($self, $dbh, $key, $limit) = @_;
$key = "all_customers" unless ($key);
- $limit_clause = "LIMIT $limit" if $limit;
+ my $limit_clause = "LIMIT $limit" if $limit;
my $query = qq|SELECT * FROM customer WHERE NOT obsolete ORDER BY name $limit_clause|;
@@ -2242,19 +2333,19 @@ sub _get_simple {
$main::lxdebug->leave_sub();
}
-sub _get_groups {
- $main::lxdebug->enter_sub();
-
- my ($self, $dbh, $key) = @_;
-
- $key ||= "all_groups";
-
- my $groups = $main::auth->read_groups();
-
- $self->{$key} = selectall_hashref_query($self, $dbh, $query);
-
- $main::lxdebug->leave_sub();
-}
+#sub _get_groups {
+# $main::lxdebug->enter_sub();
+#
+# my ($self, $dbh, $key) = @_;
+#
+# $key ||= "all_groups";
+#
+# my $groups = $main::auth->read_groups();
+#
+# $self->{$key} = selectall_hashref_query($self, $dbh, $query);
+#
+# $main::lxdebug->leave_sub();
+#}
sub get_lists {
$main::lxdebug->enter_sub();
@@ -2305,7 +2396,7 @@ sub get_lists {
if ($params{"employees"}) {
$self->_get_employees($dbh, "all_employees", $params{"employees"});
}
-
+
if ($params{"salesmen"}) {
$self->_get_employees($dbh, "all_salesmen", $params{"salesmen"});
}
@@ -2317,11 +2408,11 @@ sub get_lists {
if ($params{"dunning_configs"}) {
$self->_get_dunning_configs($dbh, $params{"dunning_configs"});
}
-
+
if($params{"currencies"}) {
$self->_get_currencies($dbh, $params{"currencies"});
}
-
+
if($params{"customers"}) {
if (ref $params{"customers"} eq 'HASH') {
$self->_get_customers($dbh, $params{"customers"}{key}, $params{"customers"}{limit});
@@ -2329,7 +2420,7 @@ sub get_lists {
$self->_get_customers($dbh, $params{"customers"});
}
}
-
+
if($params{"vendors"}) {
if (ref $params{"vendors"} eq 'HASH') {
$self->_get_vendors($dbh, $params{"vendors"}{key}, $params{"vendors"}{limit});
@@ -2337,7 +2428,7 @@ sub get_lists {
$self->_get_vendors($dbh, $params{"vendors"});
}
}
-
+
if($params{"payments"}) {
$self->_get_payments($dbh, $params{"payments"});
}
@@ -2354,9 +2445,10 @@ sub get_lists {
$self->_get_warehouses($dbh, $params{warehouses});
}
- if ($params{groups}) {
- $self->_get_groups($dbh, $params{groups});
- }
+# if ($params{groups}) {
+# $self->_get_groups($dbh, $params{groups});
+# }
+
if ($params{partsgroup}) {
$self->get_partsgroup(\%main::myconfig, { all => 1, target => $params{partsgroup} });
}
@@ -2595,7 +2687,7 @@ sub create_links {
do_statement($self, $sth, $query, '%' . $module . '%');
$self->{accounts} = "";
- while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
+ while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
foreach my $key (split(/:/, $ref->{link})) {
if ($key =~ /\Q$module\E/) {
@@ -2642,7 +2734,7 @@ sub create_links {
WHERE a.id = ?|;
$ref = selectfirst_hashref_query($self, $dbh, $query, $self->{id});
- foreach $key (keys %$ref) {
+ foreach my $key (keys %$ref) {
$self->{$key} = $ref->{$key};
}
@@ -2664,7 +2756,7 @@ sub create_links {
do_statement($self, $sth, $query, "%$module%");
$self->{accounts} = "";
- while ($ref = $sth->fetchrow_hashref(NAME_lc)) {
+ while ($ref = $sth->fetchrow_hashref("NAME_lc")) {
foreach my $key (split(/:/, $ref->{link})) {
if ($key =~ /\Q$module\E/) {
@@ -2714,7 +2806,7 @@ sub create_links {
my $index = 0;
# store amounts in {acc_trans}{$key} for multiple accounts
- while (my $ref = $sth->fetchrow_hashref(NAME_lc)) {
+ while (my $ref = $sth->fetchrow_hashref("NAME_lc")) {
$ref->{exchangerate} =
$self->get_exchangerate($dbh, $self->{currency}, $ref->{transdate}, $fld);
if (!($xkeyref{ $ref->{accno} } =~ /tax/)) {
@@ -2880,7 +2972,7 @@ sub redo_rows {
# fill rows
foreach my $item (sort { $a->{num} <=> $b->{num} } @ndx) {
$i++;
- $j = $item->{ndx} - 1;
+ my $j = $item->{ndx} - 1;
map { $self->{"${_}_$i"} = $new->[$j]->{$_} } @{$flds};
}
@@ -3063,7 +3155,7 @@ sub get_history {
qq|WHERE trans_id = | . $trans_id
. $restriction . qq| |
. $order;
-
+
my $sth = $dbh->prepare($query) || $self->dberror($query);
$sth->execute() || $self->dberror("$query");
@@ -3074,7 +3166,7 @@ sub get_history {
$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();