Mise en place de la feature de gestion des Frais

This commit is contained in:
ocroguennec committed 2026-09-01 22:16:18 +02:00
1 parent 9ea078302d
commit 0334a63139
27 files changed
+2401 -117

No files matched your search

+1
View File
@@ -212,6 +212,7 @@ Tous en lecture seule (`readOnlyHint: true`) :
| `crowdlending_list_investissements` | Liste des investissements, filtrable par statut |
| `crowdlending_get_investissement` | Détail d'un investissement + ses remboursements |
| `crowdlending_list_remboursements` | Historique des remboursements, filtrable par période |
| `crowdlending_list_frais_operations` | Frais liés aux investissements (souscription, gestion, distribution), filtrable par période |
| `crowdlending_list_depots_retraits` | Historique des mouvements de cash |
| `crowdlending_list_objectifs` | Objectifs de versement et de capital investi, à comparer au réalisé |
| `crowdlending_get_taxreport` | Synthèse fiscale annuelle (CERFA 2042/2561/2047/2778-SD) — aide à la déclaration, pas une source officielle |
+53 -3
View File
@@ -76,7 +76,10 @@ export function registerDataTools(server, { apiGet, withLabel = (t) => t, withSo
"retard/procédure), montant remboursé, intérêts bruts/nets perçus, " +
"capital reçu, total dépôts/retraits, et gain_net_depuis_debut (intérêts " +
"nets + cashback/bonus de parrainage ou de plateforme + corrections de " +
"solde, cumulés sur tout l'historique — équivalent au KPI \"Gain net " +
"solde − frais réglés hors remboursement (porte-monnaie ou compte " +
"courant du détenteur ; détail dans gain_net_depuis_debut." +
"frais_hors_remboursement — voir aussi crowdlending_list_frais_operations), " +
"cumulés sur tout l'historique — équivalent au KPI \"Gain net " +
"depuis le début\" de l'app, toujours un total, jamais filtré par année, " +
"reste valable même après un retrait complet des plateformes). Les " +
"montants d'investissements sont des soldes actuels (photo à " +
@@ -123,7 +126,13 @@ export function registerDataTools(server, { apiGet, withLabel = (t) => t, withSo
description: withSource(
"Retourne le détail complet d'un investissement (identifié par son id, " +
"obtenu via crowdlending_list_investissements), y compris la liste de " +
"ses remboursements réels perçus (capital, intérêts bruts/nets, cashback)."),
"ses remboursements réels perçus (capital, intérêts bruts/nets, cashback, " +
"et frais_ttc/frais_mode_reglement — le frais ne réduit interets_nets/" +
"net_recu que si frais_mode_reglement vaut \"remboursement\") et le " +
"tableau frais_operations : tous les frais liés à cet investissement " +
"(souscription, gestion, distribution, autre), quel que soit leur mode " +
"de règlement (source, porte-monnaie, compte courant, ou retenu sur un " +
"remboursement)."),
inputSchema: {
id: z.number().int().positive().describe("Identifiant de l'investissement"),
},
@@ -141,7 +150,13 @@ export function registerDataTools(server, { apiGet, withLabel = (t) => t, withSo
title: withLabel('Liste des remboursements'),
description: withSource(
"Liste les remboursements réels perçus (toutes plateformes confondues), " +
"avec le nom du projet et de la plateforme. Filtrable par période."),
"avec le nom du projet et de la plateforme. Filtrable par période. " +
"Chaque ligne inclut frais_ttc (montant de frais saisi sur ce " +
"remboursement) et frais_mode_reglement : le frais ne réduit " +
"interets_nets/net_recu que si frais_mode_reglement vaut " +
"\"remboursement\" — avec \"portefeuille\" ou \"compte_courant\", le frais " +
"est réglé à part (voir crowdlending_list_frais_operations) et n'a " +
"aucun impact sur ce remboursement, ne pas le soustraire une seconde fois."),
inputSchema: {
date_debut: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
.describe('Date de début au format YYYY-MM-DD (incluse)'),
@@ -156,6 +171,41 @@ export function registerDataTools(server, { apiGet, withLabel = (t) => t, withSo
},
);
server.registerTool(
'crowdlending_list_frais_operations',
{
title: withLabel('Liste des frais liés aux investissements'),
description: withSource(
"Liste les frais facturés par certaines plateformes en dehors des " +
"intérêts/prélèvements fiscaux habituels : frais d'entrée à la " +
"souscription, frais de gestion, frais sur distribution, ou autre " +
"(catégorie renseignée dans `categorie`). `mode_reglement` indique " +
"comment le frais a été réglé — \"source\" : aucun mouvement de " +
"trésorerie réel, montant purement indicatif (déjà déduit par la " +
"plateforme en amont) ; \"portefeuille\" : débité du porte-monnaie de " +
"la plateforme ; \"compte_courant\" : débité d'un compte courant du " +
"détenteur (`compte_nom`) ; \"remboursement\" : retenu directement sur " +
"le remboursement lié (`remboursement_id`), déjà pris en compte dans " +
"les champs interets_nets/net_recu de ce remboursement (voir " +
"crowdlending_list_remboursements) — ne pas le compter une seconde " +
"fois. Seuls les modes \"portefeuille\" et \"compte_courant\" " +
"représentent une sortie d'argent réelle et séparée : c'est ce " +
"sous-ensemble qui est déduit de gain_net_depuis_debut sur " +
"crowdlending_get_dashboard. Filtrable par période."),
inputSchema: {
date_debut: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
.describe('Date de début au format YYYY-MM-DD (incluse)'),
date_fin: z.string().regex(/^\d{4}-\d{2}-\d{2}$/).optional()
.describe('Date de fin au format YYYY-MM-DD (incluse)'),
},
annotations: READ_ONLY_ANNOTATIONS,
},
async ({ date_debut, date_fin }) => {
try { return toolResult(await apiGet('/frais-operations', { date_debut, date_fin })); }
catch (e) { return toolError(e); }
},
);
server.registerTool(
'crowdlending_list_depots_retraits',
{