Skip to main content

Schéma de base de données

Connexion

Source : src/lib/db.ts, prisma.config.ts

Prisma 7 utilise un driver adapter : @prisma/adapter-pg. La connexion passe par un Pool de pg plutôt que par le driver natif Prisma.

const pool = new Pool({ connectionString: process.env.DATABASE_URL });
const adapter = new PrismaPg(pool);
new PrismaClient({ adapter });

Le client est un singleton stocké sur globalThis pour survivre aux rechargements de modules Next.js en développement.

Breaking Prisma 7

L'URL de connexion est définie dans prisma.config.ts, pas dans schema.prisma.

Variables d'environnement

VariableObligatoireFormat
DATABASE_URLouipostgresql://user:password@host:5432/dbname

Modèles

Source : prisma/schema.prisma

12 modèles, tous mappés en snake_case via @@map :

ModèleTableRôle
UserusersUtilisateurs (email, passwordHash)
InstitutioninstitutionsBanques, courtiers — @@unique([userId, name])
AccountaccountsPoches financières (hiérarchie via parentAccountId)
TransactiontransactionsMouvements avec FX, catégorie, source d'import — importHash @unique
SnapshotsnapshotsSolde ponctuel par compte et par date — @@unique([accountId, date])
IncomeSourceincome_sourcesSources de revenus liées à un compte
BudgetPlanbudget_plansPlan budget de référence — @@unique([userId, month])
BudgetIncomeSourcebudget_income_sourcesSources de revenus d'un plan budget
BudgetAllocationbudget_allocationsEnveloppes d'un plan budgétaire
RulerulesRègles d'alerte (solde min/max, budget…)
CategoryConfigcategory_configsArbre de catégories + mots-clés Gemini — @@unique([userId, name])
GoalgoalsObjectifs d'épargne liés à un compte
CategorizationRulecategorization_rulesRègles auto de catégorisation par priorité

Conventions

  • Montants : Decimal @db.Decimal(12, 2)jamais Float (voir ADR-001)
  • Taux FX : Decimal @db.Decimal(18, 8) stocké à la date de transaction
  • IDs : cuid()
  • Cascade : les relations « compte supprimé → cascade transactions/snapshots » utilisent onDelete: Cascade. Les relations limitantes utilisent onDelete: Restrict.
  • Horodatage : tous les modèles ont createdAt et updatedAt (@updatedAt)

Enums

EnumValeurs
AccountTypeCHECKING, SAVINGS, INVESTMENT, CRYPTO, COMMODITY, UNLISTED
IncomeTypeSALARY, FREELANCE, REIMBURSEMENT, INVESTMENT, OTHER
AllocationTypeFIXED_EXPENSE, VARIABLE_EXPENSE, SAVINGS, INVESTMENT
RuleTypeMIN_BALANCE, MAX_BALANCE, MONTHLY_SAVINGS_MIN, BUDGET_OVERSPEND
SeverityWARNING, CRITICAL
CategorySourceAI, MANUAL, IMPORT, RULE
ImportSourceCSV_BOURSO, CSV_REVOLUT, CSV_TR, MANUAL
SnapshotSourceMANUAL, COMPUTED

Migrations

Source : prisma/migrations/

Toutes les migrations sont versionnées dans prisma/migrations/. Les commandes :

npm run db:migrate # prisma migrate dev (crée + applique en dev)
npm run db:migrate:prod # prisma migrate deploy (applique en prod, non interactif)
npm run db:seed # prisma db seed
npm run db:studio # UI Prisma Studio
Interdit
  • Aucune modification manuelle du schéma en base (toujours passer par une migration)
  • Aucun Float pour les montants financiers (voir CLAUDE.md)
  • Aucun champ Nordigen avant la V2 (voir ADR-002)

Diagramme entité-relation

À générer

Un diagramme SVG doit être ajouté dans static/img/diagrams/erd.svg. Voir prisma erd ou dbdiagram.io.

Règles de gestion liées

Les invariants et contraintes métier sont documentés par domaine :