diff --git a/erpnext/stock/stock_ledger.py b/erpnext/stock/stock_ledger.py index e2a47c84fe5..0e0b9db9c88 100644 --- a/erpnext/stock/stock_ledger.py +++ b/erpnext/stock/stock_ledger.py @@ -6,7 +6,7 @@ import gzip import json import frappe -from frappe import _, scrub +from frappe import _, bold, scrub from frappe.model.meta import get_field_precision from frappe.query_builder.functions import Sum from frappe.utils import ( @@ -14,6 +14,7 @@ from frappe.utils import ( cint, cstr, flt, + format_date, get_link_to_form, getdate, now, @@ -746,9 +747,29 @@ class update_entries_after: return self.distinct_item_warehouses[key].dependent_voucher_detail_nos + def validate_previous_sle_qty(self, sle): + previous_sle = self.data[sle.warehouse].previous_sle + if previous_sle and previous_sle.get("qty_after_transaction") < 0 and sle.get("actual_qty") > 0: + frappe.msgprint( + _( + "The stock for the item {0} in the {1} warehouse was negative on the {2}. You should create a positive entry {3} before the date {4} and time {5} to post the correct valuation rate. For more details, please read the documentation." + ).format( + bold(sle.item_code), + bold(sle.warehouse), + bold(format_date(previous_sle.posting_date)), + sle.voucher_no, + bold(format_date(previous_sle.posting_date)), + bold(previous_sle.posting_time), + ), + title=_("Warning on Negative Stock"), + indicator="blue", + ) + def process_sle(self, sle): # previous sle data for this warehouse self.wh_data = self.data[sle.warehouse] + + self.validate_previous_sle_qty(sle) self.affected_transactions.add((sle.voucher_type, sle.voucher_no)) if (sle.serial_no and not self.via_landed_cost_voucher) or not cint(self.allow_negative_stock):