export interface ItemLotTraceLotInfo { inventoryLotId: number; lotNo: string; itemId: number; itemCode: string; itemName: string; expiryDate: string | null; productionDate: string | null; stockInDate: string | null; uom: string; primaryStockInLineId: number | null; } export interface ItemLotTraceWarehouseLine { inventoryLotLineId: number; warehouseCode: string; inQty: number; outQty: number; issueQty: number; status: string; availableQty: number; } export interface ItemLotTraceAlternateLocation { inventoryLotId: number; stockInLineId: number | null; inventoryLotLineId: number; warehouseCode: string; availableQty: number; } /** * Per-location lifecycle trace block for one alternate inventory_lot * sharing the same lotNo+itemId. Contains only location-scoped dimensions. * Lot-level dimensions (BOM, JO prelude, production, byproducts, lot relations) * are NOT included — they're at the top level of ItemLotTraceResponse. */ export interface ItemLotTraceLocationBlock { inventoryLotId: number; lotNo: string; itemCode: string; itemName?: string; uom?: string; expiryDate?: string | null; productionDate?: string | null; stockInDate?: string | null; stockInLineId: number | null; warehouseLines: ItemLotTraceWarehouseLine[]; origins: ItemLotTraceOrigin[]; purchaseEvents?: ItemLotTracePurchaseEvent[]; qcResults: ItemLotTraceQcResult[]; putawayEvents: ItemLotTracePutawayEvent[]; movements: ItemLotTraceMovement[]; outboundUsage: ItemLotTraceOutboundUsage[]; stockTakeEvents: ItemLotTraceStockTakeEvent[]; adjustments: ItemLotTraceAdjustment[]; transfers: ItemLotTraceTransfer[]; openMovements: ItemLotTraceOpenMovement[]; failEvents: ItemLotTraceFailEvent[]; doDeliveries: ItemLotTraceDoDelivery[]; replenishmentEvents?: ItemLotTraceReplenishmentEvent[]; returnEvents: ItemLotTraceReturnEvent[]; } export interface ItemLotTraceReplenishmentEvent { replenishmentId: number; replenishmentCode: string; sourceDoCode: string; sourceDoId: number | null; shopCode: string; shopName: string; itemNo: string; itemName: string; reason: string; replenishQty: number; handler: string; timestamp: string | null; pickOrderLineId: number | null; stockOutLineId: number | null; lotNo?: string; inventoryLotId?: number; shopContactName?: string; shopContactNo?: string; shopContactEmail?: string; shopAddress?: string; shopDistrict?: string; } export interface ItemLotTraceOrigin { stockInLineId: number; type: string; refCode: string; refId: number | null; supplierCode: string; supplierName: string; dnNo: string; receiptDate: string | null; acceptedQty: number; status: string; } export interface ItemLotTracePurchaseEvent { purchaseOrderLineId: number; purchaseOrderId: number | null; purchaseOrderCode: string; itemCode: string; itemName: string; orderQty: number; putAwayQty: number; purchaseUnit: string; supplierCode: string; supplierName: string; orderDate: string | null; status: string; } export interface ItemLotTraceQcResult { stockInLineId: number; qcPassed: boolean; failQty: number; acceptedQty: number; remarks: string; handledBy: string; created: string | null; qcItemCode?: string; qcItemName?: string; qcItemDescription?: string; qcType?: string; } export interface ItemLotTraceMovement { direction: string; qty: number; movementType: string; refType: string; refCode: string; refId: number | null; warehouseCode: string; handledBy: string; timestamp: string | null; remarks: string; pickConsoCode?: string; outboundTicketNo?: string; deliveryOrderPickOrderId?: number | null; relationshipId?: number | null; doOutboundIsExtra?: boolean; doOutboundIsReplenish?: boolean; doOutboundQtyChanged?: boolean; processingStatus?: string; matchStatus?: string; } export interface ItemLotTracePutawayEvent { inventoryLotLineId: number; stockInLineId: number | null; warehouseCode: string; qty: number; handledBy: string; timestamp: string | null; refType: string; refCode: string; refId: number | null; status?: string; } export interface ItemLotTraceOutboundUsage { stockOutLineId: number; qty: number; pickOrderCode: string; pickOrderId: number | null; consoCode: string; jobOrderCode: string; jobOrderId: number | null; deliveryOrderCode: string; handler: string; timestamp: string | null; usageType: string; } export interface ItemLotTraceStockTakeRecordDetail { stockTakeLineId: number; bookQty: number; pickerFirstQty?: number | null; pickerFirstBadQty?: number | null; pickerSecondQty?: number | null; pickerSecondBadQty?: number | null; approverQty?: number | null; approverBadQty?: number | null; stockTakerName?: string | null; approverName?: string | null; stockTakeStartTime?: string | null; stockTakeEndTime?: string | null; approverTime?: string | null; recordStatus?: string | null; lastSelect?: number | null; varianceQty?: number | null; } export interface ItemLotTraceStockTakeEvent { stockTakeCode: string; lotNo?: string; itemCode?: string; itemName?: string; warehouseCode?: string; stockTakeSection?: string; stockTakeRoundId?: number | null; stockTakeRoundName?: string; varianceQty: number; beforeQty: number; afterQty?: number | null; approver: string; timestamp: string | null; recordDetail?: ItemLotTraceStockTakeRecordDetail | null; } export interface ItemLotTraceAdjustment { adjustmentType: string; direction: string; qty: number; reason: string; handledBy: string; timestamp: string | null; refCode: string; warehouseCode?: string; } export interface ItemLotTraceTransfer { fromWarehouse: string; toWarehouse: string; qty: number; transferCode: string; timestamp: string | null; } export interface ItemLotTraceBomDownstream { jobOrderCode: string; jobOrderId: number | null; finishedItemCode: string; finishedLotNo: string; finishedStockInLineId: number | null; fgQty: number; fgUom?: string; materialQtyUsed: number; } export interface ItemLotTraceBomUpstream { jobOrderCode: string; jobOrderId: number | null; materialItemCode: string; materialLotNo: string; materialStockInLineId: number | null; materialQty: number; bomQtyPerUnit: number | null; } export interface ItemLotTraceBomRecipeLine { materialItemCode: string; materialItemName: string; qtyPerUnit: number; uom: string; bomProcessId?: number | null; bomProcessSeqNo?: number | null; assignedStepName?: string; } export interface ItemLotTraceStepMaterialRef { materialItemCode: string; materialItemName: string; qtyPerUnit: number; uom: string; } export interface ItemLotTraceBomTrace { direction: string; downstream: ItemLotTraceBomDownstream[]; upstream: ItemLotTraceBomUpstream[]; bomRecipe: ItemLotTraceBomRecipeLine[]; } export interface ItemLotTraceJoContext { jobOrderId: number; jobOrderCode: string; planStart: string | null; /** Earliest jo_pick_order.created for this JO. */ createdAt?: string | null; reqQty: number; status: string; } export interface ItemLotTraceJoPickLine { pickOrderLineId: number; itemCode: string; itemName: string; requiredQty: number; pickedQty: number; status: string; itemType?: string; stockUom?: string; bomReqQty?: number | null; bomUom?: string; bomProcessId?: number | null; bomProcessSeqNo?: number | null; assignedStepName?: string; stockAvailable?: number | null; stockStatusApplicable?: boolean; } export interface ItemLotTraceJoPickOrder { pickOrderId: number; pickOrderCode: string; consoCode: string; status: string; targetDate: string | null; completeDate: string | null; releasedDate: string | null; lines: ItemLotTraceJoPickLine[]; } export interface ItemLotTraceMaterialInput { jobOrderCode: string; jobOrderId: number | null; materialItemCode: string; materialItemName: string; materialLotNo: string; materialStockInLineId: number | null; materialInventoryLotId: number | null; materialQty: number; materialUom?: string; bomQtyPerUnit: number | null; bomProcessId?: number | null; bomProcessSeqNo?: number | null; assignedStepName?: string; pickOrderCode: string; pickOrderId: number | null; consoCode: string; pickedAt: string | null; processingStatus?: string; matchStatus?: string; stockInOrigin: ItemLotTraceOrigin | null; purchaseEvents?: ItemLotTracePurchaseEvent[]; qcResults: ItemLotTraceQcResult[]; putawayEvents: ItemLotTracePutawayEvent[]; /** When this material was produced by another JO, its upstream pick/prelude chain. */ nestedJoPrelude?: ItemLotTraceJoPrelude | null; /** Production steps from the JO that produced this material lot. */ productionSteps?: ItemLotTraceProductionStep[]; } export interface ItemLotTraceJoPrelude { jobOrder: ItemLotTraceJoContext; pickOrders: ItemLotTraceJoPickOrder[]; materialInputs: ItemLotTraceMaterialInput[]; } export interface ItemLotTraceProductionStep { processLineId: number; stepName: string; description: string; equipmentCode: string; equipmentName: string; operatorName: string; startTime: string | null; endTime: string | null; outputQty: number; scrapQty: number; defectQty: number; status: string; seqNo: number | null; bomProcessId?: number | null; stepMaterials?: ItemLotTraceStepMaterialRef[]; } /** Sibling byproduct lot from the same job order (independent item/lot, traceable). */ export interface ItemLotTraceByproductLot { inventoryLotId: number | null; stockInLineId: number | null; lotNo: string; itemCode: string; itemName: string; qty: number; uom: string; processStepName: string; producedAt: string | null; jobOrderCode: string; jobOrderId: number | null; } export interface ItemLotTraceOpenMovement { stockInLineId: number; qty: number; warehouseCode: string; refCode: string; handledBy: string; timestamp: string | null; remarks: string; } export interface ItemLotTraceFailEvent { failId: number; failType: string; category: string; qty: number; handlerName: string; recordDate: string | null; pickOrderCode: string; pickOrderId: number | null; } export interface ItemLotTraceDoDelivery { stockOutLineId: number; qty: number; pickOrderCode: string; pickOrderId: number | null; consoCode: string; ticketNo?: string; deliveryOrderCode: string; deliveryOrderId: number | null; shopCode?: string; shopName?: string; handler: string; timestamp: string | null; releaseType?: string | null; deliveryOrderPickOrderId?: number | null; relationshipId?: number | null; deliveryNoteCode?: string; doPickOrderRecordId?: number | null; isExtra?: boolean; isReplenish?: boolean; /** True when pick_order_line.qty ≠ SUM(stock_out_line.qty) for that line (改數). */ qtyChanged?: boolean; shopContactName?: string; shopContactNo?: string; shopContactEmail?: string; shopAddress?: string; shopDistrict?: string; itemCode?: string; itemName?: string; lotNo?: string; inventoryLotId?: number; } export interface ItemLotTraceReturnEvent { stockOutLineId: number; qty: number; refCode: string; movementType: string; warehouseCode: string; handler: string; timestamp: string | null; remarks: string; } export interface ItemLotTraceLotRelation { relationType: string; inventoryLotId: number | null; lotNo: string; itemCode: string; itemName: string; qty: number; productLotNo: string; timestamp: string | null; } export interface ItemLotTraceGraphEdge { fromKey: string; toKey: string; kind?: string; } export interface ItemLotTraceGraphNodeRef { key: string; kind: string; scopeKey?: string | null; refCode?: string | null; traceLotNo?: string | null; traceItemCode?: string | null; /** Warehouse code for multi-location visual differentiation. */ warehouseCode?: string | null; } export interface ItemLotTraceGraph { nodes: ItemLotTraceGraphNodeRef[]; edges: ItemLotTraceGraphEdge[]; } export interface ItemLotTraceWhereUsed { depth: number; consumedItemCode: string; consumedItemName: string; consumedLotNo: string; materialQtyUsed: number; jobOrderCode: string; jobOrderId: number | null; producedItemCode: string; producedItemName: string; producedLotNo: string; producedQty: number; producedUom: string; producedInventoryLotId: number | null; producedStockInLineId: number | null; } export interface ItemLotTraceIssue { whereUsed: ItemLotTraceWhereUsed[]; downstreamDeliveries: ItemLotTraceDoDelivery[]; downstreamReplenishments: ItemLotTraceReplenishmentEvent[]; } export interface ItemLotTraceResponse { lot: ItemLotTraceLotInfo; warehouseLines: ItemLotTraceWarehouseLine[]; origins: ItemLotTraceOrigin[]; purchaseEvents?: ItemLotTracePurchaseEvent[]; qcResults: ItemLotTraceQcResult[]; putawayEvents: ItemLotTracePutawayEvent[]; movements: ItemLotTraceMovement[]; outboundUsage: ItemLotTraceOutboundUsage[]; stockTakeEvents: ItemLotTraceStockTakeEvent[]; adjustments: ItemLotTraceAdjustment[]; transfers: ItemLotTraceTransfer[]; bomTrace: ItemLotTraceBomTrace; joPrelude: ItemLotTraceJoPrelude | null; productionSteps: ItemLotTraceProductionStep[]; byproductLots: ItemLotTraceByproductLot[]; openMovements: ItemLotTraceOpenMovement[]; failEvents: ItemLotTraceFailEvent[]; doDeliveries: ItemLotTraceDoDelivery[]; replenishmentEvents?: ItemLotTraceReplenishmentEvent[]; returnEvents: ItemLotTraceReturnEvent[]; lotRelations: ItemLotTraceLotRelation[]; alternateLocations: ItemLotTraceAlternateLocation[]; /** Per-location full trace blocks for alternate inventory_lot rows sharing same lotNo+itemId. * Empty when there is only one location for this lot. */ locationBlocks?: ItemLotTraceLocationBlock[]; traceGraph?: ItemLotTraceGraph | null; /** Products made with this lot, and deliveries of those products. */ issueTrace?: ItemLotTraceIssue; } export interface ItemLotTraceParams { stockInLineId?: number; inventoryLotLineId?: number; lotNo?: string; itemId?: number; itemCode?: string; }