cents/apps/web/src/data/reimbursements.ts

35 lines
1.4 KiB
TypeScript

import type { LedgerEntry } from "@cents/domain";
export function isReimbursement(entry: LedgerEntry) {
return entry.type === "income" && Boolean(entry.reimbursementOfEntryId);
}
export function reimbursementsForExpense(entries: LedgerEntry[], expenseId: string) {
return entries.filter((entry) =>
entry.deletedAt === null
&& entry.reimbursementOfEntryId === expenseId,
);
}
export function reimbursedOriginalAmount(expense: LedgerEntry, entries: LedgerEntry[]) {
const amount = reimbursementsForExpense(entries, expense.id)
.filter((entry) => entry.currency === expense.currency)
.reduce((sum, entry) => sum + entry.amount, 0);
return Math.min(expense.amount, amount);
}
export function reimbursedBaseAmount(expense: LedgerEntry, entries: LedgerEntry[]) {
if (expense.baseAmount === null) return null;
const reimbursed = reimbursedOriginalAmount(expense, entries);
return Math.min(expense.baseAmount, Math.round(expense.baseAmount * reimbursed / expense.amount));
}
export function netOriginalAmount(expense: LedgerEntry, entries: LedgerEntry[]) {
return Math.max(0, expense.amount - reimbursedOriginalAmount(expense, entries));
}
export function netBaseAmount(expense: LedgerEntry, entries: LedgerEntry[]) {
if (expense.baseAmount === null) return null;
return Math.max(0, expense.baseAmount - (reimbursedBaseAmount(expense, entries) ?? 0));
}