Files
AtreidesAssetsFree/client/wealth/return-view.js
T
2026-10-30 12:28:48 +01:00

69 lines
3.1 KiB
JavaScript

// Generated, do not edit. sha256:1e2f6b41323ddf9ad9f82e4a351a8a2bf38460efa6a6ea846e58268ba7ab38e4
import { CONFIG } from '../../shared/config.js';
import { windowTwr, windowFactors } from './performance.js';
import { dailyResults, meetVenster, rollingWindows, seriesFor, windowResult } from './series.js';
export function periodChoices(length = 0, page = null, days = CONFIG.WEALTH_RETURN.ROLLING_DAYS) {
const rolling = rollingWindows(length, days)
.map(p => ({ key: p.days == null ? 'start' : `d${p.days}`, days: p.days, label: null, venster: p.venster }));
if (!page?.venster || !rolling.length) return rolling;
const venster = meetVenster(page.venster, length);
if (venster.van <= 0 && venster.tot >= length - 1) return rolling;
return [{ key: 'page', days: null, label: page.label ?? null, venster }, ...rolling];
}
export function startPeriod(periods, stored = null) {
if (stored && periods.some(p => p.key === stored && p.venster)) return stored;
return periods.some(p => p.key === 'page') ? 'page' : 'start';
}
export function returnLine(input = {}, venster = null) {
if (!venster) return { amount: null, pct: null, points: [] };
const results = dailyResults(input);
const factors = windowFactors(input, venster);
const tot = Math.min(venster.tot, results.length - 1);
const points = [];
let cumulative = 0;
if (venster.van > 0) points.push({ i: venster.van, cumulative: 0, day: null, pct: null });
for (let i = venster.van > 0 ? venster.van + 1 : 0; i <= tot; i++) {
cumulative += results[i];
points.push({ i, cumulative, day: results[i], pct: factors[i] == null ? null : factors[i] - 1 });
}
return { amount: windowResult(input, venster), pct: windowTwr(input, venster), points };
}
export function flatLine(days, today) {
const n = Math.max(2, days);
const end = Date.parse(`${today}T00:00:00Z`);
const labels = Array.from({ length: n }, (_, k) => new Date(end - (n - 1 - k) * 86_400_000).toISOString().slice(0, 10));
return { amount: 0, pct: 0, labels, points: labels.map((_, i) => ({ i, cumulative: 0, day: 0, pct: 0 })) };
}
export function contributorsPerDay(reeks = {}, ids = [], venster = null, n = 3) {
const out = new Map();
if (!venster || !ids || ids.length < 2) return out;
const per = ids.map(id => {
const input = seriesFor(reeks, id);
return { id, results: dailyResults(input), factors: windowFactors(input, venster) };
});
const tot = Math.min(venster.tot, (reeks.dagen?.length || 0) - 1);
for (let i = venster.van > 0 ? venster.van + 1 : 0; i <= tot; i++) {
const top = per
.map(p => ({ id: p.id, day: p.results[i] || 0, pct: p.factors[i] == null ? null : p.factors[i] - 1 }))
.filter(c => Math.abs(c.day) >= 0.005)
.sort((a, b) => Math.abs(b.day) - Math.abs(a.day))
.slice(0, n);
if (top.length) out.set(i, top);
}
return out;
}
export function idsForSelection(sel, assets = []) {
if (sel?.assetIds?.length) return [...sel.assetIds];
if (sel?.kind) {
const ids = assets.filter(a => a.kind === sel.kind).map(a => a.id);
return ids.length ? ids : null;
}
return null;
}