This commit is contained in:
Anand Doshi 2014-04-08 20:10:03 +05:30
parent cd71e1d8ab
commit d29465029d
28 changed files with 1095 additions and 1116 deletions

View File

@ -6,14 +6,12 @@ import frappe
import frappe.defaults
from frappe.utils import add_days, cint, cstr, date_diff, flt, getdate, nowdate, \
get_first_day, get_last_day
from frappe.utils import comma_and
get_first_day, get_last_day, comma_and
from frappe.model.naming import make_autoname
from frappe import _, msgprint
from erpnext.accounts.party import get_party_account, get_due_date
from erpnext.controllers.stock_controller import update_gl_entries_after
month_map = {'Monthly': 1, 'Quarterly': 3, 'Half-yearly': 6, 'Yearly': 12}
@ -157,7 +155,7 @@ class SalesInvoice(SellingController):
if d.time_log_batch:
tlb = frappe.get_doc("Time Log Batch", d.time_log_batch)
tlb.sales_invoice = sales_invoice
tlb.update_after_submit()
tlb.save()
def validate_time_logs_are_submitted(self):
for d in self.get(self.fname):
@ -472,7 +470,6 @@ class SalesInvoice(SellingController):
if repost_future_gle and cint(self.update_stock) \
and cint(frappe.defaults.get_global_default("auto_accounting_for_stock")):
items, warehouse_account = self.get_items_and_warehouse_accounts()
from controllers.stock_controller import update_gl_entries_after
update_gl_entries_after(self.posting_date, self.posting_time,
warehouse_account, items)
@ -696,9 +693,8 @@ def manage_recurring_invoices(next_date=None, commit=True):
raise Exception, exception_message
def make_new_invoice(ref_wrapper, posting_date):
from frappe.model.doc import clone
from erpnext.accounts.utils import get_fiscal_year
new_invoice = clone(ref_wrapper)
new_invoice = frappe.copy_doc(ref_wrapper)
mcount = month_map[ref_wrapper.recurring_type]
@ -836,4 +832,4 @@ def make_delivery_note(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist

View File

@ -2,7 +2,7 @@
# License: GNU General Public License v3. See license.txt
import frappe
import unittest, json
import unittest, json, copy
from frappe.utils import flt
from erpnext.accounts.utils import get_stock_and_account_difference
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
@ -15,23 +15,12 @@ class TestSalesInvoice(unittest.TestCase):
w.submit()
return w
def test_double_submission(self):
w = frappe.copy_doc(test_records[0])
w.docstatus = '0'
w.insert()
w2 = frappe.copy_doc(test_records[0])
w.submit()
w = frappe.get_doc(w2)
self.assertRaises(frappe.DocstatusTransitionError, w.submit)
def test_timestamp_change(self):
w = frappe.copy_doc(test_records[0])
w.docstatus = '0'
w.docstatus = 0
w.insert()
w2 = frappe.copy_doc(w)
w2 = frappe.get_doc(w.doctype, w.name)
import time
time.sleep(1)
@ -213,15 +202,15 @@ class TestSalesInvoice(unittest.TestCase):
expected_values = sorted([
[si.debit_to, 1500, 0.0],
[test_records[3][1]["income_account"], 0.0, 1163.45],
[test_records[3][3]["account_head"], 0.0, 130.31],
[test_records[3][4]["account_head"], 0.0, 2.61],
[test_records[3][5]["account_head"], 0.0, 1.31],
[test_records[3][6]["account_head"], 0.0, 25.96],
[test_records[3][7]["account_head"], 0.0, 145.43],
[test_records[3][8]["account_head"], 0.0, 116.35],
[test_records[3][9]["account_head"], 0.0, 100],
[test_records[3][10]["account_head"], 168.54, 0.0],
[test_records[3]["entries"][0]["income_account"], 0.0, 1163.45],
[test_records[3]["other_charges"][0]["account_head"], 0.0, 130.31],
[test_records[3]["other_charges"][1]["account_head"], 0.0, 2.61],
[test_records[3]["other_charges"][2]["account_head"], 0.0, 1.31],
[test_records[3]["other_charges"][3]["account_head"], 0.0, 25.96],
[test_records[3]["other_charges"][4]["account_head"], 0.0, 145.43],
[test_records[3]["other_charges"][5]["account_head"], 0.0, 116.35],
[test_records[3]["other_charges"][6]["account_head"], 0.0, 100],
[test_records[3]["other_charges"][7]["account_head"], 168.54, 0.0],
["_Test Account Service Tax - _TC", 16.88, 0.0],
])
@ -245,7 +234,7 @@ class TestSalesInvoice(unittest.TestCase):
si.get("entries")[0].price_list_rate = 62.5
si.get("entries")[0].price_list_rate = 191
for i in [2, 4, 5, 6, 7, 8]:
for i in xrange(6):
si.get("other_charges")[i].included_in_print_rate = 1
# tax type "Actual" cannot be inclusive
@ -309,7 +298,7 @@ class TestSalesInvoice(unittest.TestCase):
si.get("entries")[0].discount_percentage = 10
si.get("entries")[1].price_list_rate = 187.5
si.get("entries")[1].discount_percentage = 20
si.get("other_charges")[5].rate = 5000
si.get("other_charges")[6].rate = 5000
si.insert()
@ -321,8 +310,7 @@ class TestSalesInvoice(unittest.TestCase):
}
# check if children are saved
self.assertEquals(len(si.get("entries")),
len(expected_values)-1)
self.assertEquals(len(si.get("entries")), len(expected_values)-1)
# check if item values are calculated
for d in si.get("entries"):
@ -414,9 +402,9 @@ class TestSalesInvoice(unittest.TestCase):
expected_values = sorted([
[si.debit_to, 630.0, 0.0],
[test_records[1][1]["income_account"], 0.0, 500.0],
[test_records[1][2]["account_head"], 0.0, 80.0],
[test_records[1][3]["account_head"], 0.0, 50.0],
[test_records[1]["entries"][0]["income_account"], 0.0, 500.0],
[test_records[1]["other_charges"][0]["account_head"], 0.0, 80.0],
[test_records[1]["other_charges"][1]["account_head"], 0.0, 50.0],
])
for i, gle in enumerate(gl_entries):
@ -439,12 +427,12 @@ class TestSalesInvoice(unittest.TestCase):
self._insert_purchase_receipt()
self._insert_pos_settings()
pos = frappe.copy_doc(test_records[1])
pos[0]["is_pos"] = 1
pos[0]["update_stock"] = 1
pos[0]["posting_time"] = "12:05"
pos[0]["cash_bank_account"] = "_Test Account Bank Account - _TC"
pos[0]["paid_amount"] = 600.0
pos = copy.deepcopy(test_records[1])
pos["is_pos"] = 1
pos["update_stock"] = 1
pos["posting_time"] = "12:05"
pos["cash_bank_account"] = "_Test Account Bank Account - _TC"
pos["paid_amount"] = 600.0
si = frappe.copy_doc(pos)
si.insert()
@ -468,11 +456,11 @@ class TestSalesInvoice(unittest.TestCase):
expected_gl_entries = sorted([
[si.debit_to, 630.0, 0.0],
[pos[1]["income_account"], 0.0, 500.0],
[pos[2]["account_head"], 0.0, 80.0],
[pos[3]["account_head"], 0.0, 50.0],
[pos["entries"][0]["income_account"], 0.0, 500.0],
[pos["other_charges"][0]["account_head"], 0.0, 80.0],
[pos["other_charges"][1]["account_head"], 0.0, 50.0],
[stock_in_hand, 0.0, 75.0],
[pos[1]["expense_account"], 75.0, 0.0],
[pos["entries"][0]["expense_account"], 75.0, 0.0],
[si.debit_to, 0.0, 600.0],
["_Test Account Bank Account - _TC", 600.0, 0.0]
])
@ -501,14 +489,14 @@ class TestSalesInvoice(unittest.TestCase):
as pr_test_records
pr = frappe.copy_doc(pr_test_records[0])
pr.naming_series = "_T-Purchase Receipt-"
pr.get("entries")[0].warehouse = "_Test Warehouse No Account - _TC"
pr.get("purchase_receipt_details")[0].warehouse = "_Test Warehouse No Account - _TC"
pr.insert()
pr.submit()
si_doc = frappe.copy_doc(test_records[1])
si_doc = copy.deepcopy(test_records[1])
si_doc["update_stock"] = 1
si_doc["posting_time"] = "12:05"
si_doc.get("entries")["warehouse"] = "_Test Warehouse No Account - _TC"
si_doc.get("entries")[0]["warehouse"] = "_Test Warehouse No Account - _TC"
si = frappe.copy_doc(si_doc)
si.insert()
@ -530,7 +518,7 @@ class TestSalesInvoice(unittest.TestCase):
expected_gl_entries = sorted([
[si.debit_to, 630.0, 0.0],
[si_doc.get("entries")["income_account"], 0.0, 500.0],
[si_doc.get("entries")[0]["income_account"], 0.0, 500.0],
[si_doc.get("other_charges")[0]["account_head"], 0.0, 80.0],
[si_doc.get("other_charges")[1]["account_head"], 0.0, 50.0],
])
@ -550,9 +538,8 @@ class TestSalesInvoice(unittest.TestCase):
self.clear_stock_account_balance()
set_perpetual_inventory()
si_copy = frappe.copy_doc(test_records[1])
si_copy[1]["item_code"] = None
si = frappe.get_doc(si_copy)
si = frappe.get_doc(test_records[1])
si.get("entries")[0].item_code = None
si.insert()
si.submit()
@ -563,9 +550,9 @@ class TestSalesInvoice(unittest.TestCase):
expected_values = sorted([
[si.debit_to, 630.0, 0.0],
[test_records[1][1]["income_account"], 0.0, 500.0],
[test_records[1][2]["account_head"], 0.0, 80.0],
[test_records[1][3]["account_head"], 0.0, 50.0],
[test_records[1]["entries"][0]["income_account"], 0.0, 500.0],
[test_records[1]["other_charges"][0]["account_head"], 0.0, 80.0],
[test_records[1]["other_charges"][1]["account_head"], 0.0, 50.0],
])
for i, gle in enumerate(gl_entries):
self.assertEquals(expected_values[i][0], gle.account)
@ -577,9 +564,8 @@ class TestSalesInvoice(unittest.TestCase):
def test_sales_invoice_gl_entry_with_aii_non_stock_item(self):
self.clear_stock_account_balance()
set_perpetual_inventory()
si_copy = frappe.copy_doc(test_records[1])
si_copy[1]["item_code"] = "_Test Non Stock Item"
si = frappe.get_doc(si_copy)
si = frappe.get_doc(test_records[1])
si.get("entries")[0].item_code = "_Test Non Stock Item"
si.insert()
si.submit()
@ -590,9 +576,9 @@ class TestSalesInvoice(unittest.TestCase):
expected_values = sorted([
[si.debit_to, 630.0, 0.0],
[test_records[1][1]["income_account"], 0.0, 500.0],
[test_records[1][2]["account_head"], 0.0, 80.0],
[test_records[1][3]["account_head"], 0.0, 50.0],
[test_records[1]["entries"][0]["income_account"], 0.0, 500.0],
[test_records[1]["other_charges"][0]["account_head"], 0.0, 80.0],
[test_records[1]["other_charges"][1]["account_head"], 0.0, 50.0],
])
for i, gle in enumerate(gl_entries):
self.assertEquals(expected_values[i][0], gle.account)
@ -808,7 +794,7 @@ class TestSalesInvoice(unittest.TestCase):
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
se = make_serialized_item()
serial_nos = get_serial_nos(se.get("entries")[0].serial_no)
serial_nos = get_serial_nos(se.get("mtn_details")[0].serial_no)
si = frappe.copy_doc(test_records[0])
si.update_stock = 1
@ -842,7 +828,7 @@ class TestSalesInvoice(unittest.TestCase):
from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item
se = make_serialized_item()
serial_nos = get_serial_nos(se.get("entries")[0].serial_no)
serial_nos = get_serial_nos(se.get("mtn_details")[0].serial_no)
sr = frappe.get_doc("Serial No", serial_nos[0])
sr.status = "Not Available"
@ -858,5 +844,4 @@ class TestSalesInvoice(unittest.TestCase):
self.assertRaises(SerialNoStatusError, si.submit)
test_dependencies = ["Journal Voucher", "POS Setting", "Contact", "Address"]
test_records = frappe.get_test_records('Sales Invoice')

