[mapper] material request to purchase order
diff --git a/accounts/doctype/accounts_settings/accounts_settings.py b/accounts/doctype/accounts_settings/accounts_settings.py
index 4b58048..b548936 100644
--- a/accounts/doctype/accounts_settings/accounts_settings.py
+++ b/accounts/doctype/accounts_settings/accounts_settings.py
@@ -2,6 +2,7 @@
 
 from __future__ import unicode_literals
 import webnotes
+from webnotes.utils import cint
 
 class DocType:
 	def __init__(self, d, dl):
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index 1adce20..7e4ebe0 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -254,9 +254,6 @@
 @webnotes.whitelist()
 def make_sales_order(source_name, target_doclist=None):
 	from webnotes.model.mapper import get_mapped_doclist
-	
-	if target_doclist:
-		target_doclist = json.loads(target_doclist)
 
 	doclist = get_mapped_doclist("Quotation", source_name, {
 			"Quotation": {
diff --git a/stock/doctype/material_request/material_request.js b/stock/doctype/material_request/material_request.js
index 025f7b5..3446b02 100644
--- a/stock/doctype/material_request/material_request.js
+++ b/stock/doctype/material_request/material_request.js
@@ -102,10 +102,11 @@
 };
 
 cur_frm.cscript['Make Purchase Order'] = function() {
-	cur_frm.map([
-		["Material Request", "Purchase Order"], 
-		["Material Request Item", "Purchase Order Item"]]);
-};
+	wn.model.open_mapped_doc({
+		method: "stock.doctype.material_request.material_request.make_purchase_order",
+		source_name: cur_frm.doc.name
+	})
+}
 
 cur_frm.cscript.make_supplier_quotation = function() {
 	cur_frm.map([
diff --git a/stock/doctype/material_request/material_request.py b/stock/doctype/material_request/material_request.py
index dfed6c4..269c4c5 100644
--- a/stock/doctype/material_request/material_request.py
+++ b/stock/doctype/material_request/material_request.py
@@ -240,3 +240,35 @@
 			"indented_qty": (se_detail.docstatus==2 and 1 or -1) * add_indented_qty,
 			"posting_date": controller.doc.posting_date,
 		})
+
+
+
+@webnotes.whitelist()
+def make_purchase_order(source_name, target_doclist=None):
+	from webnotes.model.mapper import get_mapped_doclist
+
+	def update_item(obj, target):
+		target.conversion_factor = 1
+		target.qty = flt(obj.qty) - flt(obj.ordered_qty)
+
+	doclist = get_mapped_doclist("Material Request", source_name, 	{
+		"Material Request": {
+			"doctype": "Purchase Order", 
+			"validation": {
+				"docstatus": ["=", 1],
+				"material_request_type": ["=", "Purchase"]
+			}
+		}, 
+		"Material Request Item": {
+			"doctype": "Purchase Order Item", 
+			"field_map": {
+				"name": "prevdoc_detail_docname", 
+				"parent": "prevdoc_docname", 
+				"parenttype": "prevdoc_doctype", 
+				"uom": "stock_uom"
+			},
+			"postprocess": update_item
+		}
+	}, target_doclist)
+
+	return [d.fields for d in doclist]
\ No newline at end of file
diff --git a/stock/doctype/material_request/test_material_request.py b/stock/doctype/material_request/test_material_request.py
index f5dbb52..f26773b 100644
--- a/stock/doctype/material_request/test_material_request.py
+++ b/stock/doctype/material_request/test_material_request.py
@@ -6,6 +6,21 @@
 from webnotes.utils import flt
 
 class TestMaterialRequest(unittest.TestCase):
+	def test_make_purchase_order(self):
+		from stock.doctype.material_request.material_request import make_purchase_order
+
+		mr = webnotes.bean(copy=test_records[0]).insert()
+
+		self.assertRaises(webnotes.ValidationError, make_purchase_order, 
+			mr.doc.name)
+
+		mr = webnotes.bean("Material Request", mr.doc.name)
+		mr.submit()
+		po = make_purchase_order(mr.doc.name)
+		
+		self.assertEquals(po[0]["doctype"], "Purchase Order")
+		self.assertEquals(len(po), len(mr.doclist))
+	
 	def _test_expected(self, doclist, expected_values):
 		for i, expected in enumerate(expected_values):
 			for fieldname, val in expected.items():