From bd9427623f3a062632aa1d0517831f528de796c7 Mon Sep 17 00:00:00 2001 From: Trusted Computer <75872475+trustedcomputer@users.noreply.github.com> Date: Fri, 10 Apr 2026 00:39:32 -0700 Subject: [PATCH] refactor: bring back titles on sales transactions and make them optional and visible on purchase transactions (#52633) * fix: correct wrong PO titles * refactor: restore title fields to sales transaction doctypes * refactor: change title fields to optional fields with no default in purchase transactional doctypes * chore: re-save doctype definitions - updates modified timestamps - regenerates type hints --------- Co-authored-by: barredterra <14891507+barredterra@users.noreply.github.com> --- .../doctype/pos_invoice/pos_invoice.json | 16 +++++++++++++++- .../doctype/pos_invoice/pos_invoice.py | 1 + .../purchase_invoice/purchase_invoice.json | 16 +++++++++++++++- .../purchase_invoice/purchase_invoice.py | 1 + .../doctype/sales_invoice/sales_invoice.json | 16 +++++++++++++++- .../doctype/sales_invoice/sales_invoice.py | 1 + .../purchase_order/purchase_order.json | 16 +++++++++++++++- .../doctype/purchase_order/purchase_order.py | 1 + .../request_for_quotation.json | 19 +++++++++++++++++-- .../request_for_quotation.py | 1 + .../supplier_quotation.json | 14 +++++++++----- erpnext/patches.txt | 1 + erpnext/patches/v16_0/correct_po_titles.py | 15 +++++++++++++++ .../selling/doctype/quotation/quotation.json | 16 +++++++++++++++- .../selling/doctype/quotation/quotation.py | 1 + .../doctype/sales_order/sales_order.json | 16 +++++++++++++++- .../doctype/sales_order/sales_order.py | 1 + .../doctype/delivery_note/delivery_note.json | 16 +++++++++++++++- .../doctype/delivery_note/delivery_note.py | 1 + .../purchase_receipt/purchase_receipt.json | 14 ++++++++++++++ 20 files changed, 169 insertions(+), 14 deletions(-) create mode 100644 erpnext/patches/v16_0/correct_po_titles.py diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.json b/erpnext/accounts/doctype/pos_invoice/pos_invoice.json index c8fc266b012..4b8aa3f8823 100644 --- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.json +++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.json @@ -26,6 +26,8 @@ "due_date", "amended_from", "return_against", + "section_break_clmv", + "title", "accounting_dimensions_section", "project", "dimension_col_break", @@ -1620,12 +1622,24 @@ "fieldname": "auto_repeat_section", "fieldtype": "Section Break", "label": "Auto Repeat" + }, + { + "fieldname": "section_break_clmv", + "fieldtype": "Section Break" + }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 } ], "icon": "fa fa-file-text", "is_submittable": 1, "links": [], - "modified": "2026-03-02 07:32:47.667810", + "modified": "2026-03-30 12:15:57.253316", "modified_by": "Administrator", "module": "Accounts", "name": "POS Invoice", diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py index c9b35a27c29..265a350d6a2 100644 --- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py +++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py @@ -173,6 +173,7 @@ class POSInvoice(SalesInvoice): terms: DF.TextEditor | None territory: DF.Link | None timesheets: DF.Table[SalesInvoiceTimesheet] + title: DF.Data | None to_date: DF.Date | None total: DF.Currency total_advance: DF.Currency diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json index f7f8d8b8ffc..08510da58ef 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json @@ -27,6 +27,8 @@ "update_billed_amount_in_purchase_receipt", "apply_tds", "amended_from", + "section_break_ecfi", + "title", "supplier_invoice_details", "bill_no", "column_break_15", @@ -209,6 +211,14 @@ "connections_tab" ], "fields": [ + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 + }, { "fieldname": "naming_series", "fieldtype": "Select", @@ -1682,6 +1692,10 @@ "fieldname": "automation_section", "fieldtype": "Section Break", "label": "Automation" + }, + { + "fieldname": "section_break_ecfi", + "fieldtype": "Section Break" } ], "grid_page_length": 50, @@ -1689,7 +1703,7 @@ "idx": 204, "is_submittable": 1, "links": [], - "modified": "2026-03-25 11:45:38.696888", + "modified": "2026-03-30 12:16:40.157755", "modified_by": "Administrator", "module": "Accounts", "name": "Purchase Invoice", diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index 49bc27579e0..4a384f83345 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -204,6 +204,7 @@ class PurchaseInvoice(BuyingController): taxes_and_charges_deducted: DF.Currency tc_name: DF.Link | None terms: DF.TextEditor | None + title: DF.Data | None to_date: DF.Date | None total: DF.Currency total_advance: DF.Currency diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json index 8c2ad3adc09..2dc7b366b63 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json @@ -33,6 +33,8 @@ "is_created_using_pos", "pos_closing_entry", "has_subcontracted", + "section_break_sgnf", + "title", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -2328,6 +2330,18 @@ "fieldname": "automation_section", "fieldtype": "Section Break", "label": "Automation" + }, + { + "fieldname": "section_break_sgnf", + "fieldtype": "Section Break" + }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 } ], "grid_page_length": 50, @@ -2341,7 +2355,7 @@ "link_fieldname": "consolidated_invoice" } ], - "modified": "2026-03-09 17:15:30.931929", + "modified": "2026-03-30 12:17:16.201016", "modified_by": "Administrator", "module": "Accounts", "name": "Sales Invoice", diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index efbe306bcea..ebef1a8040d 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -226,6 +226,7 @@ class SalesInvoice(SellingController): terms: DF.TextEditor | None territory: DF.Link | None timesheets: DF.Table[SalesInvoiceTimesheet] + title: DF.Data | None to_date: DF.Date | None total: DF.Currency total_advance: DF.Currency diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.json b/erpnext/buying/doctype/purchase_order/purchase_order.json index 3cc69115ace..d7bd661c3bd 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.json +++ b/erpnext/buying/doctype/purchase_order/purchase_order.json @@ -23,6 +23,8 @@ "is_subcontracted", "has_unit_price_items", "supplier_warehouse", + "section_break_zymg", + "title", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -171,6 +173,14 @@ "fieldtype": "Section Break", "options": "fa fa-user" }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 + }, { "fieldname": "naming_series", "fieldtype": "Select", @@ -1309,6 +1319,10 @@ "fieldname": "auto_repeat_section", "fieldtype": "Section Break", "label": "Auto Repeat" + }, + { + "fieldname": "section_break_zymg", + "fieldtype": "Section Break" } ], "grid_page_length": 50, @@ -1316,7 +1330,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-03-25 11:46:18.748951", + "modified": "2026-03-30 12:17:43.342204", "modified_by": "Administrator", "module": "Buying", "name": "Purchase Order", diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py index 5fd05734293..16b6715acde 100644 --- a/erpnext/buying/doctype/purchase_order/purchase_order.py +++ b/erpnext/buying/doctype/purchase_order/purchase_order.py @@ -160,6 +160,7 @@ class PurchaseOrder(BuyingController): taxes_and_charges_deducted: DF.Currency tc_name: DF.Link | None terms: DF.TextEditor | None + title: DF.Data | None to_date: DF.Date | None total: DF.Currency total_net_weight: DF.Float diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json index de8b4d28547..e9f5fab1788 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.json @@ -16,6 +16,8 @@ "status", "has_unit_price_items", "amended_from", + "section_break_trpf", + "title", "suppliers_section", "suppliers", "items_section", @@ -371,6 +373,18 @@ "fieldtype": "Text Editor", "label": "Shipping Address Details", "read_only": 1 + }, + { + "fieldname": "section_break_trpf", + "fieldtype": "Section Break" + }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 } ], "grid_page_length": 50, @@ -378,7 +392,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2026-03-19 15:27:56.730649", + "modified": "2026-03-30 12:18:08.451201", "modified_by": "Administrator", "module": "Buying", "name": "Request for Quotation", @@ -448,5 +462,6 @@ "show_name_in_global_search": 1, "sort_field": "creation", "sort_order": "DESC", - "states": [] + "states": [], + "title_field": "company" } diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py index 5d8ff944cc2..90d078eb2b5 100644 --- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py +++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.py @@ -64,6 +64,7 @@ class RequestforQuotation(BuyingController): suppliers: DF.Table[RequestforQuotationSupplier] tc_name: DF.Link | None terms: DF.TextEditor | None + title: DF.Data | None transaction_date: DF.Date use_html: DF.Check vendor: DF.Link | None diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json index bb1c048301e..17abfd4fb30 100644 --- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json +++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.json @@ -9,7 +9,6 @@ "engine": "InnoDB", "field_order": [ "supplier_section", - "title", "naming_series", "supplier", "supplier_name", @@ -21,6 +20,8 @@ "quotation_number", "has_unit_price_items", "amended_from", + "section_break_wwao", + "title", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -127,10 +128,9 @@ "options": "fa fa-user" }, { - "default": "{supplier_name}", + "allow_on_submit": 1, "fieldname": "title", "fieldtype": "Data", - "hidden": 1, "label": "Title", "no_copy": 1, "print_hide": 1, @@ -940,6 +940,10 @@ "fieldname": "auto_repeat_section", "fieldtype": "Section Break", "label": "Auto Repeat" + }, + { + "fieldname": "section_break_wwao", + "fieldtype": "Section Break" } ], "grid_page_length": 50, @@ -948,7 +952,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2026-02-27 18:05:50.121391", + "modified": "2026-03-30 12:18:35.777574", "modified_by": "Administrator", "module": "Buying", "name": "Supplier Quotation", @@ -1016,5 +1020,5 @@ "sort_order": "DESC", "states": [], "timeline_field": "supplier", - "title_field": "title" + "title_field": "supplier_name" } diff --git a/erpnext/patches.txt b/erpnext/patches.txt index 2540e83e26e..a0c4c1a9c44 100644 --- a/erpnext/patches.txt +++ b/erpnext/patches.txt @@ -470,6 +470,7 @@ erpnext.patches.v16_0.add_portal_redirects erpnext.patches.v16_0.update_order_qty_and_requested_qty_based_on_mr_and_po erpnext.patches.v16_0.complete_onboarding_steps_for_older_sites #2 erpnext.patches.v16_0.enable_serial_batch_setting +erpnext.patches.v16_0.correct_po_titles erpnext.patches.v16_0.co_by_product_patch erpnext.patches.v16_0.update_requested_qty_packed_item erpnext.patches.v16_0.remove_payables_receivables_workspace diff --git a/erpnext/patches/v16_0/correct_po_titles.py b/erpnext/patches/v16_0/correct_po_titles.py new file mode 100644 index 00000000000..04334e52ca7 --- /dev/null +++ b/erpnext/patches/v16_0/correct_po_titles.py @@ -0,0 +1,15 @@ +import frappe + + +def execute(): + """ + This patch corrects the titles of purchase orders that were set to + the text string "{supplier_name}" instead of the actual supplier name. + """ + + purchase_order = frappe.qb.DocType("Purchase Order") + ( + frappe.qb.update(purchase_order) + .set(purchase_order.title, purchase_order.supplier_name) + .where(purchase_order.title == "{supplier_name}") + ).run() diff --git a/erpnext/selling/doctype/quotation/quotation.json b/erpnext/selling/doctype/quotation/quotation.json index a791c7f4538..d70475eeb0a 100644 --- a/erpnext/selling/doctype/quotation/quotation.json +++ b/erpnext/selling/doctype/quotation/quotation.json @@ -22,6 +22,8 @@ "company", "has_unit_price_items", "amended_from", + "section_break_cojf", + "title", "currency_and_price_list", "currency", "conversion_rate", @@ -1130,13 +1132,25 @@ "fieldname": "auto_repeat_section", "fieldtype": "Section Break", "label": "Auto Repeat" + }, + { + "fieldname": "section_break_cojf", + "fieldtype": "Section Break" + }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 } ], "icon": "fa fa-shopping-cart", "idx": 82, "is_submittable": 1, "links": [], - "modified": "2026-03-09 17:15:31.941114", + "modified": "2026-03-30 12:19:04.589592", "modified_by": "Administrator", "module": "Selling", "name": "Quotation", diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 5250f209d26..ae2cdbf124d 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -113,6 +113,7 @@ class Quotation(SellingController): tc_name: DF.Link | None terms: DF.TextEditor | None territory: DF.Link | None + title: DF.Data | None total: DF.Currency total_net_weight: DF.Float total_qty: DF.Float diff --git a/erpnext/selling/doctype/sales_order/sales_order.json b/erpnext/selling/doctype/sales_order/sales_order.json index 3109fd0e36e..e98fe101fbd 100644 --- a/erpnext/selling/doctype/sales_order/sales_order.json +++ b/erpnext/selling/doctype/sales_order/sales_order.json @@ -26,6 +26,8 @@ "has_unit_price_items", "is_subcontracted", "amended_from", + "section_break_umok", + "title", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -1742,6 +1744,18 @@ "no_copy": 1, "print_hide": 1, "read_only": 1 + }, + { + "fieldname": "section_break_umok", + "fieldtype": "Section Break" + }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 } ], "grid_page_length": 50, @@ -1749,7 +1763,7 @@ "idx": 105, "is_submittable": 1, "links": [], - "modified": "2026-03-04 18:04:05.873483", + "modified": "2026-03-30 12:19:27.522646", "modified_by": "Administrator", "module": "Selling", "name": "Sales Order", diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py index 492cf9bff07..744b50a3d44 100755 --- a/erpnext/selling/doctype/sales_order/sales_order.py +++ b/erpnext/selling/doctype/sales_order/sales_order.py @@ -181,6 +181,7 @@ class SalesOrder(SellingController): tc_name: DF.Link | None terms: DF.TextEditor | None territory: DF.Link | None + title: DF.Data | None to_date: DF.Date | None total: DF.Currency total_commission: DF.Currency diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.json b/erpnext/stock/doctype/delivery_note/delivery_note.json index f110e0fe32c..3729c7cc2e2 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.json +++ b/erpnext/stock/doctype/delivery_note/delivery_note.json @@ -22,6 +22,8 @@ "is_return", "issue_credit_note", "return_against", + "section_break_bxkw", + "title", "accounting_dimensions_section", "cost_center", "column_break_18", @@ -1450,13 +1452,25 @@ "fieldname": "auto_repeat_section", "fieldtype": "Section Break", "label": "Auto Repeat" + }, + { + "fieldname": "section_break_bxkw", + "fieldtype": "Section Break" + }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 } ], "icon": "fa fa-truck", "idx": 146, "is_submittable": 1, "links": [], - "modified": "2026-03-09 17:15:27.932956", + "modified": "2026-03-30 12:19:56.889644", "modified_by": "Administrator", "module": "Stock", "name": "Delivery Note", diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py index d6134a6fe23..b1d689fc26c 100644 --- a/erpnext/stock/doctype/delivery_note/delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/delivery_note.py @@ -146,6 +146,7 @@ class DeliveryNote(SellingController): tc_name: DF.Link | None terms: DF.TextEditor | None territory: DF.Link | None + title: DF.Data | None total: DF.Currency total_commission: DF.Currency total_net_weight: DF.Float diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json index 82745b34bbf..cca252ba113 100755 --- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json +++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.json @@ -25,6 +25,8 @@ "apply_putaway_rule", "is_return", "return_against", + "section_break_zwvg", + "title", "accounting_dimensions_section", "cost_center", "dimension_col_break", @@ -170,6 +172,14 @@ "print_width": "50%", "width": "50%" }, + { + "allow_on_submit": 1, + "fieldname": "title", + "fieldtype": "Data", + "label": "Title", + "no_copy": 1, + "print_hide": 1 + }, { "fieldname": "naming_series", "fieldtype": "Select", @@ -1285,6 +1295,10 @@ { "fieldname": "column_break_ugyv", "fieldtype": "Column Break" + }, + { + "fieldname": "section_break_zwvg", + "fieldtype": "Section Break" } ], "grid_page_length": 50,