View File

@ -193,7 +193,7 @@ def make_purchase_receipt(source_name, target_doc=None):
target.amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.rate)
target.base_amount = (flt(obj.qty) - flt(obj.received_qty)) * flt(obj.base_rate)
doclist = get_mapped_doc("Purchase Order", source_name, {
doc = get_mapped_doc("Purchase Order", source_name, {
"Purchase Order": {
"doctype": "Purchase Receipt",
"validation": {
@ -216,7 +216,7 @@ def make_purchase_receipt(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doc
@frappe.whitelist()
def make_purchase_invoice(source_name, target_doc=None):
@ -232,7 +232,7 @@ def make_purchase_invoice(source_name, target_doc=None):
if flt(obj.base_rate):
target.qty = target.base_amount / flt(obj.base_rate)
doclist = get_mapped_doc("Purchase Order", source_name, {
doc = get_mapped_doc("Purchase Order", source_name, {
"Purchase Order": {
"doctype": "Purchase Invoice",
"validation": {
@ -254,4 +254,4 @@ def make_purchase_invoice(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doc

View File

@ -20,14 +20,13 @@ class TestPurchaseOrder(unittest.TestCase):
po.submit()
pr = make_purchase_receipt(po.name)
pr[0]["supplier_warehouse"] = "_Test Warehouse 1 - _TC"
pr[0]["posting_date"] = "2013-05-12"
self.assertEquals(pr[0]["doctype"], "Purchase Receipt")
self.assertEquals(len(pr), len(test_records[0]))
pr.supplier_warehouse = "_Test Warehouse 1 - _TC"
pr.posting_date = "2013-05-12"
self.assertEquals(pr.doctype, "Purchase Receipt")
self.assertEquals(len(pr.get("purchase_receipt_details")), len(test_records[0]["po_details"]))
pr[0]["naming_series"] = "_T-Purchase Receipt-"
pr_doc = frappe.get_doc(pr)
pr_doc.insert()
pr.naming_series = "_T-Purchase Receipt-"
frappe.get_doc(pr).insert()
def test_ordered_qty(self):
frappe.db.sql("delete from tabBin")
@ -49,14 +48,13 @@ class TestPurchaseOrder(unittest.TestCase):
pr = make_purchase_receipt(po.name)
self.assertEquals(pr[0]["doctype"], "Purchase Receipt")
self.assertEquals(len(pr), len(test_records[0]))
pr[0]["posting_date"] = "2013-05-12"
pr[0]["naming_series"] = "_T-Purchase Receipt-"
pr[1]["qty"] = 4.0
pr_doc = frappe.get_doc(pr)
pr_doc.insert()
pr_doc.submit()
self.assertEquals(pr.doctype, "Purchase Receipt")
self.assertEquals(len(pr.get("purchase_receipt_details", [])), len(test_records[0]["po_details"]))
pr.posting_date = "2013-05-12"
pr.naming_series = "_T-Purchase Receipt-"
pr.purchase_receipt_details[0].qty = 4.0
pr.insert()
pr.submit()
self.assertEquals(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item",
"warehouse": "_Test Warehouse - _TC"}, "ordered_qty")), 6.0)
@ -64,12 +62,11 @@ class TestPurchaseOrder(unittest.TestCase):
frappe.db.set_value('Item', '_Test Item', 'tolerance', 50)
pr1 = make_purchase_receipt(po.name)
pr1[0]["naming_series"] = "_T-Purchase Receipt-"
pr1[0]["posting_date"] = "2013-05-12"
pr1[1]["qty"] = 8
pr1_doc = frappe.get_doc(pr1)
pr1_doc.insert()
pr1_doc.submit()
pr1.naming_series = "_T-Purchase Receipt-"
pr1.posting_date = "2013-05-12"
pr1.get("purchase_receipt_details")[0].qty = 8
pr1.insert()
pr1.submit()
self.assertEquals(flt(frappe.db.get_value("Bin", {"item_code": "_Test Item",
"warehouse": "_Test Warehouse - _TC"}, "ordered_qty")), 0.0)
@ -86,10 +83,10 @@ class TestPurchaseOrder(unittest.TestCase):
po.submit()
pi = make_purchase_invoice(po.name)
self.assertEquals(pi[0]["doctype"], "Purchase Invoice")
self.assertEquals(len(pi), len(test_records[0]))
pi[0]["posting_date"] = "2013-05-12"
pi[0]["bill_no"] = "NA"
self.assertEquals(pi.doctype, "Purchase Invoice")
self.assertEquals(len(pi.get("entries", [])), len(test_records[0]["po_details"]))
pi.posting_date = "2013-05-12"
pi.bill_no = "NA"
frappe.get_doc(pi).insert()
def test_subcontracting(self):

View File

@ -88,4 +88,4 @@ def make_purchase_order(source_name, target_doc=None):
},
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist

View File

@ -20,15 +20,15 @@ class TestPurchaseOrder(unittest.TestCase):
sq.submit()
po = make_purchase_order(sq.name)
self.assertEquals(po[0]["doctype"], "Purchase Order")
self.assertEquals(len(po), len(sq))
self.assertEquals(po.doctype, "Purchase Order")
self.assertEquals(len(po.get("po_details")), len(sq.get("quotation_items")))
po[0]["naming_series"] = "_T-Purchase Order-"
po.naming_series = "_T-Purchase Order-"
for doc in po:
for doc in po.get("po_details"):
if doc.get("item_code"):
doc["schedule_date"] = "2013-04-12"
doc.set("schedule_date", "2013-04-12")
frappe.get_doc(po).insert()
po.insert()
test_records = frappe.get_test_records('Supplier Quotation')

View File

@ -202,10 +202,8 @@ class AccountsController(TransactionBase):
" [" + _("Row") + " # %(row_range)s] " + _("also be included in Item's rate")) % {
"idx": tax.idx,
"doctype": tax.doctype,
"inclusive_label": self.meta.get_label("included_in_print_rate",
parentfield=self.other_fname),
"charge_type_label": self.meta.get_label("charge_type",
parentfield=self.other_fname),
"inclusive_label": frappe.get_meta(tax.doctype).get_label("included_in_print_rate"),
"charge_type_label": frappe.get_meta(tax.doctype).get_label("charge_type"),
"charge_type": tax.charge_type,
"row_range": row_range
})
@ -218,8 +216,7 @@ class AccountsController(TransactionBase):
+ "cannot be included in Item's rate") % {
"idx": tax.idx,
"doctype": tax.doctype,
"charge_type_label": self.meta.get_label("charge_type",
parentfield=self.other_fname),
"charge_type_label": frappe.get_meta(tax.doctype).get_label("charge_type"),
"charge_type": tax.charge_type,
})
elif tax.charge_type == "On Previous Row Amount" and \

View File

@ -300,7 +300,7 @@ class SellingController(StockController):
if flt(d.qty) > flt(d.delivered_qty):
reserved_qty_for_main_item = flt(d.qty) - flt(d.delivered_qty)
if self.doctype == "Delivery Note" and d.against_sales_order:
elif self.doctype == "Delivery Note" and d.against_sales_order:
# if SO qty is 10 and there is tolerance of 20%, then it will allow DN of 12.
# But in this case reserved qty should only be reduced by 10 and not 12

View File

@ -38,7 +38,6 @@ class BOM(Document):
def on_update(self):
self.check_recursion()
self.update_exploded_items()
self.db_update()
def on_submit(self):
self.manage_default_bom()
@ -132,12 +131,8 @@ class BOM(Document):
'qty': d.qty
})["rate"]
if self.docstatus == 0:
if self.docstatus in (0, 1):
self.save()
elif self.docstatus == 1:
self.calculate_cost()
self.update_exploded_items()
self.update_after_submit()
def get_bom_unitcost(self, bom_no):
bom = frappe.db.sql("""select name, total_cost/quantity as unit_cost from `tabBOM`
@ -376,7 +371,7 @@ class BOM(Document):
def add_exploded_items(self):
"Add items to Flat BOM table"
self.set('flat_bom_details', [])
frappe.db.sql("""delete from `tabBOM Explosion Item` where parent=%s""", self.name)
for d in self.cur_exploded_items:
ch = self.append('flat_bom_details', {})
for i in self.cur_exploded_items[d].keys():
@ -384,7 +379,7 @@ class BOM(Document):
ch.amount = flt(ch.qty) * flt(ch.rate)
ch.qty_consumed_per_unit = flt(ch.qty) / flt(self.quantity)
ch.docstatus = self.docstatus
ch.db_update()
ch.db_insert()
def validate_bom_links(self):
if not self.is_active:
@ -399,6 +394,7 @@ class BOM(Document):
raise_exception=1)
def get_bom_items_as_dict(bom, qty=1, fetch_exploded=1):
import json
item_dict = {}
query = """select

View File

@ -12,17 +12,17 @@ class TestBOM(unittest.TestCase):
def test_get_items(self):
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
items_dict = get_bom_items_as_dict(bom="BOM/_Test FG Item 2/001", qty=1, fetch_exploded=0)
self.assertTrue(test_records[2][1]["item_code"] in items_dict)
self.assertTrue(test_records[2][2]["item_code"] in items_dict)
self.assertTrue(test_records[2]["bom_materials"][0]["item_code"] in items_dict)
self.assertTrue(test_records[2]["bom_materials"][1]["item_code"] in items_dict)
self.assertEquals(len(items_dict.values()), 2)
def test_get_items_exploded(self):
from erpnext.manufacturing.doctype.bom.bom import get_bom_items_as_dict
items_dict = get_bom_items_as_dict(bom="BOM/_Test FG Item 2/001", qty=1, fetch_exploded=1)
self.assertTrue(test_records[2][1]["item_code"] in items_dict)
self.assertFalse(test_records[2][2]["item_code"] in items_dict)
self.assertTrue(test_records[0][1]["item_code"] in items_dict)
self.assertTrue(test_records[0][2]["item_code"] in items_dict)
self.assertTrue(test_records[2]["bom_materials"][0]["item_code"] in items_dict)
self.assertFalse(test_records[2]["bom_materials"][1]["item_code"] in items_dict)
self.assertTrue(test_records[0]["bom_materials"][0]["item_code"] in items_dict)
self.assertTrue(test_records[0]["bom_materials"][1]["item_code"] in items_dict)
self.assertEquals(len(items_dict.values()), 3)
def test_get_items_list(self):

View File

@ -37,6 +37,7 @@ class TestProductionOrder(unittest.TestCase):
stock_entry.fg_completed_qty = 4
stock_entry.posting_date = "2013-05-12"
stock_entry.fiscal_year = "_Test Fiscal Year 2013"
stock_entry.set("mtn_details", [])
stock_entry.run_method("get_items")
stock_entry.submit()
@ -56,6 +57,7 @@ class TestProductionOrder(unittest.TestCase):
stock_entry.posting_date = "2013-05-12"
stock_entry.fiscal_year = "_Test Fiscal Year 2013"
stock_entry.fg_completed_qty = 15
stock_entry.set("mtn_details", [])
stock_entry.run_method("get_items")
stock_entry.insert()

View File

@ -12,3 +12,4 @@ class TestTimeLog(unittest.TestCase):
self.assertRaises(OverlapError, ts.insert)
test_records = frappe.get_test_records('Time Log')
test_ignore = ["Time Log Batch", "Sales Invoice"]

View File

@ -17,7 +17,7 @@ class TimeLogBatchTest(unittest.TestCase):
self.assertEquals(frappe.db.get_value("Time Log", time_log.name, "status"), "Submitted")
tlb = frappe.copy_doc(test_records[0])
tlb["time_log_batch_details"][0].time_log = time_log.name
tlb.get("time_log_batch_details")[0].time_log = time_log.name
tlb.insert()
tlb.submit()
@ -26,3 +26,5 @@ class TimeLogBatchTest(unittest.TestCase):
self.assertEquals(frappe.db.get_value("Time Log", time_log.name, "status"), "Submitted")
test_records = frappe.get_test_records('Time Log Batch')
test_dependencies = ["Time Log"]
test_ignore = ["Sales Invoice"]

View File

@ -57,4 +57,4 @@ class TimeLogBatch(Document):
tl = frappe.get_doc("Time Log", d.time_log)
tl.time_log_batch = time_log_batch
tl.sales_invoice = self.sales_invoice
tl.update_after_submit()
tl.save()

View File

@ -51,13 +51,12 @@ class Customer(TransactionBase):
def create_lead_address_contact(self):
if self.lead_name:
if not frappe.db.get_value("Address", {"lead": self.lead_name, "customer": self.customer}):
if not frappe.db.get_value("Address", {"lead": self.lead_name, "customer": self.name}):
frappe.db.sql("""update `tabAddress` set customer=%s, customer_name=%s where lead=%s""",
(self.name, self.customer_name, self.lead_name))
lead = frappe.db.get_value("Lead", self.lead_name, ["lead_name", "email_id", "phone", "mobile_no"], as_dict=True)
c = frappe.get_doc('Contact')
c.set("__islocal", 1)
c = frappe.new_doc('Contact')
c.first_name = lead.lead_name
c.email_id = lead.email_id
c.phone = lead.phone

View File

@ -96,7 +96,7 @@ def _make_customer(source_name, target_doc=None, ignore_permissions=False):
}
}}, target_doc, set_missing_values, ignore_permissions=ignore_permissions)
return doclist.as_dict()
return doclist
@frappe.whitelist()
def make_opportunity(source_name, target_doc=None):

View File

@ -13,9 +13,9 @@ class TestLead(unittest.TestCase):
from erpnext.selling.doctype.lead.lead import make_customer
customer = make_customer("_T-Lead-00001")
self.assertEquals(customer[0]["doctype"], "Customer")
self.assertEquals(customer[0]["lead_name"], "_T-Lead-00001")
self.assertEquals(customer.doctype, "Customer")
self.assertEquals(customer.lead_name, "_T-Lead-00001")
customer[0]["company"] = "_Test Company"
customer[0]["customer_group"] = "_Test Customer Group"
frappe.get_doc(customer).insert()
customer.company = "_Test Company"
customer.customer_group = "_Test Customer Group"
customer.insert()

View File

@ -161,4 +161,4 @@ def make_quotation(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist

View File

@ -137,7 +137,7 @@ def _make_sales_order(source_name, target_doc=None, ignore_permissions=False):
# postprocess: fetch shipping address, set missing values
return doclist.as_dict()
return doclist
def _make_customer(source_name, ignore_permissions=False):
quotation = frappe.db.get_value("Quotation", source_name, ["lead", "order_type"])

View File

@ -20,16 +20,16 @@ class TestQuotation(unittest.TestCase):
sales_order = make_sales_order(quotation.name)
self.assertEquals(sales_order[0]["doctype"], "Sales Order")
self.assertEquals(len(sales_order), 2)
self.assertEquals(sales_order[1]["doctype"], "Sales Order Item")
self.assertEquals(sales_order[1]["prevdoc_docname"], quotation.name)
self.assertEquals(sales_order[0]["customer"], "_Test Customer")
self.assertEquals(sales_order.doctype, "Sales Order")
self.assertEquals(len(sales_order.get("sales_order_details")), 2)
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.customer, "_Test Customer")
sales_order[0]["delivery_date"] = "2014-01-01"
sales_order[0]["naming_series"] = "_T-Quotation-"
sales_order[0]["transaction_date"] = "2013-05-12"
frappe.get_doc(sales_order).insert()
sales_order.delivery_date = "2014-01-01"
sales_order.naming_series = "_T-Quotation-"
sales_order.transaction_date = "2013-05-12"
sales_order.insert()
test_records = frappe.get_test_records('Quotation')

View File

@ -258,10 +258,10 @@ def set_missing_values(source, target):
@frappe.whitelist()
def make_material_request(source_name, target_doc=None):
def postprocess(source, doclist):
doclist[0].material_request_type = "Purchase"
def postprocess(source, doc):
doc.material_request_type = "Purchase"
doclist = get_mapped_doc("Sales Order", source_name, {
doc = get_mapped_doc("Sales Order", source_name, {
"Sales Order": {
"doctype": "Material Request",
"validation": {
@ -277,7 +277,7 @@ def make_material_request(source_name, target_doc=None):
}
}, target_doc, postprocess)
return doclist
return doc
@frappe.whitelist()
def make_delivery_note(source_name, target_doc=None):
@ -317,7 +317,7 @@ def make_delivery_note(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist
@frappe.whitelist()
def make_sales_invoice(source_name, target_doc=None):
@ -357,7 +357,7 @@ def make_sales_invoice(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist
@frappe.whitelist()
def make_maintenance_schedule(source_name, target_doc=None):
@ -385,7 +385,7 @@ def make_maintenance_schedule(source_name, target_doc=None):
}
}, target_doc)
return doclist.as_dict()
return doclist
@frappe.whitelist()
def make_maintenance_visit(source_name, target_doc=None):
@ -415,4 +415,4 @@ def make_maintenance_visit(source_name, target_doc=None):
}
}, target_doc)
return doclist.as_dict()
return doclist

