import { useEffect, useRef, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import { withDevOverrides } from '../utils/devOverrides.js'; /** Nom de fichier à partir de la question (slug, sans accents). */ function slugify(text) { return text .toLowerCase() .normalize('NFD').replace(new RegExp('[\\u0300-\\u036f]', 'g'), '') .replace(/[^a-z0-9]+/g, '-') .replace(/^-+|-+$/g, '') .slice(0, 60); } /* ── Accordéon FAQ ───────────────────────────────────────────── */ /* `openQuestion`/`setOpenQuestion` sont partagés par toutes les FaqItem d'une même page (état remonté dans le composant parent) : une seule question ouverte à la fois, ouvrir la suivante referme automatiquement les autres. */ function FaqItem({ question, children, openQuestion, setOpenQuestion }) { const open = openQuestion === question; const toggle = () => setOpenQuestion(open ? null : question); const [pdfState, setPdfState] = useState('idle'); // idle | generating | error const contentRef = useRef(null); const handleDownloadPdf = async () => { if (!contentRef.current || pdfState === 'generating') return; setPdfState('generating'); // Insère le titre directement dans le bloc réel (contentRef), le temps de // la capture uniquement, puis le retire — évite de le dupliquer en // permanence à l'écran tout en réutilisant l'élément réellement rendu // (un conteneur hors-écran séparé est capturé vide par html2canvas : // sa zone de rendu ne suit pas un élément poussé loin hors du viewport). let heading = null; try { const { default: html2pdf } = await import('html2pdf.js'); // Fond capturé = fond réel du bloc (var(--surface)) : reste cohérent // que le thème actif soit clair ou sombre, plutôt qu'un blanc forcé // qui casserait le contraste du texte en mode sombre. const bgColor = getComputedStyle(contentRef.current).backgroundColor || '#ffffff'; heading = document.createElement('h3'); heading.textContent = question; heading.style.margin = '0 0 12px'; heading.style.color = 'var(--text)'; heading.style.fontSize = '1.1rem'; contentRef.current.insertBefore(heading, contentRef.current.firstChild); await html2pdf() .set({ margin: 28, filename: `faq-${slugify(question) || 'crowdlending'}.pdf`, image: { type: 'jpeg', quality: 0.95 }, html2canvas: { scale: 2, useCORS: true, backgroundColor: bgColor }, jsPDF: { unit: 'pt', format: 'a4', orientation: 'portrait' }, // 'avoid-all' : ne coupe jamais un élément (image, bloc de code, // ligne de tableau…) au milieu — le pousse entièrement sur la page // suivante à la place. C'est ce qui manquait avec le moteur HTML // interne de jsPDF (doc.html()), qui tranchait au hasard. pagebreak: { mode: ['avoid-all', 'css'] }, }) .from(contentRef.current) .toPdf() .get('pdf') .then((pdf) => { // Numérotation en bas à droite, une fois le nombre total de pages connu. const total = pdf.internal.getNumberOfPages(); for (let i = 1; i <= total; i++) { pdf.setPage(i); pdf.setFontSize(9); pdf.setTextColor(150); pdf.text( `${i} / ${total}`, pdf.internal.pageSize.getWidth() - 28, pdf.internal.pageSize.getHeight() - 16, { align: 'right' } ); } }) .save(); setPdfState('idle'); } catch (e) { console.error('Échec de la génération du PDF :', e); setPdfState('error'); } finally { if (heading && heading.parentNode) heading.parentNode.removeChild(heading); } }; return (
{open && (
{children}
{pdfState === 'error' && (

La génération du PDF a échoué. Réessayez, ou imprimez la page (Ctrl+P / Cmd+P) et choisissez « Enregistrer en PDF ».

)}
)}
); } /* ── Titre de section (regroupement thématique de la FAQ) ──────── */ function FaqSectionTitle({ children, first }) { return (

{children}

); } /* ── Lien de téléchargement (fichiers statiques dans public/) ──── */ function DownloadLink({ href, children }) { return ( {children} ); } /* ── Navigation ─────────────────────────────────────────────── */ const NAV = [ { id: 'faq', label: 'FAQ', icon: ( ), }, ]; /* ── Page principale ─────────────────────────────────────────── */ export default function Aide() { const { search } = useLocation(); const navigate = useNavigate(); const [openQuestion, setOpenQuestion] = useState(null); // question ouverte dans la FAQ (une seule à la fois) const [appInfo, setAppInfo] = useState({}); // { appUrl, mcpUrl } — valeurs brutes de la base, telles quelles useEffect(() => { fetch('/api/app-info').then(r => r.json()).then(setAppInfo).catch(() => {}); }, []); // URL MCP annoncée comme « déjà pré-remplie » : doit refléter ce que // Mon compte → Serveur MCP affichera réellement, y compris en dev (où // cette page-là retombe elle-même sur localhost via withDevOverrides). const mcpConfigUrl = withDevOverrides(appInfo).mcpUrl || 'https://mcp./mcp'; const section = new URLSearchParams(search).get('section') || 'faq'; const setSection = (s) => navigate(`/aide?section=${s}`, { replace: true }); return (
{/* ── Nav gauche ───────────────────────────────────────── */} {/* ── Contenu ──────────────────────────────────────────── */}
{section === 'faq' && (

Questions fréquentes

Comprendre la plateforme

Le solde du porte-monnaie représente les liquidités disponibles sur une plateforme, c'est-à-dire l'argent que vous pouvez retirer ou réinvestir. Il est calculé comme suit :

Solde = Dépôts
        − Retraits manuels
        + Remboursements crédités au porte-monnaie
        + Bonus (parrainage / plateforme)
        − Capital investi (en cours ou remboursé)
        − Frais (déduits à la souscription ou réglés via le porte-monnaie)
        + Corrections de solde

Retraits manuels — seuls les retraits que vous avez saisis manuellement sont déduits. Les retraits générés automatiquement lors d'un remboursement en mode "compte courant" sont exclus, car ils ne représentent pas un vrai mouvement de porte-monnaie.

Remboursements crédités au porte-monnaie — uniquement les remboursements dont le mode est "Portefeuille" (et non "Compte courant"). Le montant crédité dépend de la fiscalité de la plateforme :

  • Plateforme française (Flat Tax) — le porte-monnaie reçoit le net reçu, c'est-à-dire le montant après déduction du PFU français (17,2 % de prélèvements sociaux + 12,8 % d'impôt sur le revenu), prélevé directement à la source par la plateforme.
  • Plateforme hors France (sans fiscalité locale) — le porte-monnaie reçoit le capital remboursé + cashback + intérêts bruts. Le PFU français n'est pas prélevé à la source : vous devez le déclarer séparément dans votre déclaration fiscale annuelle.
  • Plateforme hors France (avec retenue à la source locale) — même principe que ci-dessus, mais la plateforme a déjà prélevé une taxe locale sur les intérêts. Le porte-monnaie reçoit le capital + cashback + intérêts bruts après cette retenue locale. Le PFU français reste à déclarer séparément.

Capital investi — le montant que vous avez placé dans des prêts actifs (y compris les réinvestissements complémentaires) est soustrait du porte-monnaie, car ces fonds ne sont plus disponibles. Ils reviennent progressivement via les remboursements.

Frais — les frais liés aux investissements (voir la question dédiée ci-dessous) réduisent le solde lorsqu'ils sont réglés « à la source » (déduits du versement lors de la souscription) ou via le porte-monnaie. Les frais réglés depuis un compte courant du détenteur, ou retenus directement sur un remboursement, n'ont aucun impact ici — ils ne transitent jamais par le porte-monnaie de la plateforme.

Corrections de solde — ajustements manuels permettant de réconcilier de micro-écarts de calcul (par exemple un arrondi de centimes sur la fiscalité).

Certaines plateformes facturent des frais en dehors des intérêts et prélèvements fiscaux habituels : frais d'entrée à la souscription, frais de gestion, frais sur une distribution (retenus ou non sur un remboursement), ou autre. Le bloc Frais d'opération de la fiche d'un investissement les recense tous.

Dès qu'au moins un frais a été déclaré sur l'une de vos plateformes, une page Frais dédiée apparaît dans le menu de gauche (entre Remboursements et Fiscalité) — après un rechargement de la page qui suit cette première déclaration. Elle consolide, tous investissements confondus, le montant total, la répartition par catégorie et le détail de chaque opération, avec ajout/modification/suppression directement depuis cette vue (plus besoin de passer par la fiche de chaque investissement). Cette page remplace l'ancien onglet « Frais » qui se trouvait dans Remboursements.

Où saisir un frais ?

  • Frais de souscription — depuis l'étape « Frais » du formulaire de création ou modification de l'investissement. Un seul frais de cette catégorie par investissement.
  • Frais de gestion ou autre — depuis le bouton + Ajouter du bloc Frais d'opération sur la fiche de l'investissement, ou depuis la page Frais dédiée (avec sélecteur d'investissement).
  • Frais sur distribution — depuis le champ Frais du formulaire d'un remboursement. La ligne est créée et synchronisée automatiquement dans le bloc Frais d'opération et dans la page Frais ; elle ne peut être modifiée ou supprimée que depuis ce remboursement, pour éviter toute désynchronisation.

Mode de règlement et impact

Chaque frais est réglé de l'une des quatre façons suivantes, avec un impact différent :

  • Déduit du versement lors de la souscription — aucune ligne de mouvement séparée : le montant est simplement documenté à titre de traçabilité, mais il réduit le solde du porte-monnaie (voir la question ci-dessus).
  • Porte-monnaie — débité du solde disponible sur la plateforme, comme un retrait.
  • Débité du compte courant — réglé depuis un compte courant du détenteur (choisi à la saisie), sans aucun impact sur le porte-monnaie de la plateforme.
  • Déduit du remboursement — retenu directement sur le remboursement lié : le montant réduit alors la base imposable et les intérêts nets/net reçu de ce remboursement (comportement historique). C'est le seul mode où le frais n'est pas une sortie d'argent séparée à suivre par ailleurs.

Le KPI Gain net depuis le début du tableau de bord déduit tous les frais réellement payés, sauf ceux du mode « Déduit du remboursement » : ceux-là sont déjà comptés en creux dans les intérêts nets de ce remboursement (le retirer une 2ᵉ fois compterait la même dépense deux fois). Les frais « Déduit du versement lors de la souscription », « Porte-monnaie » et « Débité du compte courant » sont chacun une vraie sortie d'argent qui n'apparaît nulle part ailleurs dans ce total, donc ils sont bien soustraits.

Le TRI (XIRR) net d'un investissement suit une règle légèrement différente : seuls les frais « Porte-monnaie » et « Compte courant » y sont ajoutés comme sortie de trésorerie. Un frais « Déduit du versement lors de la souscription » n'y est pas rajouté séparément car il est déjà reflété dans le montant investi (net du frais dès la souscription) qui sert de point de départ au calcul — l'ajouter une 2ᵉ fois fausserait le TRI.

Le réinvestissement automatique permet de capitaliser les intérêts perçus après chaque remboursement, sans aucune saisie manuelle. Les intérêts sont automatiquement réinjectés dans le capital du prêt, ce qui augmente progressivement le montant investi et les intérêts futurs.

Activation

  1. Ouvrez la fiche d'un investissement.
  2. Cliquez sur le bouton ⋮ en haut à droite du bloc Informations du projet, puis choisissez Réinvestir.
  3. Dans la modale, sélectionnez l'onglet Automatique.
  4. Cliquez sur Activer.

Une fois activé, le bloc Réinvestissements complémentaires apparaît sur la fiche avec un badge auto, même si aucun remboursement n'a encore eu lieu.

Quel montant est réinvesti ?

Le montant réinvesti après chaque remboursement dépend de la fiscalité de la plateforme :

  • Plateforme française (Flat Tax) — les intérêts nets sont réinvestis (après déduction du PFU prélevé à la source). C'est le montant réellement reçu sur votre porte-monnaie.
  • Plateforme hors France — les intérêts bruts sont réinvestis, car aucune retenue n'est effectuée à la source. Pensez à provisionner la fiscalité due lors de votre déclaration annuelle.

Si les intérêts d'un remboursement sont nuls (remboursement de capital seul), aucun réinvestissement n'est créé.

Désactivation

Pour désactiver le réinvestissement automatique, cliquez sur ⋮ dans le bloc Informations du projet et choisissez Désactiver le réinvestissement auto. Les réinvestissements déjà créés sont conservés ; les prochains remboursements n'en génèreront plus.

Fiscalité

La page Fiscalité (menu de gauche) reprend, année par année, les montants nécessaires pour préparer votre déclaration de revenus. Elle est organisée en cinq onglets, chacun correspondant à un formulaire CERFA officiel :

2561 IFU — Imprimé fiscal unique. Récapitulatif annuel transmis par les plateformes françaises soumises au prélèvement forfaitaire unique (PFU).
2047 Revenus encaissés à l'étranger. Visible dès qu'une ou plusieurs de vos plateformes sont domiciliées hors de France ; détaille les intérêts perçus pays par pays et le crédit d'impôt associé.
2778-SD Prélèvement forfaitaire obligatoire (PFO), selon votre situation fiscale — déclaration mensuelle de l'acompte dû sur les intérêts de plateformes étrangères (voir la question suivante).
2042 Déclaration des revenus. La déclaration principale : reprend les cases calculées à partir des trois formulaires ci-dessus (2TT, 2TR, 2BH, 2CK, 2TY).
2042-C PRO Intérêts d'emprunts sur une plateforme d'actif numérique (crowdlending sur RWA). Visible dès qu'une ou plusieurs de vos plateformes sont de type « Prestataire de Services sur Actifs Numériques » (PSAN) — des bénéfices non commerciaux (BNC), en régime micro (case 5HQ), indépendants des trois formulaires ci-dessus.

Le sens de circulation des données est toujours le même :

  • 2561 et 2047 alimentent directement la 2042.
  • La 2778-SD (mensuelle) alimente la 2047 (annuelle), qui seule est ensuite reportée sur la 2042 — la 2778-SD n'est qu'un mécanisme d'acompte intermédiaire, jamais une déclaration de substitution à la 2047.
  • La 2042-C PRO fonctionne à part : les intérêts de plateformes PSAN sont des bénéfices non commerciaux (BNC), pas des revenus de capitaux mobiliers — ils ne transitent ni par la 2047, ni par un crédit d'impôt, et ne sont pas repris dans les cases 2TT/2TR/2BH/2CK/2TY de la 2042. Ils se déclarent séparément, directement sur l'imprimé 2042-C PRO (voir la question dédiée ci-dessous).

Un pavé « À quoi correspond chaque CERFA ? », avec un schéma récapitulatif, est affiché directement en haut de l'onglet 2047 lorsque vous avez des plateformes étrangères.

Important — ce module est une aide à la préparation de votre déclaration, il ne la remplace pas. Vérifiez chaque montant avant de le reporter sur le site des impôts : vous restez seul responsable de l'exactitude de votre déclaration fiscale, Crowdlending ne saurait être tenu responsable des données déclarées.

Cette question concerne le formulaire 2778-SD (prélèvement forfaitaire obligatoire, ou PFO). Elle ne se pose que si vous détenez au moins une plateforme domiciliée hors de France.

La règle

Le PFO s'applique aux personnes physiques fiscalement domiciliées en France dont le revenu fiscal de référence (RFR) de l'avant-dernière année est égal ou supérieur à :

25 000 € — célibataire, divorcé ou veuf
50 000 € — couple marié ou pacsé

Votre RFR figure sur votre avis d'imposition de l'année précédente (ligne « Revenu fiscal de référence »). En dessous de ces seuils, vous êtes dispensé du PFO — mais les prélèvements sociaux restent dus.

Où l'activer dans l'application

  1. Allez dans Paramétrage → Ma fiscalité.
  2. Dépliez la carte « CERFA 2778-SD — Prélèvement Forfaitaire Obligatoire (PFO) pour des revenus de source étrangère » pour revoir le détail des seuils.
  3. Activez le bouton si votre situation vous rend redevable du PFO.

Ce réglage est global : une fois activé, l'onglet 2778-SD apparaît dans la page Fiscalité, les cases 2BH / 2CK se remplissent dans le report 2042, et les lignes de suivi mensuel du PFO (taux, montant à payer, intérêt net) s'affichent dans les tableaux « Suivi mensuel » des onglets 2047 et 2778-SD. Si vous le désactivez, ces éléments sont masqués car ils ne s'appliquent pas à votre situation.

À retenir — que le PFO s'applique ou non à vous, la déclaration annuelle via le CERFA 2047 reste obligatoire dès que vous avez perçu des intérêts d'une plateforme étrangère. Ce paramètre reflète votre propre situation fiscale : en cas de doute, vérifiez votre avis d'imposition ou consultez un professionnel.

Dans l'onglet 2047, vue « Données 2047 », chaque plateforme étrangère est classée automatiquement selon la convention fiscale signée entre la France et son pays de domiciliation.

Éligible au crédit d'impôt (cases 233 à 238)

Le pays a une convention fiscale active et n'impose pas l'imposition exclusivement dans le pays de résidence. Le crédit d'impôt (case 237) est égal à l'impôt réellement prélevé à l'étranger (case 236), plafonné au taux conventionnel du pays lorsque celui-ci est chiffré (case 234) — ou non plafonné pour certains pays dont la convention prévoit un crédit égal à l'impôt prélevé sans limite de taux.

Non éligible (case 250)

Le pays est absent des conventions fiscales référencées, sa convention est suspendue ou caduque, ou elle prévoit une imposition exclusivement dans le pays de résidence. Dans ce cas, aucun crédit d'impôt n'est calculé.

Sous-totaux par pays

Le formulaire papier 2047 se remplit par pays, pas par plateforme : si plusieurs de vos plateformes sont domiciliées dans le même pays, une ligne « Sous-total » apparaît automatiquement sous le groupe pour faciliter le report. Les totaux 8VL et 8PL (report 2042) ainsi que les cases 251/252 cumulent l'ensemble de vos plateformes étrangères, arrondis à l'euro comme l'exige le formulaire officiel.

Certaines plateformes de crowdlending prêtent sur des actifs numériques plutôt que sur des projets classiques (crowdlending sur RWA — Real World Asset tokenisés). Dans le référentiel Crowdlending, elles sont identifiées par la catégorie « Prestataire de Services sur Actifs Numériques » (PSAN), par opposition aux plateformes de financement participatif classiques (« Prestataire de Services de Financement Participatif », PSFP).

Un régime fiscal différent

Les intérêts perçus via une plateforme PSAN ne sont pas des revenus de capitaux mobiliers (RCM) comme les autres — ce sont des bénéfices non commerciaux (BNC), quelle que soit la localisation de la plateforme (française ou étrangère). Conséquence directe :

  • Pas de déclaration 2047, même si la plateforme est domiciliée hors de France.
  • Pas de crédit d'impôt conventionnel possible.
  • Déclaration directe sur l'imprimé 2042-C PRO, en régime micro-BNC, case 5HQ.

Le régime micro-BNC

Vous déclarez le montant brut des intérêts reçus (valorisés en euros au jour de leur réception) ; l'abattement forfaitaire de 34 % est appliqué automatiquement par l'administration fiscale, vous n'avez rien à calculer vous-même. Si vos recettes brutes dépassent 77 700 € sur l'année — ou si vous souhaitez déduire des charges réelles (matériel, électricité…) — vous basculez en régime réel (cases 5KO / 5KP), non géré par l'application.

Dans l'application

Dès qu'au moins une de vos plateformes est catégorisée PSAN, un onglet CERFA 2042 C PRO apparaît sur la page Fiscalité, avec un suivi mensuel des intérêts bruts et la case 5HQ à reporter — ainsi qu'un bloc dédié « Cases fiscales 2042 C PRO » affiché à côté du récapitulatif principal. Vous pouvez vérifier ou modifier la catégorie d'une plateforme (PSFP / PSAN) depuis Paramétrage → Plateformes.

Chaque onglet CERFA propose généralement plusieurs vues : un suivi mensuel (le détail plateforme par plateforme, mois par mois), une vue « Données » (les cases du formulaire lui-même), et une vue « Report 2042 » (ce qui doit être reporté sur la déclaration principale). Exception : l'onglet 2042-C PRO ne propose que les deux premières vues (Suivi mensuel / Données 2042 C PRO) — il n'existe pas de report vers la 2042 classique, les BNC se déclarant sur un imprimé séparé (voir la question dédiée aux plateformes PSAN ci-dessus).

Ordre suggéré

  1. Sélectionnez l'année concernée en haut de la page.
  2. Onglet 2561 si vous avez des plateformes françaises soumises au PFU.
  3. Onglets 2778-SD puis 2047 si vous avez des plateformes étrangères — le suivi mensuel du 2778-SD documente le détail, la vue « Données 2047 » regroupe l'annuel par pays.
  4. Onglet 2042-C PRO si vous avez des plateformes de type PSAN (crowdlending sur actifs numériques) — indépendant des onglets précédents, la case 5HQ se reporte séparément sur l'imprimé 2042-C PRO.
  5. Onglet 2042 en dernier : sa vue « Données 2042 » et sa synthèse fiscale récapitulent toutes les cases (2TT, 2TR, 2BH, 2CK, 2TY) à saisir sur le site des impôts.

Les montants affichés dans les vues « Données » et les cases officielles sont arrondis à l'euro, comme l'exigent les formulaires CERFA (les montants intermédiaires du suivi mensuel restent au centime près, pour la traçabilité).

Comme rappelé sur la page elle-même : ce module est une aide à la préparation de votre déclaration, il ne s'y substitue pas. Contrôlez chaque case avant de la reporter — vous restez seul responsable de l'exactitude de votre déclaration.

API et Serveur MCP pour l'IA

Le serveur MCP tourne déjà en continu (service Docker crowdlending-mcp, exposé via Traefik) — vous n'avez rien à installer ni à laisser tourner sur votre machine. Il suffit de connecter Claude Desktop à l'URL publique.

Étapes

  1. Générez une clé API : Mon compte → Clés API → Nouvelle clé (par exemple nommée « Claude Desktop »).
  2. Allez dans Mon compte → Serveur MCP et renseignez l'URL publique ({mcpConfigUrl}{appInfo.mcpUrl ? ' — déjà pré-rempli si vous ne l\'avez pas modifié' : ''}) ainsi que la clé générée.
  3. Copiez la configuration générée dans claude_desktop_config.json (Réglages → Développeur → Serveurs MCP locaux → Modifier la config) — le mécanisme passe par mcp-remote (avec le wrapper cmd /c sous Windows), généré automatiquement pour vous.
  4. Redémarrez complètement Claude Desktop.

Sécurité

  • Le point d'entrée public n'a volontairement aucune restriction d'IP (accessible depuis n'importe où, pour un usage nomade) : la clé API est donc la seule barrière d'accès. Traitez-la comme un mot de passe, et révoquez-la immédiatement en cas de doute (Mon compte → Clés API).
  • Limite de 60 requêtes/minute par IP (au-delà, erreur 429) et fermeture automatique des sessions inactives depuis plus de 30 minutes — aucune donnée de session n'est conservée entre deux connexions.
  • L'outil crowdlending_fetch_url (lecture d'une page web arbitraire) reste désactivé sur ce serveur.

