feat: add filters for multiple company operation
This commit is contained in:
parent
9cd9671bb5
commit
96661ba847
@ -4,6 +4,27 @@
|
|||||||
|
|
||||||
frappe.query_reports["Procurement Tracker"] = {
|
frappe.query_reports["Procurement Tracker"] = {
|
||||||
"filters": [
|
"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
|
||||||
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,11 +6,11 @@ import frappe
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
|
|
||||||
def execute(filters=None):
|
def execute(filters=None):
|
||||||
columns = get_columns()
|
columns = get_columns(filters)
|
||||||
data = get_data()
|
data = get_data(filters)
|
||||||
return columns, data
|
return columns, data
|
||||||
|
|
||||||
def get_columns():
|
def get_columns(filters):
|
||||||
columns = [
|
columns = [
|
||||||
{
|
{
|
||||||
"label": _("Material Request Date"),
|
"label": _("Material Request Date"),
|
||||||
@ -144,9 +144,22 @@ def get_columns():
|
|||||||
]
|
]
|
||||||
return columns
|
return columns
|
||||||
|
|
||||||
def get_data():
|
def get_conditions(filters):
|
||||||
purchase_order_entry = get_po_entries()
|
conditions = ""
|
||||||
mr_records, procurement_record_against_mr = get_mapped_mr_details()
|
|
||||||
|
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()
|
pr_records = get_mapped_pr_records()
|
||||||
pi_records = get_mapped_pi_records()
|
pi_records = get_mapped_pi_records()
|
||||||
|
|
||||||
@ -157,7 +170,7 @@ def get_data():
|
|||||||
# fetch material records linked to the purchase order item
|
# fetch material records linked to the purchase order item
|
||||||
mr_record = mr_records.get(po.material_request_item, [{}])[0]
|
mr_record = mr_records.get(po.material_request_item, [{}])[0]
|
||||||
procurement_detail = {
|
procurement_detail = {
|
||||||
"material_request_date": mr_record.get('transaction_date', ''),
|
"material_request_date": mr_record.get('transaction_date'),
|
||||||
"cost_center": po.cost_center,
|
"cost_center": po.cost_center,
|
||||||
"project": po.project,
|
"project": po.project,
|
||||||
"requesting_site": po.warehouse,
|
"requesting_site": po.warehouse,
|
||||||
@ -180,7 +193,7 @@ def get_data():
|
|||||||
procurement_record.append(procurement_detail)
|
procurement_record.append(procurement_detail)
|
||||||
return procurement_record
|
return procurement_record
|
||||||
|
|
||||||
def get_mapped_mr_details():
|
def get_mapped_mr_details(conditions):
|
||||||
mr_records = {}
|
mr_records = {}
|
||||||
mr_details = frappe.db.sql("""
|
mr_details = frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
@ -194,7 +207,8 @@ def get_mapped_mr_details():
|
|||||||
mr.per_ordered>=0
|
mr.per_ordered>=0
|
||||||
AND mr.name=mr_item.parent
|
AND mr.name=mr_item.parent
|
||||||
AND mr.docstatus=1
|
AND mr.docstatus=1
|
||||||
""", as_dict=1)
|
{conditions}
|
||||||
|
""".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:
|
||||||
@ -232,7 +246,7 @@ def get_mapped_pr_records():
|
|||||||
AND pr_item.purchase_order_item IS NOT NULL
|
AND pr_item.purchase_order_item IS NOT NULL
|
||||||
"""))
|
"""))
|
||||||
|
|
||||||
def get_po_entries():
|
def get_po_entries(conditions):
|
||||||
return frappe.db.sql("""
|
return frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
po_item.name,
|
po_item.name,
|
||||||
@ -257,6 +271,7 @@ def get_po_entries():
|
|||||||
po.docstatus = 1
|
po.docstatus = 1
|
||||||
AND po.name = po_item.parent
|
AND po.name = po_item.parent
|
||||||
AND po.status not in ("Closed","Completed","Cancelled")
|
AND po.status not in ("Closed","Completed","Cancelled")
|
||||||
|
{conditions}
|
||||||
GROUP BY
|
GROUP BY
|
||||||
po.name,po_item.item_code
|
po.name,po_item.item_code
|
||||||
""", as_dict=1)
|
""".format(conditions=conditions), as_dict=1) #nosec
|
||||||
@ -8,12 +8,33 @@ import frappe
|
|||||||
from erpnext.buying.report.procurement_tracker.procurement_tracker import execute
|
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.test_material_request import make_material_request
|
||||||
from erpnext.stock.doctype.material_request.material_request import make_purchase_order
|
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):
|
class TestProcurementTracker(unittest.TestCase):
|
||||||
maxDiff = None
|
maxDiff = None
|
||||||
def test_result_for_procurement_tracker(self):
|
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 = make_purchase_order(mr.name)
|
||||||
po.supplier = "_Test Supplier"
|
po.supplier = "_Test Supplier"
|
||||||
po.get("items")[0].cost_center = "_Test Cost Center - _TC"
|
po.get("items")[0].cost_center = "_Test Cost Center - _TC"
|
||||||
@ -23,12 +44,11 @@ class TestProcurementTracker(unittest.TestCase):
|
|||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
date_obj = datetime.date(datetime.now())
|
date_obj = datetime.date(datetime.now())
|
||||||
|
|
||||||
report = execute()
|
|
||||||
expected_data = {
|
expected_data = {
|
||||||
"material_request_date": date_obj,
|
"material_request_date": date_obj,
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
"project": None,
|
"project": None,
|
||||||
"requesting_site": "_Test Warehouse - _TC",
|
"requesting_site": "_Test Procurement Warehouse - _TPC",
|
||||||
"requestor": "Administrator",
|
"requestor": "Administrator",
|
||||||
"material_request_no": mr.name,
|
"material_request_no": mr.name,
|
||||||
"description": '_Test Item 1',
|
"description": '_Test Item 1',
|
||||||
@ -45,5 +65,4 @@ class TestProcurementTracker(unittest.TestCase):
|
|||||||
"expected_delivery_date": date_obj,
|
"expected_delivery_date": date_obj,
|
||||||
"actual_delivery_date": date_obj
|
"actual_delivery_date": date_obj
|
||||||
}
|
}
|
||||||
length = len(report[1])
|
return expected_data
|
||||||
self.assertEqual(expected_data, report[1][length-1])
|
|
||||||
@ -629,7 +629,8 @@ def make_material_request(**args):
|
|||||||
"item_code": args.item_code or "_Test Item",
|
"item_code": args.item_code or "_Test Item",
|
||||||
"qty": args.qty or 10,
|
"qty": args.qty or 10,
|
||||||
"schedule_date": args.schedule_date or today(),
|
"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()
|
mr.insert()
|
||||||
if not args.do_not_submit:
|
if not args.do_not_submit:
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user