mirror of
https://github.com/frappe/erpnext.git
synced 2026-06-01 03:09:09 +00:00
test: Inter company stock transfer for serialised items
This commit is contained in:
@@ -139,7 +139,7 @@ class SerialNo(StockController):
|
|||||||
order by posting_date desc, posting_time desc, name desc""",
|
order by posting_date desc, posting_time desc, name desc""",
|
||||||
("%%%s%%" % self.name, self.item_code), as_dict=1):
|
("%%%s%%" % self.name, self.item_code), as_dict=1):
|
||||||
if self.name.upper() in get_serial_nos(sle.serial_no):
|
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)
|
sle_dict.setdefault("incoming", []).append(sle)
|
||||||
else:
|
else:
|
||||||
sle_dict.setdefault("outgoing", []).append(sle)
|
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,
|
frappe.throw(_("Serial No {0} does not belong to Item {1}").format(serial_no,
|
||||||
sle.item_code), SerialNoItemError)
|
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),
|
frappe.throw(_("Serial No {0} has already been received").format(serial_no),
|
||||||
SerialNoDuplicateError)
|
SerialNoDuplicateError)
|
||||||
|
|
||||||
@@ -228,7 +228,7 @@ def validate_serial_no(sle, item_det):
|
|||||||
if return_against and return_against != sr.delivery_document_no:
|
if return_against and return_against != sr.delivery_document_no:
|
||||||
frappe.throw(_("Serial no {0} has been already returned").format(sr.name))
|
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:
|
if sr.warehouse!=sle.warehouse:
|
||||||
frappe.throw(_("Serial No {0} does not belong to Warehouse {1}").format(serial_no,
|
frappe.throw(_("Serial No {0} does not belong to Warehouse {1}").format(serial_no,
|
||||||
sle.warehouse), SerialNoWarehouseError)
|
sle.warehouse), SerialNoWarehouseError)
|
||||||
@@ -279,16 +279,16 @@ def validate_serial_no(sle, item_det):
|
|||||||
"parent": sales_invoice, "item_code": sle.item_code}, "sales_order")
|
"parent": sales_invoice, "item_code": sle.item_code}, "sales_order")
|
||||||
if sales_order and get_reserved_qty_for_so(sales_order, sle.item_code):
|
if sales_order and get_reserved_qty_for_so(sales_order, sle.item_code):
|
||||||
validate_so_serial_no(sr, sales_order)
|
validate_so_serial_no(sr, sales_order)
|
||||||
elif cint(sle.actual_qty) < 0:
|
elif sle.actual_qty < 0:
|
||||||
# transfer out
|
# transfer out
|
||||||
frappe.throw(_("Serial No {0} not in stock").format(serial_no), SerialNoNotExistsError)
|
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),
|
frappe.throw(_("Serial Nos Required for Serialized Item {0}").format(sle.item_code),
|
||||||
SerialNoRequiredError)
|
SerialNoRequiredError)
|
||||||
elif serial_nos:
|
elif serial_nos:
|
||||||
for serial_no in serial_nos:
|
for serial_no in serial_nos:
|
||||||
sr = frappe.db.get_value("Serial No", serial_no, ["name", "warehouse"], as_dict=1)
|
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}")
|
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))
|
.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
|
in Manufacture / Repack type Stock Entry
|
||||||
"""
|
"""
|
||||||
allow_serial_nos = False
|
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)
|
stock_entry = frappe.get_doc("Stock Entry", sle.voucher_no)
|
||||||
if stock_entry.purpose in ("Repack", "Manufacture"):
|
if stock_entry.purpose in ("Repack", "Manufacture"):
|
||||||
for d in stock_entry.get("items"):
|
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
|
return allow_serial_nos
|
||||||
|
|
||||||
def update_serial_nos(sle, item_det):
|
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:
|
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)
|
serial_nos = get_auto_serial_nos(item_det.serial_no_series, sle.actual_qty)
|
||||||
frappe.db.set(sle, "serial_no", serial_nos)
|
frappe.db.set(sle, "serial_no", serial_nos)
|
||||||
|
|||||||
@@ -7,6 +7,12 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe, unittest
|
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_dependencies = ["Item"]
|
||||||
test_records = frappe.get_test_records('Serial No')
|
test_records = frappe.get_test_records('Serial No')
|
||||||
|
|
||||||
@@ -29,3 +35,21 @@ class TestSerialNo(unittest.TestCase):
|
|||||||
|
|
||||||
sr.warehouse = "_Test Warehouse - _TC"
|
sr.warehouse = "_Test Warehouse - _TC"
|
||||||
self.assertTrue(SerialNoCannotCannotChangeError, sr.save)
|
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()
|
||||||
@@ -8,6 +8,7 @@ from erpnext import set_perpetual_inventory
|
|||||||
from frappe.test_runner import make_test_records
|
from frappe.test_runner import make_test_records
|
||||||
from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account
|
from erpnext.accounts.doctype.account.test_account import get_inventory_account, create_account
|
||||||
|
|
||||||
|
import erpnext
|
||||||
import frappe
|
import frappe
|
||||||
import unittest
|
import unittest
|
||||||
test_records = frappe.get_test_records('Warehouse')
|
test_records = frappe.get_test_records('Warehouse')
|
||||||
@@ -90,17 +91,24 @@ class TestWarehouse(unittest.TestCase):
|
|||||||
self.assertTrue(frappe.db.get_value("Warehouse",
|
self.assertTrue(frappe.db.get_value("Warehouse",
|
||||||
filters={"account": "Test Warehouse for Merging 2 - _TC"}))
|
filters={"account": "Test Warehouse for Merging 2 - _TC"}))
|
||||||
|
|
||||||
def create_warehouse(warehouse_name, properties=None):
|
def create_warehouse(warehouse_name, properties=None, company=None):
|
||||||
if not frappe.db.exists("Warehouse", warehouse_name + " - _TC"):
|
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 = frappe.new_doc("Warehouse")
|
||||||
w.warehouse_name = warehouse_name
|
w.warehouse_name = warehouse_name
|
||||||
w.parent_warehouse = "_Test Warehouse Group - _TC"
|
w.parent_warehouse = "_Test Warehouse Group - _TC"
|
||||||
w.company = "_Test Company"
|
w.company = company
|
||||||
make_account_for_warehouse(warehouse_name, w)
|
make_account_for_warehouse(warehouse_name, w)
|
||||||
w.account = warehouse_name + " - _TC"
|
w.account = warehouse_id
|
||||||
if properties:
|
if properties:
|
||||||
w.update(properties)
|
w.update(properties)
|
||||||
w.save()
|
w.save()
|
||||||
|
return w.name
|
||||||
|
else:
|
||||||
|
return warehouse_id
|
||||||
|
|
||||||
def make_account_for_warehouse(warehouse_name, warehouse_obj):
|
def make_account_for_warehouse(warehouse_name, warehouse_obj):
|
||||||
if not frappe.db.exists("Account", warehouse_name + " - _TC"):
|
if not frappe.db.exists("Account", warehouse_name + " - _TC"):
|
||||||
|
|||||||
Reference in New Issue
Block a user