diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py index 491ddeb89da..8a797c3ebcd 100644 --- a/erpnext/stock/doctype/serial_no/serial_no.py +++ b/erpnext/stock/doctype/serial_no/serial_no.py @@ -139,7 +139,7 @@ class SerialNo(StockController): order by posting_date desc, posting_time desc, name desc""", ("%%%s%%" % self.name, self.item_code), as_dict=1): if self.name.upper() in get_serial_nos(sle.serial_no): - if cint(sle.actual_qty) > 0: + if sle.actual_qty > 0: sle_dict.setdefault("incoming", []).append(sle) else: sle_dict.setdefault("outgoing", []).append(sle) @@ -218,7 +218,7 @@ def validate_serial_no(sle, item_det): frappe.throw(_("Serial No {0} does not belong to Item {1}").format(serial_no, sle.item_code), SerialNoItemError) - if cint(sle.actual_qty) > 0 and has_duplicate_serial_no(sr, sle): + if sle.actual_qty > 0 and has_duplicate_serial_no(sr, sle): frappe.throw(_("Serial No {0} has already been received").format(serial_no), SerialNoDuplicateError) @@ -228,7 +228,7 @@ def validate_serial_no(sle, item_det): if return_against and return_against != sr.delivery_document_no: frappe.throw(_("Serial no {0} has been already returned").format(sr.name)) - if cint(sle.actual_qty) < 0: + if sle.actual_qty < 0: if sr.warehouse!=sle.warehouse: frappe.throw(_("Serial No {0} does not belong to Warehouse {1}").format(serial_no, sle.warehouse), SerialNoWarehouseError) @@ -279,16 +279,16 @@ def validate_serial_no(sle, item_det): "parent": sales_invoice, "item_code": sle.item_code}, "sales_order") if sales_order and get_reserved_qty_for_so(sales_order, sle.item_code): validate_so_serial_no(sr, sales_order) - elif cint(sle.actual_qty) < 0: + elif sle.actual_qty < 0: # transfer out frappe.throw(_("Serial No {0} not in stock").format(serial_no), SerialNoNotExistsError) - elif cint(sle.actual_qty) < 0 or not item_det.serial_no_series: + elif sle.actual_qty < 0 or not item_det.serial_no_series: frappe.throw(_("Serial Nos Required for Serialized Item {0}").format(sle.item_code), SerialNoRequiredError) elif serial_nos: for serial_no in serial_nos: sr = frappe.db.get_value("Serial No", serial_no, ["name", "warehouse"], as_dict=1) - if sr and cint(sle.actual_qty) < 0 and sr.warehouse != sle.warehouse: + if sr and sle.actual_qty < 0 and sr.warehouse != sle.warehouse: frappe.throw(_("Cannot cancel {0} {1} because Serial No {2} does not belong to the warehouse {3}") .format(sle.voucher_type, sle.voucher_no, serial_no, sle.warehouse)) @@ -323,7 +323,7 @@ def allow_serial_nos_with_different_item(sle_serial_no, sle): in Manufacture / Repack type Stock Entry """ allow_serial_nos = False - if sle.voucher_type=="Stock Entry" and cint(sle.actual_qty) > 0: + if sle.voucher_type=="Stock Entry" and sle.actual_qty > 0: stock_entry = frappe.get_doc("Stock Entry", sle.voucher_no) if stock_entry.purpose in ("Repack", "Manufacture"): for d in stock_entry.get("items"): @@ -335,7 +335,7 @@ def allow_serial_nos_with_different_item(sle_serial_no, sle): return allow_serial_nos def update_serial_nos(sle, item_det): - if sle.is_cancelled == "No" and not sle.serial_no and cint(sle.actual_qty) > 0 \ + if sle.is_cancelled == "No" and not sle.serial_no and sle.actual_qty > 0 \ and item_det.has_serial_no == 1 and item_det.serial_no_series: serial_nos = get_auto_serial_nos(item_det.serial_no_series, sle.actual_qty) frappe.db.set(sle, "serial_no", serial_nos) diff --git a/erpnext/stock/doctype/serial_no/test_serial_no.py b/erpnext/stock/doctype/serial_no/test_serial_no.py index 89062f9ec8e..ed70790b2ca 100644 --- a/erpnext/stock/doctype/serial_no/test_serial_no.py +++ b/erpnext/stock/doctype/serial_no/test_serial_no.py @@ -7,6 +7,12 @@ from __future__ import unicode_literals import frappe, unittest +from erpnext.stock.doctype.stock_entry.test_stock_entry import make_serialized_item +from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt +from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note +from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos +from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse + test_dependencies = ["Item"] test_records = frappe.get_test_records('Serial No') @@ -29,3 +35,21 @@ class TestSerialNo(unittest.TestCase): sr.warehouse = "_Test Warehouse - _TC" self.assertTrue(SerialNoCannotCannotChangeError, sr.save) + + def test_inter_company_transfer(self): + se = make_serialized_item(target_warehouse="_Test Warehouse - _TC") + serial_nos = get_serial_nos(se.get("items")[0].serial_no) + + create_delivery_note(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0]) + + wh = create_warehouse("_Test Warehouse", company="_Test Company 1") + make_purchase_receipt(item_code="_Test Serialized Item With Series", qty=1, serial_no=serial_nos[0], + company="_Test Company 1", warehouse=wh) + + serial_no = frappe.db.get_value("Serial No", serial_nos[0], ["warehouse", "company"], as_dict=1) + + self.assertEqual(serial_no.warehouse, wh) + self.assertEqual(serial_no.company, "_Test Company 1") + + def tearDown(self): + frappe.db.rollback() \ No newline at end of file diff --git a/erpnext/stock/doctype/warehouse/test_warehouse.py b/erpnext/stock/doctype/warehouse/test_warehouse.py index b033f86d8e3..dc39e101ce0 100644 --- a/erpnext/stock/doctype/warehouse/test_warehouse.py +++ b/erpnext/stock/doctype/warehouse/test_warehouse.py @@ -8,6 +8,7 @@ from erpnext import set_perpetual_inventory from frappe.test_runner import make_test_records from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account +import erpnext import frappe import unittest test_records = frappe.get_test_records('Warehouse') @@ -90,17 +91,24 @@ class TestWarehouse(unittest.TestCase): self.assertTrue(frappe.db.get_value("Warehouse", filters={"account": "Test Warehouse for Merging 2 - _TC"})) -def create_warehouse(warehouse_name, properties=None): - if not frappe.db.exists("Warehouse", warehouse_name + " - _TC"): +def create_warehouse(warehouse_name, properties=None, company=None): + if not company: + company = "_Test Company" + + warehouse_id = erpnext.encode_company_abbr(warehouse_name, company) + if not frappe.db.exists("Warehouse", warehouse_id): w = frappe.new_doc("Warehouse") w.warehouse_name = warehouse_name w.parent_warehouse = "_Test Warehouse Group - _TC" - w.company = "_Test Company" + w.company = company make_account_for_warehouse(warehouse_name, w) - w.account = warehouse_name + " - _TC" + w.account = warehouse_id if properties: w.update(properties) w.save() + return w.name + else: + return warehouse_id def make_account_for_warehouse(warehouse_name, warehouse_obj): if not frappe.db.exists("Account", warehouse_name + " - _TC"):