[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": {