|
|
import { z } from "zod";
|
|
|
|
|
|
/** 结账地点字段(对象本身必填时可为空对象) */
|
|
|
const flockLocationDetailsSchema = z
|
|
|
.object({
|
|
|
company_name: z.string().max(128).optional(),
|
|
|
address1: z.string().max(200).optional(),
|
|
|
address2: z.string().max(128).optional(),
|
|
|
city: z.string().max(64).optional(),
|
|
|
state: z.string().max(32).optional(),
|
|
|
zip: z.string().max(16).optional(),
|
|
|
contact_name: z.string().max(128).optional(),
|
|
|
contact_email: z.string().max(128).optional(),
|
|
|
contact_phone: z.string().max(64).optional(),
|
|
|
opens_at: z.string().max(32).optional(),
|
|
|
closes_at: z.string().max(32).optional(),
|
|
|
po_number: z.string().max(128).optional(),
|
|
|
bol_remarks: z.string().max(1000).optional(),
|
|
|
notes: z.string().max(1000).optional(),
|
|
|
weekend_delivery: z.boolean().optional(),
|
|
|
})
|
|
|
.strict();
|
|
|
|
|
|
const flockCheckoutDetailsSchema = z
|
|
|
.object({
|
|
|
pickup: flockLocationDetailsSchema.default({}),
|
|
|
delivery: flockLocationDetailsSchema.default({}),
|
|
|
role: z.enum(["shipper", "receiver", "other"]).optional(),
|
|
|
nmfc: z.string().max(64).optional(),
|
|
|
po_number: z.string().max(128).optional(),
|
|
|
bol_remarks: z.string().max(1000).optional(),
|
|
|
declaration_statement: z.string().max(2000).optional(),
|
|
|
notes: z.string().max(1000).optional(),
|
|
|
documentation_required: z.boolean().optional(),
|
|
|
use_billing_for_pickup: z.boolean().optional(),
|
|
|
use_billing_for_delivery: z.boolean().optional(),
|
|
|
})
|
|
|
.strict()
|
|
|
.optional();
|
|
|
|
|
|
export const flockCheckoutSchema = z
|
|
|
.object({
|
|
|
customer_id: z.string().min(1, "请填写客户标识"),
|
|
|
quote_id: z.string().min(1, "请填写报价单号").max(64),
|
|
|
preferred_tier: z.enum(["flock_direct", "standard"], {
|
|
|
errorMap: () => ({ message: "请选择 FlockDirect® 或 Standard 报价档" }),
|
|
|
}),
|
|
|
preferred_flexibility: z
|
|
|
.enum(["2_day", "1_day", "none"], {
|
|
|
errorMap: () => ({
|
|
|
message: "请选择灵活性报价档(2 天 / 1 天 / 无灵活性)",
|
|
|
}),
|
|
|
})
|
|
|
.optional(),
|
|
|
preferred_carrier: z.string().trim().min(1).max(128).optional(),
|
|
|
flock_details: flockCheckoutDetailsSchema,
|
|
|
})
|
|
|
.superRefine((val, ctx) => {
|
|
|
const carrier = val.preferred_carrier?.trim() || "";
|
|
|
const hasFlex = Boolean(val.preferred_flexibility);
|
|
|
if (carrier && hasFlex) {
|
|
|
ctx.addIssue({
|
|
|
code: z.ZodIssueCode.custom,
|
|
|
message: "灵活性档与承运商不能同时选择",
|
|
|
path: ["preferred_carrier"],
|
|
|
});
|
|
|
return;
|
|
|
}
|
|
|
if (!carrier && !hasFlex) {
|
|
|
ctx.addIssue({
|
|
|
code: z.ZodIssueCode.custom,
|
|
|
message: "请选择灵活性报价档或承运商",
|
|
|
path: ["preferred_flexibility"],
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
|
|
|
export type FlockCheckoutDetails = NonNullable<
|
|
|
z.infer<typeof flockCheckoutSchema>["flock_details"]
|
|
|
>;
|