import { ok, type ReadonlyDB } from "@tailor-platform/erp-kit/core"; import type { DB, Selectable } from "../generated/kysely-tailordb"; export interface ResolveItemValuationPoliciesInput { companyId: string; itemIds: string[]; } export interface ItemValuationPolicyResolution { itemId: string; valuationPolicy: Selectable<"ValuationPolicy">; } export async function run(db: ReadonlyDB, input: ResolveItemValuationPoliciesInput) { const itemIds = [...new Set(input.itemIds)]; if (itemIds.length === 0) { return ok({ resolutions: [] as ItemValuationPolicyResolution[] }); } const itemValuations = await db .selectFrom("ItemValuation") .select(["itemId", "valuationPolicyId"]) .where("companyId", "=", input.companyId) .where("itemId", "in", itemIds) .execute(); // One read covers both the assigned policies and the default. const policies = await db .selectFrom("ValuationPolicy") .selectAll() .where("companyId", "=", input.companyId) .execute(); const policyById = new Map(policies.map((policy) => [policy.id, policy])); const defaultPolicy = policies.find((policy) => policy.defaultCompanyId === input.companyId) ?? null; const policyIdByItemId = new Map( itemValuations.map((itemValuation) => [itemValuation.itemId, itemValuation.valuationPolicyId]), ); const resolutions = itemIds.flatMap((itemId) => { const assignedId = policyIdByItemId.get(itemId); const valuationPolicy = (assignedId ? policyById.get(assignedId) : undefined) ?? defaultPolicy; return valuationPolicy ? [{ itemId, valuationPolicy }] : []; }); return ok({ resolutions }); }