Skip to main content

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.
  • chartData couvre les 12 derniers mois avec forward-fill.
  • totalLastMonth = dernier snapshot connu par compte avant now - 30j.
  • Si aucun snapshot et totalCurrent > 0 : un point unique { date: today, total: totalCurrent } est inséré dans chartData.

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.


Voir aussi