From 07a86b33e6f7e34a5b4bfda3f12a60d0c970a604 Mon Sep 17 00:00:00 2001 From: Mihir Kandoi Date: Tue, 23 Jun 2026 18:51:18 +0530 Subject: [PATCH] fix(stock): guard non-stock valuation-rate division against a zero divisor (Postgres) The non-stock-item valuation rate divides Sum(base_net_amount) by Sum(qty * conversion_factor) over Purchase Invoice Items. A line with qty 0 zeroes the divisor. MariaDB returns NULL for x/0 (the caller maps it via `or 0.0`); PostgreSQL raises `division by zero` and aborts. Wrap the divisor in NullIf(Sum(qty * conversion_factor), 0): unchanged on MariaDB, valid on Postgres. --- erpnext/stock/get_item_details.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py index 1025bbf5355..b11868347ea 100644 --- a/erpnext/stock/get_item_details.py +++ b/erpnext/stock/get_item_details.py @@ -11,7 +11,7 @@ from frappe.model import child_table_fields, default_fields from frappe.model.document import Document from frappe.model.meta import get_field_precision from frappe.model.utils import get_fetch_values -from frappe.query_builder.functions import IfNull, Sum +from frappe.query_builder.functions import IfNull, NullIf, Sum from frappe.utils import add_days, add_months, cint, cstr, flt, get_link_to_form, getdate, parse_json import erpnext @@ -1734,7 +1734,7 @@ def get_valuation_rate(item_code: str, company: str, warehouse: str | None = Non pi_item = frappe.qb.DocType("Purchase Invoice Item") valuation_rate = ( frappe.qb.from_(pi_item) - .select(Sum(pi_item.base_net_amount) / Sum(pi_item.qty * pi_item.conversion_factor)) + .select(Sum(pi_item.base_net_amount) / NullIf(Sum(pi_item.qty * pi_item.conversion_factor), 0)) .where((pi_item.docstatus == 1) & (pi_item.item_code == item_code)) ).run()