From 73eb4e606a4335215d732ec03bd84cce62b87fbd Mon Sep 17 00:00:00 2001 From: omogenot Date: Tue, 1 Apr 2025 21:36:52 +0200 Subject: [PATCH] NEW : Rounding unit price - line discount before applying quantity - option MAIN_APPLY_DISCOUNT_ON_UNIT_PRICE_THEN_ROUND_BEFORE_MULTIPLICATION_BY_QTY (#33690) * Rounding unit price - line discount before applying quantity On some systems, the line total price is calculated based on the discount applied on the unit price first, giving a new rounded unit price, and then multiplied by the quantity. Whereas the current way Dolibarr acts is to apply the discount on the subtotal (unit price * quantity). Using an extra OTHER SETUP constant 'MAIN_ROUND_UNIT_PRICE_BEFORE_QTY', we can choose between the two ways. * Update price.lib.php * Update price.lib.php --------- Co-authored-by: Laurent Destailleur --- htdocs/core/lib/price.lib.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/htdocs/core/lib/price.lib.php b/htdocs/core/lib/price.lib.php index ec5ff384592..14fbeead6b8 100644 --- a/htdocs/core/lib/price.lib.php +++ b/htdocs/core/lib/price.lib.php @@ -198,8 +198,13 @@ function calcul_price_total($qty, $pu, $remise_percent_ligne, $txtva, $uselocalt } // initialize total (may be HT or TTC depending on price_base_type) - $tot_sans_remise = $pu * $qty * ($progress / 100); - $tot_avec_remise_ligne = $tot_sans_remise * (1 - ((float) $remise_percent_ligne / 100)); + if ($remise_percent_ligne && getDolGlobalString('MAIN_APPLY_DISCOUNT_ON_UNIT_PRICE_THEN_ROUND_BEFORE_MULTIPLICATION_BY_QTY')) { // MAIN_APPLY_DISCOUNT_ON_UNIT_PRICE_THEN_ROUND_BEFORE_MULTIPLICATION_BY_QTY can be 'MU', 2, ... + $tot_sans_remise = $pu * $qty * ($progress / 100); + $tot_avec_remise_ligne = (float) price2num($pu * (1 - ((float) $remise_percent_ligne / 100)), getDolGlobalString('MAIN_APPLY_DISCOUNT_ON_UNIT_PRICE_THEN_ROUND_BEFORE_MULTIPLICATION_BY_QTY')) * $qty * ($progress / 100); + } else { + $tot_sans_remise = $pu * $qty * ($progress / 100); + $tot_avec_remise_ligne = $tot_sans_remise * (1 - ((float) $remise_percent_ligne / 100)); + } $tot_avec_remise = $tot_avec_remise_ligne * (1 - ((float) $remise_percent_global / 100)); // initialize result array