mirror of
https://github.com/frappe/erpnext.git
synced 2026-04-14 20:35:09 +00:00
fix: provision to recalculate the qty in the Bin
(cherry picked from commit 36081413d8)
This commit is contained in:
committed by
Mergify
parent
af35e43555
commit
5535eb4817
@@ -2,5 +2,20 @@
|
|||||||
// For license information, please see license.txt
|
// For license information, please see license.txt
|
||||||
|
|
||||||
frappe.ui.form.on("Bin", {
|
frappe.ui.form.on("Bin", {
|
||||||
refresh: function (frm) {},
|
refresh(frm) {
|
||||||
|
frm.trigger("recalculate_bin_quantity");
|
||||||
|
},
|
||||||
|
|
||||||
|
recalculate_bin_quantity(frm) {
|
||||||
|
frm.add_custom_button(__("Recalculate Bin Qty"), () => {
|
||||||
|
frappe.call({
|
||||||
|
method: "recalculate_qty",
|
||||||
|
freeze: true,
|
||||||
|
doc: frm.doc,
|
||||||
|
callback: function (r) {
|
||||||
|
frappe.show_alert(__("Bin Qty Recalculated"), 2);
|
||||||
|
},
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -35,6 +35,28 @@ class Bin(Document):
|
|||||||
warehouse: DF.Link
|
warehouse: DF.Link
|
||||||
# end: auto-generated types
|
# end: auto-generated types
|
||||||
|
|
||||||
|
@frappe.whitelist()
|
||||||
|
def recalculate_qty(self):
|
||||||
|
from erpnext.manufacturing.doctype.work_order.work_order import get_reserved_qty_for_production
|
||||||
|
from erpnext.stock.stock_balance import (
|
||||||
|
get_indented_qty,
|
||||||
|
get_ordered_qty,
|
||||||
|
get_planned_qty,
|
||||||
|
get_reserved_qty,
|
||||||
|
)
|
||||||
|
|
||||||
|
self.actual_qty = get_actual_qty(self.item_code, self.warehouse)
|
||||||
|
self.planned_qty = get_planned_qty(self.item_code, self.warehouse)
|
||||||
|
self.indented_qty = get_indented_qty(self.item_code, self.warehouse)
|
||||||
|
self.ordered_qty = get_ordered_qty(self.item_code, self.warehouse)
|
||||||
|
self.reserved_qty = get_reserved_qty(self.item_code, self.warehouse)
|
||||||
|
self.reserved_qty_for_production = get_reserved_qty_for_production(self.item_code, self.warehouse)
|
||||||
|
|
||||||
|
self.update_reserved_qty_for_sub_contracting(update_qty=False)
|
||||||
|
self.update_reserved_qty_for_production_plan(skip_project_qty_update=True, update_qty=False)
|
||||||
|
self.set_projected_qty()
|
||||||
|
self.save()
|
||||||
|
|
||||||
def before_save(self):
|
def before_save(self):
|
||||||
if self.get("__islocal") or not self.stock_uom:
|
if self.get("__islocal") or not self.stock_uom:
|
||||||
self.stock_uom = frappe.get_cached_value("Item", self.item_code, "stock_uom")
|
self.stock_uom = frappe.get_cached_value("Item", self.item_code, "stock_uom")
|
||||||
@@ -52,7 +74,7 @@ class Bin(Document):
|
|||||||
- flt(self.reserved_qty_for_production_plan)
|
- flt(self.reserved_qty_for_production_plan)
|
||||||
)
|
)
|
||||||
|
|
||||||
def update_reserved_qty_for_production_plan(self, skip_project_qty_update=False):
|
def update_reserved_qty_for_production_plan(self, skip_project_qty_update=False, update_qty=True):
|
||||||
"""Update qty reserved for production from Production Plan tables
|
"""Update qty reserved for production from Production Plan tables
|
||||||
in open production plan"""
|
in open production plan"""
|
||||||
from erpnext.manufacturing.doctype.production_plan.production_plan import (
|
from erpnext.manufacturing.doctype.production_plan.production_plan import (
|
||||||
@@ -68,11 +90,12 @@ class Bin(Document):
|
|||||||
|
|
||||||
self.reserved_qty_for_production_plan = flt(reserved_qty_for_production_plan)
|
self.reserved_qty_for_production_plan = flt(reserved_qty_for_production_plan)
|
||||||
|
|
||||||
self.db_set(
|
if update_qty:
|
||||||
"reserved_qty_for_production_plan",
|
self.db_set(
|
||||||
flt(self.reserved_qty_for_production_plan),
|
"reserved_qty_for_production_plan",
|
||||||
update_modified=True,
|
flt(self.reserved_qty_for_production_plan),
|
||||||
)
|
update_modified=True,
|
||||||
|
)
|
||||||
|
|
||||||
if not skip_project_qty_update:
|
if not skip_project_qty_update:
|
||||||
self.set_projected_qty()
|
self.set_projected_qty()
|
||||||
@@ -115,7 +138,9 @@ 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_qty_for_sub_contracting(self, subcontract_doctype="Subcontracting Order"):
|
def update_reserved_qty_for_sub_contracting(
|
||||||
|
self, subcontract_doctype="Subcontracting Order", update_qty=True
|
||||||
|
):
|
||||||
# reserved qty
|
# reserved qty
|
||||||
|
|
||||||
subcontract_order = frappe.qb.DocType(subcontract_doctype)
|
subcontract_order = frappe.qb.DocType(subcontract_doctype)
|
||||||
@@ -191,9 +216,11 @@ class Bin(Document):
|
|||||||
else:
|
else:
|
||||||
reserved_qty_for_sub_contract = 0
|
reserved_qty_for_sub_contract = 0
|
||||||
|
|
||||||
self.db_set("reserved_qty_for_sub_contract", reserved_qty_for_sub_contract, update_modified=True)
|
self.reserved_qty_for_sub_contract = reserved_qty_for_sub_contract
|
||||||
self.set_projected_qty()
|
if update_qty:
|
||||||
self.db_set("projected_qty", self.projected_qty, update_modified=True)
|
self.db_set("reserved_qty_for_sub_contract", reserved_qty_for_sub_contract, update_modified=True)
|
||||||
|
self.set_projected_qty()
|
||||||
|
self.db_set("projected_qty", self.projected_qty, update_modified=True)
|
||||||
|
|
||||||
def update_reserved_stock(self):
|
def update_reserved_stock(self):
|
||||||
"""Update `Reserved Stock` on change in Reserved Qty of Stock Reservation Entry"""
|
"""Update `Reserved Stock` on change in Reserved Qty of Stock Reservation Entry"""
|
||||||
@@ -235,27 +262,10 @@ def update_qty(bin_name, args):
|
|||||||
bin_details = get_bin_details(bin_name)
|
bin_details = get_bin_details(bin_name)
|
||||||
# actual qty is already updated by processing current voucher
|
# actual qty is already updated by processing current voucher
|
||||||
actual_qty = bin_details.actual_qty or 0.0
|
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
|
# actual qty is not up to date in case of backdated transaction
|
||||||
if future_sle_exists(args, allow_force_reposting=False):
|
if future_sle_exists(args, allow_force_reposting=False):
|
||||||
last_sle_qty = (
|
actual_qty = get_actual_qty(args.get("item_code"), args.get("warehouse"))
|
||||||
frappe.qb.from_(sle)
|
|
||||||
.select(sle.qty_after_transaction)
|
|
||||||
.where(
|
|
||||||
(sle.item_code == args.get("item_code"))
|
|
||||||
& (sle.warehouse == args.get("warehouse"))
|
|
||||||
& (sle.is_cancelled == 0)
|
|
||||||
)
|
|
||||||
.orderby(sle.posting_datetime, order=Order.desc)
|
|
||||||
.orderby(sle.creation, order=Order.desc)
|
|
||||||
.limit(1)
|
|
||||||
.run()
|
|
||||||
)
|
|
||||||
|
|
||||||
actual_qty = 0.0
|
|
||||||
if last_sle_qty:
|
|
||||||
actual_qty = last_sle_qty[0][0]
|
|
||||||
|
|
||||||
ordered_qty = flt(bin_details.ordered_qty) + flt(args.get("ordered_qty"))
|
ordered_qty = flt(bin_details.ordered_qty) + flt(args.get("ordered_qty"))
|
||||||
reserved_qty = flt(bin_details.reserved_qty) + flt(args.get("reserved_qty"))
|
reserved_qty = flt(bin_details.reserved_qty) + flt(args.get("reserved_qty"))
|
||||||
@@ -287,3 +297,23 @@ def update_qty(bin_name, args):
|
|||||||
},
|
},
|
||||||
update_modified=True,
|
update_modified=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def get_actual_qty(item_code, warehouse):
|
||||||
|
sle = frappe.qb.DocType("Stock Ledger Entry")
|
||||||
|
|
||||||
|
last_sle_qty = (
|
||||||
|
frappe.qb.from_(sle)
|
||||||
|
.select(sle.qty_after_transaction)
|
||||||
|
.where((sle.item_code == item_code) & (sle.warehouse == warehouse) & (sle.is_cancelled == 0))
|
||||||
|
.orderby(sle.posting_datetime, order=Order.desc)
|
||||||
|
.orderby(sle.creation, order=Order.desc)
|
||||||
|
.limit(1)
|
||||||
|
.run()
|
||||||
|
)
|
||||||
|
|
||||||
|
actual_qty = 0.0
|
||||||
|
if last_sle_qty:
|
||||||
|
actual_qty = last_sle_qty[0][0]
|
||||||
|
|
||||||
|
return actual_qty
|
||||||
|
|||||||
Reference in New Issue
Block a user