From 4adcc1c52167304b26b624291095f1e0512bae04 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 17:33:26 +0530 Subject: [PATCH 1/4] feat: default letterhead and print format (cherry picked from commit 0ea22f9796de62ce3fdee62192bedd32f09d8c5e) --- erpnext/setup/install.py | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 94706443d6b..d224aa017b0 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -35,6 +35,7 @@ def after_install(): update_roles() make_default_operations() update_pegged_currencies() + set_default_print_formats() create_letter_head() frappe.db.commit() @@ -301,6 +302,31 @@ def update_pegged_currencies(): doc.save() +def set_default_print_formats(): + default_map = { + "Sales Order": "Sales Order with Item Image", + "Sales Invoice": "Sales Invoice with Item Image", + "Delivery Note": "Delivery Note with Item Image", + "Purchase Order": "Purchase Order with Item Image", + "Purchase Invoice": "Purchase Invoice with Item Image", + "POS Invoice": "POS Invoice with Item Image", + } + + for doctype, print_format in default_map.items(): + if frappe.get_meta(doctype).default_print_format: + continue + + frappe.make_property_setter( + { + "doctype": doctype, + "doctype_or_field": "DocType", + "property": "default_print_format", + "value": print_format, + }, + validate_fields_for_doctype=False, + ) + + def create_letter_head(): base_path = frappe.get_app_path("erpnext", "accounts", "letterhead") @@ -318,6 +344,7 @@ def create_letter_head(): "letter_head_name": name, "source": "HTML", "content": content, + "is_default": 1 if name == "Company Letterhead - Grey" else 0, } ) doc.insert(ignore_permissions=True) From dd41f2ceb75a53ffcdf65e7934397c38b84e0bca Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 18:09:41 +0530 Subject: [PATCH 2/4] fix: add missing property_type (cherry picked from commit fbf5529ddd26c8b65d51e156ce322ad78854b4da) --- erpnext/setup/install.py | 1 + 1 file changed, 1 insertion(+) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index d224aa017b0..3337ec63252 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -322,6 +322,7 @@ def set_default_print_formats(): "doctype_or_field": "DocType", "property": "default_print_format", "value": print_format, + "property_type": "Link", }, validate_fields_for_doctype=False, ) From b21acec7116579ece48e2642fd5f9bbaf1bbf7c4 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Mon, 23 Feb 2026 18:52:08 +0530 Subject: [PATCH 3/4] test: debugging the issue (cherry picked from commit 570f574758cc14151034cfb1a5a6d9066447930a) --- erpnext/setup/install.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index 3337ec63252..e7740d253df 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -345,7 +345,7 @@ def create_letter_head(): "letter_head_name": name, "source": "HTML", "content": content, - "is_default": 1 if name == "Company Letterhead - Grey" else 0, + "is_default": 1 if name == "Company Letterhead" else 0, } ) doc.insert(ignore_permissions=True) From 1e64dea6a078c3fe388220017aac3036ea1af114 Mon Sep 17 00:00:00 2001 From: khushi8112 Date: Tue, 24 Feb 2026 18:24:09 +0530 Subject: [PATCH 4/4] fix: test cases related to default letterhead change (cherry picked from commit 8a2cb96c2ae3333650e2f805f557c69743b0d6d7) --- .../test_process_statement_of_accounts.py | 11 +++++++++++ erpnext/setup/install.py | 5 ++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py index 7d5cfb90af8..2d599fee1af 100644 --- a/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py +++ b/erpnext/accounts/doctype/process_statement_of_accounts/test_process_statement_of_accounts.py @@ -18,8 +18,19 @@ class TestProcessStatementOfAccounts(AccountsTestMixin, IntegrationTestCase): @classmethod def setUpClass(cls): super().setUpClass() + letterhead = frappe.get_doc("Letter Head", "Company Letterhead - Grey") + letterhead.is_default = 0 + letterhead.save() cls.enterClassContext(cls.change_settings("Selling Settings", validate_selling_price=0)) + @classmethod + def tearDownClass(cls): + super().tearDownClass() + letterhead = frappe.get_doc("Letter Head", "Company Letterhead - Grey") + letterhead.is_default = 1 + letterhead.save() + frappe.db.commit() # nosemgrep + def setUp(self): self.create_company() self.create_customer() diff --git a/erpnext/setup/install.py b/erpnext/setup/install.py index e7740d253df..726906ac6cb 100644 --- a/erpnext/setup/install.py +++ b/erpnext/setup/install.py @@ -316,6 +316,9 @@ def set_default_print_formats(): if frappe.get_meta(doctype).default_print_format: continue + if not frappe.db.exists("Print Format", print_format): + continue + frappe.make_property_setter( { "doctype": doctype, @@ -345,7 +348,7 @@ def create_letter_head(): "letter_head_name": name, "source": "HTML", "content": content, - "is_default": 1 if name == "Company Letterhead" else 0, + "is_default": 1 if name == "Company Letterhead - Grey" else 0, } ) doc.insert(ignore_permissions=True)