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),
});