Fixed rest of the test cases frappe/frapp#478
This commit is contained in:
parent
d29465029d
commit
9fd50bcfb6
@ -17,17 +17,20 @@ 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 = [{
|
|
||||||
'source_dt': 'Purchase Invoice Item',
|
def __init__(self, arg1, arg2=None):
|
||||||
'target_dt': 'Purchase Order Item',
|
super(PurchaseInvoice, self).__init__(arg1, arg2)
|
||||||
'join_field': 'po_detail',
|
self.status_updater = [{
|
||||||
'target_field': 'billed_amt',
|
'source_dt': 'Purchase Invoice Item',
|
||||||
'target_parent_dt': 'Purchase Order',
|
'target_dt': 'Purchase Order Item',
|
||||||
'target_parent_field': 'per_billed',
|
'join_field': 'po_detail',
|
||||||
'target_ref_field': 'amount',
|
'target_field': 'billed_amt',
|
||||||
'source_field': 'amount',
|
'target_parent_dt': 'Purchase Order',
|
||||||
'percent_join_field': 'purchase_order',
|
'target_parent_field': 'per_billed',
|
||||||
}]
|
'target_ref_field': 'amount',
|
||||||
|
'source_field': 'amount',
|
||||||
|
'percent_join_field': 'purchase_order',
|
||||||
|
}]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
if not self.is_opening:
|
if not self.is_opening:
|
||||||
|
@ -20,20 +20,23 @@ 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 = [{
|
|
||||||
'source_dt': 'Sales Invoice Item',
|
def __init__(self, arg1, arg2=None):
|
||||||
'target_field': 'billed_amt',
|
super(SalesInvoice, self).__init__(arg1, arg2)
|
||||||
'target_ref_field': 'amount',
|
self.status_updater = [{
|
||||||
'target_dt': 'Sales Order Item',
|
'source_dt': 'Sales Invoice Item',
|
||||||
'join_field': 'so_detail',
|
'target_field': 'billed_amt',
|
||||||
'target_parent_dt': 'Sales Order',
|
'target_ref_field': 'amount',
|
||||||
'target_parent_field': 'per_billed',
|
'target_dt': 'Sales Order Item',
|
||||||
'source_field': 'amount',
|
'join_field': 'so_detail',
|
||||||
'join_field': 'so_detail',
|
'target_parent_dt': 'Sales Order',
|
||||||
'percent_join_field': 'sales_order',
|
'target_parent_field': 'per_billed',
|
||||||
'status_field': 'billing_status',
|
'source_field': 'amount',
|
||||||
'keyword': 'Billed'
|
'join_field': 'so_detail',
|
||||||
}]
|
'percent_join_field': 'sales_order',
|
||||||
|
'status_field': 'billing_status',
|
||||||
|
'keyword': 'Billed'
|
||||||
|
}]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
super(SalesInvoice, self).validate()
|
super(SalesInvoice, self).validate()
|
||||||
|
@ -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':
|
||||||
|
@ -3,27 +3,27 @@
|
|||||||
|
|
||||||
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 = [{
|
|
||||||
'source_dt': 'Purchase Order Item',
|
def __init__(self, arg1, arg2=None):
|
||||||
'target_dt': 'Material Request Item',
|
super(PurchaseOrder, self).__init__(arg1, arg2)
|
||||||
'join_field': 'prevdoc_detail_docname',
|
self.status_updater = [{
|
||||||
'target_field': 'ordered_qty',
|
'source_dt': 'Purchase Order Item',
|
||||||
'target_parent_dt': 'Material Request',
|
'target_dt': 'Material Request Item',
|
||||||
'target_parent_field': 'per_ordered',
|
'join_field': 'prevdoc_detail_docname',
|
||||||
'target_ref_field': 'qty',
|
'target_field': 'ordered_qty',
|
||||||
'source_field': 'qty',
|
'target_parent_dt': 'Material Request',
|
||||||
'percent_join_field': 'prevdoc_docname',
|
'target_parent_field': 'per_ordered',
|
||||||
}]
|
'target_ref_field': 'qty',
|
||||||
|
'source_field': 'qty',
|
||||||
|
'percent_join_field': 'prevdoc_docname',
|
||||||
|
}]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
super(PurchaseOrder, self).validate()
|
super(PurchaseOrder, self).validate()
|
||||||
@ -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
|
||||||
|
@ -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)
|
||||||
|
@ -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"
|
||||||
|
@ -14,19 +14,22 @@ 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 = [{
|
|
||||||
'source_dt': 'Installation Note Item',
|
def __init__(self, arg1, arg2=None):
|
||||||
'target_dt': 'Delivery Note Item',
|
super(InstallationNote, self).__init__(arg1, arg2)
|
||||||
'target_field': 'installed_qty',
|
self.status_updater = [{
|
||||||
'target_ref_field': 'qty',
|
'source_dt': 'Installation Note Item',
|
||||||
'join_field': 'prevdoc_detail_docname',
|
'target_dt': 'Delivery Note Item',
|
||||||
'target_parent_dt': 'Delivery Note',
|
'target_field': 'installed_qty',
|
||||||
'target_parent_field': 'per_installed',
|
'target_ref_field': 'qty',
|
||||||
'source_field': 'qty',
|
'join_field': 'prevdoc_detail_docname',
|
||||||
'percent_join_field': 'prevdoc_docname',
|
'target_parent_dt': 'Delivery Note',
|
||||||
'status_field': 'installation_status',
|
'target_parent_field': 'per_installed',
|
||||||
'keyword': 'Installed'
|
'source_field': 'qty',
|
||||||
}]
|
'percent_join_field': 'prevdoc_docname',
|
||||||
|
'status_field': 'installation_status',
|
||||||
|
'keyword': 'Installed'
|
||||||
|
}]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_fiscal_year()
|
self.validate_fiscal_year()
|
||||||
|
@ -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"
|
||||||
|
@ -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": {
|
||||||
|
@ -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
|
||||||
|
@ -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 \
|
||||||
|
@ -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"])
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -15,19 +15,22 @@ 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 = [{
|
|
||||||
'source_dt': 'Delivery Note Item',
|
def __init__(self, arg1, arg2=None):
|
||||||
'target_dt': 'Sales Order Item',
|
super(DeliveryNote, self).__init__(arg1, arg2)
|
||||||
'join_field': 'prevdoc_detail_docname',
|
self.status_updater = [{
|
||||||
'target_field': 'delivered_qty',
|
'source_dt': 'Delivery Note Item',
|
||||||
'target_parent_dt': 'Sales Order',
|
'target_dt': 'Sales Order Item',
|
||||||
'target_parent_field': 'per_delivered',
|
'join_field': 'prevdoc_detail_docname',
|
||||||
'target_ref_field': 'qty',
|
'target_field': 'delivered_qty',
|
||||||
'source_field': 'qty',
|
'target_parent_dt': 'Sales Order',
|
||||||
'percent_join_field': 'against_sales_order',
|
'target_parent_field': 'per_delivered',
|
||||||
'status_field': 'delivery_status',
|
'target_ref_field': 'qty',
|
||||||
'keyword': 'Delivered'
|
'source_field': 'qty',
|
||||||
}]
|
'percent_join_field': 'against_sales_order',
|
||||||
|
'status_field': 'delivery_status',
|
||||||
|
'keyword': 'Delivered'
|
||||||
|
}]
|
||||||
|
|
||||||
def onload(self):
|
def onload(self):
|
||||||
billed_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabSales Invoice Item`
|
billed_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabSales Invoice Item`
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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):
|
||||||
|
@ -14,18 +14,20 @@ 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):
|
||||||
'source_dt': 'Purchase Receipt Item',
|
super(PurchaseReceipt, self).__init__(arg1, arg2)
|
||||||
'target_dt': 'Purchase Order Item',
|
self.status_updater = [{
|
||||||
'join_field': 'prevdoc_detail_docname',
|
'source_dt': 'Purchase Receipt Item',
|
||||||
'target_field': 'received_qty',
|
'target_dt': 'Purchase Order Item',
|
||||||
'target_parent_dt': 'Purchase Order',
|
'join_field': 'prevdoc_detail_docname',
|
||||||
'target_parent_field': 'per_received',
|
'target_field': 'received_qty',
|
||||||
'target_ref_field': 'qty',
|
'target_parent_dt': 'Purchase Order',
|
||||||
'source_field': 'qty',
|
'target_parent_field': 'per_received',
|
||||||
'percent_join_field': 'prevdoc_docname',
|
'target_ref_field': 'qty',
|
||||||
}]
|
'source_field': 'qty',
|
||||||
|
'percent_join_field': 'prevdoc_docname',
|
||||||
|
}]
|
||||||
|
|
||||||
def onload(self):
|
def onload(self):
|
||||||
billed_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabPurchase Invoice Item`
|
billed_qty = frappe.db.sql("""select sum(ifnull(qty, 0)) from `tabPurchase Invoice Item`
|
||||||
|
@ -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):
|
||||||
|
@ -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"):
|
||||||
|
@ -196,30 +196,30 @@ 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",
|
"item_code": "_Test Item",
|
||||||
"item_code": "_Test Item",
|
"parentfield": "mtn_details",
|
||||||
"parentfield": "mtn_details",
|
"incoming_rate": 1000,
|
||||||
"incoming_rate": 1000,
|
"qty": 20.0,
|
||||||
"qty": 20.0,
|
"stock_uom": "_Test UOM",
|
||||||
"stock_uom": "_Test UOM",
|
"transfer_qty": 20.0,
|
||||||
"transfer_qty": 20.0,
|
"uom": "_Test UOM",
|
||||||
"uom": "_Test UOM",
|
"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()
|
||||||
|
@ -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"}))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user