feat(#53): Show combined-ledger daily trade profit and margin

This commit is contained in:
Sirttas committed 2026-09-05 14:29:43 +02:00
1 parent 56f70eb599
commit 87d105b7b8
5 files changed
+68 -84

No files matched your search

+1 -28
View File
@@ -1,38 +1,11 @@
import {describe, expect, test} from 'vitest';
import {latestDailyBalanceValue, resolveStatisticsMode, StatisticsModes} from './statistics';
import type {CombinedLedger, MainLedger} from './ledger';
import {LedgerTypes} from './ledger';
import {latestDailyBalanceValue} from './statistics';
import type {DailyBalanceResponse} from '@/generated/mammon';
const mainLedger = {type: LedgerTypes.Main, ledgerId: 'main-1', name: 'Main', balance: 0} as MainLedger;
const combinedLedger = {type: LedgerTypes.Combined, ledgerId: 'combined-1', name: 'Combined', balance: 0} as unknown as CombinedLedger;
const balance = (date: string, averageValue: number): DailyBalanceResponse => ({
date, averageValue, highestValue: averageValue, lowestValue: averageValue,
});
describe('resolveStatisticsMode', () => {
test('keeps cash flow mode for a main ledger', () => {
expect(resolveStatisticsMode(mainLedger, StatisticsModes.CashFlow)).toBe(StatisticsModes.CashFlow);
});
test('keeps margin mode for a main ledger', () => {
expect(resolveStatisticsMode(mainLedger, StatisticsModes.Margin)).toBe(StatisticsModes.Margin);
});
test('keeps daily balance mode for a combined ledger', () => {
expect(resolveStatisticsMode(combinedLedger, StatisticsModes.DailyBalance)).toBe(StatisticsModes.DailyBalance);
});
test('falls back to daily balance when cash flow is selected for a combined ledger', () => {
expect(resolveStatisticsMode(combinedLedger, StatisticsModes.CashFlow)).toBe(StatisticsModes.DailyBalance);
});
test('falls back to daily balance when margin is selected for a combined ledger', () => {
expect(resolveStatisticsMode(combinedLedger, StatisticsModes.Margin)).toBe(StatisticsModes.DailyBalance);
});
});
describe('latestDailyBalanceValue', () => {
test('returns the average value of the most recent day in range', () => {
const result = latestDailyBalanceValue([balance('2026-08-01', 100), balance('2026-08-02', 150)]);
-4
View File
@@ -1,5 +1,4 @@
import type {DailyBalanceResponse} from "@/generated/mammon";
import {isMain, type Ledger} from "./ledger";
export const StatisticsModes = {
CashFlow: 'CASH_FLOW',
@@ -8,8 +7,5 @@ export const StatisticsModes = {
} as const;
export type StatisticsMode = typeof StatisticsModes[keyof typeof StatisticsModes];
export const resolveStatisticsMode = (ledger: Ledger, mode: StatisticsMode): StatisticsMode =>
!isMain(ledger) && mode !== StatisticsModes.DailyBalance ? StatisticsModes.DailyBalance : mode;
export const latestDailyBalanceValue = (range: DailyBalanceResponse[]): number =>
range.at(-1)?.averageValue ?? 0;