// Client-side preview of an expense amount, mirroring // backend/src/lib/finance/calculate.ts expenseAmount(). Only used to show // "this will be X PYG right now" while typing; the server stays authoritative. import type { CalcType } from '@/lib/api'; export interface PreviewContext { ticketsSold: number; checkedIn: number; sales: number } export function previewExpense( e: { calcType: CalcType; quantity: number; unitAmount: number; percentBp: number; minimumAmount: number }, ctx: PreviewContext, ): { amount: number; count: number } { switch (e.calcType) { case 'per_ticket_sold': return { amount: e.unitAmount * ctx.ticketsSold, count: ctx.ticketsSold }; case 'per_checked_in': return { amount: e.unitAmount * ctx.checkedIn, count: ctx.checkedIn }; case 'percent_of_revenue': return { amount: Math.round((Math.max(0, ctx.sales) * e.percentBp) / 10000), count: 0 }; case 'minimum_spend': return { amount: Math.max(e.minimumAmount, e.unitAmount * ctx.checkedIn), count: ctx.checkedIn }; default: return { amount: e.unitAmount * e.quantity, count: e.quantity }; } }