Store amounts as cents

This commit is contained in:
Sebastien Castiel
2023-12-07 11:11:53 -05:00
parent ec981fd237
commit 6611e3a187
7 changed files with 67 additions and 52 deletions

View File

@@ -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)
}

View File

@@ -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())