import type { FlockCarrierOption, FlockCheckoutTier, FlockFlexibilityOption, } from "@/lib/flock/flock-checkout-selection"; import type { MarkupRule } from "@/modules/pricing/engine"; import { applyMarkup } from "@/modules/pricing/engine"; import type { FlockQuoteLine } from "@/workers/rpa/flock/types"; export type FlockDisplayLine = FlockQuoteLine & { markup_amount: number; final_total_usd: number; }; export type FlockStoredQuotes = { provider: "flock"; reference?: string | null; lines: FlockDisplayLine[]; }; export function applyMarkupToFlockLines( lines: FlockQuoteLine[], rule: MarkupRule, ): FlockDisplayLine[] { return lines.map((line) => { const { markupAmount, finalTotal } = applyMarkup( line.totalUsd, line.totalUsd, rule, ); return { ...line, markup_amount: markupAmount, final_total_usd: finalTotal, }; }); } /** 档内灵活价/承运商价:rateUsd 为官网原价,展示前叠加业务客户加价 */ export function applyMarkupToFlockRateUsd( rateUsd: number, rule: MarkupRule, ): number { return applyMarkup(rateUsd, rateUsd, rule).finalTotal; } export function applyMarkupToFlockFlexibilityOptions( options: FlockFlexibilityOption[], rule: MarkupRule, ): FlockFlexibilityOption[] { return options.map((opt) => ({ ...opt, rateUsd: applyMarkupToFlockRateUsd(opt.rateUsd, rule), })); } export function applyMarkupToFlockCarrierOptions( options: FlockCarrierOption[], rule: MarkupRule, ): FlockCarrierOption[] { return options.map((opt) => ({ ...opt, rateUsd: applyMarkupToFlockRateUsd(opt.rateUsd, rule), })); } export function applyMarkupToFlockFlexibilityByTier( byTier: Partial>, rule: MarkupRule, ): Partial> { const out: Partial> = {}; for (const [tier, opts] of Object.entries(byTier) as Array< [FlockCheckoutTier, FlockFlexibilityOption[] | undefined] >) { if (!opts) continue; out[tier] = applyMarkupToFlockFlexibilityOptions(opts, rule); } return out; } export function applyMarkupToFlockCarriersByTier( byTier: Partial>, rule: MarkupRule, ): Partial> { const out: Partial> = {}; for (const [tier, opts] of Object.entries(byTier) as Array< [FlockCheckoutTier, FlockCarrierOption[] | undefined] >) { if (!opts) continue; out[tier] = applyMarkupToFlockCarrierOptions(opts, rule); } return out; } export function buildFlockStoredQuotes( lines: FlockQuoteLine[], rule: MarkupRule, reference?: string | null, ): FlockStoredQuotes { return { provider: "flock", reference: reference ?? null, lines: applyMarkupToFlockLines(lines, rule), }; } export function parseFlockStoredQuotes( json: unknown, ): FlockStoredQuotes | null { if (!json || typeof json !== "object" || Array.isArray(json)) { return null; } const o = json as Record; if (o.provider !== "flock" || !Array.isArray(o.lines)) { return null; } return o as unknown as FlockStoredQuotes; } export function readFlockShipmentMeta(pickupJson: unknown): { pickupDate?: string; provider?: string; } { if (!pickupJson || typeof pickupJson !== "object") { return {}; } const o = pickupJson as Record; return { pickupDate: typeof o.flock_pickup_date === "string" ? o.flock_pickup_date : undefined, provider: typeof o.provider === "string" ? o.provider : undefined, }; }