59 lines
2.3 KiB
TypeScript
59 lines
2.3 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
// ── Request ID Params (shared across all /:requestId routes) ──
|
|
|
|
export const requestIdParamsSchema = z.object({
|
|
requestId: z.string().min(1, 'Request ID is required').refine(
|
|
(val) => {
|
|
// Accept UUID format
|
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
|
|
// Accept request number format (e.g., REQ-2026-02-0048)
|
|
const requestNumberRegex = /^REQ-\d{4}-\d{2}-\d{4,}$/i;
|
|
return uuidRegex.test(val) || requestNumberRegex.test(val);
|
|
},
|
|
{ message: 'Invalid request ID — must be a UUID or request number (REQ-YYYY-MM-NNNN)' }
|
|
),
|
|
});
|
|
|
|
// ── Create Claim Schema ──
|
|
|
|
export const createClaimSchema = z.object({
|
|
dealerId: z.string().optional(),
|
|
activityTypeId: z.string().uuid('Invalid activity type ID').optional(),
|
|
title: z.string().min(1, 'Title is required').max(500, 'Title too long').optional(),
|
|
description: z.string().max(5000, 'Description too long').optional(),
|
|
}).passthrough(); // Allow additional fields since dealer claims have flexible structure
|
|
|
|
// ── IO Details Schema ──
|
|
|
|
export const updateIOSchema = z.object({
|
|
ioNumber: z.string().min(1, 'IO number is required').max(50, 'IO number too long'),
|
|
amount: z.number().positive('Amount must be positive').optional(),
|
|
requestNumber: z.string().max(50).optional(),
|
|
}).passthrough();
|
|
|
|
// ── E-Invoice Schema ──
|
|
|
|
export const updateEInvoiceSchema = z.object({
|
|
irnNumber: z.string().max(100, 'IRN number too long').optional(),
|
|
ackNumber: z.string().max(100, 'Acknowledgement number too long').optional(),
|
|
invoiceNumber: z.string().max(100, 'Invoice number too long').optional(),
|
|
invoiceDate: z.string().optional(),
|
|
}).passthrough();
|
|
|
|
// ── Credit Note Schema ──
|
|
|
|
export const sendCreditNoteSchema = z.object({
|
|
creditNoteNumber: z.string().max(100, 'Credit note number too long').optional(),
|
|
creditNoteDate: z.string().optional(),
|
|
creditNoteAmount: z.number().positive('Amount must be positive').optional(),
|
|
}).passthrough();
|
|
|
|
// ── SAP Test Schema ──
|
|
|
|
export const testSapBlockSchema = z.object({
|
|
ioNumber: z.string().min(1, 'IO number is required'),
|
|
amount: z.number().positive('Amount must be positive'),
|
|
requestNumber: z.string().optional(),
|
|
});
|