Fixed Test Cases frappe/frappe#478
This commit is contained in:
parent
cd71e1d8ab
commit
d29465029d
@ -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
|
||||
|
@ -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')
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -88,4 +88,4 @@ def make_purchase_order(source_name, target_doc=None):
|
||||
},
|
||||
}, target_doc, set_missing_values)
|
||||
|
||||
return doclist.as_dict()
|
||||
return doclist
|
@ -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')
|
@ -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 \
|
||||
|
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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()
|
||||
|
||||
|
@ -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"]
|
||||
|
@ -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"]
|
||||
|
@ -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()
|
||||
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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()
|
||||
|
@ -161,4 +161,4 @@ def make_quotation(source_name, target_doc=None):
|
||||
}
|
||||
}, target_doc, set_missing_values)
|
||||
|
||||
return doclist.as_dict()
|
||||
return doclist
|
@ -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"])
|
||||
|
@ -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')
|
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -323,4 +323,4 @@ def make_purchase_invoice(source_name, target_doc=None):
|
||||
}
|
||||
}, target_doc, set_missing_values)
|
||||
|
||||
return doclist.as_dict()
|
||||
return doclist
|
@ -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
|
||||
|
@ -59,4 +59,4 @@ def make_maintenance_visit(source_name, target_doc=None):
|
||||
}
|
||||
}, target_doc)
|
||||
|
||||
return doclist.as_dict()
|
||||
return doclist
|
@ -295,4 +295,4 @@ def make_maintenance_visit(source_name, target_doc=None):
|
||||
}
|
||||
}, target_doc)
|
||||
|
||||
return doclist.as_dict()
|
||||
return doclist
|
Loading…
x
Reference in New Issue
Block a user