Si la connexion reste bloquée sans erreur visible, la cause est presque toujours la même : npx qui échoue silencieusement à joindre le registre npm — voir la section Dépannage de Mon compte → Serveur MCP.

Une fois connecté, Claude (Desktop ou tout autre client MCP) peut consulter votre portefeuille en langage naturel — il choisit lui-même le bon outil selon votre question. Le serveur est strictement en lecture seule : aucune donnée n'est jamais créée, modifiée ou supprimée depuis une conversation. Toute saisie (nouvel investissement, remboursement…) reste manuelle dans l'application.

Fonctions disponibles

crowdlending_get_investisseur Profil de l'investisseur lié à la clé API (nom, type famille/entreprise, régime fiscal). Avec une clé « Famille et entreprises », renvoie la liste des profils du foyer.
crowdlending_get_dashboard KPIs du portefeuille : capital investi, capital en risque, montant remboursé, intérêts bruts/nets, dépôts/retraits, gain net depuis le début (frais hors remboursement déduits) — filtrable par année.
crowdlending_list_investissements Liste des investissements (projet, émetteur, plateforme, montant, taux, durée, statut), filtrable par statut.
crowdlending_get_investissement Détail complet d'un investissement (par id), y compris ses remboursements réels perçus et les frais qui lui sont liés (souscription, gestion, distribution).
crowdlending_list_remboursements Historique des remboursements perçus (toutes plateformes), avec le frais éventuellement retenu sur chacun, filtrable par période.
crowdlending_list_frais_operations Frais liés aux investissements — souscription, gestion, distribution — toutes plateformes, filtrable par période.
crowdlending_list_depots_retraits Historique des mouvements de cash (dépôts et retraits), du plus récent au plus ancien.
crowdlending_list_objectifs Objectifs de versement et de capital investi (Paramétrage → Fixation des objectifs), à comparer au réalisé. Filtrable par type et par année.
crowdlending_get_taxreport Synthèse fiscale annuelle (CERFA 2042/2561/2047/2778-SD) — aide à la préparation de la déclaration, calculée avec les mêmes règles que la page Fiscalité. Ce n'est pas une source officielle : à vérifier avant tout report sur votre déclaration.
crowdlending_fetch_url Développement local uniquement, désactivé par défaut. Lit une page web (ex. annonce de projet sur une plateforme) et en extrait le texte propre — c'est à vous d'en reprendre les informations utiles pour créer l'investissement manuellement, l'outil ne saisit rien lui-même.

