From b445be3552fc91ea5390771d44841717deccf7b8 Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Mon, 21 Sep 2015 10:56:02 +0530 Subject: [PATCH] Test case for delivery to target warehouse --- .../sales_invoice/test_sales_invoice.py | 21 +++---- erpnext/controllers/selling_controller.py | 2 +- .../delivery_note/test_delivery_note.py | 61 +++++++++++++++++-- .../test_landed_cost_voucher.py | 3 +- 4 files changed, 68 insertions(+), 19 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 20c734ce5c3..fc8ca632a62 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -8,6 +8,8 @@ from frappe.utils import nowdate, add_days, flt from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry, get_qty_after_transaction from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory from erpnext.exceptions import InvalidAccountCurrency, InvalidCurrency +from erpnext.stock.doctype.serial_no.serial_no import SerialNoWarehouseError +from frappe.model.naming import make_autoname class TestSalesInvoice(unittest.TestCase): def make(self): @@ -706,27 +708,22 @@ class TestSalesInvoice(unittest.TestCase): "delivery_document_no")) def test_serialize_status(self): - from erpnext.stock.doctype.serial_no.serial_no import SerialNoWarehouseError, get_serial_nos, SerialNoDuplicateError - from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item - - se = make_serialized_item() - serial_nos = get_serial_nos(se.get("items")[0].serial_no) - - sr = frappe.get_doc("Serial No", serial_nos[0]) - sr.save() + serial_no = frappe.get_doc({ + "doctype": "Serial No", + "item_code": "_Test Serialized Item With Series", + "serial_no": make_autoname("SR", "Serial No") + }) + serial_no.save() si = frappe.copy_doc(test_records[0]) si.update_stock = 1 si.get("items")[0].item_code = "_Test Serialized Item With Series" si.get("items")[0].qty = 1 - si.get("items")[0].serial_no = serial_nos[0] + si.get("items")[0].serial_no = serial_no.name si.insert() self.assertRaises(SerialNoWarehouseError, si.submit) - # hack! because stock ledger entires are already inserted and are not rolled back! - self.assertRaises(SerialNoDuplicateError, si.cancel) - def test_invoice_due_date_against_customers_credit_days(self): # set customer's credit days frappe.db.set_value("Customer", "_Test Customer", "credit_days_based_on", "Fixed Days") diff --git a/erpnext/controllers/selling_controller.py b/erpnext/controllers/selling_controller.py index 75be4d684cb..b087b8a8843 100644 --- a/erpnext/controllers/selling_controller.py +++ b/erpnext/controllers/selling_controller.py @@ -186,7 +186,7 @@ class SellingController(StockController): 'batch_no': cstr(d.get("batch_no")).strip(), 'serial_no': cstr(d.get("serial_no")).strip(), 'name': d.name, - 'target_warehouse': p.target_warehouse + 'target_warehouse': d.target_warehouse })) return il diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py index d233d6b74a5..af52c7a9ab3 100644 --- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py +++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py @@ -164,11 +164,16 @@ class TestDeliveryNote(unittest.TestCase): }) def test_serialize_status(self): - se = make_serialized_item() - serial_no = get_serial_nos(se.get("items")[0].serial_no)[0] + from frappe.model.naming import make_autoname + serial_no = frappe.get_doc({ + "doctype": "Serial No", + "item_code": "_Test Serialized Item With Series", + "serial_no": make_autoname("SR", "Serial No") + }) + serial_no.save() dn = create_delivery_note(item_code="_Test Serialized Item With Series", - serial_no=serial_no, do_not_submit=True) + serial_no=serial_no.name, do_not_submit=True) self.assertRaises(SerialNoWarehouseError, dn.submit) @@ -318,7 +323,54 @@ class TestDeliveryNote(unittest.TestCase): "delivery_document_no": "", "purchase_document_no": se.name }) + + def test_delivery_of_bundled_items_to_target_warehouse(self): + set_perpetual_inventory() + + create_stock_reconciliation(item_code="_Test Item", target="_Test Warehouse - _TC", qty=50, rate=100) + create_stock_reconciliation(item_code="_Test Item Home Desktop 100", target="_Test Warehouse - _TC", + qty=50, rate=100) + + opening_qty_test_warehouse_1 = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC") + + dn = create_delivery_note(item_code="_Test Product Bundle Item", + qty=5, rate=500, target_warehouse="_Test Warehouse 1 - _TC") + + # qty after delivery + actual_qty = get_qty_after_transaction(warehouse="_Test Warehouse - _TC") + self.assertEquals(actual_qty, 25) + + actual_qty = get_qty_after_transaction(warehouse="_Test Warehouse 1 - _TC") + self.assertEquals(actual_qty, opening_qty_test_warehouse_1 + 25) + + # stock value diff for source warehouse + stock_value_difference = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note", + "voucher_no": dn.name, "item_code": "_Test Item", "warehouse": "_Test Warehouse - _TC"}, + "stock_value_difference") + + # stock value diff for target warehouse + stock_value_difference1 = frappe.db.get_value("Stock Ledger Entry", {"voucher_type": "Delivery Note", + "voucher_no": dn.name, "item_code": "_Test Item", "warehouse": "_Test Warehouse 1 - _TC"}, + "stock_value_difference") + self.assertEquals(abs(stock_value_difference), stock_value_difference1) + # Check gl entries + gl_entries = get_gl_entries("Delivery Note", dn.name) + self.assertTrue(gl_entries) + + stock_value_difference = abs(frappe.db.sql("""select sum(stock_value_difference) + from `tabStock Ledger Entry` where voucher_type='Delivery Note' and voucher_no=%s + and warehouse='_Test Warehouse - _TC'""", dn.name)[0][0]) + + expected_values = { + "_Test Warehouse - _TC": [0.0, stock_value_difference], + "_Test Warehouse 1 - _TC": [stock_value_difference, 0.0] + } + for i, gle in enumerate(gl_entries): + self.assertEquals([gle.debit, gle.credit], expected_values.get(gle.account)) + + set_perpetual_inventory(0) + def create_delivery_note(**args): dn = frappe.new_doc("Delivery Note") args = frappe._dict(args) @@ -341,7 +393,8 @@ def create_delivery_note(**args): "conversion_factor": 1.0, "expense_account": "Cost of Goods Sold - _TC", "cost_center": "_Test Cost Center - _TC", - "serial_no": args.serial_no + "serial_no": args.serial_no, + "target_warehouse": args.target_warehouse }) if not args.do_not_save: diff --git a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py index af569f850c5..89f3ad565e5 100644 --- a/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py +++ b/erpnext/stock/doctype/landed_cost_voucher/test_landed_cost_voucher.py @@ -65,9 +65,8 @@ class TestLandedCostVoucher(unittest.TestCase): self.submit_landed_cost_voucher(pr) serial_no = frappe.db.get_value("Serial No", "SN001", - ["status", "warehouse", "purchase_rate"], as_dict=1) + ["warehouse", "purchase_rate"], as_dict=1) - self.assertEquals(serial_no.status, "Available") self.assertEquals(serial_no.purchase_rate - serial_no_rate, 5.0) self.assertEquals(serial_no.warehouse, "_Test Warehouse - _TC")