Merge branch 'responsive' of github.com:webnotes/erpnext into responsive

This commit is contained in:
Rushabh Mehta
2013-07-05 10:51:51 +05:30
20 changed files with 277 additions and 344 deletions

View File

@@ -287,8 +287,14 @@ class DocType(DocListController):
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
def on_rename(self,newdn,olddn, merge=False):
def on_rename(self, newdn, olddn, merge=False):
webnotes.conn.sql("update tabItem set item_code = %s where name = %s", (newdn, olddn))
if self.doc.page_name:
from webnotes.webutils import clear_cache
clear_cache(self.doc.page_name)
clear_cache(self.doc.page_name)
if merge:
from stock.stock_ledger import update_entries_after
for wh in webnotes.conn.sql("""select warehouse from `tabBin`
where item_code=%s""", newdn):
update_entries_after({"item_code": newdn, "warehouse": wh})

View File

@@ -36,23 +36,27 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
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 @@ erpnext.buying.MaterialRequestController = erpnext.buying.BuyingController.exten
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,25 +121,6 @@ cur_frm.cscript['Unstop Material Request'] = function(){
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() {
cur_frm.map([
["Material Request", "Purchase Order"],
["Material Request Item", "Purchase Order Item"]]);
};
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"]]);
};

View File

@@ -240,3 +240,101 @@ def _update_requested_qty(controller, mr_obj, mr_items):
"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)
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": {
"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, 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]

View File

@@ -6,6 +6,53 @@ import webnotes, unittest
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_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):
for fieldname, val in expected.items():

View File

@@ -204,3 +204,9 @@ class DocType:
else:
sql("delete from `tabStock Ledger Entry` where warehouse = %s", self.doc.name)
def on_rename(self, newdn, olddn, merge=False):
if merge:
from stock.stock_ledger import update_entries_after
for item_code in webnotes.conn.sql("""select item_code from `tabBin`
where warehouse=%s""", newdn):
update_entries_after({"item_code": item_code, "warehouse": newdn})