import { ok, type ReadonlyDB, buildPaginatedResult, DEFAULT_PAGE_SIZE, } from "@tailor-platform/erp-kit/core"; import type { InboundShipmentLineSourceDocumentType, InboundShipmentStatus, } from "../generated/enums"; import type { DB } from "../generated/kysely-tailordb"; export interface ListInboundShipmentsInput { status?: InboundShipmentStatus; sourceDocumentType?: InboundShipmentLineSourceDocumentType; sourceDocumentId?: string; dateFrom?: Date; dateTo?: Date; limit?: number; offset?: number; } export async function run(db: ReadonlyDB, input: ListInboundShipmentsInput) { const limit = input.limit ?? DEFAULT_PAGE_SIZE; const offset = input.offset ?? 0; let query = db.selectFrom("InboundShipment").selectAll(); if (input.status) query = query.where("status", "=", input.status); // Source references live on the lines, so header filtering goes through a line subquery. if (input.sourceDocumentType || input.sourceDocumentId) { query = query.where("id", "in", (eb) => { let lineQuery = eb.selectFrom("InboundShipmentLine").select("inboundShipmentId"); if (input.sourceDocumentType) { lineQuery = lineQuery.where("sourceDocumentType", "=", input.sourceDocumentType); } if (input.sourceDocumentId) { lineQuery = lineQuery.where("sourceDocumentId", "=", input.sourceDocumentId); } return lineQuery; }); } if (input.dateFrom) query = query.where("effectiveDate", ">=", input.dateFrom); if (input.dateTo) query = query.where("effectiveDate", "<=", input.dateTo); const shipments = await query .orderBy("createdAt", "desc") .limit(limit + 1) .offset(offset) .execute(); const paginatedResult = buildPaginatedResult(shipments, limit); const shipmentIds = paginatedResult.items.map((shipment) => shipment.id); const lines = shipmentIds.length > 0 ? await db .selectFrom("InboundShipmentLine") .selectAll() .where("inboundShipmentId", "in", shipmentIds) .execute() : []; const linesByShipmentId = new Map(); for (const line of lines) { const current = linesByShipmentId.get(line.inboundShipmentId) ?? []; current.push(line); linesByShipmentId.set(line.inboundShipmentId, current); } return ok({ items: paginatedResult.items.map((inboundShipment) => ({ inboundShipment, inboundShipmentLines: linesByShipmentId.get(inboundShipment.id) ?? [], })), hasNextPage: paginatedResult.hasNextPage, }); }