X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=5a9272465e7fc3d41e1b36f3f953ba2476aa8a41;hb=088f6a9721fece191bcc8d11a144b3b958b6c0c8;hp=f5305e044d188ed652e53b2ed601742ed2236580;hpb=2e07a0cdb14d031d325b20f05e916105f385ac19;p=kivitendo-erp.git diff --git a/SL/Form.pm b/SL/Form.pm index f5305e044..5a9272465 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -40,6 +40,7 @@ use Data::Dumper; use Cwd; use HTML::Template; +use Template; use SL::Template; use CGI::Ajax; use SL::DBUtils; @@ -180,7 +181,7 @@ sub new { $self->{action} = lc $self->{action}; $self->{action} =~ s/( |-|,|\#)/_/g; - $self->{version} = "2.4.2"; + $self->{version} = "2.4.3"; $main::lxdebug->leave_sub(); @@ -385,10 +386,15 @@ sub header { if ($ENV{HTTP_USER_AGENT}) { - if ($self->{stylesheet} && (-f "css/$self->{stylesheet}")) { - $stylesheet = - qq| - |; + my $stylesheets = "$self->{stylesheet} $self->{stylesheets}"; + + $stylesheets =~ s|^\s*||; + $stylesheets =~ s|\s*$||; + foreach my $file (split m/\s+/, $stylesheets) { + $file =~ s|.*/||; + next if (! -f "css/$file"); + + $stylesheet .= qq|\n|; } $self->{favicon} = "favicon.ico" unless $self->{favicon}; @@ -474,7 +480,7 @@ sub header { $main::lxdebug->leave_sub(); } -sub parse_html_template { +sub _prepare_html_template { $main::lxdebug->enter_sub(); my ($self, $file, $additional_params) = @_; @@ -508,14 +514,6 @@ sub parse_html_template { die($info); } - my $template = HTML::Template->new("filename" => $file, - "die_on_bad_params" => 0, - "strict" => 0, - "case_sensitive" => 1, - "loop_context_vars" => 1, - "global_vars" => 1); - - $additional_params = {} unless ($additional_params); if ($self->{"DEBUG"}) { $additional_params->{"DEBUG"} = $self->{"DEBUG"}; } @@ -539,16 +537,68 @@ sub parse_html_template { $additional_params->{"conf_latex_templates"} = $main::latex; $additional_params->{"conf_opendocument_templates"} = $main::opendocument_templates; - my @additional_param_names = keys(%{$additional_params}); + if (%main::debug_options) { + map { $additional_params->{'DEBUG_' . uc($_)} = $main::debug_options{$_} } keys %main::debug_options; + } + + $main::lxdebug->leave_sub(); + + return $file; +} + +sub parse_html_template { + $main::lxdebug->enter_sub(); + + my ($self, $file, $additional_params) = @_; + + $additional_params ||= { }; + + $file = $self->_prepare_html_template($file, $additional_params); + + my $template = HTML::Template->new("filename" => $file, + "die_on_bad_params" => 0, + "strict" => 0, + "case_sensitive" => 1, + "loop_context_vars" => 1, + "global_vars" => 1); + foreach my $key ($template->param()) { - my $param = $self->{$key}; - $param = $additional_params->{$key} if (grep(/^${key}$/, @additional_param_names)); + my $param = $additional_params->{$key} || $self->{$key}; $param = [] if (($template->query("name" => $key) eq "LOOP") && (ref($param) ne "ARRAY")); $template->param($key => $param); } my $output = $template->output(); + $output = $main::locale->{iconv}->convert($output) if ($main::locale); + + $main::lxdebug->leave_sub(); + + return $output; +} + +sub parse_html_template2 { + $main::lxdebug->enter_sub(); + + my ($self, $file, $additional_params) = @_; + + $additional_params ||= { }; + + $file = $self->_prepare_html_template($file, $additional_params); + + my $template = Template->new({ 'INTERPOLATE' => 0, + 'EVAL_PERL' => 0, + 'ABSOLUTE' => 1, + 'CACHE_SIZE' => 0, + }) || die; + + map { $additional_params->{$_} ||= $self->{$_} } keys %{ $self }; + + my $output; + $template->process($file, $additional_params, \$output); + + $output = $main::locale->{iconv}->convert($output) if ($main::locale); + $main::lxdebug->leave_sub(); return $output; @@ -645,7 +695,9 @@ sub redirect { if ($self->{callback}) { - ($script, $argv) = split(/\?/, $self->{callback}); + ($script, $argv) = split(/\?/, $self->{callback}, 2); + $script =~ s|.*/||; + $script =~ s|[^a-zA-Z0-9_\.]||g; exec("perl", "$script", $argv); } else { @@ -935,8 +987,10 @@ Content-Length: $numbytes $main::lxdebug->leave_sub(); } -sub generate_attachment_filename { - my ($self) = @_; +sub get_formname_translation { + my ($self, $formname) = @_; + + $formname ||= $self->{formname}; my %formname_translations = ( bin_list => $main::locale->text('Bin List'), @@ -953,7 +1007,13 @@ sub generate_attachment_filename { storno_packing_list => $main::locale->text('Storno Packing List'), ); - my $attachment_filename = $formname_translations{$self->{"formname"}}; + return $formname_translations{$formname} +} + +sub generate_attachment_filename { + my ($self) = @_; + + my $attachment_filename = $self->get_formname_translation(); my $prefix = (grep { $self->{"type"} eq $_ } qw(invoice credit_note)) ? "inv" : ($self->{"type"} =~ /_quotation$/) ? "quo" @@ -1127,6 +1187,16 @@ sub update_exchangerate { if ($curr eq '') { $main::lxdebug->leave_sub(); return; + } + my $query = qq|SELECT curr FROM defaults|; + + my ($currency) = selectrow_query($self, $dbh, $query); + my ($defaultcurrency) = split m/:/, $currency; + + + if ($curr eq $defaultcurrency) { + $main::lxdebug->leave_sub(); + return; } my $query = qq|SELECT e.curr FROM exchangerate e @@ -1134,6 +1204,16 @@ sub update_exchangerate { FOR UPDATE|; my $sth = prepare_execute_query($self, $dbh, $query, $curr, $transdate); + if ($buy == 0) { + $buy = ""; + } + if ($sell == 0) { + $sell = ""; + } + + $buy = conv_i($buy, "NULL"); + $sell = conv_i($sell, "NULL"); + my $set; if ($buy != 0 && $sell != 0) { $set = "buy = $buy, sell = $sell"; @@ -1148,6 +1228,7 @@ sub update_exchangerate { SET $set WHERE curr = ? AND transdate = ?|; + } else { $query = qq|INSERT INTO exchangerate (curr, buy, sell, transdate) VALUES (?, $buy, $sell, ?)|; @@ -1165,12 +1246,15 @@ sub save_exchangerate { my $dbh = $self->dbconnect($myconfig); - my ($buy, $sell) = (0, 0); + my ($buy, $sell); + $buy = $rate if $fld eq 'buy'; $sell = $rate if $fld eq 'sell'; + $self->update_exchangerate($dbh, $currency, $transdate, $buy, $sell); + $dbh->disconnect; $main::lxdebug->leave_sub(); @@ -1186,13 +1270,21 @@ sub get_exchangerate { return 1; } + my $query = qq|SELECT curr FROM defaults|; + + my ($currency) = selectrow_query($self, $dbh, $query); + my ($defaultcurrency) = split m/:/, $currency; + + if ($currency eq $defaultcurrency) { + $main::lxdebug->leave_sub(); + return 1; + } + my $query = qq|SELECT e.$fld FROM exchangerate e WHERE e.curr = ? AND e.transdate = ?|; my ($exchangerate) = selectrow_query($self, $dbh, $query, $curr, $transdate); - if (!$exchangerate) { - $exchangerate = 1; - } + $main::lxdebug->leave_sub(); @@ -1209,14 +1301,19 @@ sub check_exchangerate { return ""; } - my $dbh = $self->dbconnect($myconfig); + my ($defaultcurrency) = $self->get_default_currency($myconfig); + + if ($currency eq $defaultcurrency) { + $main::lxdebug->leave_sub(); + return 1; + } + my $dbh = $self->get_standard_dbh($myconfig); my $query = qq|SELECT e.$fld FROM exchangerate e WHERE e.curr = ? AND e.transdate = ?|; + my ($exchangerate) = selectrow_query($self, $dbh, $query, $currency, $transdate); - $dbh->disconnect(); - $exchangerate = 1 if ($exchangerate == 0); $exchangerate = 1 if ($exchangerate eq ""); $main::lxdebug->leave_sub(); @@ -1224,6 +1321,23 @@ sub check_exchangerate { return $exchangerate; } +sub get_default_currency { + $main::lxdebug->enter_sub(); + + my ($self, $myconfig) = @_; + my $dbh = $self->get_standard_dbh($myconfig); + + my $query = qq|SELECT curr FROM defaults|; + + my ($curr) = selectrow_query($self, $dbh, $query); + my ($defaultcurrency) = split m/:/, $curr; + + $main::lxdebug->leave_sub(); + + return $defaultcurrency; +} + + sub set_payment_options { $main::lxdebug->enter_sub(); @@ -1256,12 +1370,32 @@ sub set_payment_options { ($self->{netto_date}, $self->{skonto_date}) = selectrow_query($self, $dbh, $query, $transdate, $self->{terms_netto}, $transdate, $self->{terms_skonto}); - my $total = ($self->{invtotal}) ? $self->{invtotal} : $self->{ordtotal}; - my $skonto_amount = $self->parse_amount($myconfig, $total) * - $self->{percent_skonto}; + my ($invtotal, $total); + my (%amounts, %formatted_amounts); + + if ($self->{type} =~ /_order$/) { + $amounts{invtotal} = $self->{ordtotal}; + $amounts{total} = $self->{ordtotal}; + + } elsif ($self->{type} =~ /_quotation$/) { + $amounts{invtotal} = $self->{quototal}; + $amounts{total} = $self->{quototal}; + + } else { + $amounts{invtotal} = $self->{invtotal}; + $amounts{total} = $self->{total}; + } + + map { $amounts{$_} = $self->parse_amount($myconfig, $amounts{$_}) } keys %amounts; - $self->{skonto_amount} = - $self->format_amount($myconfig, $skonto_amount, 2); + $amounts{skonto_amount} = $amounts{invtotal} * $self->{percent_skonto}; + $amounts{invtotal_wo_skonto} = $amounts{invtotal} * (1 - $self->{percent_skonto}); + $amounts{total_wo_skonto} = $amounts{total} * (1 - $self->{percent_skonto}); + + foreach (keys %amounts) { + $amounts{$_} = $self->round_amount($amounts{$_}, 2); + $formatted_amounts{$_} = $self->format_amount($myconfig, $amounts{$_}, 2); + } if ($self->{"language_id"}) { $query = @@ -1289,23 +1423,21 @@ sub set_payment_options { ($output_numberformat ne $myconfig->{"numberformat"})) { my $saved_numberformat = $myconfig->{"numberformat"}; $myconfig->{"numberformat"} = $output_numberformat; - $self->{skonto_amount} = - $self->format_amount($myconfig, $skonto_amount, 2); + map { $formatted_amounts{$_} = $self->format_amount($myconfig, $amounts{$_}) } keys %amounts; $myconfig->{"numberformat"} = $saved_numberformat; } } $self->{payment_terms} =~ s/<%netto_date%>/$self->{netto_date}/g; $self->{payment_terms} =~ s/<%skonto_date%>/$self->{skonto_date}/g; - $self->{payment_terms} =~ s/<%skonto_amount%>/$self->{skonto_amount}/g; - $self->{payment_terms} =~ s/<%total%>/$self->{total}/g; - $self->{payment_terms} =~ s/<%invtotal%>/$self->{invtotal}/g; $self->{payment_terms} =~ s/<%currency%>/$self->{currency}/g; $self->{payment_terms} =~ s/<%terms_netto%>/$self->{terms_netto}/g; $self->{payment_terms} =~ s/<%account_number%>/$self->{account_number}/g; $self->{payment_terms} =~ s/<%bank%>/$self->{bank}/g; $self->{payment_terms} =~ s/<%bank_code%>/$self->{bank_code}/g; + map { $self->{payment_terms} =~ s/<%${_}%>/$formatted_amounts{$_}/g; } keys %formatted_amounts; + $main::lxdebug->leave_sub(); } @@ -1370,6 +1502,7 @@ sub add_shipto { my $shipto; my @values; + foreach my $item (qw(name department_1 department_2 street zipcode city country contact phone fax email)) { if ($self->{"shipto$item"}) { @@ -1377,6 +1510,7 @@ sub add_shipto { } push(@values, $self->{"shipto${item}"}); } + if ($shipto) { if ($self->{shipto_id}) { my $query = qq|UPDATE shipto set @@ -1405,8 +1539,10 @@ sub add_shipto { shiptocontact = ? AND shiptophone = ? AND shiptofax = ? AND - shiptoemail = ?|; - my $insert_check = selectfirst_hashref_query($self, $dbh, $query, @values); + shiptoemail = ? AND + module = ? AND + trans_id = ?|; + my $insert_check = selectfirst_hashref_query($self, $dbh, $query, @values, $module, $id); if(!$insert_check){ $query = qq|INSERT INTO shipto (trans_id, shiptoname, shiptodepartment_1, shiptodepartment_2, @@ -2549,8 +2685,14 @@ sub update_defaults { my ($var) = $sth->fetchrow_array; $sth->finish; - $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e; - $var ||= 1; + if ($var =~ m/\d+$/) { + my $new_var = (substr $var, $-[0]) * 1 + 1; + my $len_diff = length($var) - $-[0] - length($new_var); + $var = substr($var, 0, $-[0]) . ($len_diff > 0 ? '0' x $len_diff : '') . $new_var; + + } else { + $var = $var . '1'; + } $query = qq|UPDATE defaults SET $fld = ?|; do_query($self, $dbh, $query, $var); @@ -2581,8 +2723,15 @@ sub update_business { WHERE id = ? FOR UPDATE|; my ($var) = selectrow_query($self, $dbh, $query, $business_id); - $var =~ s/\d+$/ sprintf '%0*d', length($&), $&+1 /e; - + if ($var =~ m/\d+$/) { + my $new_var = (substr $var, $-[0]) * 1 + 1; + my $len_diff = length($var) - $-[0] - length($new_var); + $var = substr($var, 0, $-[0]) . ($len_diff > 0 ? '0' x $len_diff : '') . $new_var; + + } else { + $var = $var . '1'; + } + $query = qq|UPDATE business SET customernumberinit = ? WHERE id = ?|;