import {z} from 'zod' export type QuestionAnswer = {id?: number | undefined, selected?: boolean | undefined, answer?: string | undefined}; export type ValidationError = {field?: string | undefined, message?: string | undefined}; export type BoardingTag = {group?: string | undefined, name?: string | undefined, value?: string | undefined}; export type QuestionAnswerSet = {required?: boolean | undefined, type?: string | undefined, answers?: Array | undefined, children?: Array | undefined, sendToMerchantApp?: boolean | undefined, errors?: Array | undefined, isHidden?: boolean | undefined, selectedAnswer?: number | undefined, valid?: boolean | undefined, question?: string | undefined, conditionalOnAnswer?: number | undefined, tags?: Array | undefined}; export type QuestionAnswerGroup = {questionAnswerSets?: {[key: string]: Array} | undefined, questionAreas?: Array | undefined}; export type Metadata = {exchangeId: unknown, timestamp: unknown}; export type Survey = {questionAnswerGroup?: QuestionAnswerGroup | undefined, metadata?: Metadata | undefined}; export type OrderItemMetadata = {orderStatus?: string | undefined, terminalId: number, storeNumber: number, getvNumber?: string | undefined, apiKey?: string | undefined, publicKey?: string | undefined, trackingNumber?: string | undefined, salesforceCaseNumber?: string | undefined, tcn?: string | undefined, serialNumber?: string | undefined, productManufacturer?: string | undefined, productModel?: string | undefined}; export type OrderItem = {orderItemId?: number | undefined, manufacturer?: string | undefined, productName?: string | undefined, survey?: Survey | undefined, quantity?: number | undefined, validFrontends?: Array | undefined, errors?: Array | undefined, productType?: ('Software' | 'Terminal') | undefined, orderItemMetadata?: Array | undefined, trackingNumber?: string | undefined, completionDate?: string | undefined, surveyValid?: boolean | undefined}; export type EquipmentOrderForm = {orderItems?: Array | undefined, merchantNumber?: string | undefined, orderId?: string | undefined, status?: ('Active' | 'Submitted' | 'Signed' | 'Approved' | 'AddedSalesforce' | 'BoardedTSYS' | 'BoardedQuest' | 'Shipped' | 'BackOrdered' | 'Deleted' | 'Completed' | 'OffRamp' | 'WaitingForTracking' | 'BoardedDevice') | undefined, metadata?: Metadata | undefined, errors?: Array | undefined, orderCreateTime?: string | undefined, orderModifyTime?: string | undefined, resubmit?: boolean | undefined, validFrontends?: Array | undefined}; export type UpdateApiApiEquipmentOrdersResubmitArgs = {body: EquipmentOrderForm}; export type UpdateApiApiEquipmentOrdersResubmitOptions = {baseUrl: string, fetch?: typeof fetch | undefined}; export const questionAnswer = z.object({id: z.number().int().optional(), selected: z.boolean().optional(), answer: z.string().optional()}); export const validationError = z.object({field: z.string().optional(), message: z.string().optional()}); export const boardingTag = z.object({group: z.string().optional(), name: z.string().optional(), value: z.string().optional()}); export const questionAnswerSet: z.ZodType = z.object({required: z.boolean().optional(), type: z.string().optional(), answers: z.array(questionAnswer).optional(), children: z.array(z.lazy(() => questionAnswerSet)).optional(), sendToMerchantApp: z.boolean().optional(), errors: z.array(validationError).optional(), isHidden: z.boolean().optional(), selectedAnswer: z.number().int().optional(), valid: z.boolean().optional(), question: z.string().optional(), conditionalOnAnswer: z.number().int().optional(), tags: z.array(boardingTag).optional()}); export const questionAnswerGroup = z.object({questionAnswerSets: z.record(z.string(), z.array(questionAnswerSet)).optional(), questionAreas: z.array(z.string()).optional()}); export const metadata = z.object({exchangeId: z.unknown(), timestamp: z.unknown()}); export const survey = z.object({questionAnswerGroup: questionAnswerGroup.optional(), metadata: metadata.optional()}); export const orderItemMetadata = z.object({orderStatus: z.string().optional(), terminalId: z.number().int().gte(1000).lte(9999), storeNumber: z.number().int().gte(1000).lte(9999), getvNumber: z.string().optional(), apiKey: z.string().max(512).optional(), publicKey: z.string().max(512).optional(), trackingNumber: z.string().max(256).optional(), salesforceCaseNumber: z.string().max(255).optional(), tcn: z.string().max(16).optional(), serialNumber: z.string().min(8).max(16).optional(), productManufacturer: z.string().max(20).optional(), productModel: z.string().max(15).optional()}); export const orderItem = z.object({orderItemId: z.number().int().optional(), manufacturer: z.string().optional(), productName: z.string().optional(), survey: survey.optional(), quantity: z.number().int().optional(), validFrontends: z.array(z.string()).optional(), errors: z.array(validationError).optional(), productType: z.enum(["Software", "Terminal"]).optional(), orderItemMetadata: z.array(orderItemMetadata).optional(), trackingNumber: z.string().optional(), completionDate: z.string().optional(), surveyValid: z.boolean().optional()}); export const equipmentOrderForm = z.object({orderItems: z.array(orderItem).optional(), merchantNumber: z.string().optional(), orderId: z.string().optional(), status: z.enum(["Active", "Submitted", "Signed", "Approved", "AddedSalesforce", "BoardedTSYS", "BoardedQuest", "Shipped", "BackOrdered", "Deleted", "Completed", "OffRamp", "WaitingForTracking", "BoardedDevice"]).optional(), metadata: metadata.optional(), errors: z.array(validationError).optional(), orderCreateTime: z.string().optional(), orderModifyTime: z.string().optional(), resubmit: z.boolean().optional(), validFrontends: z.array(z.string()).optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Manual update order * * PUT /api/equipment/orders/resubmit */ export const updateApiApiEquipmentOrdersResubmit = async (args: UpdateApiApiEquipmentOrdersResubmitArgs, options: UpdateApiApiEquipmentOrdersResubmitOptions) => { const {baseUrl, fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/api/equipment/orders/resubmit${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "PUT", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(equipmentOrderForm, await res.json()) };