X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=f0bb0e2cb617b51a1c7e41ada698abea624c2e69;hb=1043d7f814fccf5864e677b1e38577d0a150026c;hp=98fd7b2b82ed8325d1f849f5db46dc2cfa85733d;hpb=8c7e44938a661e035f62840e1e177353240ace5d;p=kivitendo-erp.git
diff --git a/SL/Form.pm b/SL/Form.pm
index 98fd7b2b8..f0bb0e2cb 100644
--- a/SL/Form.pm
+++ b/SL/Form.pm
@@ -36,12 +36,15 @@
#======================================================================
package Form;
+
+#use strict;
+
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;
@@ -53,17 +56,74 @@ use SL::Menu;
use SL::Template;
use SL::User;
use Template;
-use List::Util qw(max min sum);
+use List::Util qw(first max min sum);
+use List::MoreUtils qw(any);
my $standard_dbh;
-sub DESTROY {
+END {
if ($standard_dbh) {
$standard_dbh->disconnect();
undef $standard_dbh;
}
}
+=item _store_value()
+
+parses a complex var name, and stores it in the form.
+
+syntax:
+ $form->_store_value($key, $value);
+
+keys must start with a string, and can contain various tokens.
+supported key structures are:
+
+1. simple access
+ simple key strings work as expected
+
+ id => $form->{id}
+
+2. hash access.
+ separating two keys by a dot (.) will result in a hash lookup for the inner value
+ this is similar to the behaviour of java and templating mechanisms.
+
+ filter.description => $form->{filter}->{description}
+
+3. array+hashref access
+
+ adding brackets ([]) before the dot will cause the next hash to be put into an array.
+ using [+] instead of [] will force a new array index. this is useful for recurring
+ data structures like part lists. put a [+] into the first varname, and use [] on the
+ following ones.
+
+ repeating these names in your template:
+
+ invoice.items[+].id
+ invoice.items[].parts_id
+
+ will result in:
+
+ $form->{invoice}->{items}->[
+ {
+ id => ...
+ parts_id => ...
+ },
+ {
+ id => ...
+ parts_id => ...
+ }
+ ...
+ ]
+
+4. arrays
+
+ using brackets at the end of a name will result in a pure array to be created.
+ note that you mustn't use [+], which is reserved for array+hash access and will
+ result in undefined behaviour in array context.
+
+ filter.status[] => $form->{status}->[ val1, val2, ... ]
+
+=cut
sub _store_value {
$main::lxdebug->enter_sub(2);
@@ -71,30 +131,29 @@ sub _store_value {
my $key = shift;
my $value = shift;
- my $curr = $self;
+ my @tokens = split /((?:\[\+?\])?(?:\.|$))/, $key;
- while ($key =~ /\[\+?\]\.|\./) {
- substr($key, 0, $+[0]) = '';
+ my $curr;
- if ($& eq '.') {
- $curr->{$`} ||= { };
- $curr = $curr->{$`};
+ if (scalar @tokens) {
+ $curr = \ $self->{ shift @tokens };
+ }
- } else {
- $curr->{$`} ||= [ ];
- if (!scalar @{ $curr->{$`} } || $& eq '[+].') {
- push @{ $curr->{$`} }, { };
- }
+ while (@tokens) {
+ my $sep = shift @tokens;
+ my $key = shift @tokens;
- $curr = $curr->{$`}->[-1];
- }
+ $curr = \ $$curr->[++$#$$curr], next if $sep eq '[]';
+ $curr = \ $$curr->[max 0, $#$$curr] if $sep eq '[].';
+ $curr = \ $$curr->[++$#$$curr] if $sep eq '[+].';
+ $curr = \ $$curr->{$key}
}
- $curr->{$key} = $value;
+ $$curr = $value;
$main::lxdebug->leave_sub(2);
- return \$curr->{$key};
+ return $curr;
}
sub _input_to_hash {
@@ -107,7 +166,7 @@ sub _input_to_hash {
foreach (@pairs) {
my ($key, $value) = split(/=/, $_, 2);
- $self->_store_value($self->unescape($key), $self->unescape($value));
+ $self->_store_value($self->unescape($key), $self->unescape($value)) if ($key);
}
$main::lxdebug->leave_sub(2);
@@ -170,7 +229,7 @@ sub _request_to_hash {
substr $line, $-[0], $+[0] - $-[0], "";
}
- $previous = $self->_store_value($name, '');
+ $previous = $self->_store_value($name, '') if ($name);
$self->{FILENAME} = $filename if ($filename);
next;
@@ -193,6 +252,31 @@ sub _request_to_hash {
$main::lxdebug->leave_sub(2);
}
+sub _recode_recursively {
+ $main::lxdebug->enter_sub();
+ my ($iconv, $param) = @_;
+
+ if (any { ref $param eq $_ } qw(Form 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]);
+ }
+ }
+ }
+ $main::lxdebug->leave_sub();
+}
+
sub new {
$main::lxdebug->enter_sub();
@@ -219,10 +303,24 @@ sub new {
$self->_request_to_hash($_);
+ my $db_charset = $main::dbcharset;
+ $db_charset ||= Common::DEFAULT_CHARSET;
+
+ if ($self->{INPUT_ENCODING}) {
+ if (lc $self->{INPUT_ENCODING} ne lc $db_charset) {
+ require Text::Iconv;
+ my $iconv = Text::Iconv->new($self->{INPUT_ENCODING}, $db_charset);
+
+ _recode_recursively($iconv, $self);
+ }
+
+ delete $self{INPUT_ENCODING};
+ }
+
$self->{action} = lc $self->{action};
$self->{action} =~ s/( |-|,|\#)/_/g;
- $self->{version} = "2.4.3";
+ $self->{version} = "2.6.0";
$main::lxdebug->leave_sub();
@@ -355,75 +453,33 @@ sub unescape {
}
sub quote {
+ $main::lxdebug->enter_sub();
my ($self, $str) = @_;
if ($str && !ref($str)) {
$str =~ s/\"/"/g;
}
- $str;
+ $main::lxdebug->leave_sub();
+ return $str;
}
sub unquote {
+ $main::lxdebug->enter_sub();
my ($self, $str) = @_;
if ($str && !ref($str)) {
$str =~ s/"/\"/g;
}
- $str;
-
-}
-
-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);
+ $main::lxdebug->leave_sub();
return $str;
}
-
sub hide_form {
+ $main::lxdebug->enter_sub();
my $self = shift;
if (@_) {
@@ -434,7 +490,7 @@ sub hide_form {
print($main::cgi->hidden("-name" => $_, "-default" => $self->{$_}) . "\n");
}
}
-
+ $main::lxdebug->leave_sub();
}
sub error {
@@ -518,7 +574,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 +584,49 @@ 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,
+ '-secure' => $ENV{HTTPS});
+ }
+
+ 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,10 +637,7 @@ sub header {
return;
}
- my $cgi = $main::cgi;
- $cgi ||= CGI->new('');
-
- my ($stylesheet, $favicon);
+ my ($stylesheet, $favicon, $pagelayout);
if ($ENV{HTTP_USER_AGENT}) {
my $doctype;
@@ -585,6 +681,7 @@ sub header {
if ($self->{jsscript} == 1) {
$jsscript = qq|
+
@@ -598,47 +695,25 @@ sub header {
? "$self->{title} - $self->{titlebar}"
: $self->{titlebar};
my $ajax = "";
- foreach $item (@ { $self->{AJAX} }) {
+ foreach my $item (@ { $self->{AJAX} }) {
$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}
$stylesheet
$pagelayout
$favicon
-
$jsscript
$ajax
-
+
@@ -668,6 +743,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();
@@ -720,6 +809,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;
@@ -759,46 +849,68 @@ 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;
}
sub show_generic_error {
- my ($self, $error, $title, $action) = @_;
+ $main::lxdebug->enter_sub();
+
+ my ($self, $error, %params) = @_;
my $add_params = {
- 'title_error' => $title,
+ 'title_error' => $params{title},
'label_error' => $error,
};
- my @vars;
- if ($action) {
- map({ delete($self->{$_}); } qw(action));
- map({ push(@vars, { "name" => $_, "value" => $self->{$_} })
- if (!ref($self->{$_})); }
- keys(%{$self}));
- $add_params->{"SHOW_BUTTON"} = 1;
- $add_params->{"BUTTON_LABEL"} = $action;
+ if ($params{action}) {
+ my @vars;
+
+ map { delete($self->{$_}); } qw(action);
+ map { push @vars, { "name" => $_, "value" => $self->{$_} } if (!ref($self->{$_})); } keys %{ $self };
+
+ $add_params->{SHOW_BUTTON} = 1;
+ $add_params->{BUTTON_LABEL} = $params{label} || $params{action};
+ $add_params->{VARIABLES} = \@vars;
+
+ } elsif ($params{back_button}) {
+ $add_params->{SHOW_BACK_BUTTON} = 1;
}
- $add_params->{"VARIABLES"} = \@vars;
- $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 = {
@@ -811,7 +923,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)
@@ -834,8 +948,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) {
@@ -868,7 +982,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);
@@ -901,12 +1015,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) {
@@ -930,9 +1044,9 @@ sub format_amount {
$amount .= $d[0].$p[1].(0 x ($places - length $p[1])) if ($places || $p[1] ne '');
$amount = do {
- ($dash =~ /-/) ? ($neg ? "($amount)" : "$amount" ) :
- ($dash =~ /DRCR/) ? ($neg ? "$amount DR" : "$amount CR" ) :
- ($neg ? "-$amount" : "$amount" ) ;
+ ($dash =~ /-/) ? ($neg ? "($amount)" : "$amount" ) :
+ ($dash =~ /DRCR/) ? ($neg ? "$amount " . $main::locale->text('DR') : "$amount " . $main::locale->text('CR') ) :
+ ($neg ? "-$amount" : "$amount" ) ;
};
@@ -946,16 +1060,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;
@@ -975,6 +1092,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};
@@ -1076,25 +1194,37 @@ sub parse_template {
$self->{"cwd"} = getcwd();
$self->{"tmpdir"} = $self->{cwd} . "/${userspath}";
+ my $ext_for_format;
+
if ($self->{"format"} =~ /(opendocument|oasis)/i) {
- $template = OpenDocumentTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+ $template = OpenDocumentTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+ $ext_for_format = $self->{"format"} =~ m/pdf/ ? 'pdf' : 'odt';
+
} elsif ($self->{"format"} =~ /(postscript|pdf)/i) {
$ENV{"TEXINPUTS"} = ".:" . getcwd() . "/" . $myconfig->{"templates"} . ":" . $ENV{"TEXINPUTS"};
- $template = LaTeXTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
- } elsif (($self->{"format"} =~ /html/i) ||
- (!$self->{"format"} && ($self->{"IN"} =~ /html$/i))) {
- $template = HTMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
- } elsif (($self->{"format"} =~ /xml/i) ||
- (!$self->{"format"} && ($self->{"IN"} =~ /xml$/i))) {
- $template = XMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+ $template = LaTeXTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+ $ext_for_format = 'pdf';
+
+ } elsif (($self->{"format"} =~ /html/i) || (!$self->{"format"} && ($self->{"IN"} =~ /html$/i))) {
+ $template = HTMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+ $ext_for_format = 'html';
+
+ } elsif (($self->{"format"} =~ /xml/i) || (!$self->{"format"} && ($self->{"IN"} =~ /xml$/i))) {
+ $template = XMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+ $ext_for_format = 'xml';
+
} elsif ( $self->{"format"} =~ /elsterwinston/i ) {
$template = XMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+
} elsif ( $self->{"format"} =~ /elstertaxbird/i ) {
$template = XMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
+
} elsif ( defined $self->{'format'}) {
$self->error("Outputformat not defined. This may be a future feature: $self->{'format'}");
+
} elsif ( $self->{'format'} eq '' ) {
$self->error("No Outputformat given: $self->{'format'}");
+
} else { #Catch the rest
$self->error("Outputformat not defined: $self->{'format'}");
}
@@ -1102,13 +1232,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);
@@ -1181,10 +1309,10 @@ sub parse_template {
} else {
if (!$self->{"do_not_attach"}) {
- @{ $mail->{attachments} } =
- ({ "filename" => $self->{"tmpfile"},
- "name" => $self->{"attachment_filename"} ?
- $self->{"attachment_filename"} : $self->{"tmpfile"} });
+ my $attachment_name = $self->{attachment_filename} || $self->{tmpfile};
+ $attachment_name =~ s/\.(.+?)$/.${ext_for_format}/ if ($ext_for_format);
+ $mail->{attachments} = [{ "filename" => $self->{tmpfile},
+ "name" => $attachment_name }];
}
$mail->{message} =~ s/\r//g;
@@ -1213,7 +1341,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();
@@ -1230,6 +1358,7 @@ Content-Length: $numbytes
while () {
print OUT $_;
+
}
close(OUT);
@@ -1249,55 +1378,100 @@ Content-Length: $numbytes
}
sub get_formname_translation {
+ $main::lxdebug->enter_sub();
my ($self, $formname) = @_;
$formname ||= $self->{formname};
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'),
+ 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'),
+ sales_delivery_order => $main::locale->text('Delivery Order'),
+ purchase_delivery_order => $main::locale->text('Delivery Order'),
+ dunning => $main::locale->text('Dunning'),
);
+ $main::lxdebug->leave_sub();
return $formname_translations{$formname}
}
+sub get_number_prefix_for_type {
+ $main::lxdebug->enter_sub();
+ my ($self) = @_;
+
+ my $prefix =
+ (first { $self->{type} eq $_ } qw(invoice credit_note)) ? 'inv'
+ : ($self->{type} =~ /_quotation$/) ? 'quo'
+ : ($self->{type} =~ /_delivery_order$/) ? 'do'
+ : 'ord';
+
+ $main::lxdebug->leave_sub();
+ return $prefix;
+}
+
+sub get_extension_for_format {
+ $main::lxdebug->enter_sub();
+ my ($self) = @_;
+
+ my $extension = $self->{format} =~ /pdf/i ? ".pdf"
+ : $self->{format} =~ /postscript/i ? ".ps"
+ : $self->{format} =~ /opendocument/i ? ".odt"
+ : $self->{format} =~ /html/i ? ".html"
+ : "";
+
+ $main::lxdebug->leave_sub();
+ return $extension;
+}
+
sub generate_attachment_filename {
+ $main::lxdebug->enter_sub();
my ($self) = @_;
- my $attachment_filename = $self->unquote_html($self->get_formname_translation());
- 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;
+ my $attachment_filename = $main::locale->unquote_special_chars('HTML', $self->get_formname_translation());
+ my $prefix = $self->get_number_prefix_for_type();
+
+ 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();
+
} else {
$attachment_filename = "";
}
+ $attachment_filename = $main::locale->quote_special_chars('filenames', $attachment_filename);
+ $attachment_filename =~ s|[\s/\\]+|_|g;
+
+ $main::lxdebug->leave_sub();
return $attachment_filename;
}
+sub generate_email_subject {
+ $main::lxdebug->enter_sub();
+ 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"}
+ }
+
+ $main::lxdebug->leave_sub();
+ return $subject;
+}
+
sub cleanup {
$main::lxdebug->enter_sub();
@@ -1331,6 +1505,7 @@ sub datetonum {
$main::lxdebug->enter_sub();
my ($self, $date, $myconfig) = @_;
+ my ($yy, $mm, $dd);
if ($date && $date =~ /\D/) {
@@ -1387,9 +1562,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;
@@ -1409,6 +1584,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);
@@ -1416,6 +1596,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();
@@ -1448,7 +1643,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);
@@ -1489,7 +1684,7 @@ sub update_exchangerate {
SET $set
WHERE curr = ?
AND transdate = ?|;
-
+
} else {
$query = qq|INSERT INTO exchangerate (curr, buy, sell, transdate)
VALUES (?, $buy, $sell, ?)|;
@@ -1558,6 +1753,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 "";
@@ -1576,8 +1775,6 @@ sub check_exchangerate {
my ($exchangerate) = selectrow_query($self, $dbh, $query, $currency, $transdate);
- $exchangerate = 1 if ($exchangerate eq "");
-
$main::lxdebug->leave_sub();
return $exchangerate;
@@ -1802,7 +1999,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){
@@ -1824,6 +2021,8 @@ sub get_employee {
my ($self, $dbh) = @_;
+ $dbh ||= $self->get_standard_dbh(\%main::myconfig);
+
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;
@@ -1831,28 +2030,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 = @_;
+
+ Common::check_params(\%params, qw(prefix));
+ Common::check_params_x(\%params, qw(id));
- $main::lxdebug->leave_sub() and return unless $salesman_id;
+ if (!$params{id}) {
+ $main::lxdebug->leave_sub();
+ return;
+ }
- my $dbh = $self->get_standard_dbh($myconfig);
+ 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 = ?|,
- $salesman_id);
+ 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();
@@ -1861,13 +2063,17 @@ sub get_salesman {
sub get_duedate {
$main::lxdebug->enter_sub();
- my ($self, $myconfig) = @_;
+ my ($self, $myconfig, $reference_date) = @_;
- 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});
+ $reference_date = $reference_date ? conv_dateq($reference_date) . '::DATE' : 'current_date';
+
+ my $dbh = $self->get_standard_dbh($myconfig);
+ my $query = qq|SELECT ${reference_date} + terms_netto FROM payment_terms WHERE id = ?|;
+ my ($duedate) = selectrow_query($self, $dbh, $query, $self->{payment_id});
$main::lxdebug->leave_sub();
+
+ return $duedate;
}
sub _get_contacts {
@@ -1877,6 +2083,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 | .
@@ -1945,10 +2157,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();
}
@@ -1971,6 +2188,7 @@ sub _get_charts {
$main::lxdebug->enter_sub();
my ($self, $dbh, $params) = @_;
+ my ($key);
$key = $params->{key};
$key = "all_charts" unless ($key);
@@ -1978,7 +2196,7 @@ sub _get_charts {
my $transdate = quote_db_date($params->{transdate});
my $query =
- qq|SELECT c.id, c.accno, c.description, c.link, tk.taxkey_id, tk.tax_id | .
+ qq|SELECT c.id, c.accno, c.description, c.link, c.charttype, tk.taxkey_id, tk.tax_id | .
qq|FROM chart c | .
qq|LEFT JOIN taxkeys tk ON | .
qq|(tk.id = (SELECT id FROM taxkeys | .
@@ -1994,11 +2212,27 @@ sub _get_charts {
sub _get_taxcharts {
$main::lxdebug->enter_sub();
- my ($self, $dbh, $key) = @_;
+ my ($self, $dbh, $params) = @_;
- $key = "all_taxcharts" unless ($key);
+ my $key = "all_taxcharts";
+ my @where;
- my $query = qq|SELECT * FROM tax ORDER BY taxkey|;
+ 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;
+ }
+
+ my $where = ' WHERE ' . join(' AND ', map { "($_)" } @where) if (@where);
+
+ my $query = qq|SELECT * FROM tax $where ORDER BY taxkey|;
$self->{$key} = selectall_hashref_query($self, $dbh, $query);
@@ -2078,7 +2312,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();
@@ -2092,7 +2326,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();
@@ -2104,7 +2338,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|;
@@ -2146,41 +2380,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 = ?|;
@@ -2213,6 +2428,20 @@ 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_lists {
$main::lxdebug->enter_sub();
@@ -2262,7 +2491,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"});
}
@@ -2274,11 +2503,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});
@@ -2286,7 +2515,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});
@@ -2294,7 +2523,7 @@ sub get_lists {
$self->_get_vendors($dbh, $params{"vendors"});
}
}
-
+
if($params{"payments"}) {
$self->_get_payments($dbh, $params{"payments"});
}
@@ -2311,6 +2540,14 @@ sub get_lists {
$self->_get_warehouses($dbh, $params{warehouses});
}
+# 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();
}
@@ -2545,7 +2782,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/) {
@@ -2592,7 +2829,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};
}
@@ -2614,7 +2851,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/) {
@@ -2654,7 +2891,7 @@ sub create_links {
(startdate <= a.transdate) ORDER BY startdate DESC LIMIT 1))
WHERE a.trans_id = ?
AND a.fx_transaction = '0'
- ORDER BY a.oid, a.transdate|;
+ ORDER BY a.acc_trans_id, a.transdate|;
$sth = $dbh->prepare($query);
do_statement($self, $sth, $query, $self->{id});
@@ -2664,7 +2901,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/)) {
@@ -2725,36 +2962,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();
}
@@ -2814,7 +3067,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};
}
@@ -2994,10 +3247,9 @@ sub get_history {
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 = | . $trans_id
- . $restriction . qq| |
- . $order;
-
+ qq|WHERE (trans_id = | . $trans_id . qq|) $restriction | .
+ $order;
+
my $sth = $dbh->prepare($query) || $self->dberror($query);
$sth->execute() || $self->dberror("$query");
@@ -3008,7 +3260,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();
@@ -3055,6 +3307,19 @@ sub update_defaults {
return $var;
}
+=item update_business
+
+PARAMS (not named):
+ \%config, - config hashref
+ $business_id, - business id
+ $dbh - optional database handle
+
+handles business (thats customer/vendor types) sequences.
+
+special behaviour for empty strings in customerinitnumber field:
+will in this case not increase the value, and return undef.
+
+=cut
sub update_business {
$main::lxdebug->enter_sub();
@@ -3071,6 +3336,8 @@ sub update_business {
WHERE id = ? FOR UPDATE|;
my ($var) = selectrow_query($self, $dbh, $query, $business_id);
+ return undef unless $var;
+
if ($var =~ m/\d+$/) {
my $new_var = (substr $var, $-[0]) * 1 + 1;
my $len_diff = length($var) - $-[0] - length($new_var);
@@ -3099,6 +3366,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);
@@ -3137,7 +3405,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();
}
@@ -3203,4 +3471,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 exists $self->{$_} } @vars;
+
+ $main::lxdebug->leave_sub();
+}
+
+sub restore_vars {
+ $main::lxdebug->enter_sub();
+
+ my $self = shift;
+ my @vars = @_;
+
+ map { $self->{$_} = $self->{_VAR_BACKUP}->{$_} if exists $self->{_VAR_BACKUP}->{$_} } @vars;
+
+ $main::lxdebug->leave_sub();
+}
+
1;