Added code to update Material Request on Submission of Production Order
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.py b/erpnext/buying/doctype/purchase_order/purchase_order.py
index caefe53..44fe7cf 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.py
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.py
@@ -145,7 +145,6 @@
 				and frappe.db.get_value("Item", d.item_code, "is_stock_item") \
 				and d.warehouse and not d.delivered_by_supplier:
 					item_wh_list.append([d.item_code, d.warehouse])
-
 		for item_code, warehouse in item_wh_list:
 			update_bin_qty(item_code, warehouse, {
 				"ordered_qty": get_ordered_qty(item_code, warehouse)
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.json b/erpnext/manufacturing/doctype/production_order/production_order.json
index 997a617..2ad2a3b 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.json
+++ b/erpnext/manufacturing/doctype/production_order/production_order.json
@@ -928,7 +928,31 @@
    "precision": "", 
    "print_hide": 0, 
    "print_hide_if_no_value": 0, 
-   "read_only": 0, 
+   "read_only": 1, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
+   "collapsible": 0, 
+   "fieldname": "material_request_item", 
+   "fieldtype": "Data", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "in_filter": 0, 
+   "in_list_view": 0, 
+   "label": "Material Request Item", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
    "report_hide": 0, 
    "reqd": 0, 
    "search_index": 0, 
@@ -972,7 +996,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-01-21 04:30:33.561347", 
+ "modified": "2016-02-08 04:36:35.071206", 
  "modified_by": "Administrator", 
  "module": "Manufacturing", 
  "name": "Production Order", 
@@ -1021,5 +1045,6 @@
  ], 
  "read_only": 0, 
  "read_only_onload": 0, 
+ "sort_order": "ASC", 
  "title_field": "production_item"
 }
\ No newline at end of file
diff --git a/erpnext/manufacturing/doctype/production_order/production_order.py b/erpnext/manufacturing/doctype/production_order/production_order.py
index 59d371a..ead8105 100644
--- a/erpnext/manufacturing/doctype/production_order/production_order.py
+++ b/erpnext/manufacturing/doctype/production_order/production_order.py
@@ -152,17 +152,19 @@
 			frappe.throw(_("Work-in-Progress Warehouse is required before Submit"))
 		if not self.fg_warehouse:
 			frappe.throw(_("For Warehouse is required before Submit"))
+			
 		frappe.db.set(self,'status', 'Submitted')
 		self.make_time_logs()
 		self.update_planned_qty()
-
+		self.update_completed_qty_in_material_request()
 
 	def on_cancel(self):
 		self.validate_cancel()
 
 		frappe.db.set(self,'status', 'Cancelled')
-		self.update_planned_qty()
 		self.delete_time_logs()
+		self.update_planned_qty()
+		self.update_completed_qty_in_material_request()
 
 	def validate_cancel(self):
 		if self.status == "Stopped":
@@ -178,6 +180,14 @@
 		update_bin_qty(self.production_item, self.fg_warehouse, {
 			"planned_qty": get_planned_qty(self.production_item, self.fg_warehouse)
 		})
+		
+		if self.material_request:
+			mr_obj = frappe.get_doc("Material Request", self.material_request)
+			mr_obj.update_requested_qty([self.material_request_item])
+			
+	def update_completed_qty_in_material_request(self):
+		if self.material_request:
+			frappe.get_doc("Material Request", self.material_request).update_completed_qty([self.material_request_item])
 
 	def set_production_order_operations(self):
 		"""Fetch operations from BOM and set in 'Production Order'"""
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 29968d8..559b954 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -55,7 +55,7 @@
 				
 				if(doc.material_request_type === "Manufacture" && doc.status === "Submitted")
 					cur_frm.add_custom_button(__("Production Order"),
-					this.make_production_order, __("Make"));
+					this.raise_production_orders, __("Make"));
 				
 				cur_frm.page.set_inner_btn_group_as_primary(__("Make"));
 
@@ -172,61 +172,13 @@
 	},
 	
 
