diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py index 6ea4525606f..1bfce6685bc 100644 --- a/erpnext/stock/doctype/bin/bin.py +++ b/erpnext/stock/doctype/bin/bin.py @@ -4,8 +4,8 @@ import frappe from frappe.model.document import Document -from frappe.query_builder import Case -from frappe.query_builder.functions import Coalesce, Sum +from frappe.query_builder import Case, Order +from frappe.query_builder.functions import Coalesce, CombineDatetime, Sum from frappe.utils import flt @@ -121,24 +121,23 @@ def update_qty(bin_name, args): bin_details = get_bin_details(bin_name) # actual qty is already updated by processing current voucher - actual_qty = bin_details.actual_qty + actual_qty = bin_details.actual_qty or 0.0 + sle = frappe.qb.DocType("Stock Ledger Entry") # actual qty is not up to date in case of backdated transaction if future_sle_exists(args): - actual_qty = ( - frappe.db.get_value( - "Stock Ledger Entry", - filters={ - "item_code": args.get("item_code"), - "warehouse": args.get("warehouse"), - "is_cancelled": 0, - }, - fieldname="qty_after_transaction", - order_by="posting_date desc, posting_time desc, creation desc", - ) - or 0.0 + last_sle_qty = ( + frappe.qb.from_(sle) + .select(sle.qty_after_transaction) + .where((sle.item_code == args.get("item_code")) & (sle.warehouse == args.get("warehouse"))) + .orderby(CombineDatetime(sle.posting_date, sle.posting_time), order=Order.desc) + .orderby(sle.creation, order=Order.desc) + .run() ) + if last_sle_qty: + actual_qty = last_sle_qty[0][0] + ordered_qty = flt(bin_details.ordered_qty) + flt(args.get("ordered_qty")) reserved_qty = flt(bin_details.reserved_qty) + flt(args.get("reserved_qty")) indented_qty = flt(bin_details.indented_qty) + flt(args.get("indented_qty"))