test: fixed test cases

This commit is contained in:
Rohit Waghchaure 2024-02-05 12:40:26 +05:30
parent 9fafc83632
commit c1e869f040
16 changed files with 100 additions and 143 deletions

View File

@ -151,7 +151,7 @@
"fieldtype": "Column Break"
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Serial and Batch Bundle",

View File

@ -130,7 +130,15 @@ class StockController(AccountsController):
from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos
from erpnext.stock.serial_batch_bundle import SerialBatchCreation
for row in self.items:
# To handle test cases
if frappe.flags.in_test and frappe.flags.use_serial_and_batch_fields:
return
table_name = "items"
if self.doctype == "Asset Capitalization":
table_name = "stock_items"
for row in self.get(table_name):
if not row.serial_no and not row.batch_no and not row.get("rejected_serial_no"):
continue
@ -140,7 +148,7 @@ class StockController(AccountsController):
frappe.throw(_("Please enable Use Old Serial / Batch Fields to make_bundle"))
if row.use_serial_batch_fields and (
not row.serial_and_batch_bundle or not row.get("rejected_serial_and_batch_bundle")
not row.serial_and_batch_bundle and not row.get("rejected_serial_and_batch_bundle")
):
sn_doc = SerialBatchCreation(
{
@ -164,10 +172,21 @@ class StockController(AccountsController):
if sn_doc.is_rejected:
row.rejected_serial_and_batch_bundle = sn_doc.name
row.db_set("rejected_serial_and_batch_bundle", sn_doc.name)
row.db_set(
{
"rejected_serial_and_batch_bundle": sn_doc.name,
"rejected_serial_no": "",
}
)
else:
row.serial_and_batch_bundle = sn_doc.name
row.db_set("serial_and_batch_bundle", sn_doc.name)
row.db_set(
{
"serial_and_batch_bundle": sn_doc.name,
"serial_no": "",
"batch_no": "",
}
)
def set_use_serial_batch_fields(self):
if frappe.db.get_single_value("Stock Settings", "use_serial_batch_fields"):

View File

@ -732,10 +732,10 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
item.serial_no = item.serial_no.replace(/,/g, '\n');
item.conversion_factor = item.conversion_factor || 1;
refresh_field("serial_no", item.name, item.parentfield);
if (!doc.is_return && cint(frappe.user_defaults.set_qty_in_transactions_based_on_serial_no_input)) {
if (!doc.is_return) {
setTimeout(() => {
me.update_qty(cdt, cdn);
}, 10000);
}, 3000);
}
}
}

View File

@ -200,7 +200,6 @@ class TestDeliveryNote(FrappeTestCase):
},
)
frappe.flags.ignore_serial_batch_bundle_validation = True
serial_nos = [
"OSN-1",
"OSN-2",
@ -239,6 +238,8 @@ class TestDeliveryNote(FrappeTestCase):
)
se_doc.items[0].serial_no = "\n".join(serial_nos)
frappe.flags.use_serial_and_batch_fields = True
se_doc.submit()
self.assertEqual(sorted(get_serial_nos(se_doc.items[0].serial_no)), sorted(serial_nos))
@ -294,6 +295,8 @@ class TestDeliveryNote(FrappeTestCase):
self.assertTrue(serial_no in serial_nos)
self.assertFalse(serial_no in returned_serial_nos1)
frappe.flags.use_serial_and_batch_fields = False
def test_sales_return_for_non_bundled_items_partial(self):
company = frappe.db.get_value("Warehouse", "Stores - TCP1", "company")

View File

@ -261,7 +261,7 @@
"read_only": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Serial and Batch Bundle",
@ -270,7 +270,7 @@
"print_hide": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "pick_serial_and_batch",
"fieldtype": "Button",
"label": "Pick Serial / Batch No"

View File

