X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FForm.pm;h=239f7b938cfab0d5c863b4b2035f91392e2d1b13;hb=37d14c11afd10049be58467770499b25268c1364;hp=636eacd9801f0dadfdb5126ec5c09804c7a7a611;hpb=17c2f7bdbd65623ae67d66b770dbf0cc14ad8770;p=kivitendo-erp.git diff --git a/SL/Form.pm b/SL/Form.pm index 636eacd98..239f7b938 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -42,7 +42,6 @@ use Carp; use Data::Dumper; use Carp; -use Config; use CGI; use Cwd; use Encode; @@ -88,6 +87,7 @@ use List::Util qw(first max min sum); use List::MoreUtils qw(all any apply); use SL::DB::Tax; use SL::Helper::File qw(:all); +use SL::Helper::Number; use SL::Helper::CreatePDF qw(merge_pdfs); use strict; @@ -382,10 +382,11 @@ sub create_http_response { my $session_cookie_value = $main::auth->get_session_id(); if ($session_cookie_value) { - $session_cookie = $cgi->cookie('-name' => $main::auth->get_session_cookie_name(), - '-value' => $session_cookie_value, - '-path' => $uri->path, - '-secure' => $::request->is_https); + $session_cookie = $cgi->cookie('-name' => $main::auth->get_session_cookie_name(), + '-value' => $session_cookie_value, + '-path' => $uri->path, + '-expires' => '+' . $::auth->{session_timeout} . 'm', + '-secure' => $::request->is_https); } } @@ -699,44 +700,10 @@ sub sort_columns { return @columns; } # -sub format_amount { - $main::lxdebug->enter_sub(2); +sub format_amount { my ($self, $myconfig, $amount, $places, $dash) = @_; - $amount ||= 0; - $dash ||= ''; - my $neg = $amount < 0; - my $force_places = defined $places && $places >= 0; - - $amount = $self->round_amount($amount, abs $places) if $force_places; - $neg = 0 if $amount == 0; # don't show negative zero - $amount = sprintf "%.*f", ($force_places ? $places : 10), abs $amount; # 6 is default for %fa - - # before the sprintf amount was a number, afterwards it's a string. because of the dynamic nature of perl - # this is easy to confuse, so keep in mind: before this comment no s///, m//, concat or other strong ops on - # $amount. after this comment no +,-,*,/,abs. it will only introduce subtle bugs. - - $amount =~ s/0*$// unless defined $places && $places == 0; # cull trailing 0s - - my @d = map { s/\d//g; reverse split // } my $tmp = $myconfig->{numberformat}; # get delim chars - my @p = split(/\./, $amount); # split amount at decimal point - - $p[0] =~ s/\B(?=(...)*$)/$d[1]/g if $d[1]; # add 1,000 delimiters - $amount = $p[0]; - if ($places || $p[1]) { - $amount .= $d[0] - . ( $p[1] || '' ) - . (0 x max(abs($places || 0) - length ($p[1]||''), 0)); # pad the fraction - } - - $amount = do { - ($dash =~ /-/) ? ($neg ? "($amount)" : "$amount" ) : - ($dash =~ /DRCR/) ? ($neg ? "$amount " . $main::locale->text('DR') : "$amount " . $main::locale->text('CR') ) : - ($neg ? "-$amount" : "$amount" ) ; - }; - - $main::lxdebug->leave_sub(2); - return $amount; + SL::Helper::Number::_format_number($amount, $places, %$myconfig, dash => $dash); } sub format_amount_units { @@ -825,82 +792,11 @@ sub format_string { # sub parse_amount { - $main::lxdebug->enter_sub(2); - my ($self, $myconfig, $amount) = @_; - - if (!defined($amount) || ($amount eq '')) { - $main::lxdebug->leave_sub(2); - return 0; - } - - if ( ($myconfig->{numberformat} eq '1.000,00') - || ($myconfig->{numberformat} eq '1000,00')) { - $amount =~ s/\.//g; - $amount =~ s/,/\./g; - } - - if ($myconfig->{numberformat} eq "1'000.00") { - $amount =~ s/\'//g; - } - - $amount =~ s/,//g; - - $main::lxdebug->leave_sub(2); - - # Make sure no code wich is not a math expression ends up in eval(). - return 0 unless $amount =~ /^ [\s \d \( \) \- \+ \* \/ \. ]* $/x; - - # Prevent numbers from being parsed as octals; - $amount =~ s{ (?get_precision || 0.01; - return $self->round_amount( $self->round_amount($amount / $precision, 0) * $precision, $places); - } - - # We use Perl's knowledge of string representation for - # rounding. First, convert the floating point number to a string - # with a high number of places. Then split the string on the decimal - # sign and use integer calculation for rounding the decimal places - # part. If an overflow occurs then apply that overflow to the part - # before the decimal sign as well using integer arithmetic again. - - my $int_amount = int(abs $amount); - my $str_places = max(min(10, 16 - length("$int_amount") - $places), $places); - my $amount_str = sprintf '%.*f', $places + $str_places, abs($amount); - - return $amount unless $amount_str =~ m{^(\d+)\.(\d+)$}; - - my ($pre, $post) = ($1, $2); - my $decimals = '1' . substr($post, 0, $places); - - my $propagation_limit = $Config{i32size} == 4 ? 7 : 18; - my $add_for_rounding = substr($post, $places, 1) >= 5 ? 1 : 0; - - if ($places > $propagation_limit) { - $decimals = Math::BigInt->new($decimals)->badd($add_for_rounding); - $pre = Math::BigInt->new($decimals)->badd(1) if substr($decimals, 0, 1) eq '2'; - - } else { - $decimals += $add_for_rounding; - $pre += 1 if substr($decimals, 0, 1) eq '2'; - } - - $amount = ("${pre}." . substr($decimals, 1)) * ($amount <=> 0); - - return $amount; -} +sub round_amount { shift; goto &SL::Helper::Number::_round_number; } sub parse_template { $main::lxdebug->enter_sub(); @@ -1038,7 +934,7 @@ sub parse_template { } } - if (!$self->{preview} && $self->doc_storage_enabled) + if (!$self->{preview} && $self->{attachment_type} !~ m{^dunning} && $self->doc_storage_enabled) { $self->{attachment_filename} ||= $self->generate_attachment_filename; $self->store_pdf($self); @@ -1058,7 +954,7 @@ sub parse_template { } } - if ( !$self->{preview} && $ext_for_format eq 'pdf' && $self->doc_storage_enabled) { + if ( !$self->{preview} && $ext_for_format eq 'pdf' && $self->{attachment_type} !~ m{^dunning} && $self->doc_storage_enabled) { $self->{attachment_filename} ||= $self->generate_attachment_filename; my $file_obj = $self->store_pdf($self); $self->{print_file_id} = $file_obj->id if $file_obj; @@ -1106,6 +1002,14 @@ sub send_email { map { $mail->{$_} = $self->{$_} } qw(cc subject message format); + if ($self->{cc_employee}) { + my ($user, $my_emp_cc); + $user = SL::DB::Manager::AuthUser->find_by(login => $self->{cc_employee}); + $my_emp_cc = $user->get_config_value('email') if ref $user eq 'SL::DB::AuthUser'; + $mail->{cc} .= ", " if $mail->{cc}; + $mail->{cc} .= $my_emp_cc if $my_emp_cc; + } + $mail->{bcc} = $self->get_bcc_defaults($myconfig, $self->{bcc}); $mail->{to} = $self->{EMAIL_RECIPIENT} ? $self->{EMAIL_RECIPIENT} : $self->{email}; $mail->{from} = qq|"$myconfig->{name}" <$myconfig->{email}>|; @@ -2671,7 +2575,7 @@ sub create_links { $query = qq|SELECT a.cp_id, a.invnumber, a.transdate, a.${table}_id, a.datepaid, a.deliverydate, - a.duedate, a.ordnumber, a.taxincluded, (SELECT cu.name FROM currencies cu WHERE cu.id=a.currency_id) AS currency, a.notes, + a.duedate, a.tax_point, a.ordnumber, a.taxincluded, (SELECT cu.name FROM currencies cu WHERE cu.id=a.currency_id) AS currency, a.notes, a.mtime, a.itime, a.intnotes, a.department_id, a.amount AS oldinvtotal, a.paid AS oldtotalpaid, a.employee_id, a.gldate, a.type, @@ -3062,11 +2966,13 @@ sub save_status { # $main::locale->text('ELSE') # $main::locale->text('SAVED FOR DUNNING') # $main::locale->text('DUNNING STARTED') +# $main::locale->text('PREVIEWED') # $main::locale->text('PRINTED') # $main::locale->text('MAILED') # $main::locale->text('SCREENED') # $main::locale->text('CANCELED') # $main::locale->text('IMPORT') +# $main::locale->text('UNDO TRANSFER') # $main::locale->text('UNIMPORT') # $main::locale->text('invoice') # $main::locale->text('proforma') @@ -3334,7 +3240,7 @@ sub prepare_for_printing { # Format dates. $self->format_dates($output_dateformat, $output_longdates, - qw(invdate orddate quodate pldate duedate reqdate transdate shippingdate deliverydate validitydate paymentdate datepaid + qw(invdate orddate quodate pldate duedate reqdate transdate tax_point shippingdate deliverydate validitydate paymentdate datepaid transdate_oe deliverydate_oe employee_startdate employee_enddate), grep({ /^(?:datepaid|transdate_oe|reqdate|deliverydate|deliverydate_oe|transdate)_\d+$/ } keys(%{$self})));