99 lines
3.2 KiB
TypeScript
Raw Normal View History

/**
* Catalog Domain - Schemas
*
* Zod schemas for runtime validation of catalog product data.
*/
import { z } from "zod";
// ============================================================================
// Base Catalog Product Schema
// ============================================================================
export const catalogProductBaseSchema = z.object({
id: z.string(),
sku: z.string(),
name: z.string(),
description: z.string().optional(),
displayOrder: z.number().optional(),
billingCycle: z.string().optional(),
monthlyPrice: z.number().optional(),
oneTimePrice: z.number().optional(),
unitPrice: z.number().optional(),
});
// ============================================================================
// PricebookEntry Schema
// ============================================================================
export const catalogPricebookEntrySchema = z.object({
id: z.string().optional(),
name: z.string().optional(),
unitPrice: z.number().optional(),
pricebook2Id: z.string().optional(),
product2Id: z.string().optional(),
isActive: z.boolean().optional(),
});
// ============================================================================
// Internet Product Schemas
// ============================================================================
export const internetCatalogProductSchema = catalogProductBaseSchema.extend({
internetPlanTier: z.string().optional(),
internetOfferingType: z.string().optional(),
features: z.array(z.string()).optional(),
});
export const internetPlanTemplateSchema = z.object({
tierDescription: z.string(),
description: z.string().optional(),
features: z.array(z.string()).optional(),
});
export const internetPlanCatalogItemSchema = internetCatalogProductSchema.extend({
catalogMetadata: z.object({
tierDescription: z.string().optional(),
features: z.array(z.string()).optional(),
isRecommended: z.boolean().optional(),
}).optional(),
});
export const internetInstallationCatalogItemSchema = internetCatalogProductSchema.extend({
catalogMetadata: z.object({
installationTerm: z.enum(["One-time", "12-Month", "24-Month"]),
}).optional(),
});
export const internetAddonCatalogItemSchema = internetCatalogProductSchema.extend({
isBundledAddon: z.boolean().optional(),
bundledAddonId: z.string().optional(),
});
// ============================================================================
// SIM Product Schemas
// ============================================================================
export const simCatalogProductSchema = catalogProductBaseSchema.extend({
simDataSize: z.string().optional(),
simPlanType: z.string().optional(),
simHasFamilyDiscount: z.boolean().optional(),
isBundledAddon: z.boolean().optional(),
bundledAddonId: z.string().optional(),
});
export const simActivationFeeCatalogItemSchema = simCatalogProductSchema.extend({
catalogMetadata: z.object({
isDefault: z.boolean(),
}).optional(),
});
// ============================================================================
// VPN Product Schema
// ============================================================================
export const vpnCatalogProductSchema = catalogProductBaseSchema.extend({
vpnRegion: z.string().optional(),
});