[mapper] material request - PO/supp quote/stock entry
diff --git a/buying/doctype/purchase_order/purchase_order.js b/buying/doctype/purchase_order/purchase_order.js
index 4429251..fd420ca 100644
--- a/buying/doctype/purchase_order/purchase_order.js
+++ b/buying/doctype/purchase_order/purchase_order.js
@@ -83,7 +83,13 @@
}
-//========================= Make Purchase Receipt =======================================================
+cur_frm.cscript.get_items = function(doc, dt, dn) {
+ wn.model.map_current_doc({
+ method: "stock.doctype.material_request.material_request.make_purchase_order",
+ source_name: cur_frm.doc.indent_no,
+ })
+}
+
cur_frm.cscript['Make Purchase Receipt'] = function() {
n = wn.model.make_new_doc_and_get_name('Purchase Receipt');
$c('dt_map', args={
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index 908df67..fba448c 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -21,7 +21,6 @@
from webnotes.model.bean import getlist
from webnotes.model.code import get_obj
from webnotes import msgprint
-from buying.utils import get_last_purchase_details
sql = webnotes.conn.sql
@@ -72,24 +71,6 @@
def get_bin_details(self, arg = ''):
return get_obj(dt='Purchase Common').get_bin_details(arg)
- # Pull Material Request
- def get_indent_details(self):
- if self.doc.indent_no:
- get_obj('DocType Mapper','Material Request-Purchase Order').dt_map('Material Request','Purchase Order',self.doc.indent_no, self.doc, self.doclist, "[['Material Request','Purchase Order'],['Material Request Item', 'Purchase Order Item']]")
- for d in getlist(self.doclist, 'po_details'):
- if d.item_code and not d.purchase_rate:
- last_purchase_details = get_last_purchase_details(d.item_code, self.doc.name)
- if last_purchase_details:
- conversion_factor = d.conversion_factor or 1.0
- conversion_rate = self.doc.fields.get('conversion_rate') or 1.0
- d.purchase_ref_rate = last_purchase_details['purchase_ref_rate'] * conversion_factor
- d.discount_rate = last_purchase_details['discount_rate']
- d.purchase_rate = last_purchase_details['purchase_rate'] * conversion_factor
- d.import_ref_rate = d.purchase_ref_rate / conversion_rate
- d.import_rate = d.purchase_rate / conversion_rate
- else:
- d.purchase_ref_rate = d.discount_rate = d.purchase_rate = d.import_ref_rate = d.import_rate = 0.0
-
def get_supplier_quotation_items(self):
if self.doc.supplier_quotation:
get_obj("DocType Mapper", "Supplier Quotation-Purchase Order").dt_map("Supplier Quotation",
diff --git a/buying/doctype/purchase_order/purchase_order.txt b/buying/doctype/purchase_order/purchase_order.txt
index b2bf146..6fd2161 100644
--- a/buying/doctype/purchase_order/purchase_order.txt
+++ b/buying/doctype/purchase_order/purchase_order.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:39",
"docstatus": 0,
- "modified": "2013-07-04 10:48:54",
+ "modified": "2013-07-04 18:10:21",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -31,7 +31,6 @@
"parent": "Purchase Order",
"parentfield": "permissions",
"parenttype": "DocType",
- "permlevel": 0,
"read": 1,
"report": 1
},
@@ -208,7 +207,6 @@
"label": "Get Items",
"no_copy": 0,
"oldfieldtype": "Button",
- "options": "get_indent_details",
"print_hide": 1
},
{
@@ -789,15 +787,37 @@
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
+ "permlevel": 1,
"role": "Material User",
"submit": 0,
"write": 0
},
{
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 0,
+ "role": "Material User",
+ "submit": 0,
+ "write": 0
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 1,
+ "role": "Purchase Manager",
+ "submit": 0,
+ "write": 0
+ },
+ {
"amend": 1,
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Purchase Manager",
"submit": 1,
"write": 1
@@ -807,13 +827,24 @@
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Purchase User",
"submit": 1,
"write": 1
},
{
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 1,
+ "role": "All",
+ "submit": 0
+ },
+ {
"doctype": "DocPerm",
"match": "supplier",
+ "permlevel": 0,
"role": "Supplier"
}
]
\ No newline at end of file
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.js b/buying/doctype/supplier_quotation/supplier_quotation.js
index 0ed85ff..92db302 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.js
+++ b/buying/doctype/supplier_quotation/supplier_quotation.js
@@ -31,6 +31,12 @@
cur_frm.add_custom_button("Make Purchase Order", cur_frm.cscript.make_purchase_order);
}
},
+ get_items: function() {
+ wn.model.map_current_doc({
+ method: "stock.doctype.material_request.material_request.make_supplier_quotation",
+ source_name: cur_frm.doc.indent_no,
+ })
+ }
});
// for backward compatibility: combine new and previous states
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.py b/buying/doctype/supplier_quotation/supplier_quotation.py
index 421ecd0..b8cf7cb 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.py
+++ b/buying/doctype/supplier_quotation/supplier_quotation.py
@@ -17,7 +17,6 @@
from __future__ import unicode_literals
import webnotes
from webnotes.model.code import get_obj
-from setup.utils import get_company_currency
from controllers.buying_controller import BuyingController
class DocType(BuyingController):
@@ -49,19 +48,6 @@
def on_trash(self):
pass
-
- def get_indent_details(self):
- if self.doc.indent_no:
- mapper = get_obj("DocType Mapper", "Material Request-Supplier Quotation")
- mapper.dt_map("Material Request", "Supplier Quotation", self.doc.indent_no,
- self.doc, self.doclist, """[['Material Request', 'Supplier Quotation'],
- ['Material Request Item', 'Supplier Quotation Item']]""")
-
- from webnotes.model.bean import getlist
- for d in getlist(self.doclist, self.fname):
- if d.item_code and not d.purchase_rate:
- d.purchase_ref_rate = d.discount_rate = d.purchase_rate = 0.0
- d.import_ref_rate = d.import_rate = 0.0
def validate_fiscal_year(self):
get_obj(dt = 'Purchase Common').validate_fiscal_year( \
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.txt b/buying/doctype/supplier_quotation/supplier_quotation.txt
index d9ecf60..5f2e95e 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.txt
+++ b/buying/doctype/supplier_quotation/supplier_quotation.txt
@@ -2,7 +2,7 @@
{
"creation": "2013-05-21 16:16:45",
"docstatus": 0,
- "modified": "2013-07-04 10:51:05",
+ "modified": "2013-07-04 18:47:51",
"modified_by": "Administrator",
"owner": "Administrator"
},
@@ -31,7 +31,6 @@
"parent": "Supplier Quotation",
"parentfield": "permissions",
"parenttype": "DocType",
- "permlevel": 0,
"read": 1,
"report": 1
},
@@ -191,8 +190,7 @@
"fieldtype": "Button",
"hidden": 0,
"label": "Get Items",
- "oldfieldtype": "Button",
- "options": "get_indent_details"
+ "oldfieldtype": "Button"
},
{
"doctype": "DocField",
@@ -644,6 +642,7 @@
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Manufacturing Manager",
"submit": 1,
"write": 1
@@ -653,6 +652,7 @@
"cancel": 1,
"create": 1,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Purchase Manager",
"submit": 1,
"write": 1
@@ -662,6 +662,7 @@
"cancel": 0,
"create": 1,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Purchase User",
"submit": 0,
"write": 1
@@ -671,6 +672,7 @@
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Material User",
"submit": 0,
"write": 0
@@ -680,8 +682,19 @@
"cancel": 0,
"create": 0,
"doctype": "DocPerm",
+ "permlevel": 0,
"role": "Supplier",
"submit": 0,
"write": 0
+ },
+ {
+ "amend": 0,
+ "cancel": 0,
+ "create": 0,
+ "doctype": "DocPerm",
+ "permlevel": 1,
+ "role": "All",
+ "submit": 0,
+ "write": 0
}
]
\ No newline at end of file
diff --git a/stock/doctype/material_request/material_request.js b/stock/doctype/material_request/material_request.js
index 3446b02..6de7a29 100644
--- a/stock/doctype/material_request/material_request.js
+++ b/stock/doctype/material_request/material_request.js
@@ -36,23 +36,27 @@
if(doc.docstatus == 1 && doc.status != 'Stopped'){
if(doc.material_request_type === "Purchase")
- cur_frm.add_custom_button("Make Supplier Quotation", cur_frm.cscript.make_supplier_quotation);
+ cur_frm.add_custom_button("Make Supplier Quotation",
+ cur_frm.cscript.make_supplier_quotation);
if(doc.material_request_type === "Transfer" && doc.status === "Submitted")
cur_frm.add_custom_button("Transfer Material", cur_frm.cscript.make_stock_entry);
if(flt(doc.per_ordered, 2) < 100) {
if(doc.material_request_type === "Purchase")
- cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order']);
+ cur_frm.add_custom_button('Make Purchase Order',
+ cur_frm.cscript.make_purchase_order);
- cur_frm.add_custom_button('Stop Material Request', cur_frm.cscript['Stop Material Request']);
+ cur_frm.add_custom_button('Stop Material Request',
+ cur_frm.cscript['Stop Material Request']);
}
cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
}
if(doc.docstatus == 1 && doc.status == 'Stopped')
- cur_frm.add_custom_button('Unstop Material Request', cur_frm.cscript['Unstop Material Request']);
+ cur_frm.add_custom_button('Unstop Material Request',
+ cur_frm.cscript['Unstop Material Request']);
if(doc.material_request_type === "Transfer") {
cur_frm.toggle_display("sales_order_no", false);
@@ -66,6 +70,27 @@
calculate_taxes_and_totals: function() {
return;
+ },
+
+ make_purchase_order: function() {
+ wn.model.open_mapped_doc({
+ method: "stock.doctype.material_request.material_request.make_purchase_order",
+ source_name: cur_frm.doc.name
+ })
+ },
+
+ make_supplier_quotation: function() {
+ wn.model.open_mapped_doc({
+ method: "stock.doctype.material_request.material_request.make_supplier_quotation",
+ source_name: cur_frm.doc.name
+ })
+ },
+
+ make_stock_entry: function() {
+ wn.model.open_mapped_doc({
+ method: "stock.doctype.material_request.material_request.make_stock_entry",
+ source_name: cur_frm.doc.name
+ })
}
});
@@ -96,26 +121,6 @@
if (check) {
$c('runserverobj', args={'method':'update_status', 'arg': 'Submitted','docs': wn.model.compress(make_doclist(doc.doctype, doc.name))}, function(r,rt) {
cur_frm.refresh();
-
});
}
};
-
-cur_frm.cscript['Make Purchase Order'] = function() {
- 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([
- ["Material Request", "Supplier Quotation"],
- ["Material Request Item", "Supplier Quotation Item"]]);
-};
-
-cur_frm.cscript.make_stock_entry = function() {
- cur_frm.map([
- ["Material Request", "Stock Entry"],
- ["Material Request Item", "Stock Entry Detail"]]);
-};
diff --git a/stock/doctype/material_request/material_request.py b/stock/doctype/material_request/material_request.py
index 269c4c5..3f3c212 100644
--- a/stock/doctype/material_request/material_request.py
+++ b/stock/doctype/material_request/material_request.py
@@ -250,6 +250,10 @@
def update_item(obj, target):
target.conversion_factor = 1
target.qty = flt(obj.qty) - flt(obj.ordered_qty)
+
+ def set_missing_values(source, target):
+ po = webnotes.bean(target)
+ po.run_method("set_missing_values")
doclist = get_mapped_doclist("Material Request", source_name, {
"Material Request": {
@@ -269,6 +273,68 @@
},
"postprocess": update_item
}
- }, target_doclist)
+ }, target_doclist, set_missing_values)
+
+ return [d.fields for d in doclist]
+
+@webnotes.whitelist()
+def make_supplier_quotation(source_name, target_doclist=None):
+ from webnotes.model.mapper import get_mapped_doclist
+
+ def set_missing_values(source, target):
+ sq = webnotes.bean(target)
+ sq.run_method("set_missing_values")
+
+ doclist = get_mapped_doclist("Material Request", source_name, {
+ "Material Request": {
+ "doctype": "Supplier Quotation",
+ "validation": {
+ "docstatus": ["=", 1],
+ "material_request_type": ["=", "Purchase"]
+ }
+ },
+ "Material Request Item": {
+ "doctype": "Supplier Quotation Item",
+ "field_map": {
+ "name": "prevdoc_detail_docname",
+ "parent": "prevdoc_docname",
+ "parenttype": "prevdoc_doctype"
+ }
+ }
+ }, target_doclist, set_missing_values)
+
+ return [d.fields for d in doclist]
+
+@webnotes.whitelist()
+def make_stock_entry(source_name, target_doclist=None):
+ from webnotes.model.mapper import get_mapped_doclist
+
+ def set_purpose(source, target):
+ target[0].purpose = "Material Transfer"
+
+ def update_item(source, target):
+ target.conversion_factor = 1
+ target.qty = flt(source.qty) - flt(source.ordered_qty)
+
+
+ doclist = get_mapped_doclist("Material Request", source_name, {
+ "Material Request": {
+ "doctype": "Stock Entry",
+ "validation": {
+ "docstatus": ["=", 1],
+ "material_request_type": ["=", "Transfer"]
+ }
+ },
+ "Material Request Item": {
+ "doctype": "Stock Entry Detail",
+ "field_map": {
+ "name": "material_request_item",
+ "parent": "material_request",
+ "uom": "stock_uom",
+ "warehouse": "t_warehouse"
+ },
+ "postprocess": update_item
+ }
+ }, target_doclist, set_purpose)
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 f26773b..daf31ad 100644
--- a/stock/doctype/material_request/test_material_request.py
+++ b/stock/doctype/material_request/test_material_request.py
@@ -20,6 +20,38 @@
self.assertEquals(po[0]["doctype"], "Purchase Order")
self.assertEquals(len(po), len(mr.doclist))
+
+ def test_make_supplier_quotation(self):
+ from stock.doctype.material_request.material_request import make_supplier_quotation
+
+ mr = webnotes.bean(copy=test_records[0]).insert()
+
+ self.assertRaises(webnotes.ValidationError, make_supplier_quotation,
+ mr.doc.name)
+
+ mr = webnotes.bean("Material Request", mr.doc.name)
+ mr.submit()
+ sq = make_supplier_quotation(mr.doc.name)
+
+ self.assertEquals(sq[0]["doctype"], "Supplier Quotation")
+ self.assertEquals(len(sq), len(mr.doclist))
+
+
+ def test_make_stock_entry(self):
+ from stock.doctype.material_request.material_request import make_stock_entry
+
+ mr = webnotes.bean(copy=test_records[0]).insert()
+
+ self.assertRaises(webnotes.ValidationError, make_stock_entry,
+ mr.doc.name)
+
+ mr = webnotes.bean("Material Request", mr.doc.name)
+ mr.doc.material_request_type = "Transfer"
+ mr.submit()
+ se = make_stock_entry(mr.doc.name)
+
+ self.assertEquals(se[0]["doctype"], "Stock Entry")
+ self.assertEquals(len(se), len(mr.doclist))
def _test_expected(self, doclist, expected_values):
for i, expected in enumerate(expected_values):