157 lines
6.4 KiB
JavaScript
157 lines
6.4 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.sfOrderIdParamSchema = exports.orderBusinessValidationSchema = exports.createOrderRequestSchema = exports.orderConfigurationsSchema = exports.orderQueryParamsSchema = exports.orderDetailsSchema = exports.orderSummarySchema = exports.orderItemDetailsSchema = exports.orderItemSummarySchema = void 0;
|
|
const zod_1 = require("zod");
|
|
exports.orderItemSummarySchema = zod_1.z.object({
|
|
productName: zod_1.z.string().optional(),
|
|
name: zod_1.z.string().optional(),
|
|
sku: zod_1.z.string().optional(),
|
|
status: zod_1.z.string().optional(),
|
|
billingCycle: zod_1.z.string().optional(),
|
|
itemClass: zod_1.z.string().optional(),
|
|
quantity: zod_1.z.number().int().min(0).optional(),
|
|
unitPrice: zod_1.z.number().optional(),
|
|
totalPrice: zod_1.z.number().optional(),
|
|
});
|
|
exports.orderItemDetailsSchema = zod_1.z.object({
|
|
id: zod_1.z.string(),
|
|
orderId: zod_1.z.string(),
|
|
quantity: zod_1.z.number().int().min(1),
|
|
unitPrice: zod_1.z.number().optional(),
|
|
totalPrice: zod_1.z.number().optional(),
|
|
billingCycle: zod_1.z.string().optional(),
|
|
product: zod_1.z.object({
|
|
id: zod_1.z.string().optional(),
|
|
name: zod_1.z.string().optional(),
|
|
sku: zod_1.z.string().optional(),
|
|
itemClass: zod_1.z.string().optional(),
|
|
whmcsProductId: zod_1.z.string().optional(),
|
|
internetOfferingType: zod_1.z.string().optional(),
|
|
internetPlanTier: zod_1.z.string().optional(),
|
|
vpnRegion: zod_1.z.string().optional(),
|
|
}).optional(),
|
|
});
|
|
exports.orderSummarySchema = zod_1.z.object({
|
|
id: zod_1.z.string(),
|
|
orderNumber: zod_1.z.string(),
|
|
status: zod_1.z.string(),
|
|
orderType: zod_1.z.string().optional(),
|
|
effectiveDate: zod_1.z.string(),
|
|
totalAmount: zod_1.z.number().optional(),
|
|
createdDate: zod_1.z.string(),
|
|
lastModifiedDate: zod_1.z.string(),
|
|
whmcsOrderId: zod_1.z.string().optional(),
|
|
activationStatus: zod_1.z.string().optional(),
|
|
itemsSummary: zod_1.z.array(exports.orderItemSummarySchema),
|
|
});
|
|
exports.orderDetailsSchema = exports.orderSummarySchema.extend({
|
|
accountId: zod_1.z.string().optional(),
|
|
accountName: zod_1.z.string().optional(),
|
|
pricebook2Id: zod_1.z.string().optional(),
|
|
activationType: zod_1.z.string().optional(),
|
|
activationStatus: zod_1.z.string().optional(),
|
|
activationScheduledAt: zod_1.z.string().optional(),
|
|
activationErrorCode: zod_1.z.string().optional(),
|
|
activationErrorMessage: zod_1.z.string().optional(),
|
|
activatedDate: zod_1.z.string().optional(),
|
|
items: zod_1.z.array(exports.orderItemDetailsSchema),
|
|
});
|
|
exports.orderQueryParamsSchema = zod_1.z.object({
|
|
page: zod_1.z.coerce.number().int().positive().optional(),
|
|
limit: zod_1.z.coerce.number().int().positive().max(100).optional(),
|
|
status: zod_1.z.string().optional(),
|
|
orderType: zod_1.z.string().optional(),
|
|
});
|
|
const orderConfigurationsAddressSchema = zod_1.z.object({
|
|
street: zod_1.z.string().nullable().optional(),
|
|
streetLine2: zod_1.z.string().nullable().optional(),
|
|
city: zod_1.z.string().nullable().optional(),
|
|
state: zod_1.z.string().nullable().optional(),
|
|
postalCode: zod_1.z.string().nullable().optional(),
|
|
country: zod_1.z.string().nullable().optional(),
|
|
});
|
|
exports.orderConfigurationsSchema = zod_1.z.object({
|
|
activationType: zod_1.z.enum(["Immediate", "Scheduled"]).optional(),
|
|
scheduledAt: zod_1.z.string().optional(),
|
|
accessMode: zod_1.z.enum(["IPoE-BYOR", "IPoE-HGW", "PPPoE"]).optional(),
|
|
simType: zod_1.z.enum(["eSIM", "Physical SIM"]).optional(),
|
|
eid: zod_1.z.string().optional(),
|
|
isMnp: zod_1.z.string().optional(),
|
|
mnpNumber: zod_1.z.string().optional(),
|
|
mnpExpiry: zod_1.z.string().optional(),
|
|
mnpPhone: zod_1.z.string().optional(),
|
|
mvnoAccountNumber: zod_1.z.string().optional(),
|
|
portingLastName: zod_1.z.string().optional(),
|
|
portingFirstName: zod_1.z.string().optional(),
|
|
portingLastNameKatakana: zod_1.z.string().optional(),
|
|
portingFirstNameKatakana: zod_1.z.string().optional(),
|
|
portingGender: zod_1.z.enum(["Male", "Female", "Corporate/Other"]).optional(),
|
|
portingDateOfBirth: zod_1.z.string().optional(),
|
|
address: orderConfigurationsAddressSchema.optional(),
|
|
});
|
|
const baseCreateOrderSchema = zod_1.z.object({
|
|
orderType: zod_1.z.enum(["Internet", "SIM", "VPN", "Other"]),
|
|
skus: zod_1.z.array(zod_1.z.string()),
|
|
configurations: exports.orderConfigurationsSchema.optional(),
|
|
});
|
|
exports.createOrderRequestSchema = baseCreateOrderSchema;
|
|
exports.orderBusinessValidationSchema = baseCreateOrderSchema
|
|
.extend({
|
|
userId: zod_1.z.string().uuid(),
|
|
opportunityId: zod_1.z.string().optional(),
|
|
})
|
|
.refine((data) => {
|
|
if (data.orderType === "Internet") {
|
|
const mainServiceSkus = data.skus.filter(sku => {
|
|
const upperSku = sku.toUpperCase();
|
|
return (!upperSku.includes("INSTALL") &&
|
|
!upperSku.includes("ADDON") &&
|
|
!upperSku.includes("ACTIVATION") &&
|
|
!upperSku.includes("FEE"));
|
|
});
|
|
return mainServiceSkus.length >= 1;
|
|
}
|
|
return true;
|
|
}, {
|
|
message: "Internet orders must have at least one main service SKU (non-installation, non-addon)",
|
|
path: ["skus"],
|
|
})
|
|
.refine((data) => {
|
|
if (data.orderType === "SIM" && data.configurations) {
|
|
return data.configurations.simType !== undefined;
|
|
}
|
|
return true;
|
|
}, {
|
|
message: "SIM orders must specify SIM type",
|
|
path: ["configurations", "simType"],
|
|
})
|
|
.refine((data) => {
|
|
if (data.configurations?.simType === "eSIM") {
|
|
return data.configurations.eid !== undefined && data.configurations.eid.length > 0;
|
|
}
|
|
return true;
|
|
}, {
|
|
message: "eSIM orders must provide EID",
|
|
path: ["configurations", "eid"],
|
|
})
|
|
.refine((data) => {
|
|
if (data.configurations?.isMnp === "true") {
|
|
const required = [
|
|
"mnpNumber",
|
|
"portingLastName",
|
|
"portingFirstName",
|
|
];
|
|
return required.every(field => data.configurations?.[field] !== undefined);
|
|
}
|
|
return true;
|
|
}, {
|
|
message: "MNP orders must provide porting information",
|
|
path: ["configurations"],
|
|
});
|
|
exports.sfOrderIdParamSchema = zod_1.z.object({
|
|
sfOrderId: zod_1.z
|
|
.string()
|
|
.length(18, "Salesforce order ID must be 18 characters")
|
|
.regex(/^[A-Za-z0-9]+$/, "Salesforce order ID must be alphanumeric"),
|
|
});
|
|
//# sourceMappingURL=schema.js.map
|