diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.js b/erpnext/buying/report/procurement_tracker/procurement_tracker.js index 7096b9f9f8c..0013666ce89 100644 --- a/erpnext/buying/report/procurement_tracker/procurement_tracker.js +++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.js @@ -4,6 +4,27 @@ frappe.query_reports["Procurement Tracker"] = { "filters": [ - + { + fieldname: "company", + label: __("Company"), + fieldtype: "Link", + options: "Company", + default: frappe.defaults.get_user_default("Company"), + reqd: 1 + }, + { + fieldname: "cost_center", + label: __("Cost Center"), + fieldtype: "Link", + options: "Cost Center", + reqd: 1 + }, + { + fieldname: "project", + label: __("Project"), + fieldtype: "Link", + options: "Project", + reqd: 1 + } ] } diff --git a/erpnext/buying/report/procurement_tracker/procurement_tracker.py b/erpnext/buying/report/procurement_tracker/procurement_tracker.py index 18a66605341..e3361a4c3f5 100644 --- a/erpnext/buying/report/procurement_tracker/procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/procurement_tracker.py @@ -6,11 +6,11 @@ import frappe from frappe import _ def execute(filters=None): - columns = get_columns() - data = get_data() + columns = get_columns(filters) + data = get_data(filters) return columns, data -def get_columns(): +def get_columns(filters): columns = [ { "label": _("Material Request Date"), @@ -144,9 +144,22 @@ def get_columns(): ] return columns -def get_data(): - purchase_order_entry = get_po_entries() - mr_records, procurement_record_against_mr = get_mapped_mr_details() +def get_conditions(filters): + conditions = "" + + if filters.get("company"): + conditions += " AND company='%s'"% filters.get('company') + if filters.get("cost_center") or filters.get("project"): + conditions += """ + AND (cost_center='%s' + OR project='%s') + """% (filters.get('cost_center'), filters.get('project')) + return conditions + +def get_data(filters): + conditions = get_conditions(filters) + purchase_order_entry = get_po_entries(conditions) + mr_records, procurement_record_against_mr = get_mapped_mr_details(conditions) pr_records = get_mapped_pr_records() pi_records = get_mapped_pi_records() @@ -157,7 +170,7 @@ def get_data(): # fetch material records linked to the purchase order item mr_record = mr_records.get(po.material_request_item, [{}])[0] procurement_detail = { - "material_request_date": mr_record.get('transaction_date', ''), + "material_request_date": mr_record.get('transaction_date'), "cost_center": po.cost_center, "project": po.project, "requesting_site": po.warehouse, @@ -180,7 +193,7 @@ def get_data(): procurement_record.append(procurement_detail) return procurement_record -def get_mapped_mr_details(): +def get_mapped_mr_details(conditions): mr_records = {} mr_details = frappe.db.sql(""" SELECT @@ -194,7 +207,8 @@ def get_mapped_mr_details(): mr.per_ordered>=0 AND mr.name=mr_item.parent AND mr.docstatus=1 - """, as_dict=1) + {conditions} + """.format(conditions=conditions), as_dict=1) #nosec procurement_record_against_mr = [] for record in mr_details: @@ -232,7 +246,7 @@ def get_mapped_pr_records(): AND pr_item.purchase_order_item IS NOT NULL """)) -def get_po_entries(): +def get_po_entries(conditions): return frappe.db.sql(""" SELECT po_item.name, @@ -257,6 +271,7 @@ def get_po_entries(): po.docstatus = 1 AND po.name = po_item.parent AND po.status not in ("Closed","Completed","Cancelled") + {conditions} GROUP BY po.name,po_item.item_code - """, as_dict=1) \ No newline at end of file + """.format(conditions=conditions), as_dict=1) #nosec \ No newline at end of file diff --git a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py index 7d8e750c4bc..418396fb92f 100644 --- a/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py +++ b/erpnext/buying/report/procurement_tracker/test_procurement_tracker.py @@ -8,12 +8,33 @@ import frappe from erpnext.buying.report.procurement_tracker.procurement_tracker import execute from erpnext.stock.doctype.material_request.test_material_request import make_material_request from erpnext.stock.doctype.material_request.material_request import make_purchase_order -from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt, make_purchase_invoice +from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt +from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse class TestProcurementTracker(unittest.TestCase): maxDiff = None def test_result_for_procurement_tracker(self): - mr = make_material_request() + filters = { + 'company': '_Test Procurement Company', + 'cost_center': '_Test Cost Center - _TC' + } + expected_data = self.generate_expected_data() + report = execute(filters) + + length = len(report[1]) + self.assertEqual(expected_data, report[1][length-1]) + + def generate_expected_data(self): + if not frappe.db.exists("Company", "_Test Procurement Company"): + frappe.get_doc(dict( + doctype="Company", + company_name="_Test Procurement Company", + abbr="_TPC", + default_currency="INR", + country="India" + )).insert() + warehouse = create_warehouse("_Test Procurement Warehouse", company="_Test Procurement Company") + mr = make_material_request(company="_Test Procurement Company", warehouse=warehouse) po = make_purchase_order(mr.name) po.supplier = "_Test Supplier" po.get("items")[0].cost_center = "_Test Cost Center - _TC" @@ -23,12 +44,11 @@ class TestProcurementTracker(unittest.TestCase): frappe.db.commit() date_obj = datetime.date(datetime.now()) - report = execute() expected_data = { "material_request_date": date_obj, "cost_center": "_Test Cost Center - _TC", "project": None, - "requesting_site": "_Test Warehouse - _TC", + "requesting_site": "_Test Procurement Warehouse - _TPC", "requestor": "Administrator", "material_request_no": mr.name, "description": '_Test Item 1', @@ -45,5 +65,4 @@ class TestProcurementTracker(unittest.TestCase): "expected_delivery_date": date_obj, "actual_delivery_date": date_obj } - length = len(report[1]) - self.assertEqual(expected_data, report[1][length-1]) \ No newline at end of file + return expected_data \ No newline at end of file diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index 7dc54d0e332..79cdc1ad18a 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -629,7 +629,8 @@ def make_material_request(**args): "item_code": args.item_code or "_Test Item", "qty": args.qty or 10, "schedule_date": args.schedule_date or today(), - "warehouse": args.warehouse or "_Test Warehouse - _TC" + "warehouse": args.warehouse or "_Test Warehouse - _TC", + "cost_center": args.cost_center or "_Test Cost Center - _TC" }) mr.insert() if not args.do_not_submit: