Files
crowdlending-app/README.md
T
Olivier CROGUENNEC fa6011fadd Merge master into main
2026-06-13 17:52:55 +02:00

193 lines
8.3 KiB
Markdown

# 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
1. **Dépôts / Retraits** — mouvements de cash par plateforme.
2. **CF Investissements** — liste des projets souscrits (montant, taux, durée, statut).
3. **Remboursements** — échéances réellement perçues, avec ventilation fiscale.
4. **Simul Remboursements** — échéancier prévisionnel (in fine, amortissable, mensuel, différé).
5. **TdB Global** — KPI cumulés, soldes par plateforme, intérêts par année, échéances à venir, projets en défaut.
6. **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)
```bash
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
```bash
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
```bash
cd frontend
npm install
npm run dev # http://localhost:5173 (proxie /api -> 4000)
```
## Premier usage
1. Allez sur `/register` et créez votre compte. Un compte investisseur "Compte principal" est créé automatiquement.
2. **Paramètres** → ajoutez vos plateformes (ClubFunding, October, La Première Brique, …).
3. **Paramètres** → ajoutez d'autres comptes investisseurs si besoin (Madame, SCI…).
4. **Dépôts / Retraits** → saisissez vos versements initiaux.
5. **CF Investissements** → ajoutez vos projets (avec taux + durée pour pouvoir simuler).
6. **Simul Remboursements** → choisissez un investissement et "Générer" pour créer l'échéancier.
7. **Remboursements** → saisissez les échéances reçues au fil de l'eau.
8. **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 :
1. Choisir le module cible (Dépôts/Retraits, Investissements, ou Remboursements).
2. Uploader le fichier `.xlsx` ou `.csv`.
3. Mapper chaque champ cible avec la colonne Excel correspondante (auto-détection sur les noms exacts).
4. Pour les champs non présents dans le fichier, fournir une valeur par défaut.
5. 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_bruts` des 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 en `defaut` ou `cloture` dans 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_SECRET` long 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.