Server Actions — Analytics
Deux fichiers sources pour les analytics :
src/app/actions/analytics.ts— flux mensuels, répartition catégories, résumésrc/app/actions/dashboard.ts— net worth, graphique patrimoine, variation 30j
getDashboardData()
Calcule toutes les données nécessaires au tableau de bord.
Source : src/app/actions/dashboard.ts
export type DashboardData = {
accounts: AccountWithLastSnapshot[];
chartData: { date: string; total: number }[]; // série pour le graphique patrimoine
totalCurrent: number; // net worth actuel
totalLastMonth: number; // net worth il y a 30 jours
variationAmount: number; // totalCurrent - totalLastMonth
variationPct: number; // variation en %
};
export async function getDashboardData(): Promise<DashboardData>
Comportement :
- N'inclut que les comptes
isActive = true. chartDatacouvre les 12 derniers mois avec forward-fill.totalLastMonth= dernier snapshot connu par compte avantnow - 30j.- Si aucun snapshot et
totalCurrent > 0: un point unique{ date: today, total: totalCurrent }est inséré danschartData.
getMonthlyFlows(months?, accountId?)
Agrège les transactions non-internes par mois calendaire.
Source : src/app/actions/analytics.ts
export type MonthlyFlow = {
month: string; // "2024-03"
label: string; // "Mar. 24"
credits: number;
debits: number;
net: number; // credits - debits
};
export async function getMonthlyFlows(
months?: number, // défaut: 12
accountId?: string // optionnel — filtre sur un seul compte
): Promise<MonthlyFlow[]>
Exclusions : isInternal = true.
Tri : chronologique ascendant. Les mois sans transactions ne sont pas inclus.
getCategoryBreakdown(days?, accountId?)
Répartition des dépenses par catégorie sur une période glissante.
export type CategoryTotal = {
category: string;
total: number; // somme des montants absolus
count: number;
pct: number; // % du total des dépenses
};
export async function getCategoryBreakdown(
days?: number, // défaut: 30
accountId?: string
): Promise<CategoryTotal[]>
Exclusions : isInternal = true, crédits (amount >= 0).
Limite : top 8 catégories par montant décroissant. Les transactions sans catégorie sont regroupées sous "Autre".
getTransactionsSummary(filters)
Agrégation crédit/débit/net pour un ensemble de transactions filtré.
export async function getTransactionsSummary(filters: {
accountId?: string;
search?: string;
dateFrom?: string; // "YYYY-MM-DD"
dateTo?: string;
type?: "credit" | "debit";
}): Promise<TransactionSummary>
export type TransactionSummary = {
credits: number; // Σ amount > 0
debits: number; // Σ amount < 0 (valeur négative)
net: number; // Σ tous montants
count: number;
}
Exclusions : isInternal = true.