mirror of
https://github.com/marcogll/TaxHacker_s23.git
synced 2026-01-13 21:35:19 +00:00
52 lines
1.6 KiB
TypeScript
52 lines
1.6 KiB
TypeScript
import { z } from "zod"
|
|
|
|
export const transactionFormSchema = z
|
|
.object({
|
|
name: z.string().max(128).optional(),
|
|
merchant: z.string().max(128).optional(),
|
|
description: z.string().max(256).optional(),
|
|
type: z.string().optional(),
|
|
total: z
|
|
.string()
|
|
.optional()
|
|
.transform((val) => {
|
|
if (!val || val.trim() === '') return null
|
|
const num = parseFloat(val)
|
|
if (isNaN(num)) {
|
|
throw new z.ZodError([{ message: "Invalid total", path: ["total"], code: z.ZodIssueCode.custom }])
|
|
}
|
|
return Math.round(num * 100) // convert to cents
|
|
}),
|
|
currencyCode: z.string().max(5).optional(),
|
|
convertedTotal: z
|
|
.string()
|
|
.optional()
|
|
.transform((val) => {
|
|
if (!val || val.trim() === '') return null
|
|
const num = parseFloat(val)
|
|
if (isNaN(num)) {
|
|
throw new z.ZodError([
|
|
{ message: "Invalid coverted total", path: ["convertedTotal"], code: z.ZodIssueCode.custom },
|
|
])
|
|
}
|
|
return Math.round(num * 100) // convert to cents
|
|
}),
|
|
convertedCurrencyCode: z.string().max(5).optional(),
|
|
categoryCode: z.string().optional(),
|
|
projectCode: z.string().optional(),
|
|
issuedAt: z
|
|
.union([
|
|
z.date(),
|
|
z
|
|
.string()
|
|
.refine((val) => !isNaN(Date.parse(val)), {
|
|
message: "Invalid date format",
|
|
})
|
|
.transform((val) => new Date(val)),
|
|
])
|
|
.optional(),
|
|
text: z.string().optional(),
|
|
note: z.string().optional(),
|
|
})
|
|
.catchall(z.string())
|