diff --git a/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py b/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py index 0aeec6905eb..a8e468415c1 100644 --- a/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py +++ b/erpnext/accounts/doctype/repost_accounting_ledger/repost_accounting_ledger.py @@ -215,16 +215,22 @@ def start_repost(account_repost_doc=str) -> None: def get_allowed_types_from_settings(child_doc: bool = False): - repost_docs = [ - x.document_type - for x in frappe.db.get_all( - "Repost Allowed Types", filters={"allowed": True}, fields=["distinct(document_type)"] - ) - ] + # Avoid DISTINCT(...) here: Frappe applies a default ORDER BY which breaks on Postgres + # when used with SELECT DISTINCT. + repost_docs = frappe.db.get_all( + "Repost Allowed Types", + filters={"allowed": True}, + pluck="document_type", + ) + + # De-dupe while preserving order (first occurrence wins) + repost_docs = list(dict.fromkeys(repost_docs)) result = repost_docs if repost_docs and child_doc: result.extend(get_child_docs(repost_docs)) + # Keep uniqueness after extending + result = list(dict.fromkeys(result)) return result @@ -291,8 +297,11 @@ def get_repost_allowed_types(doctype, txt, searchfield, start, page_len, filters if txt: filters.update({"document_type": ("like", f"%{txt}%")}) - if allowed_types := frappe.db.get_all( - "Repost Allowed Types", filters=filters, fields=["distinct(document_type)"], as_list=1 - ): - return allowed_types - return [] + allowed_types = frappe.db.get_all( + "Repost Allowed Types", + filters=filters, + pluck="document_type", + ) + + allowed_types = list(dict.fromkeys(allowed_types)) + return [[dt] for dt in allowed_types] diff --git a/erpnext/patches/v15_0/update_pick_list_fields.py b/erpnext/patches/v15_0/update_pick_list_fields.py index 9a7a1f5f463..de5116a22be 100644 --- a/erpnext/patches/v15_0/update_pick_list_fields.py +++ b/erpnext/patches/v15_0/update_pick_list_fields.py @@ -8,12 +8,24 @@ def execute(): def update_delivery_note(): - DN = frappe.qb.DocType("Delivery Note") - DNI = frappe.qb.DocType("Delivery Note Item") - - frappe.qb.update(DNI).join(DN).on(DN.name == DNI.parent).set(DNI.against_pick_list, DN.pick_list).where( - IfNull(DN.pick_list, "") != "" - ).run() + # Postgres doesn't support UPDATE ... JOIN. Use UPDATE ... FROM instead. + frappe.db.multisql( + { + "mariadb": """ + UPDATE `tabDelivery Note Item` dni + JOIN `tabDelivery Note` dn ON dn.`name` = dni.`parent` + SET dni.`against_pick_list` = dn.`pick_list` + WHERE COALESCE(dn.`pick_list`, '') <> '' + """, + "postgres": """ + UPDATE "tabDelivery Note Item" dni + SET against_pick_list = dn.pick_list + FROM "tabDelivery Note" dn + WHERE dn.name = dni.parent + AND COALESCE(dn.pick_list, '') <> '' + """, + } + ) def update_pick_list_items():