fix input field requirement

This commit is contained in:
root
2026-06-11 15:49:31 -04:00
parent 37a6ed8a76
commit 6b97c895e0
7 changed files with 349 additions and 200 deletions
@@ -1,9 +1,10 @@
import { z } from 'zod'
import { optionalTextField, optionalTitleCaseAllField, optionalUpperField, optionalEmailField, optionalPhoneField } from '../../lib/zodValidation'
export const companySchema = z.object({
name: z.string().min(1).optional(),
email: z.string().email().optional(),
phone: z.string().optional(),
name: optionalTextField('commercialName'),
email: optionalEmailField(),
phone: optionalPhoneField(),
address: z.record(z.unknown()).optional(),
})
@@ -12,18 +13,18 @@ export const brandSchema = z.object({
tagline: z.string().optional(),
primaryColor: z.string().optional(),
accentColor: z.string().optional(),
publicEmail: z.string().email().optional(),
publicPhone: z.string().optional(),
publicEmail: optionalEmailField(),
publicPhone: optionalPhoneField(),
publicAddress: z.string().optional(),
publicCity: z.string().optional(),
publicCountry: z.string().optional(),
publicCity: optionalTextField('city'),
publicCountry: optionalTextField('country'),
websiteUrl: z.string().url().optional(),
whatsappNumber: z.string().optional(),
defaultLocale: z.string().optional(),
defaultCurrency: z.literal('MAD').optional(),
amanpayMerchantId: z.string().optional(),
amanpaySecretKey: z.string().optional(),
paypalEmail: z.string().email().optional(),
paypalEmail: optionalEmailField(),
paypalMerchantId: z.string().optional(),
isListedOnMarketplace: z.boolean().optional(),
homePageConfig: z.object({
@@ -97,8 +98,8 @@ export const brandSchema = z.object({
})
export const contractSettingsSchema = z.object({
legalName: z.string().optional(),
registrationNumber: z.string().optional(),
legalName: optionalTitleCaseAllField('legalCompanyName'),
registrationNumber: optionalUpperField('commercialRegistry'),
taxId: z.string().optional(),
terms: z.string().optional(),
fuelPolicy: z.string().optional(),
@@ -147,8 +148,8 @@ export const accountingSettingsSchema = z.object({
reportingPeriod: z.enum(['WEEKLY', 'MONTHLY', 'QUARTERLY', 'ANNUAL']).optional(),
fiscalYearStart: z.number().int().min(1).max(12).optional(),
currency: z.literal('MAD').optional(),
accountantEmail: z.string().email().optional(),
accountantName: z.string().optional(),
accountantEmail: optionalEmailField(),
accountantName: optionalTextField('name'),
autoSendReport: z.boolean().optional(),
reportFormat: z.enum(['PDF', 'CSV', 'BOTH']).optional(),
})
@@ -1,4 +1,5 @@
import { z } from 'zod'
import { textField, optionalTextField, emailField, optionalUpperField, optionalPhoneField } from '../../lib/zodValidation'
export const paginationSchema = z.object({
page: z.coerce.number().int().min(1).max(10000).default(1),
@@ -6,20 +7,20 @@ export const paginationSchema = z.object({
})
export const customerSchema = z.object({
firstName: z.string().min(1).max(100).trim(),
lastName: z.string().min(1).max(100).trim(),
email: z.string().email().max(255).trim().toLowerCase(),
phone: z.string().max(30).trim().optional(),
driverLicense: z.string().max(50).trim().optional(),
firstName: textField('name'),
lastName: textField('name'),
email: emailField(),
phone: optionalPhoneField(),
driverLicense: optionalUpperField('driverLicenseNumber'),
dateOfBirth: z.string().datetime().optional(),
nationality: z.string().max(100).trim().optional(),
nationality: optionalTextField('nationality'),
address: z.record(z.unknown()).optional(),
notes: z.string().max(2000).trim().optional(),
licenseExpiry: z.string().datetime().optional(),
licenseIssuedAt: z.string().datetime().optional(),
licenseCountry: z.string().max(100).trim().optional(),
licenseNumber: z.string().max(50).trim().optional(),
licenseCategory: z.string().max(20).trim().optional(),
licenseCountry: optionalTextField('country'),
licenseNumber: optionalUpperField('driverLicenseNumber'),
licenseCategory: optionalUpperField('licenseCategory'),
})
export const listQuerySchema = paginationSchema.extend({
@@ -1,15 +1,16 @@
import { z } from 'zod'
import { textField, optionalTextField, optionalEmailField, upperField, optionalUpperField, optionalPhoneField } from '../../lib/zodValidation'
export const additionalDriverSchema = z.object({
firstName: z.string().min(1),
lastName: z.string().min(1),
email: z.string().email().optional(),
phone: z.string().optional(),
driverLicense: z.string().min(1),
firstName: textField('name'),
lastName: textField('name'),
email: optionalEmailField(),
phone: optionalPhoneField(),
driverLicense: upperField('driverLicenseNumber'),
licenseExpiry: z.string().datetime().optional(),
licenseIssuedAt: z.string().datetime().optional(),
dateOfBirth: z.string().datetime().optional(),
nationality: z.string().optional(),
nationality: optionalTextField('nationality'),
})
export const inspectionSchema = z.object({
@@ -35,8 +36,8 @@ export const createSchema = z.object({
customerId: z.string().cuid(),
startDate: z.string().datetime(),
endDate: z.string().datetime(),
pickupLocation: z.string().optional(),
returnLocation: z.string().optional(),
pickupLocation: optionalTextField('pickupLocation'),
returnLocation: optionalTextField('returnLocation'),
offerId: z.string().cuid().optional(),
promoCodeUsed: z.string().optional(),
depositAmount: z.number().int().min(0).default(0),
@@ -49,8 +50,8 @@ export const createSchema = z.object({
export const updateSchema = z.object({
startDate: z.string().datetime().optional(),
endDate: z.string().datetime().optional(),
pickupLocation: z.string().optional().nullable(),
returnLocation: z.string().optional().nullable(),
pickupLocation: optionalTextField('pickupLocation').nullable(),
returnLocation: optionalTextField('returnLocation').nullable(),
depositAmount: z.number().int().min(0).optional(),
notes: z.string().optional().nullable(),
paymentMode: z.string().max(50).optional().nullable(),
@@ -1,12 +1,14 @@
import { z } from 'zod'
import { sanitizeAndFormat } from '../../lib/inputValidation'
import { carTextField, upperField, optionalUpperField } from '../../lib/zodValidation'
export const vehicleSchema = z.object({
make: z.string().min(1),
model: z.string().min(1),
make: carTextField('carMark'),
model: carTextField('carModel'),
year: z.number().int().min(1990).max(new Date().getFullYear() + 1),
color: z.string().default(''),
licensePlate: z.string().min(1),
vin: z.string().optional(),
color: z.string().optional().default('').transform((v: string) => v ? sanitizeAndFormat(v, 'carColor') : ''),
licensePlate: upperField('licensePlate'),
vin: optionalUpperField('vin'),
category: z.enum(['ECONOMY', 'COMPACT', 'MIDSIZE', 'FULLSIZE', 'SUV', 'LUXURY', 'VAN', 'TRUCK']),
seats: z.number().int().min(1).max(20).default(5),
transmission: z.enum(['AUTOMATIC', 'MANUAL']).default('AUTOMATIC'),