From d0cdb4a1e9d64a484d9f4a073a6dd61579071710 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Fri, 3 May 2019 14:05:29 +0530 Subject: [PATCH] feat: subcontracting report --- .../__init__.py | 0 .../subcontracted_item_to_be_received.js | 29 ++++ .../subcontracted_item_to_be_received.json | 30 ++++ .../subcontracted_item_to_be_received.py | 105 ++++++++++++++ .../__init__.py | 0 ...tracted_raw_materials_to_be_transferred.js | 29 ++++ ...acted_raw_materials_to_be_transferred.json | 30 ++++ ...tracted_raw_materials_to_be_transferred.py | 133 ++++++++++++++++++ 8 files changed, 356 insertions(+) create mode 100644 erpnext/buying/report/subcontracted_item_to_be_received/__init__.py create mode 100644 erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.js create mode 100644 erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json create mode 100644 erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py create mode 100644 erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/__init__.py create mode 100644 erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.js create mode 100644 erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json create mode 100644 erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/__init__.py b/erpnext/buying/report/subcontracted_item_to_be_received/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.js b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.js new file mode 100644 index 00000000000..fc58b6aaafa --- /dev/null +++ b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.js @@ -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 + }, + ] +}; diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json new file mode 100644 index 00000000000..fdf6cf702df --- /dev/null +++ b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py new file mode 100644 index 00000000000..fc2ed715c9f --- /dev/null +++ b/erpnext/buying/report/subcontracted_item_to_be_received/subcontracted_item_to_be_received.py @@ -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"]) diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/__init__.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.js b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.js new file mode 100644 index 00000000000..0853afd6576 --- /dev/null +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.js @@ -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 + }, + ] +} diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json new file mode 100644 index 00000000000..c7cee5e20b3 --- /dev/null +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.json @@ -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" + } + ] +} \ No newline at end of file diff --git a/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py new file mode 100644 index 00000000000..441fbcb26b4 --- /dev/null +++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/subcontracted_raw_materials_to_be_transferred.py @@ -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'])