View File

@ -4,6 +4,7 @@
import frappe
from frappe.utils import flt
import unittest
import copy
class TestSalesOrder(unittest.TestCase):
def tearDown(self):
@ -21,8 +22,8 @@ class TestSalesOrder(unittest.TestCase):
sales_order.submit()
mr = make_material_request(so.name)
self.assertEquals(mr[0]["material_request_type"], "Purchase")
self.assertEquals(len(mr), len(sales_order))
self.assertEquals(mr.material_request_type, "Purchase")
self.assertEquals(len(mr.get("indent_details")), len(sales_order.get("sales_order_details")))
def test_make_delivery_note(self):
from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note
@ -36,8 +37,8 @@ class TestSalesOrder(unittest.TestCase):
sales_order.submit()
dn = make_delivery_note(so.name)
self.assertEquals(dn[0]["doctype"], "Delivery Note")
self.assertEquals(len(dn), len(sales_order))
self.assertEquals(dn.doctype, "Delivery Note")
self.assertEquals(len(dn.get("delivery_note_details")), len(sales_order.get("sales_order_details")))
def test_make_sales_invoice(self):
from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice
@ -51,17 +52,16 @@ class TestSalesOrder(unittest.TestCase):
sales_order.submit()
si = make_sales_invoice(so.name)
self.assertEquals(si[0]["doctype"], "Sales Invoice")
self.assertEquals(len(si), len(sales_order))
self.assertEquals(len([d for d in si if d["doctype"]=="Sales Invoice Item"]), 1)
self.assertEquals(si.doctype, "Sales Invoice")
self.assertEquals(len(si.get("entries")), len(sales_order.get("sales_order_details")))
self.assertEquals(len(si.get("entries")), 1)
si = frappe.get_doc(si)
si.posting_date = "2013-10-10"
si.insert()
si.submit()
si1 = make_sales_invoice(so.name)
self.assertEquals(len([d for d in si1 if d["doctype"]=="Sales Invoice Item"]), 0)
self.assertEquals(len(si1.get("entries")), 0)
def create_so(self, so_doc = None):
@ -106,7 +106,8 @@ class TestSalesOrder(unittest.TestCase):
def test_reserved_qty_for_so(self):
# reset bin
self.delete_bin(test_records[0][1]["item_code"], test_records[0][1]["warehouse"])
so_item = test_records[0]["sales_order_details"][0]
self.delete_bin(so_item["item_code"], so_item["warehouse"])
# submit
so = self.create_so()
@ -119,7 +120,8 @@ class TestSalesOrder(unittest.TestCase):
def test_reserved_qty_for_partial_delivery(self):
# reset bin
self.delete_bin(test_records[0][1]["item_code"], test_records[0][1]["warehouse"])
so_item = test_records[0]["sales_order_details"][0]
self.delete_bin(so_item["item_code"], so_item["warehouse"])
# submit so
so = self.create_so()
@ -134,12 +136,12 @@ class TestSalesOrder(unittest.TestCase):
# stop so
so.load_from_db()
so.obj.stop_sales_order()
so.stop_sales_order()
self.check_reserved_qty(so.get("sales_order_details")[0].item_code, so.get("sales_order_details")[0].warehouse, 0.0)
# unstop so
so.load_from_db()
so.obj.unstop_sales_order()
so.unstop_sales_order()
self.check_reserved_qty(so.get("sales_order_details")[0].item_code, so.get("sales_order_details")[0].warehouse, 5.0)
# cancel dn
@ -148,7 +150,8 @@ class TestSalesOrder(unittest.TestCase):
def test_reserved_qty_for_over_delivery(self):
# reset bin
self.delete_bin(test_records[0][1]["item_code"], test_records[0][1]["warehouse"])
so_item = test_records[0]["sales_order_details"][0]
self.delete_bin(so_item["item_code"], so_item["warehouse"])
# submit so
so = self.create_so()
@ -171,27 +174,27 @@ class TestSalesOrder(unittest.TestCase):
from erpnext.selling.doctype.sales_bom.test_sales_bom import test_records as sbom_test_records
# change item in test so record
test_record = test_records[0][:]
test_record[1]["item_code"] = "_Test Sales BOM Item"
test_record = copy.deepcopy(test_records[0])
test_record["sales_order_details"][0]["item_code"] = "_Test Sales BOM Item"
# reset bin
self.delete_bin(sbom_test_records[0][1]["item_code"], test_record[1]["warehouse"])
self.delete_bin(sbom_test_records[0][2]["item_code"], test_record[1]["warehouse"])
self.delete_bin(sbom_test_records[0]["sales_bom_items"][0]["item_code"], test_record.get("sales_order_details")[0]["warehouse"])
self.delete_bin(sbom_test_records[0]["sales_bom_items"][1]["item_code"], test_record.get("sales_order_details")[0]["warehouse"])
# submit
so = self.create_so(test_record)
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 50.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 20.0)
# cancel
so.cancel()
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 0.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 0.0)
def test_reserved_qty_for_partial_delivery_with_packing_list(self):
@ -200,11 +203,11 @@ class TestSalesOrder(unittest.TestCase):
# change item in test so record
test_record = frappe.copy_doc(test_records[0])
test_record[1]["item_code"] = "_Test Sales BOM Item"
test_record.get("sales_order_details")[0].item_code = "_Test Sales BOM Item"
# reset bin
self.delete_bin(sbom_test_records[0][1]["item_code"], test_record[1]["warehouse"])
self.delete_bin(sbom_test_records[0][2]["item_code"], test_record[1]["warehouse"])
self.delete_bin(sbom_test_records[0]["sales_bom_items"][0]["item_code"], test_record.get("sales_order_details")[0].warehouse)
self.delete_bin(sbom_test_records[0]["sales_bom_items"][1]["item_code"], test_record.get("sales_order_details")[0].warehouse)
# submit
so = self.create_so(test_record)
@ -215,33 +218,33 @@ class TestSalesOrder(unittest.TestCase):
# submit dn
dn = self.create_dn_against_so(so)
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 25.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 10.0)
# stop so
so.load_from_db()
so.obj.stop_sales_order()
so.stop_sales_order()
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 0.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 0.0)
# unstop so
so.load_from_db()
so.obj.unstop_sales_order()
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
so.unstop_sales_order()
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 25.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 10.0)
# cancel dn
dn.cancel()
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 50.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 20.0)
def test_reserved_qty_for_over_delivery_with_packing_list(self):
@ -249,11 +252,11 @@ class TestSalesOrder(unittest.TestCase):
# change item in test so record
test_record = frappe.copy_doc(test_records[0])
test_record[1]["item_code"] = "_Test Sales BOM Item"
test_record.get("sales_order_details")[0].item_code = "_Test Sales BOM Item"
# reset bin
self.delete_bin(sbom_test_records[0][1]["item_code"], test_record[1]["warehouse"])
self.delete_bin(sbom_test_records[0][2]["item_code"], test_record[1]["warehouse"])
self.delete_bin(sbom_test_records[0]["sales_bom_items"][0]["item_code"], test_record.get("sales_order_details")[0].warehouse)
self.delete_bin(sbom_test_records[0]["sales_bom_items"][1]["item_code"], test_record.get("sales_order_details")[0].warehouse)
# submit
so = self.create_so(test_record)
@ -267,16 +270,16 @@ class TestSalesOrder(unittest.TestCase):
# submit dn
dn = self.create_dn_against_so(so, 15)
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 0.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 0.0)
# cancel dn
dn.cancel()
self.check_reserved_qty(sbom_test_records[0][1]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][0]["item_code"],
so.get("sales_order_details")[0].warehouse, 50.0)
self.check_reserved_qty(sbom_test_records[0][2]["item_code"],
self.check_reserved_qty(sbom_test_records[0]["sales_bom_items"][1]["item_code"],
so.get("sales_order_details")[0].warehouse, 20.0)
def test_warehouse_user(self):

View File

@ -328,7 +328,7 @@ def make_sales_invoice(source_name, target_doc=None):
}
}, target_doc, update_accounts)
return doc.as_dict()
return doc
@frappe.whitelist()
def make_installation_note(source_name, target_doc=None):
@ -355,4 +355,4 @@ def make_installation_note(source_name, target_doc=None):
}
}, target_doc)
return doclist.as_dict()
return doclist

