/** * Payments Domain - Schemas */ import { z } from "zod"; export const paymentMethodTypeSchema = z.enum([ "CreditCard", "BankAccount", "RemoteCreditCard", "RemoteBankAccount", "Manual", ]); export const paymentMethodSchema = z.object({ id: z.number().int(), type: paymentMethodTypeSchema, description: z.string(), gatewayName: z.string().optional(), contactType: z.string().optional(), contactId: z.number().int().optional(), cardLastFour: z.string().optional(), expiryDate: z.string().optional(), startDate: z.string().optional(), issueNumber: z.string().optional(), cardType: z.string().optional(), remoteToken: z.string().optional(), lastUpdated: z.string().optional(), bankName: z.string().optional(), isDefault: z.boolean().optional(), }); export const paymentMethodListSchema = z.object({ paymentMethods: z.array(paymentMethodSchema), totalCount: z.number().int().min(0), }); export const paymentGatewayTypeSchema = z.enum([ "merchant", "thirdparty", "tokenization", "manual", ]); export const paymentGatewaySchema = z.object({ name: z.string(), displayName: z.string(), type: paymentGatewayTypeSchema, isActive: z.boolean(), // Gateway configuration varies by provider; values are primitive scalars configuration: z .record(z.string(), z.union([z.string(), z.number(), z.boolean(), z.null()])) .optional(), }); export const paymentGatewayListSchema = z.object({ gateways: z.array(paymentGatewaySchema), totalCount: z.number().int().min(0), }); export const invoicePaymentLinkSchema = z.object({ url: z.string().url(), expiresAt: z.string(), gatewayName: z.string().optional(), }); // ============================================================================ // Inferred Types from Schemas (Schema-First Approach) // ============================================================================ export type PaymentMethodType = z.infer; export type PaymentMethod = z.infer; export type PaymentMethodList = z.infer; export type PaymentGatewayType = z.infer; export type PaymentGateway = z.infer; export type PaymentGatewayList = z.infer; export type InvoicePaymentLink = z.infer;