aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/schemas.ts
diff options
context:
space:
mode:
authorSebastien Castiel <sebastien@castiel.me>2023-12-07 11:11:53 -0500
committerSebastien Castiel <sebastien@castiel.me>2023-12-07 11:11:53 -0500
commit6611e3a187e5398f686449938b7cf1ddbfcb5392 (patch)
tree0fae44f29faf8efa68bcdb113ae1ca003cbd024b /src/lib/schemas.ts
parentec981fd237a50dfc547d8c162b22f4e1a691c9fc (diff)
Store amounts as cents
Diffstat (limited to 'src/lib/schemas.ts')
-rw-r--r--src/lib/schemas.ts24
1 files changed, 21 insertions, 3 deletions
diff --git a/src/lib/schemas.ts b/src/lib/schemas.ts
index 5c3489b..ec7f3fa 100644
--- a/src/lib/schemas.ts
+++ b/src/lib/schemas.ts
@@ -42,9 +42,27 @@ export const expenseFormSchema = z.object({
title: z
.string({ required_error: 'Please enter a title.' })
.min(2, 'Enter at least two characters.'),
- amount: z.coerce
- .number({ required_error: 'You must enter an amount.' })
- .min(0.01, 'The amount must be higher than 0.01.'),
+ amount: z
+ .union(
+ [
+ z.number(),
+ z.string().transform((value, ctx) => {
+ const valueAsNumber = Number(value)
+ if (Number.isNaN(valueAsNumber))
+ ctx.addIssue({
+ code: z.ZodIssueCode.custom,
+ message: 'Invalid number.',
+ })
+ return Math.floor(valueAsNumber * 100)
+ }),
+ ],
+ { required_error: 'You must enter an amount.' },
+ )
+ .refine((amount) => amount >= 1, 'The amount must be higher than 0.01.')
+ .refine(
+ (amount) => amount <= 10_000_000_00,
+ 'The amount must be lower than 10,000,000.',
+ ),
paidBy: z.string({ required_error: 'You must select a participant.' }),
paidFor: z
.array(z.string())