fix: sre status and delivered qty

This commit is contained in:
Rohit Waghchaure
2025-08-25 21:00:08 +05:30
parent fa182395f6
commit 4cac80a968
4 changed files with 26 additions and 51 deletions

View File

@@ -935,7 +935,7 @@ class SellingController(StockController):
"voucher_no": item.get(so_field), "voucher_no": item.get(so_field),
"voucher_detail_no": item.so_detail, "voucher_detail_no": item.so_detail,
"warehouse": item.warehouse, "warehouse": item.warehouse,
"status": ["in", ["Partially Delivered", "Delivered"]], "status": ["in", ["Partially Delivered", "Delivered", "Partially Used", "Closed"]],
}, },
order_by="creation", order_by="creation",
) )

View File

@@ -1342,7 +1342,7 @@ class WorkOrder(Document):
for name in names: for name in names:
doc = frappe.get_doc("Stock Reservation Entry", name) doc = frappe.get_doc("Stock Reservation Entry", name)
qty_to_update = 0.0 qty_to_update = 0.0
if transferred_qty <= 0: if transferred_qty < 0:
continue continue
if transferred_qty > flt(doc.reserved_qty - doc.consumed_qty): if transferred_qty > flt(doc.reserved_qty - doc.consumed_qty):
@@ -1352,12 +1352,16 @@ class WorkOrder(Document):
qty_to_update = transferred_qty qty_to_update = transferred_qty
transferred_qty = 0.0 transferred_qty = 0.0
if qty_to_update <= 0: if qty_to_update < 0:
continue continue
doc.db_set("transferred_qty", flt(qty_to_update), update_modified=False) doc.db_set("transferred_qty", flt(qty_to_update), update_modified=False)
if (doc.has_batch_no or doc.has_serial_no) and doc.reservation_based_on == "Serial and Batch": if (doc.has_batch_no or doc.has_serial_no) and doc.reservation_based_on == "Serial and Batch":
doc.consume_serial_batch_for_material_transfer(row_wise_serial_batch) doc.consume_serial_batch_for_material_transfer(row_wise_serial_batch)
if doc.transferred_qty >= doc.reserved_qty:
doc.db_set("status", "Closed", update_modified=False)
doc.update_status() doc.update_status()
doc.update_reserved_stock_in_bin() doc.update_reserved_stock_in_bin()
@@ -2405,7 +2409,7 @@ def get_row_wise_serial_batch(work_order, purpose=None):
row_wise_serial_batch = {} row_wise_serial_batch = {}
for entry in serial_batch_entries: for entry in serial_batch_entries:
key = (entry.item_code, entry.warehouse, entry.voucher_detail_no) key = (entry.item_code, entry.warehouse)
if key not in row_wise_serial_batch: if key not in row_wise_serial_batch:
row_wise_serial_batch[key] = frappe._dict( row_wise_serial_batch[key] = frappe._dict(
{ {

View File

@@ -172,7 +172,7 @@
"fieldtype": "Select", "fieldtype": "Select",
"label": "Status", "label": "Status",
"no_copy": 1, "no_copy": 1,
"options": "Draft\nPartially Reserved\nReserved\nPartially Delivered\nDelivered\nCancelled\nClosed", "options": "Draft\nPartially Reserved\nReserved\nPartially Delivered\nPartially Used\nDelivered\nCancelled\nClosed",
"read_only": 1 "read_only": 1
}, },
{ {
@@ -344,7 +344,7 @@
"index_web_pages_for_search": 1, "index_web_pages_for_search": 1,
"is_submittable": 1, "is_submittable": 1,
"links": [], "links": [],
"modified": "2025-06-24 00:24:40.394164", "modified": "2025-08-25 19:48:33.170835",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Stock", "module": "Stock",
"name": "Stock Reservation Entry", "name": "Stock Reservation Entry",

View File

@@ -47,6 +47,7 @@ class StockReservationEntry(Document):
"Partially Reserved", "Partially Reserved",
"Reserved", "Reserved",
"Partially Delivered", "Partially Delivered",
"Partially Used",
"Delivered", "Delivered",
"Cancelled", "Cancelled",
"Closed", "Closed",
@@ -498,7 +499,12 @@ class StockReservationEntry(Document):
if self.docstatus == 2: if self.docstatus == 2:
status = "Cancelled" status = "Cancelled"
elif self.docstatus == 1: elif self.docstatus == 1:
if self.reserved_qty == (self.delivered_qty or self.transferred_qty or self.consumed_qty): if self.transferred_qty:
status = "Closed"
if self.transferred_qty < self.reserved_qty:
status = "Partially Used"
elif self.reserved_qty == (self.delivered_qty or self.consumed_qty):
status = "Delivered" status = "Delivered"
elif self.delivered_qty and self.delivered_qty < self.reserved_qty: elif self.delivered_qty and self.delivered_qty < self.reserved_qty:
status = "Partially Delivered" status = "Partially Delivered"
@@ -610,54 +616,19 @@ class StockReservationEntry(Document):
def consume_serial_batch_for_material_transfer(self, row_wise_serial_batch): def consume_serial_batch_for_material_transfer(self, row_wise_serial_batch):
for entry in self.sb_entries: for entry in self.sb_entries:
if entry.reference_for_reservation: entry.delivered_qty = 0
entry.delete()
qty_to_consume = self.reserved_qty for entry in self.sb_entries:
for (item_code, warehouse, reference_for_reservation), data in row_wise_serial_batch.items(): for row in row_wise_serial_batch:
if item_code != self.item_code or warehouse != self.warehouse: data = row_wise_serial_batch[row]
continue
remove_serial_nos = [] if entry.serial_no in data.serial_nos:
for serial_no in data.serial_nos: entry.delivered_qty = 1
if qty_to_consume <= 0:
break
new_row = self.append( elif entry.batch_no in data.batch_nos:
"sb_entries", entry.delivered_qty = data.batch_nos[entry.batch_no]
{
"serial_no": serial_no,
"qty": -1,
"warehouse": self.warehouse,
"reference_for_reservation": reference_for_reservation,
},
)
new_row.insert() entry.db_update()
qty_to_consume -= 1
remove_serial_nos.append(serial_no)
for sn in remove_serial_nos:
data.serial_nos.remove(sn)
for batch_no, batch_qty in data.batch_nos.items():
if qty_to_consume <= 0:
break
qty = batch_qty if batch_qty <= qty_to_consume else (qty_to_consume)
new_row = self.append(
"sb_entries",
{
"batch_no": batch_no,
"qty": qty * -1,
"warehouse": self.warehouse,
"reference_for_reservation": reference_for_reservation,
},
)
new_row.insert()
qty_to_consume -= qty
data.batch_nos[batch_no] -= qty
def validate_stock_reservation_settings(voucher: object) -> None: def validate_stock_reservation_settings(voucher: object) -> None: