fix: consider received qty while creating SO -> MR
(cherry picked from commit b2cee396ac)
Co-authored-by: s-aga-r <sagarsharma.s312@gmail.com>
This commit is contained in:
@@ -542,29 +542,37 @@ def close_or_unclose_sales_orders(names, status):
|
|||||||
|
|
||||||
|
|
||||||
def get_requested_item_qty(sales_order):
|
def get_requested_item_qty(sales_order):
|
||||||
return frappe._dict(
|
result = {}
|
||||||
frappe.db.sql(
|
for d in frappe.db.get_all(
|
||||||
"""
|
"Material Request Item",
|
||||||
select sales_order_item, sum(qty)
|
filters={"docstatus": 1, "sales_order": sales_order},
|
||||||
from `tabMaterial Request Item`
|
fields=["sales_order_item", "sum(qty) as qty", "sum(received_qty) as received_qty"],
|
||||||
where docstatus = 1
|
group_by="sales_order_item",
|
||||||
and sales_order = %s
|
):
|
||||||
group by sales_order_item
|
result[d.sales_order_item] = frappe._dict({"qty": d.qty, "received_qty": d.received_qty})
|
||||||
""",
|
|
||||||
sales_order,
|
return result
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def make_material_request(source_name, target_doc=None):
|
def make_material_request(source_name, target_doc=None):
|
||||||
requested_item_qty = get_requested_item_qty(source_name)
|
requested_item_qty = get_requested_item_qty(source_name)
|
||||||
|
|
||||||
|
def get_remaining_qty(so_item):
|
||||||
|
return flt(
|
||||||
|
flt(so_item.qty)
|
||||||
|
- flt(requested_item_qty.get(so_item.name, {}).get("qty"))
|
||||||
|
- max(
|
||||||
|
flt(so_item.get("delivered_qty"))
|
||||||
|
- flt(requested_item_qty.get(so_item.name, {}).get("received_qty")),
|
||||||
|
0,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
def update_item(source, target, source_parent):
|
def update_item(source, target, source_parent):
|
||||||
# qty is for packed items, because packed items don't have stock_qty field
|
# qty is for packed items, because packed items don't have stock_qty field
|
||||||
qty = source.get("qty")
|
|
||||||
target.project = source_parent.project
|
target.project = source_parent.project
|
||||||
target.qty = qty - requested_item_qty.get(source.name, 0) - flt(source.get("delivered_qty"))
|
target.qty = get_remaining_qty(source)
|
||||||
target.stock_qty = flt(target.qty) * flt(target.conversion_factor)
|
target.stock_qty = flt(target.qty) * flt(target.conversion_factor)
|
||||||
|
|
||||||
args = target.as_dict().copy()
|
args = target.as_dict().copy()
|
||||||
@@ -597,8 +605,8 @@ def make_material_request(source_name, target_doc=None):
|
|||||||
"Sales Order Item": {
|
"Sales Order Item": {
|
||||||
"doctype": "Material Request Item",
|
"doctype": "Material Request Item",
|
||||||
"field_map": {"name": "sales_order_item", "parent": "sales_order"},
|
"field_map": {"name": "sales_order_item", "parent": "sales_order"},
|
||||||
"condition": lambda doc: not frappe.db.exists("Product Bundle", doc.item_code)
|
"condition": lambda item: not frappe.db.exists("Product Bundle", item.item_code)
|
||||||
and (doc.stock_qty - flt(doc.get("delivered_qty"))) > requested_item_qty.get(doc.name, 0),
|
and get_remaining_qty(item) > 0,
|
||||||
"postprocess": update_item,
|
"postprocess": update_item,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user