feat: maintain Reserved Stock in Bin

This commit is contained in:
s-aga-r 2023-11-01 17:37:17 +05:30
parent 98d6cdd53c
commit f52916a2c3
3 changed files with 29 additions and 0 deletions

View File

@ -148,6 +148,17 @@ class Bin(Document):
self.set_projected_qty()
self.db_set("projected_qty", self.projected_qty, update_modified=True)
def update_reserved_stock(self):
"""Update `Reserved Stock` on change in Reserved Qty of Stock Reservation Entry"""
from erpnext.stock.doctype.stock_reservation_entry.stock_reservation_entry import (
get_sre_reserved_qty_for_item_and_warehouse,
)
reserved_stock = get_sre_reserved_qty_for_item_and_warehouse(self.item_code, self.warehouse)
self.db_set("reserved_stock", flt(reserved_stock), update_modified=True)
def on_doctype_update():
frappe.db.add_unique("Bin", ["item_code", "warehouse"], constraint_name="unique_item_warehouse")

View File

@ -365,6 +365,9 @@ class DeliveryNote(SellingController):
# Update Stock Reservation Entry `Status` based on `Delivered Qty`.
sre_doc.update_status()
# Update Reserved Stock in Bin.
sre_doc.update_reserved_stock_in_bin()
qty_to_deliver -= qty_can_be_deliver
if self._action == "cancel":
@ -427,6 +430,9 @@ class DeliveryNote(SellingController):
# Update Stock Reservation Entry `Status` based on `Delivered Qty`.
sre_doc.update_status()
# Update Reserved Stock in Bin.
sre_doc.update_reserved_stock_in_bin()
qty_to_undelivered -= qty_can_be_undelivered
def validate_against_stock_reservation_entries(self):

View File

@ -9,6 +9,8 @@ from frappe.model.document import Document
from frappe.query_builder.functions import Sum
from frappe.utils import cint, flt
from erpnext.stock.utils import get_or_make_bin
class StockReservationEntry(Document):
def validate(self) -> None:
@ -31,6 +33,7 @@ class StockReservationEntry(Document):
self.update_reserved_qty_in_voucher()
self.update_reserved_qty_in_pick_list()
self.update_status()
self.update_reserved_stock_in_bin()
def on_update_after_submit(self) -> None:
self.can_be_updated()
@ -40,12 +43,14 @@ class StockReservationEntry(Document):
self.validate_reservation_based_on_serial_and_batch()
self.update_reserved_qty_in_voucher()
self.update_status()
self.update_reserved_stock_in_bin()
self.reload()
def on_cancel(self) -> None:
self.update_reserved_qty_in_voucher()
self.update_reserved_qty_in_pick_list()
self.update_status()
self.update_reserved_stock_in_bin()
def validate_amended_doc(self) -> None:
"""Raises an exception if document is amended."""
@ -341,6 +346,13 @@ class StockReservationEntry(Document):
update_modified=update_modified,
)
def update_reserved_stock_in_bin(self) -> None:
"""Updates `Reserved Stock` in Bin."""
bin_name = get_or_make_bin(self.item_code, self.warehouse)
bin_doc = frappe.get_cached_doc("Bin", bin_name)
bin_doc.update_reserved_stock()
def update_status(self, status: str = None, update_modified: bool = True) -> None:
"""Updates status based on Voucher Qty, Reserved Qty and Delivered Qty."""