mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-31 10:49:09 +00:00
feat: maintain Reserved Stock in Bin
This commit is contained in:
@@ -148,6 +148,17 @@ class Bin(Document):
|
|||||||
self.set_projected_qty()
|
self.set_projected_qty()
|
||||||
self.db_set("projected_qty", self.projected_qty, update_modified=True)
|
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():
|
def on_doctype_update():
|
||||||
frappe.db.add_unique("Bin", ["item_code", "warehouse"], constraint_name="unique_item_warehouse")
|
frappe.db.add_unique("Bin", ["item_code", "warehouse"], constraint_name="unique_item_warehouse")
|
||||||
|
|||||||
@@ -365,6 +365,9 @@ class DeliveryNote(SellingController):
|
|||||||
# Update Stock Reservation Entry `Status` based on `Delivered Qty`.
|
# Update Stock Reservation Entry `Status` based on `Delivered Qty`.
|
||||||
sre_doc.update_status()
|
sre_doc.update_status()
|
||||||
|
|
||||||
|
# Update Reserved Stock in Bin.
|
||||||
|
sre_doc.update_reserved_stock_in_bin()
|
||||||
|
|
||||||
qty_to_deliver -= qty_can_be_deliver
|
qty_to_deliver -= qty_can_be_deliver
|
||||||
|
|
||||||
if self._action == "cancel":
|
if self._action == "cancel":
|
||||||
@@ -427,6 +430,9 @@ class DeliveryNote(SellingController):
|
|||||||
# Update Stock Reservation Entry `Status` based on `Delivered Qty`.
|
# Update Stock Reservation Entry `Status` based on `Delivered Qty`.
|
||||||
sre_doc.update_status()
|
sre_doc.update_status()
|
||||||
|
|
||||||
|
# Update Reserved Stock in Bin.
|
||||||
|
sre_doc.update_reserved_stock_in_bin()
|
||||||
|
|
||||||
qty_to_undelivered -= qty_can_be_undelivered
|
qty_to_undelivered -= qty_can_be_undelivered
|
||||||
|
|
||||||
def validate_against_stock_reservation_entries(self):
|
def validate_against_stock_reservation_entries(self):
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ from frappe.model.document import Document
|
|||||||
from frappe.query_builder.functions import Sum
|
from frappe.query_builder.functions import Sum
|
||||||
from frappe.utils import cint, flt
|
from frappe.utils import cint, flt
|
||||||
|
|
||||||
|
from erpnext.stock.utils import get_or_make_bin
|
||||||
|
|
||||||
|
|
||||||
class StockReservationEntry(Document):
|
class StockReservationEntry(Document):
|
||||||
def validate(self) -> None:
|
def validate(self) -> None:
|
||||||
@@ -31,6 +33,7 @@ class StockReservationEntry(Document):
|
|||||||
self.update_reserved_qty_in_voucher()
|
self.update_reserved_qty_in_voucher()
|
||||||
self.update_reserved_qty_in_pick_list()
|
self.update_reserved_qty_in_pick_list()
|
||||||
self.update_status()
|
self.update_status()
|
||||||
|
self.update_reserved_stock_in_bin()
|
||||||
|
|
||||||
def on_update_after_submit(self) -> None:
|
def on_update_after_submit(self) -> None:
|
||||||
self.can_be_updated()
|
self.can_be_updated()
|
||||||
@@ -40,12 +43,14 @@ class StockReservationEntry(Document):
|
|||||||
self.validate_reservation_based_on_serial_and_batch()
|
self.validate_reservation_based_on_serial_and_batch()
|
||||||
self.update_reserved_qty_in_voucher()
|
self.update_reserved_qty_in_voucher()
|
||||||
self.update_status()
|
self.update_status()
|
||||||
|
self.update_reserved_stock_in_bin()
|
||||||
self.reload()
|
self.reload()
|
||||||
|
|
||||||
def on_cancel(self) -> None:
|
def on_cancel(self) -> None:
|
||||||
self.update_reserved_qty_in_voucher()
|
self.update_reserved_qty_in_voucher()
|
||||||
self.update_reserved_qty_in_pick_list()
|
self.update_reserved_qty_in_pick_list()
|
||||||
self.update_status()
|
self.update_status()
|
||||||
|
self.update_reserved_stock_in_bin()
|
||||||
|
|
||||||
def validate_amended_doc(self) -> None:
|
def validate_amended_doc(self) -> None:
|
||||||
"""Raises an exception if document is amended."""
|
"""Raises an exception if document is amended."""
|
||||||
@@ -341,6 +346,13 @@ class StockReservationEntry(Document):
|
|||||||
update_modified=update_modified,
|
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:
|
def update_status(self, status: str = None, update_modified: bool = True) -> None:
|
||||||
"""Updates status based on Voucher Qty, Reserved Qty and Delivered Qty."""
|
"""Updates status based on Voucher Qty, Reserved Qty and Delivered Qty."""
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user