@ -147,12 +147,11 @@ class PickList(Document):
"voucher_no": self.name,
"voucher_detail_no": row.name,
"qty": row.stock_qty,
"type_of_transaction": "Inward" if row.stock_qty > 0 else "Outward",
"type_of_transaction": "Outward",
"company": self.company,
"serial_nos": get_serial_nos(row.serial_no) if row.serial_no else None,
"batches": frappe._dict({row.batch_no: row.stock_qty}) if row.batch_no else None,
"batch_no": row.batch_no,
"use_serial_batch_fields": row.use_serial_batch_fields,
}
).make_serial_and_batch_bundle()
@ -188,6 +187,7 @@ class PickList(Document):
{"is_cancelled": 1, "voucher_no": ""},
)
frappe.get_doc("Serial and Batch Bundle", row.serial_and_batch_bundle).cancel()
row.db_set("serial_and_batch_bundle", None)
def on_update(self):
@ -349,18 +349,13 @@ class PickList(Document):
self.item_location_map = frappe._dict()
from_warehouses = None
if self.parent_warehouse and frappe.get_cached_value(
"Warehouse", self.parent_warehouse, "is_group"
):
if self.parent_warehouse:
from_warehouses = get_descendants_of("Warehouse", self.parent_warehouse)
elif self.parent_warehouse:
from_warehouses = [self.parent_warehouse]
# Create replica before resetting, to handle empty table on update after submit.
locations_replica = self.get("locations")
# reset
self.remove_serial_and_batch_bundle()
self.delete_key("locations")
updated_locations = frappe._dict()
for item_doc in items:
@ -387,13 +382,13 @@ class PickList(Document):
for row in locations:
location = item_doc.as_dict()
location.update(row)
bundle = location.serial_and_batch_bundle or location.serial_no or location.batch_no
key = (
location.item_code,
location.warehouse,
location.uom,
location.batch_no,
location.serial_no,
location.sales_order_item or location.material_request_item,
bundle,
)
if key not in updated_locations:
@ -675,13 +670,17 @@ def get_items_with_location_and_quantity(item_doc, item_location_map, docstatus)
if not stock_qty:
break
serial_nos = None
if item_location.serial_nos:
serial_nos = "\n".join(item_location.serial_nos[0 : cint(stock_qty)])
locations.append(
frappe._dict(
{
"qty": qty,
"stock_qty": stock_qty,
"warehouse": item_location.warehouse,
"serial_no": item_location.serial_no,
"serial_no": serial_nos,
"batch_no": item_location.batch_no,
"use_serial_batch_fields": 1,
}
@ -711,7 +710,6 @@ def get_available_item_locations(
company,
ignore_validation=False,
picked_item_details=None,
consider_rejected_warehouses=False,
):
locations = []
total_picked_qty = (
@ -727,7 +725,6 @@ def get_available_item_locations(
required_qty,
company,
total_picked_qty,
consider_rejected_warehouses=consider_rejected_warehouses,
)
elif has_serial_no:
locations = get_available_item_locations_for_serialized_item(
@ -778,7 +775,6 @@ def get_available_item_locations_for_serial_and_batched_item(
required_qty,
company,
total_picked_qty=0,
consider_rejected_warehouses=False,
):
# Get batch nos by FIFO
locations = get_available_item_locations_for_batched_item(
@ -786,7 +782,6 @@ def get_available_item_locations_for_serial_and_batched_item(
from_warehouses,
required_qty,
company,
consider_rejected_warehouses=consider_rejected_warehouses,
)
if locations:
@ -804,12 +799,12 @@ def get_available_item_locations_for_serial_and_batched_item(
.where(
(conditions) & (sn.batch_no == location.batch_no) & (sn.warehouse == location.warehouse)
)
.orderby(sn.purchase_date)
.orderby(sn.creation)
.limit(ceil(location.qty + total_picked_qty))
).run(as_dict=True)
serial_nos = [sn.name for sn in serial_nos]
location.serial_no = serial_nos
location.serial_nos = serial_nos
location.qty = len(serial_nos)
return locations
@ -848,6 +843,7 @@ def get_available_item_locations_for_serialized_item(
picked_qty -= 1
locations = []
for warehouse, serial_nos in warehouse_serial_nos_map.items():
qty = len(serial_nos)
@ -888,12 +884,14 @@ def get_available_item_locations_for_batched_item(
for warehouse, batches in warehouse_wise_batches.items():
for batch_no, qty in batches.items():
locations.append(
{
"qty": qty,
"warehouse": warehouse,
"item_code": item_code,
"batch_no": batch_no,
}
frappe._dict(
{
"qty": qty,
"warehouse": warehouse,
"item_code": item_code,
"batch_no": batch_no,
}
)
)
return locations

View File

@ -217,6 +217,8 @@ class TestPickList(FrappeTestCase):
)
pick_list.save()
pick_list.submit()
self.assertEqual(pick_list.locations[0].item_code, "_Test Serialized Item")
self.assertEqual(pick_list.locations[0].warehouse, "_Test Warehouse - _TC")
self.assertEqual(pick_list.locations[0].qty, 5)
@ -239,7 +241,7 @@ class TestPickList(FrappeTestCase):
pr1 = make_purchase_receipt(item_code="Batched Item", qty=1, rate=100.0)
pr1.load_from_db()
oldest_batch_no = pr1.items[0].batch_no
oldest_batch_no = get_batch_from_bundle(pr1.items[0].serial_and_batch_bundle)
pr2 = make_purchase_receipt(item_code="Batched Item", qty=2, rate=100.0)
@ -302,6 +304,8 @@ class TestPickList(FrappeTestCase):
}
)
pick_list.set_item_locations()
pick_list.submit()
pick_list.reload()
self.assertEqual(
get_batch_from_bundle(pick_list.locations[0].serial_and_batch_bundle), oldest_batch_no
@ -310,6 +314,7 @@ class TestPickList(FrappeTestCase):
get_serial_nos_from_bundle(pick_list.locations[0].serial_and_batch_bundle), oldest_serial_nos
)
pick_list.cancel()
pr1.cancel()
pr2.cancel()
@ -671,29 +676,22 @@ class TestPickList(FrappeTestCase):
so = make_sales_order(item_code=item, qty=25.0, rate=100)
pl = create_pick_list(so.name)
pl.submit()
# pick half the qty
for loc in pl.locations:
self.assertEqual(loc.qty, 25.0)
self.assertTrue(loc.serial_and_batch_bundle)
data = frappe.get_all(
"Serial and Batch Entry",
fields=["qty", "batch_no"],
filters={"parent": loc.serial_and_batch_bundle},
)
for d in data:
self.assertEqual(d.batch_no, "PICKLT-000001")
self.assertEqual(d.qty, 25.0 * -1)
pl.save()
pl.submit()
so1 = make_sales_order(item_code=item, qty=10.0, rate=100)
pl = create_pick_list(so1.name)
pl1 = create_pick_list(so1.name)
pl1.submit()
# pick half the qty
for loc in pl.locations:
self.assertEqual(loc.qty, 10.0)
for loc in pl1.locations:
self.assertEqual(loc.qty, 5.0)
self.assertTrue(loc.serial_and_batch_bundle)
data = frappe.get_all(
@ -709,8 +707,7 @@ class TestPickList(FrappeTestCase):
elif d.batch_no == "PICKLT-000002":
self.assertEqual(d.qty, 5.0 * -1)
pl.save()
pl.submit()
pl1.cancel()
pl.cancel()
def test_picklist_for_serial_item(self):
@ -723,6 +720,7 @@ class TestPickList(FrappeTestCase):
so = make_sales_order(item_code=item, qty=25.0, rate=100)
pl = create_pick_list(so.name)
pl.submit()
picked_serial_nos = []
# pick half the qty
for loc in pl.locations:
@ -736,13 +734,11 @@ class TestPickList(FrappeTestCase):
picked_serial_nos = [d.serial_no for d in data]
self.assertEqual(len(picked_serial_nos), 25)
pl.save()
pl.submit()
so1 = make_sales_order(item_code=item, qty=10.0, rate=100)
pl = create_pick_list(so1.name)
pl1 = create_pick_list(so1.name)
pl1.submit()
# pick half the qty
for loc in pl.locations:
for loc in pl1.locations:
self.assertEqual(loc.qty, 10.0)
self.assertTrue(loc.serial_and_batch_bundle)
@ -756,8 +752,7 @@ class TestPickList(FrappeTestCase):
for d in data:
self.assertTrue(d.serial_no not in picked_serial_nos)
pl.save()
pl.submit()
pl1.cancel()
pl.cancel()
def test_picklist_with_bundles(self):

View File

@ -196,7 +196,7 @@
"read_only": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Serial and Batch Bundle",
@ -206,7 +206,7 @@
"search_index": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "pick_serial_and_batch",
"fieldtype": "Button",
"label": "Pick Serial / Batch No"

View File

@ -136,6 +136,7 @@ class TestSerialandBatchBundle(FrappeTestCase):
def test_old_batch_valuation(self):
frappe.flags.ignore_serial_batch_bundle_validation = True
frappe.flags.use_serial_and_batch_fields = True
batch_item_code = "Old Batch Item Valuation 1"
make_item(
batch_item_code,
@ -240,6 +241,7 @@ class TestSerialandBatchBundle(FrappeTestCase):
bundle_doc.submit()
frappe.flags.ignore_serial_batch_bundle_validation = False
frappe.flags.use_serial_and_batch_fields = False
def test_old_serial_no_valuation(self):
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt
@ -259,6 +261,7 @@ class TestSerialandBatchBundle(FrappeTestCase):
)
frappe.flags.ignore_serial_batch_bundle_validation = True
frappe.flags.use_serial_and_batch_fields = True
serial_no_id = "Old Serial No 1"
if not frappe.db.exists("Serial No", serial_no_id):
@ -320,6 +323,9 @@ class TestSerialandBatchBundle(FrappeTestCase):
for row in bundle_doc.entries:
self.assertEqual(flt(row.stock_value_difference, 2), -100.00)
frappe.flags.ignore_serial_batch_bundle_validation = False
frappe.flags.use_serial_and_batch_fields = False
def test_batch_not_belong_to_serial_no(self):
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import make_purchase_receipt

View File

@ -92,6 +92,9 @@ def make_stock_entry(**args):
else:
args.qty = cint(args.qty)
if args.serial_no or args.batch_no:
args.use_serial_batch_fields = True
# purpose
if not args.purpose:
if args.source and args.target:
@ -162,6 +165,7 @@ def make_stock_entry(**args):
)
args.serial_no = serial_number
s.append(
"items",
{
@ -177,6 +181,7 @@ def make_stock_entry(**args):
"batch_no": args.batch_no,
"cost_center": args.cost_center,
"expense_account": args.expense_account,
"use_serial_batch_fields": args.use_serial_batch_fields,
},
)

View File

@ -680,6 +680,7 @@ class TestStockEntry(FrappeTestCase):
def test_serial_move(self):
se = make_serialized_item()
serial_no = get_serial_nos_from_bundle(se.get("items")[0].serial_and_batch_bundle)[0]
frappe.flags.use_serial_and_batch_fields = True
se = frappe.copy_doc(test_records[0])
se.purpose = "Material Transfer"
@ -700,6 +701,7 @@ class TestStockEntry(FrappeTestCase):
self.assertTrue(
frappe.db.get_value("Serial No", serial_no, "warehouse"), "_Test Warehouse - _TC"
)
frappe.flags.use_serial_and_batch_fields = False
def test_serial_cancel(self):
se, serial_nos = self.test_serial_by_series()
@ -999,6 +1001,8 @@ class TestStockEntry(FrappeTestCase):
do_not_save=True,
)
frappe.flags.use_serial_and_batch_fields = True
cls_obj = SerialBatchCreation(
{
"type_of_transaction": "Inward",
@ -1035,84 +1039,7 @@ class TestStockEntry(FrappeTestCase):
s2.submit()
s2.cancel()
# def test_retain_sample(self):
# from erpnext.stock.doctype.batch.batch import get_batch_qty
# from erpnext.stock.doctype.warehouse.test_warehouse import create_warehouse
# create_warehouse("Test Warehouse for Sample Retention")
# frappe.db.set_value(
# "Stock Settings",
# None,
# "sample_retention_warehouse",
# "Test Warehouse for Sample Retention - _TC",
# )
# test_item_code = "Retain Sample Item"
# if not frappe.db.exists("Item", test_item_code):
# item = frappe.new_doc("Item")
# item.item_code = test_item_code
# item.item_name = "Retain Sample Item"
# item.description = "Retain Sample Item"
# item.item_group = "All Item Groups"
# item.is_stock_item = 1
# item.has_batch_no = 1
# item.create_new_batch = 1
# item.retain_sample = 1
# item.sample_quantity = 4
# item.save()
# receipt_entry = frappe.new_doc("Stock Entry")
# receipt_entry.company = "_Test Company"
# receipt_entry.purpose = "Material Receipt"
# receipt_entry.append(
# "items",
# {
# "item_code": test_item_code,
# "t_warehouse": "_Test Warehouse - _TC",
# "qty": 40,
# "basic_rate": 12,
# "cost_center": "_Test Cost Center - _TC",
# "sample_quantity": 4,
# },
# )
# receipt_entry.set_stock_entry_type()
# receipt_entry.insert()
# receipt_entry.submit()
# retention_data = move_sample_to_retention_warehouse(
# receipt_entry.company, receipt_entry.get("items")
# )
# retention_entry = frappe.new_doc("Stock Entry")
# retention_entry.company = retention_data.company
# retention_entry.purpose = retention_data.purpose
# retention_entry.append(
# "items",
# {
# "item_code": test_item_code,
# "t_warehouse": "Test Warehouse for Sample Retention - _TC",
# "s_warehouse": "_Test Warehouse - _TC",
# "qty": 4,
# "basic_rate": 12,
# "cost_center": "_Test Cost Center - _TC",
# "batch_no": get_batch_from_bundle(receipt_entry.get("items")[0].serial_and_batch_bundle),
# },
# )
# retention_entry.set_stock_entry_type()
# retention_entry.insert()
# retention_entry.submit()
# qty_in_usable_warehouse = get_batch_qty(
# get_batch_from_bundle(receipt_entry.get("items")[0].serial_and_batch_bundle), "_Test Warehouse - _TC", "_Test Item"
# )
# qty_in_retention_warehouse = get_batch_qty(
# get_batch_from_bundle(receipt_entry.get("items")[0].serial_and_batch_bundle),
# "Test Warehouse for Sample Retention - _TC",
# "_Test Item",
# )
# self.assertEqual(qty_in_usable_warehouse, 36)
# self.assertEqual(qty_in_retention_warehouse, 4)
frappe.flags.use_serial_and_batch_fields = False
def test_quality_check(self):
item_code = "_Test Item For QC"

View File

@ -582,7 +582,7 @@
"label": "Add Serial / Batch No"
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Serial and Batch Bundle",

View File

@ -482,6 +482,8 @@ class TestStockLedgerEntry(FrappeTestCase, StockTestMixin):
(item, warehouses[0], batches[1], 1, 200),
(item, warehouses[0], batches[0], 1, 200),
]
frappe.flags.use_serial_and_batch_fields = True
dns = create_delivery_note_entries_for_batchwise_item_valuation_test(dn_entry_list)
sle_details = fetch_sle_details_for_doc_list(dns, ["stock_value_difference"])
svd_list = [-1 * d["stock_value_difference"] for d in sle_details]
@ -494,6 +496,8 @@ class TestStockLedgerEntry(FrappeTestCase, StockTestMixin):
"Incorrect 'Incoming Rate' values fetched for DN items",
)
frappe.flags.use_serial_and_batch_fields = False
def test_batchwise_item_valuation_stock_reco(self):
item, warehouses, batches = setup_item_valuation_test()
state = {"stock_value": 0.0, "qty": 0.0}

View File

@ -198,7 +198,7 @@
"read_only": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Serial / Batch Bundle",
@ -208,7 +208,7 @@
"search_index": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "current_serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Current Serial / Batch Bundle",
@ -217,7 +217,7 @@
"read_only": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "add_serial_batch_bundle",
"fieldtype": "Button",
"label": "Add Serial / Batch No"

View File

@ -479,7 +479,7 @@
"label": "Accounting Details"
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Serial and Batch Bundle",
@ -488,7 +488,7 @@
"print_hide": 1
},
{
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "rejected_serial_and_batch_bundle",
"fieldtype": "Link",
"label": "Rejected Serial and Batch Bundle",

View File

@ -201,7 +201,7 @@
},
{
"columns": 2,
"depends_on": "eval:doc.use_serial_batch_fields === 0",
"depends_on": "eval:doc.use_serial_batch_fields === 0 || doc.docstatus === 1",
"fieldname": "serial_and_batch_bundle",
"fieldtype": "Link",
"in_list_view": 1,