[feature] pull from material request based on supplier
diff --git a/buying/doctype/purchase_order/purchase_order.js b/buying/doctype/purchase_order/purchase_order.js
index 0d3d0ee..99149bc 100644
--- a/buying/doctype/purchase_order/purchase_order.js
+++ b/buying/doctype/purchase_order/purchase_order.js
@@ -80,7 +80,8 @@
 						company: cur_frm.doc.company
 					}
 				})
-			});
+			}
+		);
 
 		cur_frm.add_custom_button(wn._('From Supplier Quotation'), 
 			function() {
@@ -93,7 +94,20 @@
 						company: cur_frm.doc.company
 					}
 				})
-			});	
+			}
+		);	
+			
+		cur_frm.add_custom_button(wn._('For Supplier'), 
+			function() {
+				wn.model.map_current_doc({
+					method: "stock.doctype.material_request.material_request.make_purchase_order_based_on_supplier",
+					source_doctype: "Supplier",
+					get_query_filters: {
+						docstatus: ["!=", 2],
+					}
+				})
+			}
+		);
 	},
 
 	tc_name: function() {
diff --git a/stock/doctype/item/item.txt b/stock/doctype/item/item.txt
index de9e8f8..3e41101 100644
--- a/stock/doctype/item/item.txt
+++ b/stock/doctype/item/item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-05-03 10:45:46", 
   "docstatus": 0, 
-  "modified": "2013-07-23 11:54:52", 
+  "modified": "2013-07-26 16:26:15", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -36,7 +36,8 @@
   "parenttype": "DocType", 
   "permlevel": 0, 
   "read": 1, 
-  "report": 1
+  "report": 1, 
+  "submit": 0
  }, 
  {
   "doctype": "DocType", 
@@ -403,6 +404,13 @@
   "reqd": 1
  }, 
  {
+  "doctype": "DocField", 
+  "fieldname": "default_supplier", 
+  "fieldtype": "Link", 
+  "label": "Default Supplier", 
+  "options": "Supplier"
+ }, 
+ {
   "depends_on": "eval:doc.is_purchase_item==\"Yes\"", 
   "description": "Lead Time days is number of days by which this item is expected in your warehouse. This days is fetched in Material Request when you select this item.", 
   "doctype": "DocField", 
@@ -876,7 +884,6 @@
   "create": 1, 
   "doctype": "DocPerm", 
   "role": "Material Master Manager", 
-  "submit": 0, 
   "write": 1
  }, 
  {
@@ -885,7 +892,6 @@
   "create": 0, 
   "doctype": "DocPerm", 
   "role": "Material Manager", 
-  "submit": 0, 
   "write": 0
  }, 
  {
@@ -894,19 +900,6 @@
   "create": 0, 
   "doctype": "DocPerm", 
   "role": "Material User", 
-  "submit": 0, 
   "write": 0
- }, 
- {
-  "doctype": "DocPerm", 
-  "role": "Sales User"
- }, 
- {
-  "doctype": "DocPerm", 
-  "role": "Purchase User"
- }, 
- {
-  "doctype": "DocPerm", 
-  "role": "Accounts User"
  }
 ]
\ No newline at end of file
diff --git a/stock/doctype/material_request/material_request.py b/stock/doctype/material_request/material_request.py
index 86de99e..5bcbaf8 100644
--- a/stock/doctype/material_request/material_request.py
+++ b/stock/doctype/material_request/material_request.py
@@ -222,18 +222,18 @@
 			"posting_date": controller.doc.posting_date,
 		})
 
-def set_missing_values(source, target):
-	po = webnotes.bean(target)
+def set_missing_values(source, target_doclist):
+	po = webnotes.bean(target_doclist)
 	po.run_method("set_missing_values")
+	
+def update_item(obj, target, source_parent):
+	target.conversion_factor = 1
+	target.qty = flt(obj.qty) - flt(obj.ordered_qty)
 
 @webnotes.whitelist()
 def make_purchase_order(source_name, target_doclist=None):
 	from webnotes.model.mapper import get_mapped_doclist
 
-	def update_item(obj, target, source_parent):
-		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", 
@@ -258,6 +258,62 @@
 	return [d.fields for d in doclist]
 	
 @webnotes.whitelist()
+def make_purchase_order_based_on_supplier(source_name, target_doclist=None):
+	from webnotes.model.mapper import get_mapped_doclist
+	if target_doclist:
+		if isinstance(target_doclist, basestring):
+			import json
+			target_doclist = webnotes.doclist(json.loads(target_doclist))
+		target_doclist = target_doclist.get({"parentfield": ["!=", "po_details"]})
+		
+	material_requests, supplier_items = get_material_requests_based_on_supplier(source_name)
+	
+	def postprocess(source, target_doclist):
+		target_doclist[0].supplier = source_name
+		set_missing_values(source, target_doclist)
+		
+		po_items = target_doclist.get({"parentfield": "po_details"})
+		target_doclist = target_doclist.get({"parentfield": ["!=", "po_details"]}) + \
+			[d for d in po_items 
+				if d.fields.get("item_code") in supplier_items and d.fields.get("qty") > 0]
+		
+		return target_doclist
+		
+	for mr in material_requests:
+		target_doclist = get_mapped_doclist("Material Request", mr, 	{
+			"Material Request": {
+				"doctype": "Purchase Order", 
+			}, 
+			"Material Request Item": {
+				"doctype": "Purchase Order Item", 
+				"field_map": [
+					["name", "prevdoc_detail_docname"], 
+					["parent", "prevdoc_docname"], 
+					["parenttype", "prevdoc_doctype"], 
+					["uom", "stock_uom"],
+					["uom", "uom"]
+				],
+				"postprocess": update_item
+			}
+		}, target_doclist, postprocess)
+	
+	return [d.fields for d in target_doclist]
+	
+def get_material_requests_based_on_supplier(supplier):
+	supplier_items = [d[0] for d in webnotes.conn.get_values("Item", 
+		{"default_supplier": supplier})]
+	material_requests = webnotes.conn.sql_list("""select distinct mr.name 
+		from `tabMaterial Request` mr, `tabMaterial Request Item` mr_item
+		where mr.name = mr_item.parent
+		and mr_item.item_code in (%s)
+		and mr.material_request_type = 'Purchase'
+		and ifnull(mr.per_ordered, 0) < 99.99
+		and mr.docstatus = 1
+		and mr.status != 'Stopped'""" % ', '.join(['%s']*len(supplier_items)),
+		tuple(supplier_items))
+	return material_requests, supplier_items
+	
+@webnotes.whitelist()
 def make_supplier_quotation(source_name, target_doclist=None):
 	from webnotes.model.mapper import get_mapped_doclist
 
@@ -287,11 +343,6 @@
 
 	def set_purpose(source, target):
 		target[0].purpose = "Material Transfer"
-		
-	def update_item(source, target, source_parent):
-		target.conversion_factor = 1
-		target.qty = flt(source.qty) - flt(source.ordered_qty)
-		
 
 	doclist = get_mapped_doclist("Material Request", source_name, {
 		"Material Request": {