mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-28 17:34:47 +00:00
Co-authored-by: Mihir Kandoi <kandoimihir@gmail.com>
This commit is contained in:
@@ -651,20 +651,25 @@ class SubcontractingInwardController:
|
|||||||
).update_manufacturing_qty_fields()
|
).update_manufacturing_qty_fields()
|
||||||
elif self.purpose in ["Subcontracting Delivery", "Subcontracting Return"]:
|
elif self.purpose in ["Subcontracting Delivery", "Subcontracting Return"]:
|
||||||
fieldname = "delivered_qty" if self.purpose == "Subcontracting Delivery" else "returned_qty"
|
fieldname = "delivered_qty" if self.purpose == "Subcontracting Delivery" else "returned_qty"
|
||||||
|
qty_map = defaultdict(lambda: defaultdict(float))
|
||||||
for item in self.items:
|
for item in self.items:
|
||||||
doctype = (
|
doctype = (
|
||||||
"Subcontracting Inward Order Item"
|
"Subcontracting Inward Order Item"
|
||||||
if not item.type and not item.is_legacy_scrap_item
|
if not item.type and not item.is_legacy_scrap_item
|
||||||
else "Subcontracting Inward Order Secondary Item"
|
else "Subcontracting Inward Order Secondary Item"
|
||||||
)
|
)
|
||||||
frappe.db.set_value(
|
qty_map[doctype][item.scio_detail] += (
|
||||||
doctype,
|
item.transfer_qty if self._action == "submit" else -item.transfer_qty
|
||||||
item.scio_detail,
|
|
||||||
fieldname,
|
|
||||||
frappe.get_value(doctype, item.scio_detail, fieldname)
|
|
||||||
+ (item.transfer_qty if self._action == "submit" else -item.transfer_qty),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
for doctype, item_qty_map in qty_map.items():
|
||||||
|
table = frappe.qb.DocType(doctype)
|
||||||
|
field = table[fieldname]
|
||||||
|
doc_updates = {
|
||||||
|
scio_detail: {fieldname: field + qty} for scio_detail, qty in item_qty_map.items()
|
||||||
|
}
|
||||||
|
frappe.db.bulk_update(doctype, doc_updates, chunk_size=len(doc_updates))
|
||||||
|
|
||||||
def update_inward_order_received_items(self):
|
def update_inward_order_received_items(self):
|
||||||
if self.subcontracting_inward_order:
|
if self.subcontracting_inward_order:
|
||||||
match self.purpose:
|
match self.purpose:
|
||||||
@@ -679,14 +684,18 @@ class SubcontractingInwardController:
|
|||||||
else -item.transfer_qty
|
else -item.transfer_qty
|
||||||
for item in self.items
|
for item in self.items
|
||||||
}
|
}
|
||||||
case_expr = Case()
|
|
||||||
table = frappe.qb.DocType("Subcontracting Inward Order Received Item")
|
table = frappe.qb.DocType("Subcontracting Inward Order Received Item")
|
||||||
for scio_rm_name, qty in scio_rm_names.items():
|
doc_updates = {
|
||||||
case_expr = case_expr.when(table.name == scio_rm_name, table.returned_qty + qty)
|
scio_rm_name: {"returned_qty": table.returned_qty + qty}
|
||||||
|
for scio_rm_name, qty in scio_rm_names.items()
|
||||||
frappe.qb.update(table).set(table.returned_qty, case_expr).where(
|
}
|
||||||
(table.name.isin(list(scio_rm_names.keys()))) & (table.docstatus == 1)
|
if doc_updates:
|
||||||
).run()
|
frappe.db.bulk_update(
|
||||||
|
"Subcontracting Inward Order Received Item",
|
||||||
|
doc_updates,
|
||||||
|
chunk_size=len(doc_updates),
|
||||||
|
update_modified=False,
|
||||||
|
)
|
||||||
|
|
||||||
def update_inward_order_received_items_for_raw_materials_receipt(self):
|
def update_inward_order_received_items_for_raw_materials_receipt(self):
|
||||||
data = frappe._dict()
|
data = frappe._dict()
|
||||||
@@ -737,9 +746,7 @@ class SubcontractingInwardController:
|
|||||||
fields=["rate", "name", "required_qty", "received_qty"],
|
fields=["rate", "name", "required_qty", "received_qty"],
|
||||||
)
|
)
|
||||||
|
|
||||||
deleted_docs = []
|
doc_updates = {}
|
||||||
table = frappe.qb.DocType("Subcontracting Inward Order Received Item")
|
|
||||||
case_expr_qty, case_expr_rate = Case(), Case()
|
|
||||||
for d in result:
|
for d in result:
|
||||||
current_qty = flt(data[d.name].transfer_qty) * (1 if self._action == "submit" else -1)
|
current_qty = flt(data[d.name].transfer_qty) * (1 if self._action == "submit" else -1)
|
||||||
current_rate = flt(data[d.name].rate)
|
current_rate = flt(data[d.name].rate)
|
||||||
@@ -754,16 +761,17 @@ class SubcontractingInwardController:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if not d.required_qty and not d.received_qty:
|
if not d.required_qty and not d.received_qty:
|
||||||
deleted_docs.append(d.name)
|
|
||||||
frappe.delete_doc("Subcontracting Inward Order Received Item", d.name)
|
frappe.delete_doc("Subcontracting Inward Order Received Item", d.name)
|
||||||
else:
|
else:
|
||||||
case_expr_qty = case_expr_qty.when(table.name == d.name, d.received_qty)
|
doc_updates[d.name] = {"received_qty": d.received_qty, "rate": d.rate}
|
||||||
case_expr_rate = case_expr_rate.when(table.name == d.name, d.rate)
|
|
||||||
|
|
||||||
if final_list := list(set(data.keys()) - set(deleted_docs)):
|
if doc_updates:
|
||||||
frappe.qb.update(table).set(table.received_qty, case_expr_qty).set(
|
frappe.db.bulk_update(
|
||||||
table.rate, case_expr_rate
|
"Subcontracting Inward Order Received Item",
|
||||||
).where((table.name.isin(final_list)) & (table.docstatus == 1)).run()
|
doc_updates,
|
||||||
|
chunk_size=len(doc_updates),
|
||||||
|
update_modified=False,
|
||||||
|
)
|
||||||
|
|
||||||
def update_inward_order_received_items_for_manufacture(self):
|
def update_inward_order_received_items_for_manufacture(self):
|
||||||
customer_warehouse = frappe.get_cached_value(
|
customer_warehouse = frappe.get_cached_value(
|
||||||
@@ -815,8 +823,8 @@ class SubcontractingInwardController:
|
|||||||
)
|
)
|
||||||
|
|
||||||
if data := data.run(as_dict=True):
|
if data := data.run(as_dict=True):
|
||||||
deleted_docs, used_item_wh = [], []
|
used_item_wh = []
|
||||||
case_expr = Case()
|
doc_updates = {}
|
||||||
for d in data:
|
for d in data:
|
||||||
if not d.warehouse:
|
if not d.warehouse:
|
||||||
d.warehouse = next(
|
d.warehouse = next(
|
||||||
@@ -828,15 +836,17 @@ class SubcontractingInwardController:
|
|||||||
|
|
||||||
qty = d.consumed_qty + item_code_wh[(d.rm_item_code, d.warehouse)]
|
qty = d.consumed_qty + item_code_wh[(d.rm_item_code, d.warehouse)]
|
||||||
if qty or d.is_customer_provided_item or not d.is_additional_item:
|
if qty or d.is_customer_provided_item or not d.is_additional_item:
|
||||||
case_expr = case_expr.when((table.name == d.name), qty)
|
doc_updates[d.name] = {"consumed_qty": qty}
|
||||||
else:
|
else:
|
||||||
deleted_docs.append(d.name)
|
|
||||||
frappe.delete_doc("Subcontracting Inward Order Received Item", d.name)
|
frappe.delete_doc("Subcontracting Inward Order Received Item", d.name)
|
||||||
|
|
||||||
if final_list := list(set([d.name for d in data]) - set(deleted_docs)):
|
if doc_updates:
|
||||||
frappe.qb.update(table).set(table.consumed_qty, case_expr).where(
|
frappe.db.bulk_update(
|
||||||
(table.name.isin(final_list)) & (table.docstatus == 1)
|
"Subcontracting Inward Order Received Item",
|
||||||
).run()
|
doc_updates,
|
||||||
|
chunk_size=len(doc_updates),
|
||||||
|
update_modified=False,
|
||||||
|
)
|
||||||
|
|
||||||
main_item_code = next(fg for fg in self.items if fg.is_finished_item).item_code
|
main_item_code = next(fg for fg in self.items if fg.is_finished_item).item_code
|
||||||
for extra_item in [
|
for extra_item in [
|
||||||
@@ -908,27 +918,25 @@ class SubcontractingInwardController:
|
|||||||
for d in result
|
for d in result
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
deleted_docs = []
|
doc_updates = {}
|
||||||
case_expr = Case()
|
|
||||||
table = frappe.qb.DocType("Subcontracting Inward Order Secondary Item")
|
|
||||||
for key, value in secondary_items_dict.items():
|
for key, value in secondary_items_dict.items():
|
||||||
if (
|
if (
|
||||||
self._action == "cancel"
|
self._action == "cancel"
|
||||||
and value.produced_qty - abs(secondary_items.get(key)) == 0
|
and value.produced_qty - abs(secondary_items.get(key)) == 0
|
||||||
):
|
):
|
||||||
deleted_docs.append(value.name)
|
|
||||||
frappe.delete_doc("Subcontracting Inward Order Secondary Item", value.name)
|
frappe.delete_doc("Subcontracting Inward Order Secondary Item", value.name)
|
||||||
else:
|
else:
|
||||||
case_expr = case_expr.when(
|
doc_updates[value.name] = {
|
||||||
table.name == value.name, value.produced_qty + secondary_items.get(key)
|
"produced_qty": value.produced_qty + secondary_items.get(key)
|
||||||
)
|
}
|
||||||
|
|
||||||
if final_list := list(
|
if doc_updates:
|
||||||
set([v.name for v in secondary_items_dict.values()]) - set(deleted_docs)
|
frappe.db.bulk_update(
|
||||||
):
|
"Subcontracting Inward Order Secondary Item",
|
||||||
frappe.qb.update(table).set(table.produced_qty, case_expr).where(
|
doc_updates,
|
||||||
(table.name.isin(final_list)) & (table.docstatus == 1)
|
chunk_size=len(doc_updates),
|
||||||
).run()
|
update_modified=False,
|
||||||
|
)
|
||||||
|
|
||||||
fg_item_code = next(fg for fg in self.items if fg.is_finished_item).item_code
|
fg_item_code = next(fg for fg in self.items if fg.is_finished_item).item_code
|
||||||
for secondary_item in [
|
for secondary_item in [
|
||||||
|
|||||||
Reference in New Issue
Block a user