# 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.

