mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-02 03:39:11 +00:00
feat: fetch purchase invoice and purchase receipt records for actual cost calculation
This commit is contained in:
@@ -4,7 +4,6 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe import _
|
from frappe import _
|
||||||
from frappe.utils import cint,cstr
|
|
||||||
|
|
||||||
def execute(filters=None):
|
def execute(filters=None):
|
||||||
columns = get_columns()
|
columns = get_columns()
|
||||||
@@ -14,21 +13,22 @@ def execute(filters=None):
|
|||||||
def get_columns():
|
def get_columns():
|
||||||
columns = [
|
columns = [
|
||||||
{
|
{
|
||||||
"label": _("Date Requisition Received in Procurement "),
|
"label": _("Material Request Date"),
|
||||||
"fieldname": "date_requisition_received_in_procurement",
|
"fieldname": "material_request_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": _("Date Requisition was Raised"),
|
"label": _("Cost Center"),
|
||||||
"fieldname": "date_requisition_was_raised",
|
|
||||||
"fieldtype": "Date",
|
|
||||||
"width": 140
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": _("Sector/Project"),
|
|
||||||
"options": "Cost Center",
|
"options": "Cost Center",
|
||||||
"fieldname": "sector/project",
|
"fieldname": "cost_center",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"width": 140
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Project"),
|
||||||
|
"options": "Project",
|
||||||
|
"fieldname": "project",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
@@ -47,16 +47,16 @@ def get_columns():
|
|||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": _("Budget Code"),
|
"label": _("Material Request No"),
|
||||||
"options": "Budget",
|
"options": "Material Request",
|
||||||
"fieldname": "budget_code",
|
"fieldname": "material_request_no",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": _("Requisition Line"),
|
"label": _("Budget Code"),
|
||||||
"options": "Item",
|
"options": "Budget",
|
||||||
"fieldname": "requisition_line",
|
"fieldname": "budget_code",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
@@ -119,13 +119,13 @@ def get_columns():
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": _("Purchase Order Amount"),
|
"label": _("Purchase Order Amount"),
|
||||||
"fieldname": "purchase_order_amount",
|
"fieldname": "purchase_order_amt",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": _("Purchase Order Amount(USD)"),
|
"label": _("Purchase Order Amount(Company Currency)"),
|
||||||
"fieldname": "purchase_order_amount_usd",
|
"fieldname": "purchase_order_amt_usd",
|
||||||
"fieldtype": "Float",
|
"fieldtype": "Float",
|
||||||
"width": 140
|
"width": 140
|
||||||
},
|
},
|
||||||
@@ -147,20 +147,19 @@ def get_columns():
|
|||||||
def get_data():
|
def get_data():
|
||||||
purchase_order_entry = frappe.db.sql("""
|
purchase_order_entry = frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
po_item.item_code,
|
po_item.name,
|
||||||
po_item.item_name,
|
po_item.parent,
|
||||||
po_item.cost_center,
|
po_item.cost_center,
|
||||||
po_item.project,
|
po_item.project,
|
||||||
po_item.warehouse,
|
po_item.warehouse,
|
||||||
po_item.material_request,
|
po_item.material_request,
|
||||||
|
po_item.material_request_item,
|
||||||
po_item.description,
|
po_item.description,
|
||||||
po_item.stock_uom,
|
po_item.stock_uom,
|
||||||
po_item.qty,
|
po_item.qty,
|
||||||
po_item.net_amount,
|
po_item.amount,
|
||||||
po_item.base_amount,
|
po_item.base_amount,
|
||||||
po_item.schedule_date,
|
po_item.schedule_date,
|
||||||
po_item.expected_delivery_date,
|
|
||||||
po.name,
|
|
||||||
po.transaction_date,
|
po.transaction_date,
|
||||||
po.supplier,
|
po.supplier,
|
||||||
po.status,
|
po.status,
|
||||||
@@ -172,41 +171,72 @@ def get_data():
|
|||||||
AND po.status not in ("Closed","Completed","Cancelled")
|
AND po.status not in ("Closed","Completed","Cancelled")
|
||||||
GROUP BY
|
GROUP BY
|
||||||
po.name,po_item.item_code
|
po.name,po_item.item_code
|
||||||
""", as_dict = 1)
|
""", as_dict=1)
|
||||||
|
|
||||||
mr_records = frappe._dict(frappe.db.sql("""
|
mr_details = frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
name,
|
mr.transaction_date,
|
||||||
transaction_date
|
mr_item.name,
|
||||||
FROM `tabMaterial Request`
|
mr_item.parent,
|
||||||
|
mr_item.amount
|
||||||
|
FROM `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
|
||||||
WHERE
|
WHERE
|
||||||
per_ordered = 100
|
per_ordered > 0
|
||||||
AND docstatus = 1
|
AND mr.name = mr_item.parent
|
||||||
"""))
|
AND mr.docstatus = 1
|
||||||
|
""", as_dict=1)
|
||||||
|
|
||||||
supplier_quotation_records = frappe._dict(frappe.db.sql("""
|
pi_records = frappe._dict(frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
name,
|
po_detail,
|
||||||
base_amount
|
base_amount
|
||||||
FROM `tabSupplier Quotation Item`
|
FROM `tabPurchase Invoice Item`
|
||||||
WHERE
|
WHERE
|
||||||
per_ordered = 100
|
docstatus=1
|
||||||
AND docstatus = 1
|
AND po_detail IS NOT NULL
|
||||||
"""))
|
"""))
|
||||||
|
|
||||||
budget_records = frappe.db.sql("""
|
pr_records = frappe._dict(frappe.db.sql("""
|
||||||
SELECT
|
SELECT
|
||||||
budget.name,
|
pr_item.purchase_order_item,
|
||||||
budget.project,
|
pr.posting_date
|
||||||
budget.cost_center,
|
FROM `tabPurchase Receipt` pr, `tabPurchase Receipt Item` pr_item
|
||||||
budget_account.account,
|
|
||||||
budget_account.budget_amount
|
|
||||||
FROM `tabBudget` budget, `tabBudget Account` budget_account
|
|
||||||
WHERE
|
WHERE
|
||||||
budget.project IS NOT NULL
|
pr.docstatus=1
|
||||||
AND budget.name = budget_account.parent
|
AND pr.name=pr_item.parent
|
||||||
AND budget.cost_center IS NOT NULL
|
AND pr_item.purchase_order_item IS NOT NULL
|
||||||
AND budget.docstatus = 1
|
"""))
|
||||||
""", as_dict = 1)
|
|
||||||
|
|
||||||
return purchase_order_entry
|
|
||||||
|
mr_records = {}
|
||||||
|
for record in mr_details:
|
||||||
|
mr_records.setdefault(record.name, []).append(frappe._dict(record))
|
||||||
|
|
||||||
|
procurement_record=[]
|
||||||
|
for po in purchase_order_entry:
|
||||||
|
# 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', ''),
|
||||||
|
"cost_center": po.cost_center,
|
||||||
|
"project": po.project,
|
||||||
|
"requesting_site": po.warehouse,
|
||||||
|
"requestor": po.owner,
|
||||||
|
"material_request_no": po.material_request,
|
||||||
|
"description": po.description,
|
||||||
|
"quantity": po.qty,
|
||||||
|
"unit_of_measurement": po.stock_uom,
|
||||||
|
"status": po.status,
|
||||||
|
"purchase_order_date": po.transaction_date,
|
||||||
|
"purchase_order": po.parent,
|
||||||
|
"supplier": po.supplier,
|
||||||
|
"estimated_cost": mr_record.get('amount'),
|
||||||
|
"actual_cost": pi_records.get(po.name, ''),
|
||||||
|
"purchase_order_amt": po.amount,
|
||||||
|
"purchase_order_amt_in_company_currency": po.base_amount,
|
||||||
|
"expected_delivery_date": po.schedule_date,
|
||||||
|
"actual_delivery_date": pr_records.get(po.name, {})
|
||||||
|
}
|
||||||
|
procurement_record.append(procurement_detail)
|
||||||
|
return procurement_record
|
||||||
@@ -4,10 +4,9 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import unittest
|
import unittest
|
||||||
from frappe.utils import nowdate, add_months
|
from frappe.utils import nowdate, add_months
|
||||||
from apps.erpnext.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.accounts.doctype.budget.test_budget import make_budget
|
|
||||||
|
|
||||||
class TestProcurementTracker(unittest.TestCase):
|
class TestProcurementTracker(unittest.TestCase):
|
||||||
def test_result_for_procurement_tracker(self):
|
def test_result_for_procurement_tracker(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user