Exemples de questions

  • « Quel est mon encours de crowdlending actuellement ? »
  • « Quel a été mon rendement (intérêts nets) en 2026 ? »
  • « Liste-moi les investissements en retard ou en procédure. »
  • « Donne-moi le détail de l'investissement 42, avec ses remboursements. »
  • « Quels remboursements ai-je reçus entre le 1er et le 30 juin 2026 ? »
  • « Quels ont été mes derniers dépôts et retraits ? »
  • « Combien ai-je payé de frais cette année, et sur quels investissements ? »
  • « Regarde cette annonce de projet et propose-moi les infos pour créer l'investissement : [URL] » (développement local, avec crowdlending_fetch_url activé)
  • « Ai-je atteint mon objectif de versement pour {new Date().getFullYear()} ? »
  • « Prépare-moi une synthèse fiscale pour l'année {new Date().getFullYear() - 1}. »

Ces exemples fonctionnent aussi bien en dev qu'en prod dès lors que le serveur correspondant est connecté (voir les FAQ de configuration ci-dessus) — les neuf premiers outils sont identiques dans les deux environnements.

Comme le serveur MCP, Power Query s'appuie sur l'API v1 (lecture seule) via une clé API. Power Query est intégré nativement à Excel (365 / 2016 et plus, Windows ou Mac) — rien à installer. Chaque étape ci-dessous correspond à un écran que vous pouvez capturer pour illustrer votre propre guide.

