35 lines
1.4 KiB
TypeScript
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));
|
|
}
|