feat: subcontracting report
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 0000000..e69de29
--- /dev/null
+++ b/erpnext/buying/report/subcontracted_item_to_be_received/__init__.py
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 0000000..fc58b6a
--- /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 0000000..fdf6cf7
--- /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 0000000..fc2ed71
--- /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 0000000..e69de29
--- /dev/null
+++ b/erpnext/buying/report/subcontracted_raw_materials_to_be_transferred/__init__.py
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 0000000..0853afd
--- /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 0000000..c7cee5e
--- /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 0000000..441fbcb
--- /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'])