Télécharger le classeur complet (.xlsb)

Le classeur ci-dessus contient déjà les 7 requêtes ci-dessous, prêtes à charger — il ne reste qu'à renseigner votre clé (étape 1). Vous pouvez aussi tout reconstruire à la main avec les fichiers .pq individuels proposés à chaque étape ci-dessous.

Étape 1 — Générer une clé API

  1. Mon compte → Clés API → Nouvelle clé.
  2. Donnez-lui un nom explicite (ex. « Excel »), validez, puis copiez immédiatement la clé affichée — elle ne sera plus visible en clair ensuite.

Étape 2 — Créer les deux requêtes de connexion

Dans Excel : Données → Obtenir des données → À partir d'autres sources → Requête vide. Une nouvelle requête « Requête1 » apparaît dans l'éditeur Power Query.

  1. Renommez-la ApiBaseUrl (double-clic sur son nom dans le volet Requêtes), puis Affichage → Éditeur avancé, effacez le contenu par défaut et collez :
{`"http://localhost:4000/api/v1"`}
              
Télécharger ApiBaseUrl.pq Éditeur avancé Power Query — requête ApiBaseUrl avec l'URL de l'API en production { e.currentTarget.style.display = 'none'; }} />
  1. Cliquez Terminé, puis Accueil → Fermer et charger dans… → Uniquement créer la connexion (pas besoin d'un tableau pour celle-ci).
  2. Répétez l'opération pour une seconde requête vide nommée ApiKey :
{`"clk_live_VOTRE_CLE_API"`}
              
Télécharger ApiKey.pq Éditeur avancé Power Query — requête ApiKey avec la clé API renseignée { e.currentTarget.style.display = 'none'; }} />

