Fixed rest of the test cases frappe/frapp#478

This commit is contained in:
Anand Doshi 2014-04-09 19:20:01 +05:30
parent d29465029d
commit 9fd50bcfb6
23 changed files with 705 additions and 656 deletions

View File

@ -17,7 +17,10 @@ from erpnext.accounts.party import get_party_account, get_due_date
class PurchaseInvoice(BuyingController): class PurchaseInvoice(BuyingController):
tname = 'Purchase Invoice Item' tname = 'Purchase Invoice Item'
fname = 'entries' fname = 'entries'
status_updater = [{
def __init__(self, arg1, arg2=None):
super(PurchaseInvoice, self).__init__(arg1, arg2)
self.status_updater = [{
'source_dt': 'Purchase Invoice Item', 'source_dt': 'Purchase Invoice Item',
'target_dt': 'Purchase Order Item', 'target_dt': 'Purchase Order Item',
'join_field': 'po_detail', 'join_field': 'po_detail',

View File

@ -20,7 +20,10 @@ from erpnext.controllers.selling_controller import SellingController
class SalesInvoice(SellingController): class SalesInvoice(SellingController):
tname = 'Sales Invoice Item' tname = 'Sales Invoice Item'
fname = 'entries' fname = 'entries'
status_updater = [{
def __init__(self, arg1, arg2=None):
super(SalesInvoice, self).__init__(arg1, arg2)
self.status_updater = [{
'source_dt': 'Sales Invoice Item', 'source_dt': 'Sales Invoice Item',
'target_field': 'billed_amt', 'target_field': 'billed_amt',
'target_ref_field': 'amount', 'target_ref_field': 'amount',

View File

@ -153,7 +153,7 @@ class PurchaseCommon(BuyingController):
status = 'Stopped'""" % (doctype, '%s'), docname) status = 'Stopped'""" % (doctype, '%s'), docname)
if stopped: if stopped:
frappe.throw("One cannot do any transaction against %s : %s, it's status is 'Stopped'" % frappe.throw("One cannot do any transaction against %s : %s, it's status is 'Stopped'" %
(doctype, docname)) (doctype, docname), exc=frappe.InvalidStatusError)
def check_docstatus(self, check, doctype, docname, detail_doctype = ''): def check_docstatus(self, check, doctype, docname, detail_doctype = ''):
if check == 'Next': if check == 'Next':

View File

@ -3,17 +3,17 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe.utils import cstr, flt from frappe.utils import cstr, flt
from frappe import msgprint from frappe import msgprint
from erpnext.controllers.buying_controller import BuyingController from erpnext.controllers.buying_controller import BuyingController
class PurchaseOrder(BuyingController): class PurchaseOrder(BuyingController):
tname = 'Purchase Order Item' tname = 'Purchase Order Item'
fname = 'po_details' fname = 'po_details'
status_updater = [{
def __init__(self, arg1, arg2=None):
super(PurchaseOrder, self).__init__(arg1, arg2)
self.status_updater = [{
'source_dt': 'Purchase Order Item', 'source_dt': 'Purchase Order Item',
'target_dt': 'Material Request Item', 'target_dt': 'Material Request Item',
'join_field': 'prevdoc_detail_docname', 'join_field': 'prevdoc_detail_docname',
@ -156,7 +156,7 @@ class PurchaseOrder(BuyingController):
frappe.db.set(self,'status','Submitted') frappe.db.set(self,'status','Submitted')
def on_cancel(self): def on_cancel(self):
pc_obj = frappe.get_doc(dt = 'Purchase Common') pc_obj = frappe.get_doc('Purchase Common')
self.check_for_stopped_status(pc_obj) self.check_for_stopped_status(pc_obj)
# Check if Purchase Receipt has been submitted against current Purchase Order # Check if Purchase Receipt has been submitted against current Purchase Order

View File

@ -150,7 +150,6 @@ class StatusUpdater(DocListController):
""" """
Checks if there is overflow condering a relaxation tolerance Checks if there is overflow condering a relaxation tolerance
""" """
# check if overflow is within tolerance # check if overflow is within tolerance
tolerance, self.tolerance, self.global_tolerance = get_tolerance_for(item['item_code'], tolerance, self.tolerance, self.global_tolerance = get_tolerance_for(item['item_code'],
self.tolerance, self.global_tolerance) self.tolerance, self.global_tolerance)

View File

@ -79,7 +79,7 @@ def make_feed(feedtype, doctype, name, owner, subject, color):
f.subject = subject f.subject = subject
f.color = color f.color = color
f.full_name = get_fullname(owner) f.full_name = get_fullname(owner)
f.save() f.save(ignore_permissions=True)
def update_feed(doc, method=None): def update_feed(doc, method=None):
"adds a new feed" "adds a new feed"

View File

@ -14,7 +14,10 @@ from erpnext.utilities.transaction_base import TransactionBase
class InstallationNote(TransactionBase): class InstallationNote(TransactionBase):
tname = 'Installation Note Item' tname = 'Installation Note Item'
fname = 'installed_item_details' fname = 'installed_item_details'
status_updater = [{
def __init__(self, arg1, arg2=None):
super(InstallationNote, self).__init__(arg1, arg2)
self.status_updater = [{
'source_dt': 'Installation Note Item', 'source_dt': 'Installation Note Item',
'target_dt': 'Delivery Note Item', 'target_dt': 'Delivery Note Item',
'target_field': 'installed_qty', 'target_field': 'installed_qty',

View File

@ -21,9 +21,9 @@ class TestQuotation(unittest.TestCase):
sales_order = make_sales_order(quotation.name) sales_order = make_sales_order(quotation.name)
self.assertEquals(sales_order.doctype, "Sales Order") self.assertEquals(sales_order.doctype, "Sales Order")
self.assertEquals(len(sales_order.get("sales_order_details")), 2) self.assertEquals(len(sales_order.get("sales_order_details")), 1)
self.assertEquals(sales_order.get("sales_order_details")[0]["doctype"], "Sales Order Item") self.assertEquals(sales_order.get("sales_order_details")[0].doctype, "Sales Order Item")
self.assertEquals(sales_order.get("sales_order_details")[0]["prevdoc_docname"], quotation.name) self.assertEquals(sales_order.get("sales_order_details")[0].prevdoc_docname, quotation.name)
self.assertEquals(sales_order.customer, "_Test Customer") self.assertEquals(sales_order.customer, "_Test Customer")
sales_order.delivery_date = "2014-01-01" sales_order.delivery_date = "2014-01-01"

View File

@ -281,10 +281,10 @@ def make_material_request(source_name, target_doc=None):
@frappe.whitelist() @frappe.whitelist()
def make_delivery_note(source_name, target_doc=None): def make_delivery_note(source_name, target_doc=None):
def update_item(obj, target, source_parent): def update_item(source, target, source_parent):
target.base_amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.base_rate) target.base_amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.base_rate)
target.amount = (flt(obj.qty) - flt(obj.delivered_qty)) * flt(obj.rate) target.amount = (flt(source.qty) - flt(source.delivered_qty)) * flt(source.rate)
target.qty = flt(obj.qty) - flt(obj.delivered_qty) target.qty = flt(source.qty) - flt(source.delivered_qty)
doclist = get_mapped_doc("Sales Order", source_name, { doclist = get_mapped_doc("Sales Order", source_name, {
"Sales Order": { "Sales Order": {
@ -326,10 +326,10 @@ def make_sales_invoice(source_name, target_doc=None):
doc.is_pos = 0 doc.is_pos = 0
doc.run_method("onload_post_render") doc.run_method("onload_post_render")
def update_item(obj, target, source_parent): def update_item(source, target, source_parent):
target.amount = flt(obj.amount) - flt(obj.billed_amt) target.amount = flt(source.amount) - flt(source.billed_amt)
target.base_amount = target.amount * flt(source_parent.conversion_rate) target.base_amount = target.amount * flt(source_parent.conversion_rate)
target.qty = obj.rate and target.amount / flt(obj.rate) or obj.qty target.qty = source.rate and target.amount / flt(source.rate) or obj.qty
doclist = get_mapped_doc("Sales Order", source_name, { doclist = get_mapped_doc("Sales Order", source_name, {
"Sales Order": { "Sales Order": {

View File

@ -106,7 +106,7 @@ class TestSalesOrder(unittest.TestCase):
def test_reserved_qty_for_so(self): def test_reserved_qty_for_so(self):
# reset bin # reset bin
so_item = test_records[0]["sales_order_details"][0] so_item = test_records[0]["sales_order_details"][0].copy()
self.delete_bin(so_item["item_code"], so_item["warehouse"]) self.delete_bin(so_item["item_code"], so_item["warehouse"])
# submit # submit
@ -120,7 +120,7 @@ class TestSalesOrder(unittest.TestCase):
def test_reserved_qty_for_partial_delivery(self): def test_reserved_qty_for_partial_delivery(self):
# reset bin # reset bin
so_item = test_records[0]["sales_order_details"][0] so_item = test_records[0]["sales_order_details"][0].copy()
self.delete_bin(so_item["item_code"], so_item["warehouse"]) self.delete_bin(so_item["item_code"], so_item["warehouse"])
# submit so # submit so
@ -150,7 +150,7 @@ class TestSalesOrder(unittest.TestCase):
def test_reserved_qty_for_over_delivery(self): def test_reserved_qty_for_over_delivery(self):
# reset bin # reset bin
so_item = test_records[0]["sales_order_details"][0] so_item = test_records[0]["sales_order_details"][0].copy()
self.delete_bin(so_item["item_code"], so_item["warehouse"]) self.delete_bin(so_item["item_code"], so_item["warehouse"])
# submit so # submit so

View File

@ -5,10 +5,14 @@ from __future__ import unicode_literals
import frappe import frappe
from frappe.utils.nestedset import NestedSet from frappe.utils.nestedset import NestedSet
from frappe.website.website_generator import WebsiteGenerator
class ItemGroup(NestedSet): class ItemGroup(NestedSet, WebsiteGenerator):
nsm_parent_field = 'parent_item_group' nsm_parent_field = 'parent_item_group'
def autoname(self):
self.name = self.item_group_name
def validate(self): def validate(self):
if not self.parent_website_route: if not self.parent_website_route:
self.parent_website_route = frappe.get_website_route("Item Group", self.parent_website_route = frappe.get_website_route("Item Group",
@ -16,11 +20,18 @@ class ItemGroup(NestedSet):
def on_update(self): def on_update(self):
NestedSet.on_update(self) NestedSet.on_update(self)
WebsiteGenerator.on_update(self)
self.validate_name_with_item() self.validate_name_with_item()
self.validate_one_root() self.validate_one_root()
def after_rename(self, olddn, newdn, merge=False):
NestedSet.after_rename(self, olddn, newdn, merge)
WebsiteGenerator.after_rename(self, olddn, newdn, merge)
def on_trash(self):
NestedSet.on_trash(self)
WebsiteGenerator.on_trash(self)
def validate_name_with_item(self): def validate_name_with_item(self):
if frappe.db.exists("Item", self.name): if frappe.db.exists("Item", self.name):
frappe.msgprint("An item exists with same name (%s), please change the \ frappe.msgprint("An item exists with same name (%s), please change the \

View File

@ -18,7 +18,6 @@ class TestItem(unittest.TestCase):
records = test_records[2:] records = test_records[2:]
for item_group in records: for item_group in records:
item_group = item_group[0]
lft, rgt, parent_item_group = frappe.db.get_value("Item Group", item_group["item_group_name"], lft, rgt, parent_item_group = frappe.db.get_value("Item Group", item_group["item_group_name"],
["lft", "rgt", "parent_item_group"]) ["lft", "rgt", "parent_item_group"])

View File

@ -4,9 +4,12 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe.utils import cint, cstr, filter_strip_join from frappe.utils import cint, cstr, filter_strip_join
from frappe.model.document import Document from frappe.website.website_generator import WebsiteGenerator
class SalesPartner(WebsiteGenerator):
def autoname(self):
self.name = self.partner_name
class SalesPartner(Document):
def validate(self): def validate(self):
if self.partner_website and not self.partner_website.startswith("http"): if self.partner_website and not self.partner_website.startswith("http"):
self.partner_website = "http://" + self.partner_website self.partner_website = "http://" + self.partner_website

View File

@ -15,7 +15,10 @@ from erpnext.controllers.selling_controller import SellingController
class DeliveryNote(SellingController): class DeliveryNote(SellingController):
tname = 'Delivery Note Item' tname = 'Delivery Note Item'
fname = 'delivery_note_details' fname = 'delivery_note_details'
status_updater = [{
def __init__(self, arg1, arg2=None):
super(DeliveryNote, self).__init__(arg1, arg2)
self.status_updater = [{
'source_dt': 'Delivery Note Item', 'source_dt': 'Delivery Note Item',
'target_dt': 'Sales Order Item', 'target_dt': 'Sales Order Item',
'join_field': 'prevdoc_detail_docname', 'join_field': 'prevdoc_detail_docname',

View File

@ -11,7 +11,7 @@ from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import get_gl_
def _insert_purchase_receipt(item_code=None): def _insert_purchase_receipt(item_code=None):
if not item_code: if not item_code:
item_code = pr_test_records[0][1]["item_code"] item_code = pr_test_records[0]["purchase_receipt_details"][0]["item_code"]
pr = frappe.copy_doc(pr_test_records[0]) pr = frappe.copy_doc(pr_test_records[0])
pr.get("purchase_receipt_details")[0].item_code = item_code pr.get("purchase_receipt_details")[0].item_code = item_code
@ -34,10 +34,10 @@ class TestDeliveryNote(unittest.TestCase):
dn.submit() dn.submit()
si = make_sales_invoice(dn.name) si = make_sales_invoice(dn.name)
self.assertEquals(len(si), len(dn)) self.assertEquals(len(si.get("entries")), len(dn.get("delivery_note_details")))
# modify amount # modify amount
si[1]["rate"] = 200 si.get("entries")[0].rate = 200
self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert) self.assertRaises(frappe.ValidationError, frappe.get_doc(si).insert)

View File

@ -3,16 +3,13 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe.utils import cstr, flt, getdate, now_datetime, formatdate
from frappe import msgprint, _ from frappe import msgprint, _
from frappe.utils import cstr, flt, getdate, now_datetime, formatdate
from frappe.model.controller import DocListController from frappe.website.website_generator import WebsiteGenerator
class WarehouseNotSet(Exception): pass class WarehouseNotSet(Exception): pass
class Item(DocListController): class Item(WebsiteGenerator):
def onload(self): def onload(self):
self.set("__sle_exists", self.check_if_sle_exists()) self.set("__sle_exists", self.check_if_sle_exists())
@ -48,6 +45,7 @@ class Item(DocListController):
self.old_page_name = frappe.db.get_value('Item', self.name, 'page_name') self.old_page_name = frappe.db.get_value('Item', self.name, 'page_name')
def on_update(self): def on_update(self):
super(Item, self).on_update()
self.validate_name_with_item_group() self.validate_name_with_item_group()
self.update_item_price() self.update_item_price()
@ -225,6 +223,7 @@ class Item(DocListController):
return ret return ret
def on_trash(self): def on_trash(self):
super(Item, self).on_trash()
frappe.db.sql("""delete from tabBin where item_code=%s""", self.item_code) frappe.db.sql("""delete from tabBin where item_code=%s""", self.item_code)
def before_rename(self, olddn, newdn, merge=False): def before_rename(self, olddn, newdn, merge=False):
@ -242,8 +241,9 @@ class Item(DocListController):
frappe.db.sql("delete from `tabBin` where item_code=%s", olddn) frappe.db.sql("delete from `tabBin` where item_code=%s", olddn)
def after_rename(self, olddn, newdn, merge): def after_rename(self, olddn, newdn, merge):
frappe.db.set_value("Item", newdn, "item_code", newdn) super(Item, self).after_rename(olddn, newdn, merge)
frappe.db.set_value("Item", newdn, "item_code", newdn)
if merge: if merge:
self.set_last_purchase_rate(newdn) self.set_last_purchase_rate(newdn)
self.recalculate_bin_qty(newdn) self.recalculate_bin_qty(newdn)

View File

@ -169,11 +169,10 @@ def update_completed_qty(doc, method):
for mr_name, mr_items in material_request_map.items(): for mr_name, mr_items in material_request_map.items():
mr_obj = frappe.get_doc("Material Request", mr_name) mr_obj = frappe.get_doc("Material Request", mr_name)
mr_doctype = frappe.get_meta("Material Request")
if mr_obj.status in ["Stopped", "Cancelled"]: 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) + _(mr_obj.meta.get_label("status")) + " = %s. " % _(mr_obj.status)
+ _("Cannot continue."), exc=frappe.InvalidStatusError) + _("Cannot continue."), exc=frappe.InvalidStatusError)
_update_requested_qty(doc, mr_obj, mr_items) _update_requested_qty(doc, mr_obj, mr_items)

View File

@ -24,7 +24,7 @@ class TestMaterialRequest(unittest.TestCase):
mr.submit() mr.submit()
po = make_purchase_order(mr.name) po = make_purchase_order(mr.name)
self.assertEquals(po["doctype"], "Purchase Order") self.assertEquals(po.doctype, "Purchase Order")
self.assertEquals(len(po.get("po_details")), len(mr.get("indent_details"))) self.assertEquals(len(po.get("po_details")), len(mr.get("indent_details")))
def test_make_supplier_quotation(self): def test_make_supplier_quotation(self):
@ -38,7 +38,7 @@ class TestMaterialRequest(unittest.TestCase):
mr.submit() mr.submit()
sq = make_supplier_quotation(mr.name) sq = make_supplier_quotation(mr.name)
self.assertEquals(sq["doctype"], "Supplier Quotation") self.assertEquals(sq.doctype, "Supplier Quotation")
self.assertEquals(len(sq.get("quotation_items")), len(mr.get("indent_details"))) self.assertEquals(len(sq.get("quotation_items")), len(mr.get("indent_details")))
@ -55,14 +55,9 @@ class TestMaterialRequest(unittest.TestCase):
mr.submit() mr.submit()
se = make_stock_entry(mr.name) se = make_stock_entry(mr.name)
self.assertEquals(se["doctype"], "Stock Entry") self.assertEquals(se.doctype, "Stock Entry")
self.assertEquals(len(se.get("mtn_details")), len(mr.get("indent_details"))) self.assertEquals(len(se.get("mtn_details")), len(mr.get("indent_details")))
def _test_expected(self, doc, expected_values):
for i, expected in enumerate(expected_values):
for fieldname, val in expected.items():
self.assertEquals(val, doc.get(fieldname))
def _test_requested_qty(self, qty1, qty2): def _test_requested_qty(self, qty1, qty2):
self.assertEqual(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 100", self.assertEqual(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item Home Desktop 100",
"warehouse": "_Test Warehouse - _TC"}, "indented_qty")), qty1) "warehouse": "_Test Warehouse - _TC"}, "indented_qty")), qty1)
@ -116,28 +111,34 @@ class TestMaterialRequest(unittest.TestCase):
mr.submit() mr.submit()
# check if per complete is None # check if per complete is None
self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) self.assertEquals(mr.per_ordered, None)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)
self._test_requested_qty(54.0, 3.0) self._test_requested_qty(54.0, 3.0)
# map a purchase order # map a purchase order
from erpnext.stock.doctype.material_request.material_request import make_purchase_order from erpnext.stock.doctype.material_request.material_request import make_purchase_order
po_doc = make_purchase_order(mr.name) po_doc = make_purchase_order(mr.name)
po_doc["supplier"] = "_Test Supplier" po_doc.supplier = "_Test Supplier"
po_doc["transaction_date"] = "2013-07-07" po_doc.transaction_date = "2013-07-07"
po_doc.get("po_details")[0]["qty"] = 27.0 po_doc.get("po_details")[0].qty = 27.0
po_doc.get("po_details")[1]["qty"] = 1.5 po_doc.get("po_details")[1].qty = 1.5
po_doc.get("po_details")[0]["schedule_date"] = "2013-07-09" po_doc.get("po_details")[0].schedule_date = "2013-07-09"
po_doc.get("po_details")[1]["schedule_date"] = "2013-07-09" po_doc.get("po_details")[1].schedule_date = "2013-07-09"
# check for stopped status of Material Request # check for stopped status of Material Request
po = frappe.copy_doc(po_doc) po = frappe.copy_doc(po_doc)
po.insert() po.insert()
po.load_from_db()
mr.update_status('Stopped') mr.update_status('Stopped')
self.assertRaises(frappe.ValidationError, po.submit) self.assertRaises(frappe.InvalidStatusError, po.submit)
self.assertRaises(frappe.ValidationError, po.cancel) frappe.db.set(po, "docstatus", 1)
self.assertRaises(frappe.InvalidStatusError, po.cancel)
# resubmit and check for per complete
mr.load_from_db()
mr.update_status('Submitted') mr.update_status('Submitted')
po = frappe.copy_doc(po_doc) po = frappe.copy_doc(po_doc)
po.insert() po.insert()
@ -145,13 +146,18 @@ class TestMaterialRequest(unittest.TestCase):
# check if per complete is as expected # check if per complete is as expected
mr.load_from_db() mr.load_from_db()
self._test_expected(mr, [{"per_ordered": 50}, {"ordered_qty": 27.0}, {"ordered_qty": 1.5}]) self.assertEquals(mr.per_ordered, 50)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 27.0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 1.5)
self._test_requested_qty(27.0, 1.5) self._test_requested_qty(27.0, 1.5)
po.cancel() po.cancel()
# check if per complete is as expected # check if per complete is as expected
mr.load_from_db() mr.load_from_db()
self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) self.assertEquals(mr.per_ordered, None)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, None)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, None)
self._test_requested_qty(54.0, 3.0) self._test_requested_qty(54.0, 3.0)
def test_completed_qty_for_transfer(self): def test_completed_qty_for_transfer(self):
@ -165,7 +171,9 @@ class TestMaterialRequest(unittest.TestCase):
mr.submit() mr.submit()
# check if per complete is None # check if per complete is None
self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) self.assertEquals(mr.per_ordered, None)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)
self._test_requested_qty(54.0, 3.0) self._test_requested_qty(54.0, 3.0)
@ -198,8 +206,12 @@ class TestMaterialRequest(unittest.TestCase):
se = frappe.copy_doc(se_doc) se = frappe.copy_doc(se_doc)
se.insert() se.insert()
mr.update_status('Stopped') mr.update_status('Stopped')
self.assertRaises(frappe.ValidationError, se.submit) self.assertRaises(frappe.InvalidStatusError, se.submit)
self.assertRaises(frappe.ValidationError, se.cancel)
mr.update_status('Submitted')
se.submit()
mr.update_status('Stopped')
self.assertRaises(frappe.InvalidStatusError, se.cancel)
mr.update_status('Submitted') mr.update_status('Submitted')
se = frappe.copy_doc(se_doc) se = frappe.copy_doc(se_doc)
@ -208,13 +220,19 @@ class TestMaterialRequest(unittest.TestCase):
# check if per complete is as expected # check if per complete is as expected
mr.load_from_db() mr.load_from_db()
self._test_expected(mr, [{"per_ordered": 50}, {"ordered_qty": 27.0}, {"ordered_qty": 1.5}]) self.assertEquals(mr.per_ordered, 50)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 27.0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 1.5)
self._test_requested_qty(27.0, 1.5) self._test_requested_qty(27.0, 1.5)
# check if per complete is as expected for Stock Entry cancelled # check if per complete is as expected for Stock Entry cancelled
se.cancel() se.cancel()
mr.load_from_db() mr.load_from_db()
self._test_expected(mr, [{"per_ordered": 0}, {"ordered_qty": 0}, {"ordered_qty": 0}]) self.assertEquals(mr.per_ordered, 0)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)
self._test_requested_qty(54.0, 3.0) self._test_requested_qty(54.0, 3.0)
def test_completed_qty_for_over_transfer(self): def test_completed_qty_for_over_transfer(self):
@ -228,7 +246,9 @@ class TestMaterialRequest(unittest.TestCase):
mr.submit() mr.submit()
# check if per complete is None # check if per complete is None
self._test_expected(mr, [{"per_ordered": None}, {"ordered_qty": None}, {"ordered_qty": None}]) self.assertEquals(mr.per_ordered, None)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)
self._test_requested_qty(54.0, 3.0) self._test_requested_qty(54.0, 3.0)
@ -261,8 +281,8 @@ class TestMaterialRequest(unittest.TestCase):
se = frappe.copy_doc(se_doc) se = frappe.copy_doc(se_doc)
se.insert() se.insert()
mr.update_status('Stopped') mr.update_status('Stopped')
self.assertRaises(frappe.ValidationError, se.submit) self.assertRaises(frappe.InvalidStatusError, se.submit)
self.assertRaises(frappe.ValidationError, se.cancel) self.assertRaises(frappe.InvalidStatusError, se.cancel)
mr.update_status('Submitted') mr.update_status('Submitted')
se = frappe.copy_doc(se_doc) se = frappe.copy_doc(se_doc)
@ -271,13 +291,19 @@ class TestMaterialRequest(unittest.TestCase):
# check if per complete is as expected # check if per complete is as expected
mr.load_from_db() mr.load_from_db()
self._test_expected(mr, [{"per_ordered": 100}, {"ordered_qty": 60.0}, {"ordered_qty": 3.0}])
self.assertEquals(mr.per_ordered, 100)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 60.0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 3.0)
self._test_requested_qty(0.0, 0.0) self._test_requested_qty(0.0, 0.0)
# check if per complete is as expected for Stock Entry cancelled # check if per complete is as expected for Stock Entry cancelled
se.cancel() se.cancel()
mr.load_from_db() mr.load_from_db()
self._test_expected(mr, [{"per_ordered": 0}, {"ordered_qty": 0}, {"ordered_qty": 0}]) self.assertEquals(mr.per_ordered, 0)
self.assertEquals(mr.get("indent_details")[0].ordered_qty, 0)
self.assertEquals(mr.get("indent_details")[1].ordered_qty, 0)
self._test_requested_qty(54.0, 3.0) self._test_requested_qty(54.0, 3.0)
def test_incorrect_mapping_of_stock_entry(self): def test_incorrect_mapping_of_stock_entry(self):

View File

@ -14,8 +14,10 @@ from erpnext.controllers.buying_controller import BuyingController
class PurchaseReceipt(BuyingController): class PurchaseReceipt(BuyingController):
tname = 'Purchase Receipt Item' tname = 'Purchase Receipt Item'
fname = 'purchase_receipt_details' fname = 'purchase_receipt_details'
count = 0
status_updater = [{ def __init__(self, arg1, arg2=None):
super(PurchaseReceipt, self).__init__(arg1, arg2)
self.status_updater = [{
'source_dt': 'Purchase Receipt Item', 'source_dt': 'Purchase Receipt Item',
'target_dt': 'Purchase Order Item', 'target_dt': 'Purchase Order Item',
'join_field': 'prevdoc_detail_docname', 'join_field': 'prevdoc_detail_docname',

View File

@ -23,11 +23,11 @@ class TestPurchaseReceipt(unittest.TestCase):
pr.submit() pr.submit()
pi = make_purchase_invoice(pr.name) pi = make_purchase_invoice(pr.name)
self.assertEquals(pi["doctype"], "Purchase Invoice") self.assertEquals(pi.doctype, "Purchase Invoice")
self.assertEquals(len(pi.get("entries")), len(pr.get("purchase_receipt_details"))) self.assertEquals(len(pi.get("entries")), len(pr.get("purchase_receipt_details")))
# modify rate # modify rate
pi.get("entries")[0]["rate"] = 200 pi.get("entries")[0].rate = 200
self.assertRaises(frappe.ValidationError, frappe.get_doc(pi).submit) self.assertRaises(frappe.ValidationError, frappe.get_doc(pi).submit)
def test_purchase_receipt_no_gl_entry(self): def test_purchase_receipt_no_gl_entry(self):

View File

@ -407,14 +407,14 @@ class TestStockEntry(unittest.TestCase):
from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice, make_delivery_note from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice, make_delivery_note
actual_qty_0 = self._get_actual_qty() actual_qty_0 = self._get_actual_qty()
so = frappe.copy_doc(sales_order_test_records[0]) so = frappe.copy_doc(sales_order_test_records[0])
so.get("sales_order_details")[0].item_code = item_code so.get("sales_order_details")[0].item_code = item_code
so.get("sales_order_details")[0].qty = 5.0 so.get("sales_order_details")[0].qty = 5.0
so.insert() so.insert()
so.submit() so.submit()
dn_doc = make_delivery_note(so.name)
dn = frappe.get_doc(dn_doc) dn = make_delivery_note(so.name)
dn.status = "Draft" dn.status = "Draft"
dn.posting_date = so.delivery_date dn.posting_date = so.delivery_date
dn.insert() dn.insert()
@ -423,9 +423,7 @@ class TestStockEntry(unittest.TestCase):
actual_qty_1 = self._get_actual_qty() actual_qty_1 = self._get_actual_qty()
self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1) self.assertEquals(actual_qty_0 - delivered_qty, actual_qty_1)
si_doc = make_sales_invoice(so.name) si = make_sales_invoice(so.name)
si = frappe.get_doc(si_doc)
si.posting_date = dn.posting_date si.posting_date = dn.posting_date
si.debit_to = "_Test Customer - _TC" si.debit_to = "_Test Customer - _TC"
for d in si.get("entries"): for d in si.get("entries"):

View File

@ -196,15 +196,14 @@ class TestStockReconciliation(unittest.TestCase):
frappe.db.set_value("Item", "_Test Item", "valuation_method", valuation_method) frappe.db.set_value("Item", "_Test Item", "valuation_method", valuation_method)
frappe.db.set_default("allow_negative_stock", 1) frappe.db.set_default("allow_negative_stock", 1)
stock_entry = [ stock_entry = {
{
"company": "_Test Company", "company": "_Test Company",
"doctype": "Stock Entry", "doctype": "Stock Entry",
"posting_date": "2012-12-12", "posting_date": "2012-12-12",
"posting_time": "01:00", "posting_time": "01:00",
"purpose": "Material Receipt", "purpose": "Material Receipt",
"fiscal_year": "_Test Fiscal Year 2012", "fiscal_year": "_Test Fiscal Year 2012",
}, "mtn_details": [
{ {
"conversion_factor": 1.0, "conversion_factor": 1.0,
"doctype": "Stock Entry Detail", "doctype": "Stock Entry Detail",
@ -218,8 +217,9 @@ class TestStockReconciliation(unittest.TestCase):
"t_warehouse": "_Test Warehouse - _TC", "t_warehouse": "_Test Warehouse - _TC",
"expense_account": "Stock Adjustment - _TC", "expense_account": "Stock Adjustment - _TC",
"cost_center": "_Test Cost Center - _TC" "cost_center": "_Test Cost Center - _TC"
}, }
] ]
}
pr = frappe.copy_doc(stock_entry) pr = frappe.copy_doc(stock_entry)
pr.insert() pr.insert()

View File

@ -7,32 +7,32 @@ class TestNewsletter(unittest.TestCase):
def test_get_recipients_lead(self): def test_get_recipients_lead(self):
w = frappe.get_doc(test_records[0]) w = frappe.get_doc(test_records[0])
w.insert() w.insert()
self.assertTrue("test_lead@example.com" in w.controller.get_recipients()) self.assertTrue("test_lead@example.com" in w.get_recipients())
frappe.db.sql("""delete from `tabBulk Email`""") frappe.db.sql("""delete from `tabBulk Email`""")
w.controller.send_emails() w.send_emails()
self.assertTrue(frappe.db.get_value("Bulk Email", {"recipient": "test_lead@example.com"})) self.assertTrue(frappe.db.get_value("Bulk Email", {"recipient": "test_lead@example.com"}))
def test_get_recipients_lead_by_status(self): def test_get_recipients_lead_by_status(self):
w = frappe.get_doc(test_records[0]) w = frappe.get_doc(test_records[0])
w.lead_status="Converted" w.lead_status="Converted"
w.insert() w.insert()
self.assertTrue("test_lead3@example.com" in w.controller.get_recipients()) self.assertTrue("test_lead3@example.com" in w.get_recipients())
def test_get_recipients_contact_customer(self): def test_get_recipients_contact_customer(self):
w = frappe.get_doc(test_records[1]) w = frappe.get_doc(test_records[1])
w.insert() w.insert()
self.assertTrue("test_contact_customer@example.com" in w.controller.get_recipients()) self.assertTrue("test_contact_customer@example.com" in w.get_recipients())
def test_get_recipients_contact_supplier(self): def test_get_recipients_contact_supplier(self):
w = frappe.get_doc(test_records[1]) w = frappe.get_doc(test_records[1])
w.contact_type="Supplier" w.contact_type="Supplier"
w.insert() w.insert()
self.assertTrue("test_contact_supplier@example.com" in w.controller.get_recipients()) self.assertTrue("test_contact_supplier@example.com" in w.get_recipients())
def test_get_recipients_custom(self): def test_get_recipients_custom(self):
w = frappe.get_doc(test_records[2]) w = frappe.get_doc(test_records[2])
w.insert() w.insert()
self.assertTrue("test_custom2@example.com" in w.controller.get_recipients()) self.assertTrue("test_custom2@example.com" in w.get_recipients())
self.assertTrue(frappe.db.get("Lead", self.assertTrue(frappe.db.get("Lead",
{"email_id": "test_custom2@example.com"})) {"email_id": "test_custom2@example.com"}))