refactor: rewrite Procurement Tracker Report queries in QB

This commit is contained in:
Sagar Sharma 2022-10-07 18:13:33 +05:30
parent a14b9c7bac
commit e78a706994

View File

@ -127,32 +127,27 @@ def get_columns(filters):
return columns return columns
def get_conditions(filters): def apply_filters_on_query(filters, parent, child, query):
conditions = ""
if filters.get("company"): if filters.get("company"):
conditions += " AND parent.company=%s" % frappe.db.escape(filters.get("company")) query = query.where(parent.company == filters.get("company"))
if filters.get("cost_center") or filters.get("project"): if filters.get("cost_center") or filters.get("project"):
conditions += """ query = query.where(
AND (child.`cost_center`=%s OR child.`project`=%s) (child.cost_center == filters.get("cost_center")) | (child.project == filters.get("project"))
""" % (
frappe.db.escape(filters.get("cost_center")),
frappe.db.escape(filters.get("project")),
) )
if filters.get("from_date"): if filters.get("from_date"):
conditions += " AND parent.transaction_date>='%s'" % filters.get("from_date") query = query.where(parent.transaction_date >= filters.get("from_date"))
if filters.get("to_date"): if filters.get("to_date"):
conditions += " AND parent.transaction_date<='%s'" % filters.get("to_date") query = query.where(parent.transaction_date <= filters.get("to_date"))
return conditions
return query
def get_data(filters): def get_data(filters):
conditions = get_conditions(filters) purchase_order_entry = get_po_entries(filters)
purchase_order_entry = get_po_entries(conditions) mr_records, procurement_record_against_mr = get_mapped_mr_details(filters)
mr_records, procurement_record_against_mr = get_mapped_mr_details(conditions)
pr_records = get_mapped_pr_records() pr_records = get_mapped_pr_records()
pi_records = get_mapped_pi_records() pi_records = get_mapped_pi_records()
@ -187,11 +182,15 @@ def get_data(filters):
return procurement_record return procurement_record
def get_mapped_mr_details(conditions): def get_mapped_mr_details(filters):
mr_records = {} mr_records = {}
mr_details = frappe.db.sql( parent = frappe.qb.DocType("Material Request")
""" child = frappe.qb.DocType("Material Request Item")
SELECT
query = (
frappe.qb.from_(parent)
.from_(child)
.select(
parent.transaction_date, parent.transaction_date,
parent.per_ordered, parent.per_ordered,
parent.owner, parent.owner,
@ -203,18 +202,13 @@ def get_mapped_mr_details(conditions):
child.uom, child.uom,
parent.status, parent.status,
child.project, child.project,
child.cost_center child.cost_center,
FROM `tabMaterial Request` parent, `tabMaterial Request Item` child )
WHERE .where((parent.per_ordered >= 0) & (parent.name == child.parent) & (parent.docstatus == 1))
parent.per_ordered>=0 )
AND parent.name=child.parent query = apply_filters_on_query(filters, parent, child, query)
AND parent.docstatus=1
{conditions} mr_details = query.run(as_dict=True)
""".format(
conditions=conditions
),
as_dict=1,
) # nosec
procurement_record_against_mr = [] procurement_record_against_mr = []
for record in mr_details: for record in mr_details:
@ -241,46 +235,49 @@ def get_mapped_mr_details(conditions):
def get_mapped_pi_records(): def get_mapped_pi_records():
return frappe._dict( po = frappe.qb.DocType("Purchase Order")
frappe.db.sql( pi_item = frappe.qb.DocType("Purchase Invoice Item")
""" pi_records = (
SELECT frappe.qb.from_(pi_item)
pi_item.po_detail, .inner_join(po)
pi_item.base_amount .on(pi_item.purchase_order == po.name)
FROM `tabPurchase Invoice Item` as pi_item .select(pi_item.po_detail, pi_item.base_amount)
INNER JOIN `tabPurchase Order` as po .where(
ON pi_item.`purchase_order` = po.`name` (pi_item.docstatus == 1)
WHERE & (po.status.notin(("Closed", "Completed", "Cancelled")))
pi_item.docstatus = 1 & (pi_item.po_detail.isnotnull())
AND po.status not in ('Closed','Completed','Cancelled')
AND pi_item.po_detail IS NOT NULL
"""
) )
) ).run()
return frappe._dict(pi_records)
def get_mapped_pr_records(): def get_mapped_pr_records():
return frappe._dict( pr = frappe.qb.DocType("Purchase Receipt")
frappe.db.sql( pr_item = frappe.qb.DocType("Purchase Receipt Item")
""" pr_records = (
SELECT frappe.qb.from_(pr)
pr_item.purchase_order_item, .from_(pr_item)
pr.posting_date .select(pr_item.purchase_order_item, pr.posting_date)
FROM `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pr_item .where(
WHERE (pr.docstatus == 1)
pr.docstatus=1 & (pr.name == pr_item.parent)
AND pr.name=pr_item.parent & (pr_item.purchase_order_item.isnotnull())
AND pr_item.purchase_order_item IS NOT NULL & (pr.status.notin(("Closed", "Completed", "Cancelled")))
AND pr.status not in ('Closed','Completed','Cancelled')
"""
) )
) ).run()
return frappe._dict(pr_records)
def get_po_entries(conditions): def get_po_entries(filters):
return frappe.db.sql( parent = frappe.qb.DocType("Purchase Order")
""" child = frappe.qb.DocType("Purchase Order Item")
SELECT
query = (
frappe.qb.from_(parent)
.from_(child)
.select(
child.name, child.name,
child.parent, child.parent,
child.cost_center, child.cost_center,
@ -297,17 +294,15 @@ def get_po_entries(conditions):
parent.transaction_date, parent.transaction_date,
parent.supplier, parent.supplier,
parent.status, parent.status,
parent.owner parent.owner,
FROM `tabPurchase Order` parent, `tabPurchase Order Item` child )
WHERE .where(
parent.docstatus = 1 (parent.docstatus == 1)
AND parent.name = child.parent & (parent.name == child.parent)
AND parent.status not in ('Closed','Completed','Cancelled') & (parent.status.notin(("Closed", "Completed", "Cancelled")))
{conditions} )
GROUP BY .groupby(parent.name, child.item_code)
parent.name, child.item_code )
""".format( query = apply_filters_on_query(filters, parent, child, query)
conditions=conditions
), return query.run(as_dict=True)
as_dict=1,
) # nosec