[feature] pull from material request based on supplier

This commit is contained in:
Nabin Hait 2013-07-26 19:45:22 +05:30
parent 114bc09164
commit 834a4db596
3 changed files with 88 additions and 30 deletions

View File

@ -80,7 +80,8 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
company: cur_frm.doc.company
}
})
});
}
);
cur_frm.add_custom_button(wn._('From Supplier Quotation'),
function() {
@ -93,7 +94,20 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
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() {

View File

@ -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",
@ -402,6 +403,13 @@
"read_only": 0,
"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.",
@ -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"
}
]

View File

@ -222,18 +222,18 @@ def _update_requested_qty(controller, mr_obj, mr_items):
"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",
@ -257,6 +257,62 @@ def make_purchase_order(source_name, target_doclist=None):
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 make_stock_entry(source_name, target_doclist=None):
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": {