From 088dec6c0967eb5a0b3d171c31702a45206b3714 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 7 Apr 2014 16:00:28 +0530 Subject: [PATCH] testcase fixes #478 --- erpnext/selling/doctype/lead/lead.py | 10 +- .../selling/doctype/quotation/quotation.py | 4 +- .../material_request/material_request.py | 180 +++++++++--------- .../material_request/test_material_request.py | 130 ++++++------- 4 files changed, 162 insertions(+), 162 deletions(-) diff --git a/erpnext/selling/doctype/lead/lead.py b/erpnext/selling/doctype/lead/lead.py index 2c16a1d7e0..57e73d09b4 100644 --- a/erpnext/selling/doctype/lead/lead.py +++ b/erpnext/selling/doctype/lead/lead.py @@ -77,13 +77,13 @@ def _make_customer(source_name, target_doc=None, ignore_permissions=False): def set_missing_values(source, target): if source.company_name: - target[0].customer_type = "Company" - target[0].customer_name = source.company_name + target.customer_type = "Company" + target.customer_name = source.company_name else: - target[0].customer_type = "Individual" - target[0].customer_name = source.lead_name + target.customer_type = "Individual" + target.customer_name = source.lead_name - target[0].customer_group = frappe.db.get_default("customer_group") + target.customer_group = frappe.db.get_default("customer_group") doclist = get_mapped_doc("Lead", source_name, {"Lead": { diff --git a/erpnext/selling/doctype/quotation/quotation.py b/erpnext/selling/doctype/quotation/quotation.py index 45a9d0bf32..f5c2050e64 100644 --- a/erpnext/selling/doctype/quotation/quotation.py +++ b/erpnext/selling/doctype/quotation/quotation.py @@ -105,8 +105,8 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False): def set_missing_values(source, target): if customer: - target[0].customer = customer.name - target[0].customer_name = customer.customer_name + target.customer = customer.name + target.customer_name = customer.customer_name si = frappe.get_doc(target) si.ignore_permissions = ignore_permissions diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py index 756f540db3..2b3a5fa116 100644 --- a/erpnext/stock/doctype/material_request/material_request.py +++ b/erpnext/stock/doctype/material_request/material_request.py @@ -29,84 +29,84 @@ class MaterialRequest(BuyingController): so_items[d.sales_order_no][d.item_code] = flt(d.qty) else: so_items[d.sales_order_no][d.item_code] += flt(d.qty) - + for so_no in so_items.keys(): for item in so_items[so_no].keys(): - already_indented = frappe.db.sql("""select sum(ifnull(qty, 0)) - from `tabMaterial Request Item` - where item_code = %s and sales_order_no = %s and + already_indented = frappe.db.sql("""select sum(ifnull(qty, 0)) + from `tabMaterial Request Item` + where item_code = %s and sales_order_no = %s and docstatus = 1 and parent != %s""", (item, so_no, self.name)) already_indented = already_indented and flt(already_indented[0][0]) or 0 - - actual_so_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabSales Order Item` + + actual_so_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabSales Order Item` where parent = %s and item_code = %s and docstatus = 1""", (so_no, item)) actual_so_qty = actual_so_qty and flt(actual_so_qty[0][0]) or 0 - + if actual_so_qty and (flt(so_items[so_no][item]) + already_indented > actual_so_qty): frappe.throw("You can raise indent of maximum qty: %s for item: %s against sales order: %s\ \n Anyway, you can add more qty in new row for the same item." % (actual_so_qty - already_indented, item, so_no)) - + def validate_schedule_date(self): for d in self.get('indent_details'): if d.schedule_date < self.transaction_date: frappe.throw(_("Expected Date cannot be before Material Request Date")) - + # Validate # --------------------- def validate(self): super(MaterialRequest, self).validate() - + self.validate_schedule_date() self.validate_uom_is_integer("uom", "qty") - + if not self.status: self.status = "Draft" from erpnext.utilities import validate_status validate_status(self.status, ["Draft", "Submitted", "Stopped", "Cancelled"]) - + self.validate_value("material_request_type", "in", ["Purchase", "Transfer"]) pc_obj = frappe.get_doc('Purchase Common') pc_obj.validate_for_items(self) - + # self.validate_qty_against_so() # NOTE: Since Item BOM and FG quantities are combined, using current data, it cannot be validated # Though the creation of Material Request from a Production Plan can be rethought to fix this - + def update_bin(self, is_submit, is_stopped): """ Update Quantity Requested for Purchase in Bin for Material Request of type 'Purchase'""" - + from erpnext.stock.utils import update_bin for d in self.get('indent_details'): if frappe.db.get_value("Item", d.item_code, "is_stock_item") == "Yes": if not d.warehouse: - frappe.throw("Please Enter Warehouse for Item %s as it is stock item" + frappe.throw("Please Enter Warehouse for Item %s as it is stock item" % cstr(d.item_code)) - + qty =flt(d.qty) if is_stopped: qty = (d.qty > d.ordered_qty) and flt(flt(d.qty) - flt(d.ordered_qty)) or 0 - + args = { "item_code": d.item_code, "warehouse": d.warehouse, "indented_qty": (is_submit and 1 or -1) * flt(qty), "posting_date": self.transaction_date } - update_bin(args) - + update_bin(args) + def on_submit(self): frappe.db.set(self, 'status', 'Submitted') self.update_bin(is_submit = 1, is_stopped = 0) - + def check_modified_date(self): - mod_db = frappe.db.sql("""select modified from `tabMaterial Request` where name = %s""", + mod_db = frappe.db.sql("""select modified from `tabMaterial Request` where name = %s""", self.name) date_diff = frappe.db.sql("""select TIMEDIFF('%s', '%s')""" % (mod_db[0][0], cstr(self.modified))) - + if date_diff and date_diff[0][0]: frappe.throw(cstr(self.doctype) + " => " + cstr(self.name) + " has been modified. Please Refresh.") @@ -115,93 +115,93 @@ class MaterialRequest(BuyingController): # Step 1:=> Update Bin self.update_bin(is_submit = (status == 'Submitted') and 1 or 0, is_stopped = 1) - # Step 2:=> Set status + # Step 2:=> Set status frappe.db.set(self, 'status', cstr(status)) - + # Step 3:=> Acknowledge User msgprint(self.doctype + ": " + self.name + " has been %s." % ((status == 'Submitted') and 'Unstopped' or cstr(status))) - + def on_cancel(self): # Step 1:=> Get Purchase Common Obj pc_obj = frappe.get_doc('Purchase Common') - + # Step 2:=> Check for stopped status pc_obj.check_for_stopped_status(self.doctype, self.name) - + # Step 3:=> Check if Purchase Order has been submitted against current Material Request pc_obj.check_docstatus(check = 'Next', doctype = 'Purchase Order', docname = self.name, detail_doctype = 'Purchase Order Item') # Step 4:=> Update Bin self.update_bin(is_submit = 0, is_stopped = (cstr(self.status) == 'Stopped') and 1 or 0) - + # Step 5:=> Set Status frappe.db.set(self,'status','Cancelled') - + def update_completed_qty(self, mr_items=None): if self.material_request_type != "Transfer": return - + item_doclist = self.get("indent_details") - + if not mr_items: mr_items = [d.name for d in item_doclist] - + per_ordered = 0.0 for d in item_doclist: if d.name in mr_items: - d.ordered_qty = flt(frappe.db.sql("""select sum(transfer_qty) - from `tabStock Entry Detail` where material_request = %s - and material_request_item = %s and docstatus = 1""", + d.ordered_qty = flt(frappe.db.sql("""select sum(transfer_qty) + from `tabStock Entry Detail` where material_request = %s + and material_request_item = %s and docstatus = 1""", (self.name, d.name))[0][0]) frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty) - + # note: if qty is 0, its row is still counted in len(item_doclist) # hence adding 1 to per_ordered if (d.ordered_qty > d.qty) or not d.qty: per_ordered += 1.0 elif d.qty > 0: per_ordered += flt(d.ordered_qty / flt(d.qty)) - + self.per_ordered = flt((per_ordered / flt(len(item_doclist))) * 100.0, 2) frappe.db.set_value(self.doctype, self.name, "per_ordered", self.per_ordered) - + def update_completed_qty(doc, method): if doc.doctype == "Stock Entry": material_request_map = {} - + for d in doc.get("mtn_details"): if d.material_request: material_request_map.setdefault(d.material_request, []).append(d.material_request_item) - + for mr_name, mr_items in material_request_map.items(): mr_obj = frappe.get_doc("Material Request", mr_name) mr_doctype = frappe.get_meta("Material Request") - + if mr_obj.status in ["Stopped", "Cancelled"]: - frappe.throw(_("Material Request") + ": %s, " % mr_obj.name + frappe.throw(_("Material Request") + ": %s, " % mr_obj.name + _(mr_doctype.get_label("status")) + " = %s. " % _(mr_obj.status) + _("Cannot continue."), exc=frappe.InvalidStatusError) - + _update_requested_qty(doc, mr_obj, mr_items) - + # update ordered percentage and qty mr_obj.update_completed_qty(mr_items) - + def _update_requested_qty(doc, mr_obj, mr_items): """update requested qty (before ordered_qty is updated)""" from erpnext.stock.utils import update_bin for mr_item_name in mr_items: mr_item = mr_obj.get("indent_details", {"name": mr_item_name}) - se_detail = doc.get("mtn_details", {"material_request": mr_obj.name, + se_detail = doc.get("mtn_details", {"material_request": mr_obj.name, "material_request_item": mr_item_name}) - + if mr_item and se_detail: mr_item = mr_item[0] se_detail = se_detail[0] mr_item.ordered_qty = flt(mr_item.ordered_qty) mr_item.qty = flt(mr_item.qty) se_detail.transfer_qty = flt(se_detail.transfer_qty) - + if se_detail.docstatus == 2 and mr_item.ordered_qty > mr_item.qty \ and se_detail.transfer_qty == mr_item.ordered_qty: add_indented_qty = mr_item.qty @@ -210,7 +210,7 @@ def _update_requested_qty(doc, mr_obj, mr_items): add_indented_qty = mr_item.qty - mr_item.ordered_qty else: add_indented_qty = se_detail.transfer_qty - + update_bin({ "item_code": se_detail.item_code, "warehouse": se_detail.t_warehouse, @@ -221,7 +221,7 @@ def _update_requested_qty(doc, mr_obj, mr_items): def set_missing_values(source, target_doc): po = frappe.get_doc(target_doc) 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) @@ -232,18 +232,18 @@ def make_purchase_order(source_name, target_doc=None): doclist = get_mapped_doc("Material Request", source_name, { "Material Request": { - "doctype": "Purchase Order", + "doctype": "Purchase Order", "validation": { "docstatus": ["=", 1], "material_request_type": ["=", "Purchase"] } - }, + }, "Material Request Item": { - "doctype": "Purchase Order Item", + "doctype": "Purchase Order Item", "field_map": [ - ["name", "prevdoc_detail_docname"], - ["parent", "prevdoc_docname"], - ["parenttype", "prevdoc_doctype"], + ["name", "prevdoc_detail_docname"], + ["parent", "prevdoc_docname"], + ["parenttype", "prevdoc_doctype"], ["uom", "stock_uom"], ["uom", "uom"] ], @@ -252,7 +252,7 @@ def make_purchase_order(source_name, target_doc=None): }, target_doc, set_missing_values) return doclist.as_dict() - + @frappe.whitelist() def make_purchase_order_based_on_supplier(source_name, target_doc=None): from frappe.model.mapper import get_mapped_doc @@ -261,44 +261,44 @@ def make_purchase_order_based_on_supplier(source_name, target_doc=None): import json target_doc = frappe.get_doc(json.loads(target_doc)) target_doc = target_doc.get({"parentfield": ["!=", "po_details"]}) - + material_requests, supplier_items = get_material_requests_based_on_supplier(source_name) - + def postprocess(source, target_doc): target_doc[0].supplier = source_name set_missing_values(source, target_doc) - + po_items = target_doc.get({"parentfield": "po_details"}) target_doc = target_doc.get({"parentfield": ["!=", "po_details"]}) + \ - [d for d in po_items + [d for d in po_items if d.get("item_code") in supplier_items and d.get("qty") > 0] - + return target_doc - + for mr in material_requests: target_doc = get_mapped_doc("Material Request", mr, { "Material Request": { - "doctype": "Purchase Order", - }, + "doctype": "Purchase Order", + }, "Material Request Item": { - "doctype": "Purchase Order Item", + "doctype": "Purchase Order Item", "field_map": [ - ["name", "prevdoc_detail_docname"], - ["parent", "prevdoc_docname"], - ["parenttype", "prevdoc_doctype"], + ["name", "prevdoc_detail_docname"], + ["parent", "prevdoc_docname"], + ["parenttype", "prevdoc_doctype"], ["uom", "stock_uom"], ["uom", "uom"] ], "postprocess": update_item } }, target_doc, postprocess) - + return target_doc.as_dict() - + def get_material_requests_based_on_supplier(supplier): - supplier_items = [d[0] for d in frappe.db.get_values("Item", + supplier_items = [d[0] for d in frappe.db.get_values("Item", {"default_supplier": supplier})] - material_requests = frappe.db.sql_list("""select distinct mr.name + material_requests = frappe.db.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) @@ -308,59 +308,59 @@ def get_material_requests_based_on_supplier(supplier): and mr.status != 'Stopped'""" % ', '.join(['%s']*len(supplier_items)), tuple(supplier_items)) return material_requests, supplier_items - + @frappe.whitelist() def make_supplier_quotation(source_name, target_doc=None): from frappe.model.mapper import get_mapped_doc doclist = get_mapped_doc("Material Request", source_name, { "Material Request": { - "doctype": "Supplier Quotation", + "doctype": "Supplier Quotation", "validation": { "docstatus": ["=", 1], "material_request_type": ["=", "Purchase"] } - }, + }, "Material Request Item": { - "doctype": "Supplier Quotation Item", + "doctype": "Supplier Quotation Item", "field_map": { - "name": "prevdoc_detail_docname", - "parent": "prevdoc_docname", + "name": "prevdoc_detail_docname", + "parent": "prevdoc_docname", "parenttype": "prevdoc_doctype" } } }, target_doc, set_missing_values) return doclist.as_dict() - + @frappe.whitelist() def make_stock_entry(source_name, target_doc=None): from frappe.model.mapper import get_mapped_doc - + def update_item(obj, target, source_parent): target.conversion_factor = 1 target.qty = flt(obj.qty) - flt(obj.ordered_qty) target.transfer_qty = flt(obj.qty) - flt(obj.ordered_qty) - + def set_missing_values(source, target): - target[0].purpose = "Material Transfer" + target.purpose = "Material Transfer" se = frappe.get_doc(target) se.run_method("get_stock_and_rate") doclist = get_mapped_doc("Material Request", source_name, { "Material Request": { - "doctype": "Stock Entry", + "doctype": "Stock Entry", "validation": { "docstatus": ["=", 1], "material_request_type": ["=", "Transfer"] } - }, + }, "Material Request Item": { - "doctype": "Stock Entry Detail", + "doctype": "Stock Entry Detail", "field_map": { - "name": "material_request_item", - "parent": "material_request", - "uom": "stock_uom", + "name": "material_request_item", + "parent": "material_request", + "uom": "stock_uom", "warehouse": "t_warehouse" }, "postprocess": update_item diff --git a/erpnext/stock/doctype/material_request/test_material_request.py b/erpnext/stock/doctype/material_request/test_material_request.py index 6d10d40059..f27fadbc65 100644 --- a/erpnext/stock/doctype/material_request/test_material_request.py +++ b/erpnext/stock/doctype/material_request/test_material_request.py @@ -17,89 +17,89 @@ class TestMaterialRequest(unittest.TestCase): mr = frappe.copy_doc(test_records[0]).insert() - self.assertRaises(frappe.ValidationError, make_purchase_order, + self.assertRaises(frappe.ValidationError, make_purchase_order, mr.name) mr = frappe.get_doc("Material Request", mr.name) mr.submit() po = make_purchase_order(mr.name) - + self.assertEquals(po[0]["doctype"], "Purchase Order") self.assertEquals(len(po), len(mr)) - + def test_make_supplier_quotation(self): from erpnext.stock.doctype.material_request.material_request import make_supplier_quotation mr = frappe.copy_doc(test_records[0]).insert() - self.assertRaises(frappe.ValidationError, make_supplier_quotation, + self.assertRaises(frappe.ValidationError, make_supplier_quotation, mr.name) mr = frappe.get_doc("Material Request", mr.name) mr.submit() sq = make_supplier_quotation(mr.name) - + self.assertEquals(sq[0]["doctype"], "Supplier Quotation") self.assertEquals(len(sq), len(mr)) - - + + def test_make_stock_entry(self): from erpnext.stock.doctype.material_request.material_request import make_stock_entry mr = frappe.copy_doc(test_records[0]).insert() - self.assertRaises(frappe.ValidationError, make_stock_entry, + self.assertRaises(frappe.ValidationError, make_stock_entry, mr.name) mr = frappe.get_doc("Material Request", mr.name) mr.material_request_type = "Transfer" mr.submit() se = make_stock_entry(mr.name) - + self.assertEquals(se[0]["doctype"], "Stock Entry") self.assertEquals(len(se), len(mr)) - + def _test_expected(self, doc, expected_values): for i, expected in enumerate(expected_values): for fieldname, val in expected.items(): - self.assertEquals(val, doc[i].get(fieldname)) - + self.assertEquals(val, doc.get(fieldname)) + def _test_requested_qty(self, qty1, qty2): self.assertEqual(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 100", "warehouse": "_Test Warehouse - _TC"}, "indented_qty")), qty1) self.assertEqual(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 200", "warehouse": "_Test Warehouse - _TC"}, "indented_qty")), qty2) - + def _insert_stock_entry(self, qty1, qty2): se = frappe.get_doc({ - "company": "_Test Company", - "doctype": "Stock Entry", - "posting_date": "2013-03-01", - "posting_time": "00:00:00", + "company": "_Test Company", + "doctype": "Stock Entry", + "posting_date": "2013-03-01", + "posting_time": "00:00:00", "purpose": "Material Receipt", "fiscal_year": "_Test Fiscal Year 2013", "mtn_details": [ { - "conversion_factor": 1.0, - "doctype": "Stock Entry Detail", + "conversion_factor": 1.0, + "doctype": "Stock Entry Detail", "item_code": "_Test Item Home Desktop 100", - "parentfield": "mtn_details", + "parentfield": "mtn_details", "incoming_rate": 100, - "qty": qty1, - "stock_uom": "_Test UOM 1", - "transfer_qty": qty1, + "qty": qty1, + "stock_uom": "_Test UOM 1", + "transfer_qty": qty1, "uom": "_Test UOM 1", "t_warehouse": "_Test Warehouse 1 - _TC", }, { - "conversion_factor": 1.0, - "doctype": "Stock Entry Detail", + "conversion_factor": 1.0, + "doctype": "Stock Entry Detail", "item_code": "_Test Item Home Desktop 200", - "parentfield": "mtn_details", + "parentfield": "mtn_details", "incoming_rate": 100, - "qty": qty2, - "stock_uom": "_Test UOM 1", - "transfer_qty": qty2, + "qty": qty2, + "stock_uom": "_Test UOM 1", + "transfer_qty": qty2, "uom": "_Test UOM 1", "t_warehouse": "_Test Warehouse 1 - _TC", } @@ -107,20 +107,20 @@ class TestMaterialRequest(unittest.TestCase): }) se.insert() se.submit() - + def test_completed_qty_for_purchase(self): frappe.db.sql("""delete from `tabBin`""") - + # submit material request of type Purchase mr = frappe.copy_doc(test_records[0]) mr.insert() mr.submit() - + # check if per complete is None self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) - + self._test_requested_qty(54.0, 3.0) - + # map a purchase order from erpnext.stock.doctype.material_request.material_request import make_purchase_order po_doc = make_purchase_order(mr.name) @@ -131,34 +131,34 @@ class TestMaterialRequest(unittest.TestCase): po_doc.get("po_details")[0]["schedule_date"] = "2013-07-09" po_doc.get("po_details")[1]["schedule_date"] = "2013-07-09" - + # check for stopped status of Material Request po = frappe.copy_doc(po_doc) po.insert() - mr.obj.update_status('Stopped') + mr.update_status('Stopped') self.assertRaises(frappe.ValidationError, po.submit) self.assertRaises(frappe.ValidationError, po.cancel) - mr.obj.update_status('Submitted') + mr.update_status('Submitted') po = frappe.copy_doc(po_doc) po.insert() po.submit() - + # check if per complete is as expected mr.load_from_db() self._test_expected(mr, [{"per_ordered": 50}, {"ordered_qty": 27.0}, {"ordered_qty": 1.5}]) self._test_requested_qty(27.0, 1.5) - + po.cancel() # check if per complete is as expected mr.load_from_db() self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) self._test_requested_qty(54.0, 3.0) - + def test_completed_qty_for_transfer(self): frappe.db.sql("""delete from `tabBin`""") frappe.db.sql("""delete from `tabStock Ledger Entry`""") - + # submit material request of type Purchase mr = frappe.copy_doc(test_records[0]) mr.material_request_type = "Transfer" @@ -167,11 +167,11 @@ class TestMaterialRequest(unittest.TestCase): # check if per complete is None self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) - + self._test_requested_qty(54.0, 3.0) from erpnext.stock.doctype.material_request.material_request import make_stock_entry - + # map a stock entry se_doc = make_stock_entry(mr.name) se_doc.update({ @@ -191,37 +191,37 @@ class TestMaterialRequest(unittest.TestCase): "s_warehouse": "_Test Warehouse 1 - _TC", "incoming_rate": 1.0 }) - + # make available the qty in _Test Warehouse 1 before transfer self._insert_stock_entry(27.0, 1.5) - + # check for stopped status of Material Request se = frappe.copy_doc(se_doc) se.insert() - mr.obj.update_status('Stopped') + mr.update_status('Stopped') self.assertRaises(frappe.ValidationError, se.submit) self.assertRaises(frappe.ValidationError, se.cancel) - - mr.obj.update_status('Submitted') + + mr.update_status('Submitted') se = frappe.copy_doc(se_doc) se.insert() se.submit() - + # check if per complete is as expected mr.load_from_db() self._test_expected(mr, [{"per_ordered": 50}, {"ordered_qty": 27.0}, {"ordered_qty": 1.5}]) self._test_requested_qty(27.0, 1.5) - + # check if per complete is as expected for Stock Entry cancelled se.cancel() mr.load_from_db() self._test_expected(mr, [{"per_ordered": 0}, {"ordered_qty": 0}, {"ordered_qty": 0}]) self._test_requested_qty(54.0, 3.0) - + def test_completed_qty_for_over_transfer(self): frappe.db.sql("""delete from `tabBin`""") frappe.db.sql("""delete from `tabStock Ledger Entry`""") - + # submit material request of type Purchase mr = frappe.copy_doc(test_records[0]) mr.material_request_type = "Transfer" @@ -230,9 +230,9 @@ class TestMaterialRequest(unittest.TestCase): # check if per complete is None self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) - + self._test_requested_qty(54.0, 3.0) - + # map a stock entry from erpnext.stock.doctype.material_request.material_request import make_stock_entry @@ -257,30 +257,30 @@ class TestMaterialRequest(unittest.TestCase): # make available the qty in _Test Warehouse 1 before transfer self._insert_stock_entry(60.0, 3.0) - + # check for stopped status of Material Request se = frappe.copy_doc(se_doc) se.insert() - mr.obj.update_status('Stopped') + mr.update_status('Stopped') self.assertRaises(frappe.ValidationError, se.submit) self.assertRaises(frappe.ValidationError, se.cancel) - - mr.obj.update_status('Submitted') + + mr.update_status('Submitted') se = frappe.copy_doc(se_doc) se.insert() se.submit() - + # check if per complete is as expected mr.load_from_db() self._test_expected(mr, [{"per_ordered": 100}, {"ordered_qty": 60.0}, {"ordered_qty": 3.0}]) self._test_requested_qty(0.0, 0.0) - + # check if per complete is as expected for Stock Entry cancelled se.cancel() mr.load_from_db() self._test_expected(mr, [{"per_ordered": 0}, {"ordered_qty": 0}, {"ordered_qty": 0}]) self._test_requested_qty(54.0, 3.0) - + def test_incorrect_mapping_of_stock_entry(self): # submit material request of type Purchase mr = frappe.copy_doc(test_records[0]) @@ -290,7 +290,7 @@ class TestMaterialRequest(unittest.TestCase): # map a stock entry from erpnext.stock.doctype.material_request.material_request import make_stock_entry - + se_doc = make_stock_entry(mr.name) se_doc.update({ "posting_date": "2013-03-01", @@ -310,11 +310,11 @@ class TestMaterialRequest(unittest.TestCase): "s_warehouse": "_Test Warehouse 1 - _TC", "incoming_rate": 1.0 }) - + # check for stopped status of Material Request se = frappe.copy_doc(se_doc) self.assertRaises(frappe.MappingMismatchError, se.insert) - + def test_warehouse_company_validation(self): from erpnext.stock.utils import InvalidWarehouseCompany mr = frappe.copy_doc(test_records[0]) @@ -322,4 +322,4 @@ class TestMaterialRequest(unittest.TestCase): self.assertRaises(InvalidWarehouseCompany, mr.insert) test_dependencies = ["Currency Exchange"] -test_records = frappe.get_test_records('Material Request') \ No newline at end of file +test_records = frappe.get_test_records('Material Request')