feat: subcontracting report
This commit is contained in:
parent
f13abe8332
commit
d0cdb4a1e9
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
/* eslint-disable */
|
||||||
|
|
||||||
|
frappe.query_reports["Subcontracted Item To Be Received"] = {
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
fieldname: "supplier",
|
||||||
|
label: __("Supplier"),
|
||||||
|
fieldtype: "Link",
|
||||||
|
options: "Supplier",
|
||||||
|
reqd: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldname:"from_date",
|
||||||
|
label: __("From Date"),
|
||||||
|
fieldtype: "Date",
|
||||||
|
default: frappe.datetime.add_months(frappe.datetime.month_start(), -1),
|
||||||
|
reqd: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldname:"to_date",
|
||||||
|
label: __("To Date"),
|
||||||
|
fieldtype: "Date",
|
||||||
|
default: frappe.datetime.add_days(frappe.datetime.month_start(),-1),
|
||||||
|
reqd: 1
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"add_total_row": 1,
|
||||||
|
"creation": "2019-05-03 11:25:03.685247",
|
||||||
|
"disable_prepared_report": 0,
|
||||||
|
"disabled": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Report",
|
||||||
|
"idx": 0,
|
||||||
|
"is_standard": "Yes",
|
||||||
|
"modified": "2019-05-03 11:25:03.685247",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Subcontracted Item To Be Received",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"prepared_report": 0,
|
||||||
|
"ref_doctype": "Purchase Order",
|
||||||
|
"report_name": "Subcontracted Item To Be Received",
|
||||||
|
"report_type": "Script Report",
|
||||||
|
"roles": [
|
||||||
|
{
|
||||||
|
"role": "Stock User"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Purchase Manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Purchase User"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,105 @@
|
|||||||
|
# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
|
||||||
|
def execute(filters=None):
|
||||||
|
if filters.from_date >= filters.to_date:
|
||||||
|
frappe.msgprint(_("To Date must be greater than From Date"))
|
||||||
|
|
||||||
|
data = []
|
||||||
|
columns = get_columns()
|
||||||
|
get_data(data , filters)
|
||||||
|
return columns, data
|
||||||
|
|
||||||
|
def get_columns():
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"label": _("Purchase Order"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"fieldname": "purchase_order",
|
||||||
|
"options": "Purchase Order",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"fieldname": "date",
|
||||||
|
"hidden": 1,
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Supplier"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"fieldname": "supplier",
|
||||||
|
"options": "Supplier",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Finished Good Item Code"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"fieldname": "fg_item_code",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Item name"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"fieldname": "item_name",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Required Quantity"),
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"fieldname": "r_qty",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Received Quantity"),
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"fieldname": "received_qty",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Pending Quantity"),
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"fieldname": "p_qty",
|
||||||
|
"width": 100
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_data(data, filters):
|
||||||
|
po = get_po(filters)
|
||||||
|
po_name = [v.name for v in po]
|
||||||
|
print(po_name)
|
||||||
|
sub_items = get_purchase_order_item_supplied(po_name)
|
||||||
|
for item in sub_items:
|
||||||
|
for order in po:
|
||||||
|
if order.name == item.parent and item.received_qty < item.qty:
|
||||||
|
row ={
|
||||||
|
'purchase_order': item.parent,
|
||||||
|
'date': order.transaction_date,
|
||||||
|
'supplier': order.supplier,
|
||||||
|
'fg_item_code': item.item_code,
|
||||||
|
'item_name': item.item_name,
|
||||||
|
'r_qty': item.qty,
|
||||||
|
'received_qty':item.received_qty,
|
||||||
|
'p_qty':item.qty - item.received_qty
|
||||||
|
}
|
||||||
|
data.append(row)
|
||||||
|
|
||||||
|
def get_po(filters):
|
||||||
|
record_filters = [
|
||||||
|
["is_subcontracted", "=", "Yes"],
|
||||||
|
["supplier", "=", filters.supplier],
|
||||||
|
["transaction_date", "<=", filters.to_date],
|
||||||
|
["transaction_date", ">=", filters.from_date],
|
||||||
|
["docstatus", "=", 1]
|
||||||
|
]
|
||||||
|
return frappe.get_all("Purchase Order", filters=record_filters, fields=["name", "transaction_date", "supplier"])
|
||||||
|
|
||||||
|
def get_purchase_order_item_supplied(po):
|
||||||
|
return frappe.get_all("Purchase Order Item", filters=[
|
||||||
|
('parent', 'IN', po)
|
||||||
|
], fields=["parent", "item_code", "item_name", "qty", "received_qty"])
|
@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
// For license information, please see license.txt
|
||||||
|
/* eslint-disable */
|
||||||
|
|
||||||
|
frappe.query_reports["Subcontracted Raw Materials To Be Transferred"] = {
|
||||||
|
"filters": [
|
||||||
|
{
|
||||||
|
fieldname: "supplier",
|
||||||
|
label: __("Supplier"),
|
||||||
|
fieldtype: "Link",
|
||||||
|
options: "Supplier",
|
||||||
|
reqd: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldname:"from_date",
|
||||||
|
label: __("From Date"),
|
||||||
|
fieldtype: "Date",
|
||||||
|
default: frappe.datetime.add_months(frappe.datetime.month_start(), -1),
|
||||||
|
reqd: 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
fieldname:"to_date",
|
||||||
|
label: __("To Date"),
|
||||||
|
fieldtype: "Date",
|
||||||
|
default: frappe.datetime.add_days(frappe.datetime.month_start(),-1),
|
||||||
|
reqd: 1
|
||||||
|
},
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"add_total_row": 1,
|
||||||
|
"creation": "2019-05-03 12:04:14.438345",
|
||||||
|
"disable_prepared_report": 0,
|
||||||
|
"disabled": 0,
|
||||||
|
"docstatus": 0,
|
||||||
|
"doctype": "Report",
|
||||||
|
"idx": 0,
|
||||||
|
"is_standard": "Yes",
|
||||||
|
"modified": "2019-05-03 12:04:24.203721",
|
||||||
|
"modified_by": "Administrator",
|
||||||
|
"module": "Buying",
|
||||||
|
"name": "Subcontracted Raw Materials To Be Transferred",
|
||||||
|
"owner": "Administrator",
|
||||||
|
"prepared_report": 0,
|
||||||
|
"ref_doctype": "Purchase Order",
|
||||||
|
"report_name": "Subcontracted Raw Materials To Be Transferred",
|
||||||
|
"report_type": "Script Report",
|
||||||
|
"roles": [
|
||||||
|
{
|
||||||
|
"role": "Stock User"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Purchase Manager"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"role": "Purchase User"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,133 @@
|
|||||||
|
# Copyright (c) 2013, Frappe Technologies Pvt. Ltd. and contributors
|
||||||
|
# For license information, please see license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from frappe import _
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
def execute(filters=None):
|
||||||
|
if filters.from_date >= filters.to_date:
|
||||||
|
frappe.msgprint(_("To Date must be greater than From Date"))
|
||||||
|
|
||||||
|
data = []
|
||||||
|
columns = get_columns()
|
||||||
|
get_data(data , filters)
|
||||||
|
return columns, data
|
||||||
|
|
||||||
|
def get_columns():
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
"label": _("Purchase Order"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"fieldname": "purchase_order",
|
||||||
|
"options": "Purchase Order",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Date"),
|
||||||
|
"fieldtype": "Date",
|
||||||
|
"fieldname": "date",
|
||||||
|
"hidden": 1,
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Supplier"),
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"fieldname": "supplier",
|
||||||
|
"options": "Supplier",
|
||||||
|
"width": 150
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Item Code"),
|
||||||
|
"fieldtype": "Data",
|
||||||
|
"fieldname": "rm_item_code",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Required Quantity"),
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"fieldname": "r_qty",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Transferred Quantity"),
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"fieldname": "t_qty",
|
||||||
|
"width": 100
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": _("Pending Quantity"),
|
||||||
|
"fieldtype": "Float",
|
||||||
|
"fieldname": "p_qty",
|
||||||
|
"width": 100
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
def get_data(data, filters):
|
||||||
|
po = get_po(filters)
|
||||||
|
po_transferred_qty_map = frappe._dict(get_transferred_quantity([v.name for v in po]))
|
||||||
|
sub_items = get_purchase_order_item_supplied([v.name for v in po])
|
||||||
|
|
||||||
|
for order in po:
|
||||||
|
for item in sub_items:
|
||||||
|
if order.name == item.parent and item.required_qty != po_transferred_qty_map.get(order.name).get(item.rm_item_code):
|
||||||
|
row ={
|
||||||
|
'purchase_order': item.parent,
|
||||||
|
'date': order.transaction_date,
|
||||||
|
'supplier': order.supplier,
|
||||||
|
'rm_item_code': item.rm_item_code,
|
||||||
|
'r_qty': item.required_qty,
|
||||||
|
't_qty':po_transferred_qty_map.get(order.name).get(item.rm_item_code),
|
||||||
|
'p_qty':item.required_qty - po_transferred_qty_map.get(order.name).get(item.rm_item_code)
|
||||||
|
}
|
||||||
|
|
||||||
|
data.append(row)
|
||||||
|
|
||||||
|
return(data)
|
||||||
|
|
||||||
|
def get_po(filters):
|
||||||
|
record_filters = [
|
||||||
|
["is_subcontracted", "=", "Yes"],
|
||||||
|
["supplier", "=", filters.supplier],
|
||||||
|
["transaction_date", "<=", filters.to_date],
|
||||||
|
["transaction_date", ">=", filters.from_date],
|
||||||
|
["docstatus", "=", 1]
|
||||||
|
]
|
||||||
|
return frappe.get_all("Purchase Order", filters=record_filters, fields=["name", "transaction_date", "supplier"])
|
||||||
|
|
||||||
|
def get_transferred_quantity(po_name):
|
||||||
|
stock_entries = get_stock_entry(po_name)
|
||||||
|
stock_entries_detail = get_stock_entry_detail([v.name for v in stock_entries])
|
||||||
|
po_transferred_qty_map = {}
|
||||||
|
|
||||||
|
for entry in stock_entries:
|
||||||
|
for details in stock_entries_detail:
|
||||||
|
if details.parent == entry.name:
|
||||||
|
details["Purchase_order"] = entry.purchase_order
|
||||||
|
if entry.purchase_order not in po_transferred_qty_map:
|
||||||
|
po_transferred_qty_map[entry.purchase_order] = {}
|
||||||
|
po_transferred_qty_map[entry.purchase_order][details.item_code] = details.qty
|
||||||
|
else:
|
||||||
|
po_transferred_qty_map[entry.purchase_order][details.item_code] = po_transferred_qty_map[entry.purchase_order].get(details.item_code, 0) + details.qty
|
||||||
|
|
||||||
|
return po_transferred_qty_map
|
||||||
|
|
||||||
|
|
||||||
|
def get_stock_entry(po):
|
||||||
|
return frappe.get_all("Stock Entry", filters=[
|
||||||
|
('purchase_order', 'IN', po),
|
||||||
|
('stock_entry_type', '=', 'Send to Subcontractor'),
|
||||||
|
('docstatus', '=', 1)
|
||||||
|
], fields=["name", "purchase_order"])
|
||||||
|
|
||||||
|
def get_stock_entry_detail(se):
|
||||||
|
return frappe.get_all("Stock Entry Detail", filters=[
|
||||||
|
["parent", "in", se]
|
||||||
|
],
|
||||||
|
fields=["parent", "item_code", "qty"])
|
||||||
|
|
||||||
|
def get_purchase_order_item_supplied(po):
|
||||||
|
return frappe.get_all("Purchase Order Item Supplied", filters=[
|
||||||
|
('parent', 'IN', po)
|
||||||
|
], fields=['parent', 'rm_item_code', 'required_qty'])
|
Loading…
x
Reference in New Issue
Block a user