Remplacez par la clé copiée à l'étape 1, entre guillemets. Même chose : Terminé → Uniquement créer la connexion.

Étape 3 — La fonction technique fnApiGet

Une troisième requête vide, nommée fnApiGet, fait l'appel HTTP et transmet la clé dans l'en-tête X-API-Key — les requêtes suivantes la réutiliseront par son nom, sans la récrire :

{`(chemin as text, optional parametres as nullable record) as any =>
    let
        parametresBruts = if parametres = null then [] else parametres,
        champsUtiles = List.Select(
            Record.FieldNames(parametresBruts),
            each Record.Field(parametresBruts, _) <> null and Record.Field(parametresBruts, _) <> ""
        ),
        parametresNettoyes = Record.SelectFields(parametresBruts, champsUtiles),
        reponse = Web.Contents(
            ApiBaseUrl,
            [
                RelativePath = chemin,
                Headers = [#"X-API-Key" = ApiKey, #"Accept" = "application/json"],
                Query = parametresNettoyes
            ]
        ),
        resultat = Json.Document(reponse)
    in
        resultat`}
              
Télécharger fnApiGet.pq Éditeur avancé Power Query — fonction fnApiGet { e.currentTarget.style.display = 'none'; }} />

Terminé → Fermer et charger dans… → Uniquement créer la connexion (ce n'est pas une donnée à afficher).

Étape 4 — Première requête de données : Investissements

Une nouvelle requête vide, nommée Investissements :

{`let
    // Pour filtrer par statut, remplacez null par [statut = "rembourse"]
    // Statuts possibles : en_cours, rembourse, en_retard, procedure, cloture
    Source = fnApiGet("/investissements", null),
    Resultat = Table.FromRecords(Source)
in
    Resultat`}
              
Télécharger Investissements.pq Éditeur avancé Power Query — requête Investissements avec aperçu des données chargées { e.currentTarget.style.display = 'none'; }} />

