La migration ALTER TABLE ADD COLUMN pour csg, crds et solidarite s'exécutait après le seed qui tentait d'insérer ces colonnes, provoquant un crash SQLite. Déplace le bloc de migration avant le seed pour respecter l'ordre d'exécution.
Crowdlending Tracker
Application web de suivi de crowdlending : dépôts/retraits, investissements, remboursements (réels & simulés), tableau de bord global et récapitulatif fiscal 2778-SD.
Stack : React (Vite) + Node.js / Express + SQLite (better-sqlite3) + Docker.
Modules
- Dépôts / Retraits — mouvements de cash par plateforme.
- CF Investissements — liste des projets souscrits (montant, taux, durée, statut).
- Remboursements — échéances réellement perçues, avec ventilation fiscale.
- Simul Remboursements — échéancier prévisionnel (in fine, amortissable, mensuel, différé).
- TdB Global — KPI cumulés, soldes par plateforme, intérêts par année, échéances à venir, projets en défaut.
- 2778-SD — récap annuel : intérêts, prélèvements sociaux, PFNL, pertes en capital, export CSV.
Chaque module supporte la saisie manuelle et l'import Excel (avec mappage de colonnes).
Authentification
JWT, multi-utilisateurs. Chaque user peut gérer plusieurs comptes investisseurs (Monsieur, Madame, SCI…) — toutes les données sont scopées au compte actif (sélecteur en haut à droite).
Interface
- Menu masquable : un bouton ☰ en haut de la barre d'outils permet de masquer / réafficher la sidebar (état persisté). Sur mobile, la sidebar est masquée par défaut et s'ouvre en overlay.
- Thème clair / sombre / système : sélecteur en haut à droite (☀ Clair, ☾ Sombre, ◐ Système). Le mode "Système" suit la préférence OS et réagit en temps réel quand vous changez le thème système. Choix persisté dans le navigateur.
Démarrage rapide (Docker)
cp .env.example .env # éditez JWT_SECRET
docker compose up -d --build
- Frontend : http://localhost:8080
- Backend : http://localhost:4000/api/health
Les données SQLite et les uploads Excel sont persistés dans des volumes Docker (backend_data, backend_uploads).
Démarrage en local (dev)
Backend
cd backend
npm install
cp ../.env.example .env
npm run db:init # crée le schéma SQLite
npm run dev # http://localhost:4000
Frontend
cd frontend
npm install
npm run dev # http://localhost:5173 (proxie /api -> 4000)
Premier usage
- Allez sur
/registeret créez votre compte. Un compte investisseur "Compte principal" est créé automatiquement. - Paramètres → ajoutez vos plateformes (ClubFunding, October, La Première Brique, …).
- Paramètres → ajoutez d'autres comptes investisseurs si besoin (Madame, SCI…).
- Dépôts / Retraits → saisissez vos versements initiaux.
- CF Investissements → ajoutez vos projets (avec taux + durée pour pouvoir simuler).
- Simul Remboursements → choisissez un investissement et "Générer" pour créer l'échéancier.
- Remboursements → saisissez les échéances reçues au fil de l'eau.
- 2778-SD → consultez le récap fiscal et exportez le CSV au moment de la déclaration.
Import Excel
Module Import Excel dans le menu :
- Choisir le module cible (Dépôts/Retraits, Investissements, ou Remboursements).
- Uploader le fichier
.xlsxou.csv. - Mapper chaque champ cible avec la colonne Excel correspondante (auto-détection sur les noms exacts).
- Pour les champs non présents dans le fichier, fournir une valeur par défaut.
- Valider — les lignes sont insérées en bloc (transaction), avec un récap des erreurs ligne par ligne.
Les imports sont historisés (table imports).
Schéma de la base
Voir backend/src/db/schema.sql. Tables principales :
| Table | Rôle |
|---|---|
users |
comptes de connexion |
investisseurs |
profils d'investissement (multi-comptes) |
plateformes |
ClubFunding, October, … |
depots_retraits |
mouvements de cash |
investissements |
projets souscrits |
remboursements |
échéances réellement perçues |
simul_remboursements |
échéancier prévisionnel |
imports |
historique des imports |
Vues : v_solde_plateforme, v_synthese_inv, v_interets_annuels.
Structure du projet
crowdlending-app/
├── backend/
│ ├── src/
│ │ ├── server.js # Express bootstrap
│ │ ├── db/
│ │ │ ├── schema.sql # schéma SQLite
│ │ │ ├── index.js # connexion + apply schema
│ │ │ └── init.js # script `npm run db:init`
│ │ ├── middleware/
│ │ │ ├── auth.js # JWT
│ │ │ ├── investisseurScope.js
│ │ │ └── errorHandler.js
│ │ └── routes/
│ │ ├── auth.js
│ │ ├── investisseurs.js
│ │ ├── plateformes.js
│ │ ├── depotsRetraits.js
│ │ ├── investissements.js
│ │ ├── remboursements.js
│ │ ├── simul.js # CRUD + générateur d'échéancier
│ │ ├── dashboard.js
│ │ ├── fiscal2778.js # récap + export CSV
│ │ └── imports.js # preview + apply
│ ├── Dockerfile
│ └── package.json
├── frontend/
│ ├── src/
│ │ ├── main.jsx # bootstrap React
│ │ ├── App.jsx # router
│ │ ├── api.js # fetch wrapper
│ │ ├── styles.css
│ │ ├── context/ # AuthContext, InvestisseurContext
│ │ ├── components/ # Layout, Modal
│ │ ├── pages/ # Login/Register + 6 modules + Imports + Settings
│ │ └── utils/format.js
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── vite.config.js
│ └── package.json
├── docker-compose.yml
├── .env.example
├── .gitignore
└── README.md
Endpoints API (sélection)
| Méthode | Endpoint | Description |
|---|---|---|
| POST | /api/auth/register |
crée user + compte principal |
| POST | /api/auth/login |
retourne JWT |
| GET | /api/auth/me |
user courant |
| GET/POST/PUT/DELETE | /api/investisseurs |
gérer les comptes investisseurs |
| GET/POST/PUT/DELETE | /api/plateformes |
gérer les plateformes |
| GET/POST/PUT/DELETE | /api/depots-retraits |
mouvements de cash |
| GET/POST/PUT/DELETE | /api/investissements |
projets |
| GET | /api/investissements/:id |
détail + remboursements + simul |
| GET/POST/PUT/DELETE | /api/remboursements |
échéances réelles |
| GET/POST/DELETE | /api/simul |
échéances prévisionnelles |
| POST | /api/simul/generate |
générer l'échéancier d'un investissement |
| GET | /api/dashboard |
TdB global |
| GET | /api/fiscal-2778?annee=2025 |
récap fiscal |
| GET | /api/fiscal-2778/export?annee=2025 |
export CSV |
| POST | /api/imports/preview |
analyse fichier Excel |
| POST | /api/imports/apply |
insère les lignes selon mappage |
| GET | /api/imports/history |
historique des imports |
Tous les endpoints (sauf /auth/*) requièrent :
- header
Authorization: Bearer <jwt> - header
X-Investisseur-Id: <id>pour les routes scopées (depots-retraits, investissements, remboursements, simul, dashboard, fiscal-2778, imports).
Notes fiscales 2778-SD
Les cases calculées (2TR, 2CK, 2BH) sont indicatives. La logique est :
- 2TR : somme des
interets_brutsdes remboursements payés/partiels de l'année. - 2CK : somme des
prelev_forfaitaire(PFNL 12,8 % déjà retenu à la source par la plateforme) — c'est un crédit d'impôt. - 2BH : base CSG/CRDS (par défaut = intérêts bruts ; à ajuster selon votre situation).
- Pertes en capital :
montant_investi - capital_remboursépour les projets passés endefautoucloturedans l'année (updated_at). Vérifier l'éligibilité à l'imputation (CGI art. 125-00 A).
L'export CSV inclut le détail ligne par ligne, prêt à être joint à votre déclaration.
Sécurité — TODO si déploiement public
- Forcer un
JWT_SECRETlong et aléatoire en prod. - Ajouter HTTPS (reverse proxy Caddy/Traefik).
- Activer un CORS explicite (origin exacte).
- Ajouter une politique de rotation de tokens / refresh tokens.
- Sauvegarde régulière du volume
backend_data.
Licence
Privé / personnel.