Refactor production and stock tests to remove UOM dependency
- Updated production.spec.ts, stock-adjustments.spec.ts, and stock-transfers.spec.ts to eliminate UOM references in API seeder and test cases. - Adjusted ApiSeeder methods to remove UOM parameters from stock receiving and production template creation. - Revised documentation to reflect changes in UOM handling, emphasizing that stock is counted in base UOM only. - Introduced new enums for MeasureUnit and StageQtyUnit to clarify content size and stage input quantities. - Implemented ItemContent service to validate and normalize content sizes. - Updated smoke tests to validate production stage inputs expressed in content units, ensuring correct consumption calculations. - Modified frontend UOM label handling to reflect the removal of per-line UOMs in document lines.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { test, expect, APIRequestContext } from "@playwright/test"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Uom, Vendor } from "../support/api"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Vendor } from "../support/api"
|
||||
import { GrnNewPage, GrnDetailPage } from "../pages/GrnPages"
|
||||
import { ProductionRunListPage, ProductionRunDetailPage } from "../pages/ProductionRunPages"
|
||||
import { StockTransferNewPage, StockTransferDetailPage } from "../pages/StockPages"
|
||||
@@ -16,7 +16,6 @@ test.describe("Chained flow: GRN -> Production -> Stock Transfer", () => {
|
||||
let sourceWarehouse: Warehouse
|
||||
let destWarehouse: Warehouse
|
||||
let vendor: Vendor
|
||||
let uom: Uom
|
||||
let rawItem: Item
|
||||
let finishedItem: Item
|
||||
let templateName: string
|
||||
@@ -26,7 +25,6 @@ test.describe("Chained flow: GRN -> Production -> Stock Transfer", () => {
|
||||
seeder = new ApiSeeder(api)
|
||||
sourceWarehouse = await seeder.firstWarehouse()
|
||||
destWarehouse = await seeder.secondWarehouse()
|
||||
uom = await seeder.firstUom()
|
||||
vendor = await seeder.createVendor("Chained Flow Vendor")
|
||||
rawItem = await seeder.createItem({ namePrefix: "Chained Raw Material" })
|
||||
finishedItem = await seeder.createItem({ namePrefix: "Chained Finished Good" })
|
||||
@@ -34,7 +32,7 @@ test.describe("Chained flow: GRN -> Production -> Stock Transfer", () => {
|
||||
const template = await seeder.createSingleStageTemplate({
|
||||
rawItemId: rawItem.itemId,
|
||||
finishedItemId: finishedItem.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
})
|
||||
templateName = template.name
|
||||
})
|
||||
@@ -50,7 +48,7 @@ test.describe("Chained flow: GRN -> Production -> Stock Transfer", () => {
|
||||
await grnNew.useDirectReceipt()
|
||||
await grnNew.selectVendor(vendor.name)
|
||||
await grnNew.selectWarehouse(sourceWarehouse.name)
|
||||
await grnNew.fillFirstLine({ item: rawItem.name, uom: uom.name, qty: 100, unitCost: 20 })
|
||||
await grnNew.fillFirstLine({ item: rawItem.name, qty: 100, unitCost: 20 })
|
||||
await grnNew.submit()
|
||||
|
||||
await expect(page).toHaveURL(/\/dashboard\/receiving\/grn\/\d+/)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { test, expect, APIRequestContext } from "@playwright/test"
|
||||
import { ApiSeeder, newApiContext, Vendor, Warehouse, Item, Uom } from "../support/api"
|
||||
import { ApiSeeder, newApiContext, Vendor, Warehouse, Item } from "../support/api"
|
||||
import { GrnNewPage, GrnDetailPage } from "../pages/GrnPages"
|
||||
|
||||
// GRN receiving flow (Backend/ERPCore/Controllers/GrnsController.cs, Frontend
|
||||
@@ -10,14 +10,12 @@ test.describe("GRN", () => {
|
||||
let seeder: ApiSeeder
|
||||
let warehouse: Warehouse
|
||||
let vendor: Vendor
|
||||
let uom: Uom
|
||||
let item: Item
|
||||
|
||||
test.beforeAll(async () => {
|
||||
api = await newApiContext()
|
||||
seeder = new ApiSeeder(api)
|
||||
warehouse = await seeder.firstWarehouse()
|
||||
uom = await seeder.firstUom()
|
||||
vendor = await seeder.createVendor()
|
||||
item = await seeder.createItem({ namePrefix: "GRN Test Item" })
|
||||
})
|
||||
@@ -32,7 +30,7 @@ test.describe("GRN", () => {
|
||||
await grnNew.useDirectReceipt()
|
||||
await grnNew.selectVendor(vendor.name)
|
||||
await grnNew.selectWarehouse(warehouse.name)
|
||||
await grnNew.fillFirstLine({ item: item.name, uom: uom.name, qty: 10, unitCost: 50 })
|
||||
await grnNew.fillFirstLine({ item: item.name, qty: 10, unitCost: 50 })
|
||||
await grnNew.submit()
|
||||
|
||||
await expect(page).toHaveURL(/\/dashboard\/receiving\/grn\/\d+/)
|
||||
@@ -53,7 +51,7 @@ test.describe("GRN", () => {
|
||||
vendorId: vendor.vendorId,
|
||||
warehouseId: warehouse.warehouseId,
|
||||
itemId: item.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
qty: 5,
|
||||
unitPrice: 40,
|
||||
})
|
||||
@@ -76,7 +74,7 @@ test.describe("GRN", () => {
|
||||
await grnNew.useDirectReceipt()
|
||||
await grnNew.selectVendor(vendor.name)
|
||||
// Warehouse intentionally left unselected.
|
||||
await grnNew.fillFirstLine({ item: item.name, uom: uom.name, qty: 1, unitCost: 10 })
|
||||
await grnNew.fillFirstLine({ item: item.name, qty: 1, unitCost: 10 })
|
||||
await grnNew.submit()
|
||||
|
||||
await expect(page).toHaveURL(/\/dashboard\/receiving\/grn\/new/)
|
||||
@@ -87,7 +85,7 @@ test.describe("GRN", () => {
|
||||
warehouseId: warehouse.warehouseId,
|
||||
vendorId: vendor.vendorId,
|
||||
itemId: item.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
qty: 8,
|
||||
unitCost: 12,
|
||||
})
|
||||
@@ -110,7 +108,7 @@ test.describe("GRN", () => {
|
||||
warehouseId: warehouse.warehouseId,
|
||||
vendorId: vendor.vendorId,
|
||||
itemId: item.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
qty: 3,
|
||||
unitCost: 12,
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { test, expect, APIRequestContext } from "@playwright/test"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Uom, Vendor } from "../support/api"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Vendor } from "../support/api"
|
||||
import { ProductionRunListPage, ProductionRunDetailPage } from "../pages/ProductionRunPages"
|
||||
|
||||
// Production run lifecycle (Backend/ERPCore/Controllers/ProductionRunsController.cs,
|
||||
@@ -12,7 +12,6 @@ test.describe("Production runs", () => {
|
||||
let seeder: ApiSeeder
|
||||
let warehouse: Warehouse
|
||||
let vendor: Vendor
|
||||
let uom: Uom
|
||||
let rawItem: Item
|
||||
let finishedItem: Item
|
||||
let templateName: string
|
||||
@@ -21,7 +20,6 @@ test.describe("Production runs", () => {
|
||||
api = await newApiContext()
|
||||
seeder = new ApiSeeder(api)
|
||||
warehouse = await seeder.firstWarehouse()
|
||||
uom = await seeder.firstUom()
|
||||
vendor = await seeder.createVendor()
|
||||
rawItem = await seeder.createItem({ namePrefix: "PROD Raw Material" })
|
||||
finishedItem = await seeder.createItem({ namePrefix: "PROD Finished Good" })
|
||||
@@ -31,7 +29,7 @@ test.describe("Production runs", () => {
|
||||
warehouseId: warehouse.warehouseId,
|
||||
vendorId: vendor.vendorId,
|
||||
itemId: rawItem.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
qty: 100,
|
||||
unitCost: 20,
|
||||
})
|
||||
@@ -39,7 +37,7 @@ test.describe("Production runs", () => {
|
||||
const template = await seeder.createSingleStageTemplate({
|
||||
rawItemId: rawItem.itemId,
|
||||
finishedItemId: finishedItem.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
})
|
||||
templateName = template.name
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { test, expect, APIRequestContext } from "@playwright/test"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Uom, Vendor } from "../support/api"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Vendor } from "../support/api"
|
||||
import { StockAdjustmentNewPage } from "../pages/StockPages"
|
||||
|
||||
// Stock adjustment flow (Backend/ERPCore/Controllers/StockAdjustmentsController.cs,
|
||||
@@ -10,14 +10,12 @@ test.describe("Stock adjustments", () => {
|
||||
let seeder: ApiSeeder
|
||||
let warehouse: Warehouse
|
||||
let vendor: Vendor
|
||||
let uom: Uom
|
||||
let item: Item
|
||||
|
||||
test.beforeAll(async () => {
|
||||
api = await newApiContext()
|
||||
seeder = new ApiSeeder(api)
|
||||
warehouse = await seeder.firstWarehouse()
|
||||
uom = await seeder.firstUom()
|
||||
vendor = await seeder.createVendor()
|
||||
item = await seeder.createItem({ namePrefix: "Adjustment Test Item" })
|
||||
|
||||
@@ -25,7 +23,7 @@ test.describe("Stock adjustments", () => {
|
||||
warehouseId: warehouse.warehouseId,
|
||||
vendorId: vendor.vendorId,
|
||||
itemId: item.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
qty: 20,
|
||||
unitCost: 30,
|
||||
})
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { test, expect, APIRequestContext } from "@playwright/test"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Uom, Vendor } from "../support/api"
|
||||
import { ApiSeeder, newApiContext, Warehouse, Item, Vendor } from "../support/api"
|
||||
import { StockTransferNewPage, StockTransferDetailPage } from "../pages/StockPages"
|
||||
|
||||
// Stock transfer flow (Backend/ERPCore/Controllers/StockTransfersController.cs, Frontend
|
||||
@@ -11,7 +11,6 @@ test.describe("Stock transfers", () => {
|
||||
let srcWarehouse: Warehouse
|
||||
let destWarehouse: Warehouse
|
||||
let vendor: Vendor
|
||||
let uom: Uom
|
||||
let item: Item
|
||||
|
||||
test.beforeAll(async () => {
|
||||
@@ -19,7 +18,6 @@ test.describe("Stock transfers", () => {
|
||||
seeder = new ApiSeeder(api)
|
||||
srcWarehouse = await seeder.firstWarehouse()
|
||||
destWarehouse = await seeder.secondWarehouse()
|
||||
uom = await seeder.firstUom()
|
||||
vendor = await seeder.createVendor()
|
||||
item = await seeder.createItem({ namePrefix: "Transfer Test Item" })
|
||||
|
||||
@@ -27,7 +25,7 @@ test.describe("Stock transfers", () => {
|
||||
warehouseId: srcWarehouse.warehouseId,
|
||||
vendorId: vendor.vendorId,
|
||||
itemId: item.itemId,
|
||||
uomId: uom.uomId,
|
||||
|
||||
qty: 50,
|
||||
unitCost: 15,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user