Cette fois-ci, Terminé → Fermer et charger (le bouton simple, pas « … ») : la requête s'ajoute comme tableau dans une nouvelle feuille, avec vos investissements en ligne et en colonnes.

Étape 5 — Actualiser

Données → Actualiser tout (ou Ctrl+Alt+F5) à tout moment pour recharger les données depuis l'API — utile après un nouvel investissement ou remboursement saisi dans l'app.

Aller plus loin — les autres requêtes

Même principe (requête vide → nom exact → éditeur avancé → coller → charger) pour :

Investisseur Profil investisseur (ou liste des membres si clé « Famille et entreprises »). .pq
Dashboard KPIs du portefeuille, au format « Indicateur / Valeur » (facile à croiser dans un TCD). .pq
Remboursements Historique des remboursements, filtrable par période. .pq
DépôtsRetraits Historique des mouvements de cash. .pq
fnDetailInvestissement Fonction avancée : sur la table Investissements, colonne personnalisée{' '} = fnDetailInvestissement([id]){' '} pour ramener le détail + les remboursements de chaque prêt. .pq

Toutes ces requêtes sont déjà incluses dans le classeur téléchargeable en haut de cette fiche — les fichiers .pq ci-dessus ne sont utiles que si vous préférez les coller vous-même dans un classeur existant.

Dépannage

  • « Impossible de se connecter au service distant » — le backend n'est pas démarré, ou ApiBaseUrl est incorrecte (vérifiez le port et le suffixe /api/v1).
  • Erreur 401 / clé invalide — régénérez une clé dans Mon compte → Clés API et mettez à jour la requête ApiKey.
  • Avertissement de confidentialité au premier chargement — normal pour toute nouvelle source Web dans Power Query ; choisissez « Organisationnel » ou « Public » selon votre contexte.

Comme le serveur MCP, ces requêtes sont strictement en lecture seule : aucune saisie n'est possible depuis Excel, toute modification reste à faire dans l'application.

)}
); }