103 lines
3.4 KiB
TypeScript
103 lines
3.4 KiB
TypeScript
/**
|
|
* Orders Domain - Schemas
|
|
*
|
|
* Zod schemas for runtime validation of order data.
|
|
*/
|
|
|
|
import { z } from "zod";
|
|
|
|
// ============================================================================
|
|
// Fulfillment Order Schemas
|
|
// ============================================================================
|
|
|
|
export const fulfillmentOrderProductSchema = z.object({
|
|
id: z.string().optional(),
|
|
sku: z.string().optional(),
|
|
name: z.string().optional(),
|
|
itemClass: z.string().optional(),
|
|
whmcsProductId: z.string().optional(),
|
|
billingCycle: z.string().optional(),
|
|
});
|
|
|
|
export const fulfillmentOrderItemSchema = z.object({
|
|
id: z.string(),
|
|
orderId: z.string(),
|
|
quantity: z.number().int().min(1),
|
|
product: fulfillmentOrderProductSchema.nullable(),
|
|
});
|
|
|
|
export const fulfillmentOrderDetailsSchema = z.object({
|
|
id: z.string(),
|
|
orderNumber: z.string().optional(),
|
|
orderType: z.string().optional(),
|
|
items: z.array(fulfillmentOrderItemSchema),
|
|
});
|
|
|
|
// ============================================================================
|
|
// Order Item Summary Schema
|
|
// ============================================================================
|
|
|
|
export const orderItemSummarySchema = z.object({
|
|
productName: z.string().optional(),
|
|
sku: z.string().optional(),
|
|
status: z.string().optional(),
|
|
billingCycle: z.string().optional(),
|
|
});
|
|
|
|
// ============================================================================
|
|
// Order Item Details Schema
|
|
// ============================================================================
|
|
|
|
export const orderItemDetailsSchema = z.object({
|
|
id: z.string(),
|
|
orderId: z.string(),
|
|
quantity: z.number().int().min(1),
|
|
unitPrice: z.number().optional(),
|
|
totalPrice: z.number().optional(),
|
|
billingCycle: z.string().optional(),
|
|
product: z.object({
|
|
id: z.string().optional(),
|
|
name: z.string().optional(),
|
|
sku: z.string().optional(),
|
|
itemClass: z.string().optional(),
|
|
whmcsProductId: z.string().optional(),
|
|
internetOfferingType: z.string().optional(),
|
|
internetPlanTier: z.string().optional(),
|
|
vpnRegion: z.string().optional(),
|
|
}).optional(),
|
|
});
|
|
|
|
// ============================================================================
|
|
// Order Summary Schema
|
|
// ============================================================================
|
|
|
|
export const orderSummarySchema = z.object({
|
|
id: z.string(),
|
|
orderNumber: z.string(),
|
|
status: z.string(),
|
|
orderType: z.string().optional(),
|
|
effectiveDate: z.string(), // IsoDateTimeString
|
|
totalAmount: z.number().optional(),
|
|
createdDate: z.string(), // IsoDateTimeString
|
|
lastModifiedDate: z.string(), // IsoDateTimeString
|
|
whmcsOrderId: z.string().optional(),
|
|
itemsSummary: z.array(orderItemSummarySchema),
|
|
});
|
|
|
|
// ============================================================================
|
|
// Order Details Schema
|
|
// ============================================================================
|
|
|
|
export const orderDetailsSchema = orderSummarySchema.extend({
|
|
accountId: z.string().optional(),
|
|
accountName: z.string().optional(),
|
|
pricebook2Id: z.string().optional(),
|
|
activationType: z.string().optional(),
|
|
activationStatus: z.string().optional(),
|
|
activationScheduledAt: z.string().optional(), // IsoDateTimeString
|
|
activationErrorCode: z.string().optional(),
|
|
activationErrorMessage: z.string().optional(),
|
|
activatedDate: z.string().optional(), // IsoDateTimeString
|
|
items: z.array(orderItemDetailsSchema),
|
|
});
|