From 5491709d806da011c8bcb4328417722932b39631 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Fri, 24 Aug 2018 01:22:35 +0000 Subject: [PATCH] Bug 18736: (follow-up) Fix missing rounding and bad formatting This patch: Adds a missing use Uses 'Koha::Number::Price->round()' instead of 'format()' to ensure numeric returns Ensures too big numbers don't crash round() Uses syspref in 'GetBudgetHierarchy' To test: Follow previous test plan Check values on admin/aqbudgets.pl are affected by syspref Ensure values throughout acquisitions are correctly calculated/displayed (even when greater than 1,000) Signed-off-by: Julian Maurice Signed-off-by: Marcel de Rooy Signed-off-by: Nick Clemens (cherry picked from commit 4ccbae8879a386a1846bb48c18b3722f936dc983) Signed-off-by: Martin Renvoize --- C4/Acquisition.pm | 2 +- C4/Budgets.pm | 4 ++-- Koha/Number/Price.pm | 7 ++++++- acqui/spent.pl | 1 + 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/C4/Acquisition.pm b/C4/Acquisition.pm index 144ab19a03..0bb9610e02 100644 --- a/C4/Acquisition.pm +++ b/C4/Acquisition.pm @@ -2025,7 +2025,7 @@ returns a price rounded as specified in OrderPriceRounding system preference. sub get_rounded_price { my ( $price ) = @_; my $rounding_pref = C4::Context->preference('OrderPriceRounding'); - if( $rounding_pref eq 'nearest_cent' ) { return Koha::Number::Price->new( $price )->format(); } + if( $rounding_pref eq 'nearest_cent' ) { return Koha::Number::Price->new( $price )->round(); } else { return $price; } } diff --git a/C4/Budgets.pm b/C4/Budgets.pm index e1ef185e97..e43b44f4f7 100644 --- a/C4/Budgets.pm +++ b/C4/Budgets.pm @@ -561,14 +561,14 @@ sub GetBudgetHierarchy { # Get all the budgets totals in as few queries as possible my $hr_budget_spent = $dbh->selectall_hashref(q| SELECT aqorders.budget_id, aqbudgets.budget_parent_id, - SUM( COALESCE(unitprice_tax_included, ecost_tax_included) * quantity ) AS budget_spent + SUM( | . _get_rounding_sql(qq|COALESCE(unitprice_tax_included, ecost_tax_included)|) . q| * quantity ) AS budget_spent FROM aqorders JOIN aqbudgets USING (budget_id) WHERE quantityreceived > 0 AND datecancellationprinted IS NULL GROUP BY budget_id, budget_parent_id |, 'budget_id'); my $hr_budget_ordered = $dbh->selectall_hashref(q| SELECT aqorders.budget_id, aqbudgets.budget_parent_id, - SUM(ecost_tax_included * quantity) AS budget_ordered + SUM( | . _get_rounding_sql(qq|ecost_tax_included|) . q| * quantity) AS budget_ordered FROM aqorders JOIN aqbudgets USING (budget_id) WHERE quantityreceived = 0 AND datecancellationprinted IS NULL GROUP BY budget_id, budget_parent_id diff --git a/Koha/Number/Price.pm b/Koha/Number/Price.pm index 64c9dfe585..7b0b826a14 100644 --- a/Koha/Number/Price.pm +++ b/Koha/Number/Price.pm @@ -19,7 +19,7 @@ package Koha::Number::Price; use Modern::Perl; -use Number::Format qw( format_price ); +use Number::Format; use C4::Context; use Koha::Acquisition::Currencies; @@ -84,6 +84,11 @@ sub round { my $format_params = $self->_format_params; + # To avoid the system to crash, we will not format big number + # We divide per 100 because we want to keep the default DECIMAL_DIGITS (2) + # error - round() overflow. Try smaller precision or use Math::BigFloat + return $self->value if $self->value > Number::Format::MAX_INT/100; + return Number::Format->new(%$format_params)->round($self->value); } diff --git a/acqui/spent.pl b/acqui/spent.pl index 3801b44a03..80d93617e2 100755 --- a/acqui/spent.pl +++ b/acqui/spent.pl @@ -34,6 +34,7 @@ use C4::Auth; use C4::Output; use Modern::Perl; use CGI qw ( -utf8 ); +use C4::Acquisition; use Koha::Acquisition::Invoice::Adjustments; my $dbh = C4::Context->dbh; -- 2.39.5