From 87be020c783f99f21dbbdcb653f538b97431ebdd Mon Sep 17 00:00:00 2001 From: Rohit Waghchaure Date: Thu, 8 Jan 2026 13:39:03 +0530 Subject: [PATCH] fix: negative stock issue for higher precision --- .../doctype/delivery_note/test_delivery_note.py | 17 +++++++++++++++++ erpnext/stock/stock_ledger.py | 6 +++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index e912340bdff..9b02ebe2f7a 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -2789,6 +2789,23 @@ class TestDeliveryNote(IntegrationTestCase): serial_batch_map[row.item_code].batch_no_valuation[entry.batch_no], ) + def test_negative_stock_with_higher_precision(self): + original_flt_precision = frappe.db.get_default("float_precision") + frappe.db.set_single_value("System Settings", "float_precision", 7) + + item_code = make_item( + "Test Negative Stock High Precision Item", properties={"is_stock_item": 1, "valuation_rate": 1} + ).name + dn = create_delivery_note( + item_code=item_code, + qty=0.0000010, + do_not_submit=True, + ) + + self.assertRaises(frappe.ValidationError, dn.submit) + + frappe.db.set_single_value("System Settings", "float_precision", original_flt_precision) + def create_delivery_note(**args): dn = frappe.new_doc("Delivery Note") diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index dfd516cc293..10b319325ae 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -1176,7 +1176,11 @@ class update_entries_after: diff = self.wh_data.qty_after_transaction + flt(sle.actual_qty) - flt(self.reserved_stock) diff = flt(diff, self.flt_precision) # respect system precision - if diff < 0 and abs(diff) > 0.0001: + diff_threshold = 0.0001 + if self.flt_precision > 4: + diff_threshold = 10 ** (-1 * self.flt_precision) + + if diff < 0 and abs(diff) > diff_threshold: # negative stock! exc = sle.copy().update({"diff": diff}) self.exceptions.setdefault(sle.warehouse, []).append(exc)