From 934b5065fcb5cd0acfab7fc1e610e0d6a2f8c6ff Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Thu, 25 Jun 2026 14:39:08 +0530 Subject: [PATCH] fix(postgres): expiry-based serial selection picks wrong serials on Postgres get_serial_nos_based_on_filters with based_on='Expiry' orders by amc_expiry_date asc and limits to qty. MariaDB sorts NULL (no-AMC) serials first; Postgres last, so a different set of serials is auto-selected. Order by (amc_expiry_date IS NULL) desc, amc_expiry_date so NULLs sort first on both (MariaDB unchanged). --- .../doctype/serial_and_batch_bundle/serial_and_batch_bundle.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py index cd706b800a5..951023d8bb7 100644 --- a/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py +++ b/erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py @@ -2432,6 +2432,8 @@ def get_serial_nos_based_on_filters(filters, fields, order_by, kwargs): if kwargs.based_on == "LIFO": query = query.orderby(order_by_column, order=frappe.query_builder.Order.desc) else: + if order_by == "amc_expiry_date": + query = query.orderby(order_by_column.isnull(), order=frappe.query_builder.Order.desc) query = query.orderby(order_by_column) for key, value in filters.items():