X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/d735aab3fc2987d555c63ce0dc8e24626ca30654..fd47986c57c883f91779be1f9700886388354e63:/SL/Form.pm diff --git a/SL/Form.pm b/SL/Form.pm index 81b5370b7..35050a0c7 100644 --- a/SL/Form.pm +++ b/SL/Form.pm @@ -945,17 +945,15 @@ sub parse_amount { return 0; } - if ( ($myconfig->{numberformat} eq '1.000,00') - || ($myconfig->{numberformat} eq '1000,00')) { + if ($myconfig->{numberformat} eq '1,000.00') { + $amount =~ s/,//g; + } elsif ($myconfig->{numberformat} eq '1.000,00') { $amount =~ s/\.//g; - $amount =~ s/,/\./g; - } - - if ($myconfig->{numberformat} eq "1'000.00") { + } elsif ($myconfig->{numberformat} eq "1'000.00") { $amount =~ s/\'//g; } - $amount =~ s/,//g; + $amount =~ s/,/\./g; $main::lxdebug->leave_sub(2); @@ -969,7 +967,18 @@ sub parse_amount { } sub round_amount { - my ($self, $amount, $places) = @_; + my ($self, $amount, $places, $adjust) = @_; + + if ($adjust) { + my $precision = 0.01; + # Round amounts to eight places before rounding to the requested + # number of places. This gets rid of errors due to internal floating + # point representation. + $amount = int($amount * 10**8 + .5 * ($amount <=> 0)) / 10**8 if $places < 8; + $amount = int($amount / ($precision = _get_precision()) + ($amount <=> 0) * .5) * $precision; + $amount = int($amount * 10**$places + .5 * ($amount <=> 0)) / 10**$places; + return $amount; + } return 0 if !defined $amount; @@ -2604,18 +2613,18 @@ sub all_vc { } sub mtime_ischanged { - my ($self, $relation,$option) = @_; - #$main::lxdebug->message(LXDebug->DEBUG2(),"mtime_ischanged from rel=".$relation." id=".$id); - if ( ! $self->{id} ) { return ; } - - my $query = "SELECT mtime, itime FROM ".$relation." WHERE id = ?"; - my $ref = selectfirst_hashref_query($self, $self->get_standard_dbh, $query, $self->{id}); - $ref->{mtime} = $ref->{itime} if !$ref->{mtime}; - #$main::lxdebug->message(LXDebug->DEBUG2(),"my mtime=".$self->{lastmtime}." new mtime=".$ref->{mtime}); + my ($self, $table, $option) = @_; + + return unless $self->{id}; + croak ("wrong call, no valid table defined") unless $table =~ /^(oe|ar|ap|delivery_orders|parts)$/; + + my $query = "SELECT mtime, itime FROM " . $table . " WHERE id = ?"; + my $ref = selectfirst_hashref_query($self, $self->get_standard_dbh, $query, $self->{id}); + $ref->{mtime} ||= $ref->{itime}; + if ($self->{lastmtime} && $self->{lastmtime} ne $ref->{mtime} ) { - my $etxt = $main::locale->text("The document has been changed from other user. Please reopen it in another window and copy the changes to the new window"); - $etxt = $main::locale->text("The document has been changed from other user. No mail was sent. Please reopen it in another window and copy the changes to the new window") - if defined $option && $option eq 'mail'; + my $etxt = ($option eq 'mail') ? "The document has been changed by another user. Please reopen it in another window and copy the changes to the new window" : + "The document has been changed by another user. No mail was sent. Please reopen it in another window and copy the changes to the new window"; $self->error($main::locale->text($etxt)); ::end_of_request(); } @@ -2772,7 +2781,7 @@ sub create_links { qq|SELECT a.cp_id, a.invnumber, a.transdate, a.${table}_id, a.datepaid, a.duedate, 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.mtime, a.itime, a.intnotes, a.department_id, a.amount AS oldinvtotal, a.paid AS oldtotalpaid, a.employee_id, a.gldate, a.type, a.globalproject_id, ${extra_columns} @@ -2789,7 +2798,7 @@ sub create_links { foreach my $key (keys %$ref) { $self->{$key} = $ref->{$key}; } - $self->{mtime} = $self->{itime} if ! $self->{mtime}; + $self->{mtime} ||= $self->{itime}; $self->{lastmtime} = $self->{mtime}; my $transdate = "current_date"; if ($self->{transdate}) { @@ -3685,6 +3694,20 @@ sub calculate_tax { return ($amount,$tax); }; +sub _get_precision { + my ( $self ) = @_; + my $precision = 0.01; + eval { + my $client = $::auth->{client}; + my $dbconnect = 'dbi:Pg:dbname=' . $client->{dbname} . ';host=' . $client->{dbhost} . ';port=' . $client->{dbport}; + my $dbh = DBI->connect($dbconnect, $client->{dbuser}, $client->{dbpasswd}); + my $query = q{ SELECT precision FROM defaults }; + ($precision) = selectrow_query($::form, $dbh, $query); + $dbh->disconnect; + }; + return $precision; +} + 1; __END__ @@ -3756,6 +3779,17 @@ Used to override the default favicon. A html page title will be generated from this +=item mtime_ischanged + +Tries to avoid concurrent write operations to records by checking the database mtime with a fetched one. + +Can be used / called with any table, that has itime and mtime attributes. +Valid C