Use decimal.js to validate uneven amounts
All checks were successful
CI / checks (push) Successful in 56s

This commit is contained in:
Peter Smit
2025-11-08 11:11:43 +01:00
parent 548a8dc5ee
commit fc0feee736

View File

@@ -1,4 +1,6 @@
import { RecurrenceRule, SplitMode } from '@prisma/client' import { RecurrenceRule, SplitMode } from '@prisma/client'
import Decimal from 'decimal.js'
import * as z from 'zod' import * as z from 'zod'
export const groupFormSchema = z export const groupFormSchema = z
@@ -148,14 +150,14 @@ export const expenseFormSchema = z
break // noop break // noop
case 'BY_AMOUNT': { case 'BY_AMOUNT': {
const sum = expense.paidFor.reduce( const sum = expense.paidFor.reduce(
(sum, { shares }) => sum + Number(shares), (sum, { shares }) => new Decimal(shares).add(sum),
0, new Decimal(0),
) )
if (sum !== expense.amount) { if (!sum.equals(new Decimal(expense.amount))) {
const detail = // const detail =
sum < expense.amount // sum < expense.amount
? `${((expense.amount - sum) / 100).toFixed(2)} missing` // ? `${((expense.amount - sum) / 100).toFixed(2)} missing`
: `${((sum - expense.amount) / 100).toFixed(2)} surplus` // : `${((sum - expense.amount) / 100).toFixed(2)} surplus`
ctx.addIssue({ ctx.addIssue({
code: z.ZodIssueCode.custom, code: z.ZodIssueCode.custom,
message: 'amountSum', message: 'amountSum',