- Remplace le dropdown CSV/XLS/JSON de PfuSection par Exporter/Importer ZIP - GET /api/pfu/export-zip : ZIP avec manifest, pfu.json, taux_credit_impot.json - POST /api/pfu/import-zip : upsert PFU (par annee) et TCI (par nom_pays/code_pays) - ResultBanner pour le résultat de l'import dans PfuSection
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.