From c5ed69c2c2b434dd818307324abbebb04ef1b4cc Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 16 Apr 2026 10:40:27 +0530 Subject: [PATCH] fix: reset base_rounded_total when rounded_total resets (backport #54241) (#54302) * fix: reset base_rounded_total when rounded_total resets (cherry picked from commit f8d278b73309cbc02ed1474bff88453321c0e2fd) # Conflicts: # erpnext/controllers/tests/test_taxes_and_totals.py # erpnext/public/js/controllers/taxes_and_totals.js * chore: spelling mistake (cherry picked from commit e2ac4765877851bbf0a41864e3a0589840c58c27) * chore: resolve conflicts --------- Co-authored-by: ljain112 --- erpnext/controllers/taxes_and_totals.py | 17 ++++----- .../tests/test_taxes_and_totals.py | 37 +++++++++++++++++++ .../public/js/controllers/taxes_and_totals.js | 27 ++++++++------ 3 files changed, 60 insertions(+), 21 deletions(-) create mode 100644 erpnext/controllers/tests/test_taxes_and_totals.py diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 102622adf7a..39dd10e14b3 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -626,18 +626,17 @@ class calculate_taxes_and_totals: if self.doc.meta.get_field("rounded_total"): if self.doc.is_rounded_total_disabled(): self.doc.rounded_total = 0 - self.doc.base_rounded_total = 0 self.doc.rounding_adjustment = 0 - return - self.doc.rounded_total = round_based_on_smallest_currency_fraction( - self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total") - ) + else: + self.doc.rounded_total = round_based_on_smallest_currency_fraction( + self.doc.grand_total, self.doc.currency, self.doc.precision("rounded_total") + ) - # rounding adjustment should always be the difference vetween grand and rounded total - self.doc.rounding_adjustment = flt( - self.doc.rounded_total - self.doc.grand_total, self.doc.precision("rounding_adjustment") - ) + # rounding adjustment should always be the difference between grand and rounded total + self.doc.rounding_adjustment = flt( + self.doc.rounded_total - self.doc.grand_total, self.doc.precision("rounding_adjustment") + ) self._set_in_company_currency(self.doc, ["rounding_adjustment", "rounded_total"]) diff --git a/erpnext/controllers/tests/test_taxes_and_totals.py b/erpnext/controllers/tests/test_taxes_and_totals.py new file mode 100644 index 00000000000..504716f4684 --- /dev/null +++ b/erpnext/controllers/tests/test_taxes_and_totals.py @@ -0,0 +1,37 @@ +import frappe +from frappe.tests.utils import FrappeTestCase + +from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals +from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order + + +class TestTaxesAndTotals(FrappeTestCase): + def test_disabling_rounded_total_resets_base_fields(self): + """Disabling rounded total should also clear base rounded values.""" + so = make_sales_order(do_not_save=True) + so.items[0].qty = 1 + so.items[0].rate = 1000.25 + so.items[0].price_list_rate = 1000.25 + so.items[0].discount_percentage = 0 + so.items[0].discount_amount = 0 + so.set("taxes", []) + + so.disable_rounded_total = 0 + calculate_taxes_and_totals(so) + + self.assertEqual(so.grand_total, 1000.25) + self.assertEqual(so.rounded_total, 1000.0) + self.assertEqual(so.rounding_adjustment, -0.25) + self.assertEqual(so.base_grand_total, 1000.25) + self.assertEqual(so.base_rounded_total, 1000.0) + self.assertEqual(so.base_rounding_adjustment, -0.25) + + # User toggles disable_rounded_total after values are already set. + so.disable_rounded_total = 1 + + calculate_taxes_and_totals(so) + + self.assertEqual(so.rounded_total, 0) + self.assertEqual(so.rounding_adjustment, 0) + self.assertEqual(so.base_rounded_total, 0) + self.assertEqual(so.base_rounding_adjustment, 0) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 0d0b12fbf18..2b72244dc1f 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -609,18 +609,21 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { disable_rounded_total = frappe.sys_defaults.disable_rounded_total; } - if (cint(disable_rounded_total)) { - this.frm.doc.rounded_total = 0; - this.frm.doc.base_rounded_total = 0; - this.frm.doc.rounding_adjustment = 0; - return; - } - - if(frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total", this.frm.doc.name)) { - this.frm.doc.rounded_total = round_based_on_smallest_currency_fraction(this.frm.doc.grand_total, - this.frm.doc.currency, precision("rounded_total")); - this.frm.doc.rounding_adjustment = flt(this.frm.doc.rounded_total - this.frm.doc.grand_total, - precision("rounding_adjustment")); + if (frappe.meta.get_docfield(this.frm.doc.doctype, "rounded_total", this.frm.doc.name)) { + if (cint(disable_rounded_total)) { + this.frm.doc.rounded_total = 0; + this.frm.doc.rounding_adjustment = 0; + } else { + this.frm.doc.rounded_total = round_based_on_smallest_currency_fraction( + this.frm.doc.grand_total, + this.frm.doc.currency, + precision("rounded_total") + ); + this.frm.doc.rounding_adjustment = flt( + this.frm.doc.rounded_total - this.frm.doc.grand_total, + precision("rounding_adjustment") + ); + } this.set_in_company_currency(this.frm.doc, ["rounding_adjustment", "rounded_total"]); }