You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

134 lines
3.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<Record<FlockCheckoutTier, FlockFlexibilityOption[]>>,
rule: MarkupRule,
): Partial<Record<FlockCheckoutTier, FlockFlexibilityOption[]>> {
const out: Partial<Record<FlockCheckoutTier, FlockFlexibilityOption[]>> = {};
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<Record<FlockCheckoutTier, FlockCarrierOption[]>>,
rule: MarkupRule,
): Partial<Record<FlockCheckoutTier, FlockCarrierOption[]>> {
const out: Partial<Record<FlockCheckoutTier, FlockCarrierOption[]>> = {};
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<string, unknown>;
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<string, unknown>;
return {
pickupDate:
typeof o.flock_pickup_date === "string" ? o.flock_pickup_date : undefined,
provider: typeof o.provider === "string" ? o.provider : undefined,
};
}