-	make_production_order: function() {
-		var items = []
-		$.each(cur_frm.doc["items"] || [], function(i, d) {
-			items.push(d.item_code);
+	raise_production_orders: function() {		
+		frappe.call({
+			method:"erpnext.stock.doctype.material_request.material_request.raise_production_orders",
+			args: {
+				"source_name": cur_frm.doc.name
+			}
 		});
-		var d = new frappe.ui.Dialog({
-			title: __("Production Order"),
-			fields: [
-				{
-					"fieldtype": "Link",
-					"label": __("Production Item"),
-					"fieldname": "item",
-					"options": "Item",
-					"reqd": 1,
-					"get_query": function() {
-						return {
-							"filters": [
-								['item_code', 'in', items],
-							]
-						}
-					}
-				}
-			]
-			
-		});
-		
-		d.set_primary_action(__("Make"), function() {
-			frappe.call({
-				method:"erpnext.stock.doctype.material_request.material_request.validate_production_item",
-				args: {
-					"item_code": d.get_values().item
-				},
-				callback: function(r) {
-					if(!r.message) {
-						msgprint("Cannot create Production Order for selected Item.")
-					}
-					else {
-						frappe.call({
-							method:"erpnext.stock.doctype.material_request.material_request.make_production_order",
-							args: {
-								"source_name": cur_frm.doc.name,
-								"item_code": d.get_values().item,
-							},
-							callback: function(r) {
-								if(!r.exe) {
-									var doclist = frappe.model.sync(r.message);
-									frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
-								}
-							}
-						});
-					}
-				}
-			});
-		});
-		d.show();
 	}
 });
 
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index f7dee98..80ec589 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -7,8 +7,8 @@
 from __future__ import unicode_literals
 import frappe
 
-from frappe.utils import cstr, flt, getdate
-from frappe import _
+from frappe.utils import cstr, flt, getdate, comma_and
+from frappe import msgprint, _
 from frappe.model.mapper import get_mapped_doc
 from erpnext.stock.stock_balance import update_bin_qty, get_indented_qty
 from erpnext.controllers.buying_controller import BuyingController
@@ -107,35 +107,41 @@
 
 		frappe.db.set(self,'status','Cancelled')
 
-	def update_completed_qty(self, mr_items=None):
+	def update_completed_qty(self, mr_items=None, update_modified=True):
 		if self.material_request_type == "Purchase":
 			return
 
 		if not mr_items:
 			mr_items = [d.name for d in self.get("items")]
 
-		per_ordered = 0.0
 		for d in self.get("items"):
 			if d.name in mr_items:
-				d.ordered_qty =  flt(frappe.db.sql("""select sum(transfer_qty)
-					from `tabStock Entry Detail` where material_request = %s
-					and material_request_item = %s and docstatus = 1""",
-					(self.name, d.name))[0][0])
+				if self.material_request_type in ("Material Issue", "Material Transfer"):
+					d.ordered_qty =  flt(frappe.db.sql("""select sum(transfer_qty)
+						from `tabStock Entry Detail` where material_request = %s
+						and material_request_item = %s and docstatus = 1""",
+						(self.name, d.name))[0][0])
 
-				if d.ordered_qty and d.ordered_qty > d.qty:
-					frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
+					if d.ordered_qty and d.ordered_qty > d.qty:
+						frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1}  \
+							cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
+					
+				elif self.material_request_type == "Manufacture":
+					d.ordered_qty = flt(frappe.db.sql("""select sum(qty)
+						from `tabProduction Order` where material_request = %s
+						and material_request_item = %s and docstatus = 1""",
+						(self.name, d.name))[0][0])
 
 				frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
-
-			# note: if qty is 0, its row is still counted in len(self.get("items"))
-			# hence adding 1 to per_ordered
-			if (d.ordered_qty > d.qty) or not d.qty:
-				per_ordered += 1.0
-			elif d.qty > 0:
-				per_ordered += flt(d.ordered_qty / flt(d.qty))
-
-		self.per_ordered = flt((per_ordered / flt(len(self.get("items")))) * 100.0, 2)
-		frappe.db.set_value(self.doctype, self.name, "per_ordered", self.per_ordered)
+		
+		self._update_percent_field({
+			"target_dt": "Material Request Item",
+			"target_parent_dt": self.doctype,
+			"target_parent_field": "per_ordered",
+			"target_ref_field": "qty",
+			"target_field": "ordered_qty",
+			"name": self.name,
+		}, update_modified)
 
 	def update_requested_qty(self, mr_item_rows=None):
 		"""update requested qty (before ordered_qty is updated)"""
@@ -329,25 +335,33 @@
 
 	return doclist
 
-
 @frappe.whitelist()
-def validate_production_item(item_code):
-	return frappe.db.get_value("Item", item_code, "is_pro_applicable")
-
-@frappe.whitelist()
-def make_production_order(source_name, item_code):
+def raise_production_orders(source_name):
 	material_request= frappe.get_doc("Material Request", source_name)
-	prod_order = frappe.new_doc("Production Order")
-	prod_order.production_item = item_code
-	prod_order.qty = 0
+	errors =[]
+	production_orders = []
 	for d in material_request.items:
-		if d.item_code == item_code:
-			prod_order.qty = d.qty - d.ordered_qty
-			prod_order.fg_warehouse = d.warehouse
-			prod_order.description = d.description
-			prod_order.stock_uom = d.uom
-			prod_order.expected_delivery_date = d.schedule_date
-			prod_order.sales_order = d.sales_order
-	prod_order.bom_no = get_item_details(item_code).bom_no
-	prod_order.material_request = material_request.name
-	return prod_order
+		if (d.qty - d.ordered_qty) >0 :
+			if frappe.db.get_value("Item", d.item_code, "is_pro_applicable"):
+				prod_order = frappe.new_doc("Production Order")
+				prod_order.production_item = d.item_code
+				prod_order.qty = d.qty - d.ordered_qty
+				prod_order.fg_warehouse = d.warehouse
+				prod_order.description = d.description
+				prod_order.stock_uom = d.uom
+				prod_order.expected_delivery_date = d.schedule_date
+				prod_order.sales_order = d.sales_order
+				prod_order.bom_no = get_item_details(d.item_code).bom_no
+				prod_order.material_request = material_request.name
+				prod_order.material_request_item = d.name
+				prod_order.planned_start_date = material_request.transaction_date
+				prod_order.save()
+				production_orders.append(prod_order.name)
+			else:
+				errors.append(d.item_code + " in Row " + cstr(d.idx))
+	if production_orders: 
+		message = ["""<a href="#Form/Production Order/%s" target="_blank">%s</a>""" % \
+			(p, p) for p in production_orders]
+		msgprint(_("Production Orders {0} created").format(comma_and(message)))
+	if errors:
+		msgprint(_("Could not Raise Production Orders for {0}").format(comma_and(errors)))
\ No newline at end of file