]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Form.pm
=resolved uncommited prepared statement
[mfinanz.git] / SL / Form.pm
index a0dbb91cc3b178f2566640930993c402b23764cf..22d5d1a31808ad845f639f84a4b2166c2d88bc97 100644 (file)
@@ -850,7 +850,7 @@ sub format_amount {
   return $amount;
 }
 
-sub format_amount_units {
+sub format_amount_unit {
   $main::lxdebug->enter_sub();
 
   my $self             = shift;
@@ -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;
 
@@ -2607,15 +2616,15 @@ sub mtime_ischanged {
   my ($self, $table, $option) = @_;
 
   return                                       unless $self->{id};
-  croak ("wrong call, no valid table defined") unless $table =~ /(oe|ar|ap|delivery_orders|parts)/;
+  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 = ($option eq 'mail') ? "The document has been changed from other user. Please reopen it in another window and copy the changes to the new window" :
-                                       "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";
+      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();
   }
@@ -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__