mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-13 10:11:20 +00:00
fix: sre status and delivered qty
This commit is contained in:
@@ -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",
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user