fix: (travis) Production Plan Summary Report breaks if no WO

- `get_cached_value` throws a DoesNotExistError if non-existent value, used `get_value` instead
- accomodate production plan items that dont have WO/PO against them as well (blank values)
- added some None value handling to avoid AttributeError
This commit is contained in:
marination 2021-11-09 23:07:28 +05:30
parent 031178224f
commit 1eb3ca2b86

View File

@ -28,8 +28,15 @@ def get_production_plan_item_details(filters, data, order_details):
production_plan_doc = frappe.get_cached_doc("Production Plan", filters.get("production_plan")) production_plan_doc = frappe.get_cached_doc("Production Plan", filters.get("production_plan"))
for row in production_plan_doc.po_items: for row in production_plan_doc.po_items:
work_order = frappe.get_cached_value("Work Order", {"production_plan_item": row.name, work_order = frappe.get_value(
"bom_no": row.bom_no, "production_item": row.item_code}, "name") "Work Order",
{
"production_plan_item": row.name,
"bom_no": row.bom_no,
"production_item": row.item_code
},
"name"
)
if row.item_code not in itemwise_indent: if row.item_code not in itemwise_indent:
itemwise_indent.setdefault(row.item_code, {}) itemwise_indent.setdefault(row.item_code, {})
@ -40,10 +47,10 @@ def get_production_plan_item_details(filters, data, order_details):
"item_name": frappe.get_cached_value("Item", row.item_code, "item_name"), "item_name": frappe.get_cached_value("Item", row.item_code, "item_name"),
"qty": row.planned_qty, "qty": row.planned_qty,
"document_type": "Work Order", "document_type": "Work Order",
"document_name": work_order, "document_name": work_order or "",
"bom_level": frappe.get_cached_value("BOM", row.bom_no, "bom_level"), "bom_level": frappe.get_cached_value("BOM", row.bom_no, "bom_level"),
"produced_qty": order_details.get((work_order, row.item_code)).get("produced_qty"), "produced_qty": order_details.get((work_order, row.item_code), {}).get("produced_qty", 0),
"pending_qty": flt(row.planned_qty) - flt(order_details.get((work_order, row.item_code)).get("produced_qty")) "pending_qty": flt(row.planned_qty) - flt(order_details.get((work_order, row.item_code), {}).get("produced_qty", 0))
}) })
get_production_plan_sub_assembly_item_details(filters, row, production_plan_doc, data, order_details) get_production_plan_sub_assembly_item_details(filters, row, production_plan_doc, data, order_details)
@ -54,11 +61,23 @@ def get_production_plan_sub_assembly_item_details(filters, row, production_plan_
subcontracted_item = (item.type_of_manufacturing == 'Subcontract') subcontracted_item = (item.type_of_manufacturing == 'Subcontract')
if subcontracted_item: if subcontracted_item:
docname = frappe.get_cached_value("Purchase Order Item", docname = frappe.get_value(
{"production_plan_sub_assembly_item": item.name, "docstatus": ("<", 2)}, "parent") "Purchase Order Item",
{
"production_plan_sub_assembly_item": item.name,
"docstatus": ("<", 2)
},
"parent"
)
else: else:
docname = frappe.get_cached_value("Work Order", docname = frappe.get_value(
{"production_plan_sub_assembly_item": item.name, "docstatus": ("<", 2)}, "name") "Work Order",
{
"production_plan_sub_assembly_item": item.name,
"docstatus": ("<", 2)
},
"name"
)
data.append({ data.append({
"indent": 1, "indent": 1,
@ -66,10 +85,10 @@ def get_production_plan_sub_assembly_item_details(filters, row, production_plan_
"item_name": item.item_name, "item_name": item.item_name,
"qty": item.qty, "qty": item.qty,
"document_type": "Work Order" if not subcontracted_item else "Purchase Order", "document_type": "Work Order" if not subcontracted_item else "Purchase Order",
"document_name": docname, "document_name": docname or "",
"bom_level": item.bom_level, "bom_level": item.bom_level,
"produced_qty": order_details.get((docname, item.production_item)).get("produced_qty"), "produced_qty": order_details.get((docname, item.production_item), {}).get("produced_qty", 0),
"pending_qty": flt(item.qty) - flt(order_details.get((docname, item.production_item)).get("produced_qty")) "pending_qty": flt(item.qty) - flt(order_details.get((docname, item.production_item), {}).get("produced_qty", 0))
}) })
def get_work_order_details(filters, order_details): def get_work_order_details(filters, order_details):