From fc5b58e20d6f071dbe41f6ad10657a6870d4c087 Mon Sep 17 00:00:00 2001 From: Sydney Kibanga Date: Wed, 3 Jun 2026 16:01:15 +0300 Subject: [PATCH] feat: add validation to prevent weighing ticket quantity from exceeding remaining reference document quantity --- .../weighbridge_ticket/weighbridge_ticket.py | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/av_tools/weigh_bridge/doctype/weighbridge_ticket/weighbridge_ticket.py b/av_tools/weigh_bridge/doctype/weighbridge_ticket/weighbridge_ticket.py index 9ee8a93..3f3f752 100644 --- a/av_tools/weigh_bridge/doctype/weighbridge_ticket/weighbridge_ticket.py +++ b/av_tools/weigh_bridge/doctype/weighbridge_ticket/weighbridge_ticket.py @@ -83,6 +83,39 @@ def validate_items_against_reference(self): f"Items not found in {self.document_type} {self.document_reference}: {', '.join(extra_items)}" ) + other_tickets = frappe.get_all( + "Weighbridge Ticket", + filters={ + "document_type": self.document_type, + "document_reference": self.document_reference, + "name": ["!=", self.name], + "docstatus": 1 + }, + pluck="name" + ) + + consumed_qty = {} + if other_tickets: + other_items = frappe.get_all( + "Weighbridge Ticket Item", + filters={"parent": ["in", other_tickets]}, + fields=["item_code", "qty"] + ) + for row in other_items: + consumed_qty[row.item_code] = consumed_qty.get(row.item_code, 0) + flt(row.qty) + + for item_code, qty in ticket_qty.items(): + ref_qty = reference_qty.get(item_code, 0) + cons_qty = consumed_qty.get(item_code, 0) + available = ref_qty - cons_qty + + if flt(qty) > available: + frappe.msgprint( + f"Quantity {flt(qty)} exceeds remaining available quantity {available} on {self.document_type}.", + indicator="orange", + alert=True + ) + def update_reference_document_quantities(self): if not self.document_type or not self.document_reference: return