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
| Variable | Obligatoire | Format |
|---|---|---|
DATABASE_URL | oui | postgresql://user:password@host:5432/dbname |
Modèles
Source : prisma/schema.prisma
12 modèles, tous mappés en snake_case via @@map :
| Modèle | Table | Rôle |
|---|---|---|
User | users | Utilisateurs (email, passwordHash) |
Institution | institutions | Banques, courtiers — @@unique([userId, name]) |
Account | accounts | Poches financières (hiérarchie via parentAccountId) |
Transaction | transactions | Mouvements avec FX, catégorie, source d'import — importHash @unique |
Snapshot | snapshots | Solde ponctuel par compte et par date — @@unique([accountId, date]) |
IncomeSource | income_sources | Sources de revenus liées à un compte |
BudgetPlan | budget_plans | Plan budget de référence — @@unique([userId, month]) |
BudgetIncomeSource | budget_income_sources | Sources de revenus d'un plan budget |
BudgetAllocation | budget_allocations | Enveloppes d'un plan budgétaire |
Rule | rules | Règles d'alerte (solde min/max, budget…) |
CategoryConfig | category_configs | Arbre de catégories + mots-clés Gemini — @@unique([userId, name]) |
Goal | goals | Objectifs d'épargne liés à un compte |
CategorizationRule | categorization_rules | Règles auto de catégorisation par priorité |
Conventions
- Montants :
Decimal @db.Decimal(12, 2)— jamaisFloat(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 utilisentonDelete: Restrict. - Horodatage : tous les modèles ont
createdAtetupdatedAt(@updatedAt)
Enums
| Enum | Valeurs |
|---|---|
AccountType | CHECKING, SAVINGS, INVESTMENT, CRYPTO, COMMODITY, UNLISTED |
IncomeType | SALARY, FREELANCE, REIMBURSEMENT, INVESTMENT, OTHER |
AllocationType | FIXED_EXPENSE, VARIABLE_EXPENSE, SAVINGS, INVESTMENT |
RuleType | MIN_BALANCE, MAX_BALANCE, MONTHLY_SAVINGS_MIN, BUDGET_OVERSPEND |
Severity | WARNING, CRITICAL |
CategorySource | AI, MANUAL, IMPORT, RULE |
ImportSource | CSV_BOURSO, CSV_REVOLUT, CSV_TR, MANUAL |
SnapshotSource | MANUAL, 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
Floatpour 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 :