View File

@ -245,7 +245,7 @@ def make_purchase_order(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist
@frappe.whitelist()
def make_purchase_order_based_on_supplier(source_name, target_doc=None):
@ -325,7 +325,7 @@ def make_supplier_quotation(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist
@frappe.whitelist()
def make_stock_entry(source_name, target_doc=None):
@ -361,4 +361,4 @@ def make_stock_entry(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist

View File

@ -323,4 +323,4 @@ def make_purchase_invoice(source_name, target_doc=None):
}
}, target_doc, set_missing_values)
return doclist.as_dict()
return doclist

View File

@ -234,6 +234,7 @@ class StockEntry(StockController):
def validate_finished_goods(self):
"""validation: finished good quantity should be same as manufacturing quantity"""
import json
for d in self.get('mtn_details'):
if d.bom_no and flt(d.transfer_qty) != flt(self.fg_completed_qty):
msgprint(_("Row #") + " %s: " % d.idx

View File

@ -59,4 +59,4 @@ def make_maintenance_visit(source_name, target_doc=None):
}
}, target_doc)
return doclist.as_dict()
return doclist

View File

@ -295,4 +295,4 @@ def make_maintenance_visit(source_name, target_doc=None):
}
}, target_doc)
return doclist.as_dict()
return doclist