From eef075a2bac9b4b37ba73d8b58da00a6fed6c65d Mon Sep 17 00:00:00 2001 From: Lakshit Jain Date: Tue, 9 Jun 2026 17:52:19 +0530 Subject: [PATCH 1/3] fix: update round off account functions to accept document context for regional overrides (#55758) (cherry picked from commit 08129ff71c2279e803ec95564b9f4837a599c42b) # Conflicts: # erpnext/controllers/taxes_and_totals.py # erpnext/controllers/tests/test_taxes_and_totals.py # erpnext/public/js/controllers/taxes_and_totals.js --- erpnext/controllers/taxes_and_totals.py | 15 +++++++++-- .../tests/test_taxes_and_totals.py | 26 +++++++++++++++++++ .../public/js/controllers/taxes_and_totals.js | 9 +++++++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 54aee03e083..8b2a02ce290 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -26,9 +26,14 @@ from erpnext.utilities.regional import temporary_flag class calculate_taxes_and_totals: def __init__(self, doc: Document): self.doc = doc +<<<<<<< HEAD frappe.flags.round_off_applicable_accounts = [] frappe.flags.round_row_wise_tax = frappe.db.get_single_value( "Accounts Settings", "round_row_wise_tax" +======= + frappe.flags.round_off_applicable_accounts = ( + get_round_off_applicable_accounts(self.doc.company, [], self.doc) or [] +>>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) ) if doc.get("round_off_applicable_accounts_for_tax_withholding"): @@ -1128,14 +1133,20 @@ def get_itemised_tax_breakup_html(doc): @frappe.whitelist() +<<<<<<< HEAD def get_round_off_applicable_accounts(company, account_list): +======= +def get_round_off_applicable_accounts( + company: str, account_list: list | str, doc: str | dict | Document | None = None +): +>>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) # required to set correct region with temporary_flag("company", company): - return get_regional_round_off_accounts(company, account_list) + return get_regional_round_off_accounts(company, account_list, doc) @erpnext.allow_regional -def get_regional_round_off_accounts(company, account_list): +def get_regional_round_off_accounts(company, account_list, doc=None): pass diff --git a/erpnext/controllers/tests/test_taxes_and_totals.py b/erpnext/controllers/tests/test_taxes_and_totals.py index 504716f4684..b86e60a027b 100644 --- a/erpnext/controllers/tests/test_taxes_and_totals.py +++ b/erpnext/controllers/tests/test_taxes_and_totals.py @@ -5,7 +5,33 @@ from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order +<<<<<<< HEAD class TestTaxesAndTotals(FrappeTestCase): +======= +class TestTaxesAndTotals(ERPNextTestSuite): + def test_regional_round_off_accounts(self): + """ + Regional overrides cannot extend the list in-place — the return + value must be assigned back to frappe.flags.round_off_applicable_accounts. + """ + test_account = "_Test Round Off Account" + + def mock_regional(company, account_list: list, doc=None) -> list: + # Simulates a regional override + account_list.extend([test_account]) + return account_list + + so = make_sales_order(do_not_save=True) + + with patch( + "erpnext.controllers.taxes_and_totals.get_regional_round_off_accounts", + mock_regional, + ): + calculate_taxes_and_totals(so) + + self.assertIn(test_account, frappe.flags.round_off_applicable_accounts) + +>>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) 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) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 7b07c13bf11..924bf4534ac 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -204,10 +204,19 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { if (me.frm.doc.company) { frappe.call({ +<<<<<<< HEAD "method": "erpnext.controllers.taxes_and_totals.get_round_off_applicable_accounts", "args": { "company": me.frm.doc.company, "account_list": frappe.flags.round_off_applicable_accounts +======= + method: "erpnext.controllers.taxes_and_totals.get_round_off_applicable_accounts", + args: { + company: me.frm.doc.company, + account_list: frappe.flags.round_off_applicable_accounts, + // pass the doc so regional overrides can inspect it + doc: me.frm.doc, +>>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) }, callback(r) { if (r.message) { From 5629056ec267e9bb72b316f5f661f7a99e534e7d Mon Sep 17 00:00:00 2001 From: ljain112 Date: Tue, 9 Jun 2026 18:12:53 +0530 Subject: [PATCH 2/3] chore: resolve conflicts --- erpnext/controllers/taxes_and_totals.py | 13 +++---------- erpnext/controllers/tests/test_taxes_and_totals.py | 6 ++---- erpnext/public/js/controllers/taxes_and_totals.js | 12 ++---------- 3 files changed, 7 insertions(+), 24 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 8b2a02ce290..09318b6725f 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -26,14 +26,9 @@ from erpnext.utilities.regional import temporary_flag class calculate_taxes_and_totals: def __init__(self, doc: Document): self.doc = doc -<<<<<<< HEAD frappe.flags.round_off_applicable_accounts = [] frappe.flags.round_row_wise_tax = frappe.db.get_single_value( "Accounts Settings", "round_row_wise_tax" -======= - frappe.flags.round_off_applicable_accounts = ( - get_round_off_applicable_accounts(self.doc.company, [], self.doc) or [] ->>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) ) if doc.get("round_off_applicable_accounts_for_tax_withholding"): @@ -43,7 +38,9 @@ class calculate_taxes_and_totals: self._items = self.filter_rows() if self.doc.doctype == "Quotation" else self.doc.get("items") - get_round_off_applicable_accounts(self.doc.company, frappe.flags.round_off_applicable_accounts) + get_round_off_applicable_accounts( + self.doc.company, frappe.flags.round_off_applicable_accounts, self.doc + ) self.calculate() def filter_rows(self): @@ -1133,13 +1130,9 @@ def get_itemised_tax_breakup_html(doc): @frappe.whitelist() -<<<<<<< HEAD -def get_round_off_applicable_accounts(company, account_list): -======= def get_round_off_applicable_accounts( company: str, account_list: list | str, doc: str | dict | Document | None = None ): ->>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) # required to set correct region with temporary_flag("company", company): return get_regional_round_off_accounts(company, account_list, doc) diff --git a/erpnext/controllers/tests/test_taxes_and_totals.py b/erpnext/controllers/tests/test_taxes_and_totals.py index b86e60a027b..715acf8782f 100644 --- a/erpnext/controllers/tests/test_taxes_and_totals.py +++ b/erpnext/controllers/tests/test_taxes_and_totals.py @@ -1,3 +1,5 @@ +from unittest.mock import patch + import frappe from frappe.tests.utils import FrappeTestCase @@ -5,10 +7,7 @@ from erpnext.controllers.taxes_and_totals import calculate_taxes_and_totals from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order -<<<<<<< HEAD class TestTaxesAndTotals(FrappeTestCase): -======= -class TestTaxesAndTotals(ERPNextTestSuite): def test_regional_round_off_accounts(self): """ Regional overrides cannot extend the list in-place — the return @@ -31,7 +30,6 @@ class TestTaxesAndTotals(ERPNextTestSuite): self.assertIn(test_account, frappe.flags.round_off_applicable_accounts) ->>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) 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) diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js index 924bf4534ac..0df4cabfb4f 100644 --- a/erpnext/public/js/controllers/taxes_and_totals.js +++ b/erpnext/public/js/controllers/taxes_and_totals.js @@ -204,19 +204,11 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments { if (me.frm.doc.company) { frappe.call({ -<<<<<<< HEAD "method": "erpnext.controllers.taxes_and_totals.get_round_off_applicable_accounts", "args": { "company": me.frm.doc.company, - "account_list": frappe.flags.round_off_applicable_accounts -======= - method: "erpnext.controllers.taxes_and_totals.get_round_off_applicable_accounts", - args: { - company: me.frm.doc.company, - account_list: frappe.flags.round_off_applicable_accounts, - // pass the doc so regional overrides can inspect it - doc: me.frm.doc, ->>>>>>> 08129ff71c (fix: update round off account functions to accept document context for regional overrides (#55758)) + "account_list": frappe.flags.round_off_applicable_accounts, + "doc": me.frm.doc, }, callback(r) { if (r.message) { From 42121f2e36d314166ee3f7e92e37cc3a5a2dfa3b Mon Sep 17 00:00:00 2001 From: ljain112 Date: Mon, 22 Jun 2026 17:40:57 +0530 Subject: [PATCH 3/3] fix: simplify get_round_off_applicable_accounts function signature --- erpnext/controllers/taxes_and_totals.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py index 09318b6725f..1fc8128d6ea 100644 --- a/erpnext/controllers/taxes_and_totals.py +++ b/erpnext/controllers/taxes_and_totals.py @@ -1130,9 +1130,7 @@ def get_itemised_tax_breakup_html(doc): @frappe.whitelist() -def get_round_off_applicable_accounts( - company: str, account_list: list | str, doc: str | dict | Document | None = None -): +def get_round_off_applicable_accounts(company, account_list, doc=None): # required to set correct region with temporary_flag("company", company): return get_regional_round_off_accounts(company, account_list, doc)