From 1bbeecff12ee22efccf0c1e8583d52aecd78bbb7 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 (cherry picked from commit 87be020c783f99f21dbbdcb653f538b97431ebdd) # Conflicts: # erpnext/stock/doctype/delivery_note/test_delivery_note.py --- .../delivery_note/test_delivery_note.py | 19 +++++++++++++++++++ erpnext/stock/stock_ledger.py | 6 +++++- 2 files changed, 24 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 5e28362c509..933b39989fc 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -2721,6 +2721,7 @@ class TestDeliveryNote(FrappeTestCase): serial_batch_map[row.item_code].batch_no_valuation[entry.batch_no], ) +<<<<<<< HEAD @change_settings("Stock Settings", {"allow_negative_stock": 0, "enable_stock_reservation": 1}) def test_partial_delivery_note_against_reserved_stock(self): from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import ( @@ -2789,6 +2790,24 @@ class TestDeliveryNote(FrappeTestCase): self.assertEqual(sre_details[0].status, "Partially Delivered") self.assertEqual(sre_details[0].reserved_qty, so.items[0].qty) self.assertEqual(sre_details[0].delivered_qty, dn.items[0].qty) +======= + 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) +>>>>>>> 87be020c78 (fix: negative stock issue for higher precision) def create_delivery_note(**args): diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index 0040aec77dc..55e30258044 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -1170,7 +1170,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)