From 78a3701f4c19a5a322a00758654d19fa7b89d511 Mon Sep 17 00:00:00 2001 From: dharanidharan2813 Date: Fri, 17 Oct 2025 13:16:02 +0530 Subject: [PATCH 1/5] fix: Payment Terms auto-fetched in Sales Invoice even when automatically_fetch_payment_terms is disabled (cherry picked from commit cf1d892d60f9c0622640623066819aa855028cef) # Conflicts: # erpnext/selling/doctype/sales_order/test_sales_order.py --- .../doctype/sales_order/sales_order.py | 1 - .../doctype/sales_order/test_sales_order.py | 38 +++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index a1047c11a96..832992198b6 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -1203,7 +1203,6 @@ def make_sales_invoice(source_name, target_doc=None, ignore_permissions=False, a "doctype": "Sales Invoice", "field_map": { "party_account_currency": "party_account_currency", - "payment_terms_template": "payment_terms_template", }, "field_no_map": ["payment_terms_template"], "validation": {"docstatus": ["=", 1]}, diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index d38473e4b69..a78367900eb 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -200,10 +200,16 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): so.load_from_db() self.assertEqual(so.per_billed, 0) +<<<<<<< HEAD @change_settings( "Accounts Settings", {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 1}, ) +======= + @IntegrationTestCase.change_settings( + "Accounts Settings", {"automatically_fetch_payment_terms": 1} + ) # Enable auto fetch +>>>>>>> cf1d892d60 (fix: Payment Terms auto-fetched in Sales Invoice even when automatically_fetch_payment_terms is disabled) def test_make_sales_invoice_with_terms(self): so = make_sales_order(do_not_submit=True) @@ -232,6 +238,38 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): si1 = make_sales_invoice(so.name) self.assertEqual(len(si1.get("items")), 0) + @IntegrationTestCase.change_settings( + "Accounts Settings", {"automatically_fetch_payment_terms": 1} + ) # Enable auto fetch + def test_auto_fetch_terms_enable(self): + so = make_sales_order(do_not_submit=True) + + so.payment_terms_template = "_Test Payment Term Template" + so.save() + so.submit() + + si = make_sales_invoice(so.name) + # Check if payment terms are copied from sales order to sales invoice + self.assertTrue(si.payment_terms_template) + si.insert() + si.submit() + + @IntegrationTestCase.change_settings( + "Accounts Settings", {"automatically_fetch_payment_terms": 0} + ) # Disable auto fetch + def test_auto_fetch_terms_disable(self): + so = make_sales_order(do_not_submit=True) + + so.payment_terms_template = "_Test Payment Term Template" + so.save() + so.submit() + + si = make_sales_invoice(so.name) + # Check if payment terms are not copied from sales order to sales invoice + self.assertFalse(si.payment_terms_template) + si.insert() + si.submit() + def test_update_qty(self): so = make_sales_order() From a503460bd5f2ac907140b79ebc1f60574f7eb94a Mon Sep 17 00:00:00 2001 From: Diptanil Saha Date: Tue, 2 Dec 2025 12:20:56 +0530 Subject: [PATCH 2/5] chore: resolve conflict --- .../selling/doctype/sales_order/test_sales_order.py | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index a78367900eb..53832569812 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -200,16 +200,10 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): so.load_from_db() self.assertEqual(so.per_billed, 0) -<<<<<<< HEAD @change_settings( "Accounts Settings", {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 1}, ) -======= - @IntegrationTestCase.change_settings( - "Accounts Settings", {"automatically_fetch_payment_terms": 1} - ) # Enable auto fetch ->>>>>>> cf1d892d60 (fix: Payment Terms auto-fetched in Sales Invoice even when automatically_fetch_payment_terms is disabled) def test_make_sales_invoice_with_terms(self): so = make_sales_order(do_not_submit=True) @@ -238,7 +232,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): si1 = make_sales_invoice(so.name) self.assertEqual(len(si1.get("items")), 0) - @IntegrationTestCase.change_settings( + @change_settings( "Accounts Settings", {"automatically_fetch_payment_terms": 1} ) # Enable auto fetch def test_auto_fetch_terms_enable(self): @@ -254,7 +248,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): si.insert() si.submit() - @IntegrationTestCase.change_settings( + @change_settings( "Accounts Settings", {"automatically_fetch_payment_terms": 0} ) # Disable auto fetch def test_auto_fetch_terms_disable(self): From 4da44e2c3f092104b314ba15ff53efa44d09068d Mon Sep 17 00:00:00 2001 From: Diptanil Saha Date: Tue, 2 Dec 2025 12:25:39 +0530 Subject: [PATCH 3/5] chore: resolve linter issue --- erpnext/selling/doctype/sales_order/test_sales_order.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index 53832569812..d56431f5d3b 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -232,9 +232,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): si1 = make_sales_invoice(so.name) self.assertEqual(len(si1.get("items")), 0) - @change_settings( - "Accounts Settings", {"automatically_fetch_payment_terms": 1} - ) # Enable auto fetch + @change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 1}) # Enable auto fetch def test_auto_fetch_terms_enable(self): so = make_sales_order(do_not_submit=True) @@ -248,9 +246,7 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): si.insert() si.submit() - @change_settings( - "Accounts Settings", {"automatically_fetch_payment_terms": 0} - ) # Disable auto fetch + @change_settings("Accounts Settings", {"automatically_fetch_payment_terms": 0}) # Disable auto fetch def test_auto_fetch_terms_disable(self): so = make_sales_order(do_not_submit=True) From 2c13b2cc220b7aacbc140d07016dbcfdce670d7c Mon Sep 17 00:00:00 2001 From: diptanilsaha Date: Tue, 2 Dec 2025 12:58:43 +0530 Subject: [PATCH 4/5] test: fixed test_make_sales_invoice_with_terms --- erpnext/selling/doctype/sales_order/test_sales_order.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py index d56431f5d3b..cff84411231 100644 --- a/erpnext/selling/doctype/sales_order/test_sales_order.py +++ b/erpnext/selling/doctype/sales_order/test_sales_order.py @@ -202,7 +202,11 @@ class TestSalesOrder(AccountsTestMixin, FrappeTestCase): @change_settings( "Accounts Settings", - {"add_taxes_from_item_tax_template": 0, "add_taxes_from_taxes_and_charges_template": 1}, + { + "add_taxes_from_item_tax_template": 0, + "add_taxes_from_taxes_and_charges_template": 1, + "automatically_fetch_payment_terms": 1, + }, ) def test_make_sales_invoice_with_terms(self): so = make_sales_order(do_not_submit=True) From 13239a9deecd312b8fb50192b9e14be3eecfa6cc Mon Sep 17 00:00:00 2001 From: Dharanidharan S Date: Wed, 3 Dec 2025 18:44:25 +0530 Subject: [PATCH 5/5] fix(accounts-controller): handle empty items list --- erpnext/controllers/accounts_controller.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index f6195e6e09e..cc371a9ccf9 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2580,12 +2580,12 @@ class AccountsController(TransactionBase): def get_order_details(self): if self.doctype == "Sales Invoice": - po_or_so = self.get("items")[0].get("sales_order") + po_or_so = self.get("items") and self.get("items")[0].get("sales_order") po_or_so_doctype = "Sales Order" po_or_so_doctype_name = "sales_order" else: - po_or_so = self.get("items")[0].get("purchase_order") + po_or_so = self.get("items") and self.get("items")[0].get("purchase_order") po_or_so_doctype = "Purchase Order" po_or_so_doctype_name = "purchase_order"