import assert from "node:assert/strict"; import { readFileSync } from "node:fs"; import { fileURLToPath } from "node:url"; const inventoryViewSource = readFileSync( fileURLToPath(new URL("../src/views/InventoryLedgerView.vue", import.meta.url)), "utf8" ); const backendInventorySource = readFileSync( fileURLToPath(new URL("../../backend/app/api/routes/inventory.py", import.meta.url)), "utf8" ); assert.match( inventoryViewSource, /const isScrapSaleOutbound = computed\(\(\) =>[\s\S]*activeWarehouseType\.value === "SCRAP"[\s\S]*activeOperation\.value\?\.bizType === "SCRAP_SALE_OUT"/, "scrap sale outbound should have an explicit state flag" ); assert.match( inventoryViewSource, /if \(isScrapSaleOutbound\.value\) \{[\s\S]*return "废料";[\s\S]*\}/, "scrap sale outbound should label the generic item field as 废料" ); assert.match( inventoryViewSource, /usesGenericSourceLotSelector[\s\S]*isScrapSaleOutbound\.value/, "scrap sale outbound should use the stock-lot selector instead of a manual source-lot input" ); assert.match( inventoryViewSource, /function buildScrapSaleSourceLotOptions\([\s\S]*source_material_sub_batch_no[\s\S]*lot_no: sourceLotNo[\s\S]*source_stock_lot_no/, "scrap sale outbound should build selectable options from scrap lots while displaying raw-material source lot numbers" ); assert.match( inventoryViewSource, /isScrapSaleOutbound\.value[\s\S]*buildScrapSaleSourceLotOptions/, "scrap sale outbound source lot options should come from selected scrap stock" ); assert.match( backendInventorySource, /_SELECTED_SOURCE_LOT_OUTBOUND_BIZ_TYPES = \{[\s\S]*"SCRAP_SALE_OUT"[\s\S]*\}/, "backend should allow scrap sale outbound to specify selected stock lots" ); console.log("scrap sale outbound source lot checks passed");