From 6611e3a187e5398f686449938b7cf1ddbfcb5392 Mon Sep 17 00:00:00 2001 From: Sebastien Castiel Date: Thu, 7 Dec 2023 11:11:53 -0500 Subject: Store amounts as cents --- src/lib/balances.ts | 6 +++--- src/lib/schemas.ts | 24 +++++++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) (limited to 'src/lib') diff --git a/src/lib/balances.ts b/src/lib/balances.ts index 20a83fb..77f4622 100644 --- a/src/lib/balances.ts +++ b/src/lib/balances.ts @@ -42,7 +42,7 @@ export function getBalances( } function divide(total: number, count: number, isLast: boolean): number { - if (!isLast) return Math.floor((total * 100) / count) / 100 + if (!isLast) return Math.floor(total / count) return total - divide(total, count, false) * (count - 1) } @@ -58,7 +58,7 @@ export function getSuggestedReimbursements( while (balancesArray.length > 1) { const first = balancesArray[0] const last = balancesArray[balancesArray.length - 1] - const amount = Math.round(first.total * 100 + last.total * 100) / 100 + const amount = first.total + last.total if (first.total > -last.total) { reimbursements.push({ from: last.participantId, @@ -77,5 +77,5 @@ export function getSuggestedReimbursements( balancesArray.shift() } } - return reimbursements + return reimbursements.filter(({ amount }) => amount !== 0) } 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()) -- cgit v1.3