{"openapi":"3.1.0","info":{"title":"OpenAPI definition","version":"v0"},"servers":[{"url":"http://ydev-upgreen.taila4fda8.ts.net:8000/b2b","description":"Generated server url"}],"tags":[{"name":"Extraction","description":"**Extraction automatique des données de factures via ML Sidecar**\n\nPipeline intelligent d'extraction:\n\n```\n┌─────────┐    ┌───────────────┐    ┌──────────┐\n│   PDF   │───▶│  ML Sidecar   │───▶│  JSON    │\n│         │    │ Fast + Mistral│    │ EN16931  │\n└─────────┘    └───────────────┘    └──────────┘\n```\n\n## Fonctionnement automatique\n\n1. **Fast extraction** - Regex optimisés (~100ms)\n2. **Mistral OCR** - Si couverture < 40% (auto-enrichissement)\n\n## Données extraites\n\n| Catégorie | Champs |\n|-----------|--------|\n| **Document** | Numéro, dates (émission, échéance) |\n| **Vendeur** | Nom, adresse, SIREN, SIRET, TVA |\n| **Acheteur** | Nom, adresse, référence |\n| **Lignes** | Description, quantité, prix unitaire, TVA |\n| **Totaux** | HT, TVA, TTC |\n\n## SLA\n\n| Métrique | Objectif |\n|----------|----------|\n| P50 | < 500ms |\n| P99 | < 15s (avec Mistral) |\n| Précision | > 95% |\n"},{"name":"CGU & Conditions PDP","description":"Gestion des conditions générales et PDP"},{"name":"Approbations","description":"Gestion des workflows d'approbation des factures"},{"name":"Archivage Légal","description":"Archivage à valeur probante NF Z42-013"},{"name":"Bulk Upload","description":"Import en masse de factures : upload → extraction → conversion → soumission"},{"name":"White-Label","description":"Personnalisation de marque par tenant"},{"name":"Horodatage","description":"**Horodatage RFC 3161 — relais vers une TSA externe**\n\nDemande des jetons d'horodatage à une Autorité de Confiance (TSA) tierce,\nau format RFC 3161. ParaphiX n'est pas elle-même TSA : la qualification eIDAS\néventuelle dépend exclusivement du prestataire choisi (publié sur la Liste\nde Confiance EU/EEA de la Commission européenne).\n\n## Valeur légale\n\nSi le jeton est délivré par une TSA **qualifiée eIDAS**, il bénéficie de la\nprésomption légale d'exactitude de la date prévue par l'Article 41 du\nrèglement eIDAS. Cette présomption relève de la TSA émettrice, **pas** de\nParaphiX.\n\n## Processus\n\n```\n┌──────────┐    ┌──────────┐    ┌──────────┐    ┌──────────┐\n│ Document │───▶│ SHA-256  │───▶│   TSA    │───▶│  Token   │\n│          │    │   Hash   │    │  externe │    │ RFC 3161 │\n└──────────┘    └──────────┘    └──────────┘    └──────────┘\n```\n\n## Providers TSA supportés\n\n| Provider | Statut eIDAS déclaré par le PSC | Pays | Usage |\n|----------|---------------------------------|------|-------|\n| **Universign** | Qualifié (à vérifier sur la TSL) | FR | Production |\n| **CertEurope** | Qualifié (à vérifier sur la TSL) | FR | Production |\n| **Dhimyotis**  | Qualifié (à vérifier sur la TSL) | FR | Production |\n| **FreeTSA**    | Non qualifié                      | DE | Tests uniquement |\n\n> Le statut « qualifié » fait foi uniquement s'il est confirmé sur la Liste\n> de Confiance européenne (EU LOTL) au moment de l'horodatage.\n\n## Conservation\n\nLes tokens d'horodatage doivent être conservés avec le document original\npour constituer un élément de preuve d'antériorité.\n"},{"name":"Templates","description":"Templates de factures sectoriels (BTP, Consulting, Commerce, etc.)"},{"name":"Cycle de vie","description":"**Gestion du cycle de vie des factures (Flux 6 PPF)**\n\nCe module gère les transitions de statut des factures électroniques\nconformément aux spécifications du Portail Public de Facturation (PPF).\n\n## Machine à états\n\n```\n┌──────────┐     ┌──────────┐     ┌──────────┐     ┌──────────┐\n│ CREATED  │────▶│SUBMITTED │────▶│ DEPOSITED│────▶│ RECEIVED │\n└──────────┘     └──────────┘     └──────────┘     └────┬─────┘\n                                                        │\n                 ┌──────────────────────────────────────┼──────────────────┐\n                 │                                      │                  │\n                 ▼                                      ▼                  ▼\n           ┌──────────┐                           ┌──────────┐       ┌──────────┐\n           │ REFUSED  │                           │ ACCEPTED │──────▶│   PAID   │\n           └──────────┘                           └──────────┘       └──────────┘\n```\n\n## Codes statut PPF officiels\n\n| Code | Statut | Description |\n|------|--------|-------------|\n| 200 | DEPOSITED | Facture déposée sur la plateforme |\n| 210 | REFUSED | Facture refusée par le destinataire |\n| 212 | PAID | Facture encaissée/payée |\n| 213 | REJECTED | Rejetée par contrôle de conformité |\n\n## Règles de transition\n\n- **CREATED** → SUBMITTED (soumission)\n- **SUBMITTED** → DEPOSITED (accusé de réception)\n- **DEPOSITED** → RECEIVED (réception par destinataire)\n- **RECEIVED** → ACCEPTED | REFUSED (décision destinataire)\n- **ACCEPTED** → PAID (paiement effectué)\n- **CANCELLED** depuis tout statut sauf PAID\n\n## Traçabilité\n\nChaque transition est enregistrée avec:\n- Timestamp précis (ISO 8601)\n- Utilisateur/Client ayant déclenché l'action\n- Correlation ID pour le suivi\n- Raison du changement (obligatoire pour REFUSED, CANCELLED)\n"},{"name":"Statuts","description":"**Vérification des statuts de factures sur Chorus Pro**\n\nInterrogez Chorus Pro pour connaître le statut de vos factures soumises.\n\n## Endpoints disponibles\n\n| Endpoint | Usage |\n|----------|-------|\n| `GET /chorus/invoices` | Liste toutes les factures soumises avec leurs statuts |\n| `GET /chorus/invoices/{id}` | Détail complet d'une facture par ID Chorus Pro |\n\n## Statuts Chorus Pro\n\n| Statut | Description |\n|--------|-------------|\n| BROUILLON | Facture saisie via le portail (non soumise par API) |\n| MISE_A_DISPOSITION | ✅ Facture traitée et disponible pour le destinataire |\n| SERVICE_FAIT | Service fait validé par le destinataire |\n| MISE_EN_PAIEMENT | Paiement en cours |\n| MANDATEE | Paiement confirmé |\n| REJETEE | Rejetée par la plateforme ou le destinataire |\n| SUSPENDUE | Suspendue temporairement |\n"},{"name":"Validation","description":"**Validation XSD stricte EN16931 CIUS-FR et Factur-X**\n\nValide les factures électroniques contre les schémas officiels pour\ngarantir leur conformité avant soumission au PPF ou Chorus Pro.\n\n## Niveaux de validation\n\n| Niveau | Description | Obligatoire |\n|--------|-------------|-------------|\n| **XSD** | Structure XML | Oui |\n| **Schematron** | Règles métier EN16931 | Recommandé |\n| **Cohérence** | Calculs (HT + TVA = TTC) | Recommandé |\n\n## Schémas supportés\n\n- **EN16931**: Norme européenne de facturation électronique\n- **CIUS-FR**: Spécificités françaises (Core Invoice Usage Specification)\n- **Factur-X**: Format franco-allemand (CII D16B)\n- **UBL 2.1**: Universal Business Language\n\n## Codes d'erreur\n\n| Code | Signification |\n|------|---------------|\n| `XSD_001` | Élément XML manquant |\n| `XSD_002` | Valeur hors plage |\n| `BR-01` à `BR-XX` | Règles métier EN16931 |\n| `CIUS-FR-01` à `XX` | Règles CIUS françaises |\n| `CALC_001` | Erreur de calcul |\n"},{"name":"Streaming","description":"Traitement de factures avec progression SSE temps réel"},{"name":"Field Management","description":"Gestion des champs EN16931 et patterns ML"},{"name":"Webhooks","description":"**Notifications en temps réel via Webhooks**\n\nCe module permet de configurer des webhooks pour recevoir des notifications\ninstantanées lors d'événements sur les factures.\n\n## Architecture\n\n```\n┌─────────────┐     ┌─────────────┐     ┌─────────────┐\n│  Événement  │────▶│   Queue     │────▶│   Votre     │\n│  (Facture)  │     │   (Redis)   │     │   Serveur   │\n└─────────────┘     └─────────────┘     └─────────────┘\n                           │\n                    ┌──────▼──────┐\n                    │   Retry     │\n                    │  (3 essais) │\n                    └─────────────┘\n```\n\n## Types d'événements\n\n| Événement | Description |\n|-----------|-------------|\n| `INVOICE_CREATED` | Nouvelle facture créée |\n| `INVOICE_VALIDATED` | Facture validée (XSD + Schematron) |\n| `INVOICE_SUBMITTED` | Soumise à PPF/Chorus |\n| `INVOICE_STATUS_CHANGED` | Changement de statut |\n| `INVOICE_ACCEPTED` | Acceptée par le destinataire |\n| `INVOICE_REFUSED` | Refusée par le destinataire |\n| `INVOICE_PAID` | Marquée comme payée |\n| `PPF_DEPOSITED` | Déposée sur PPF |\n| `PPF_RECEIVED` | Reçue par destinataire via PPF |\n\n## Sécurité HMAC-SHA256\n\nChaque webhook est signé avec votre secret:\n\n```\nX-Webhook-Signature: hmac_sha256(timestamp + \".\" + body, secret)\nX-Webhook-Timestamp: 1704067200\n```\n\n## Vérification de signature\n\n```python\nimport hmac\nimport hashlib\n\ndef verify(payload, timestamp, signature, secret):\n    message = f\"{timestamp}.{payload}\"\n    expected = hmac.new(\n        secret.encode(),\n        message.encode(),\n        hashlib.sha256\n    ).hexdigest()\n    return hmac.compare_digest(expected, signature)\n```\n\n## Politique de retry\n\n- 3 tentatives maximum\n- Backoff exponentiel (5s, 30s, 5min)\n- Dead letter queue après échecs\n"},{"name":"Expert-Comptable","description":"Gestion multi-dossier et workflows comptables"},{"name":"Soumission","description":"**Soumission de factures au PPF et Chorus Pro**\n\nDéposez vos factures Factur-X sur les plateformes officielles françaises.\n\n## Plateformes disponibles\n\n| Plateforme | Usage | Obligation |\n|------------|-------|------------|\n| **PPF** | B2B (entreprises privées) | Sept 2026 - Sept 2027 |\n| **Chorus Pro** | B2G (secteur public) | Obligatoire depuis 2020 |\n\n## Workflow de soumission\n\n```\n┌────────────┐    ┌────────────┐    ┌────────────┐    ┌────────────┐\n│  Factur-X  │───▶│ Validation │───▶│  Dépôt sur │───▶│  Suivi     │\n│   (PDF)    │    │ préalable  │    │ plateforme │    │  statut    │\n└────────────┘    └────────────┘    └────────────┘    └────────────┘\n```\n\n## Statuts de soumission\n\n| Code | Statut | Description |\n|------|--------|-------------|\n| 200 | DEPOSEE | Facture reçue par la plateforme |\n| 210 | REFUSEE | Rejet par le destinataire |\n| 212 | ENCAISSEE | Paiement confirmé |\n| 213 | REJETEE | Échec de contrôle |\n\n## Mode Sandbox\n\nUtilisez `sandbox=true` pour tester vos intégrations sans impact réel.\nLes factures ne seront pas transmises aux vrais destinataires.\n"},{"name":"E-Reporting","description":"**E-Reporting - Transmission des données hors e-invoicing (Flux 10)**\n\nCe module gère la transmission obligatoire des données de facturation\npour les transactions non couvertes par l'e-invoicing B2B.\n\n## Périmètre E-Reporting\n\n| Flux | Nom | Transactions concernées |\n|------|-----|------------------------|\n| **10.1** | Ventes B2C | Particuliers, DOM-TOM, export |\n| **10.2** | Encaissements ventes | Paiements reçus sur 10.1 |\n| **10.3** | Acquisitions | Achats auprès de non-assujettis |\n| **10.4** | Paiements acquisitions | Paiements effectués sur 10.3 |\n\n## Catégories de transactions\n\n```\nVENTES (Flux 10.1)              ACQUISITIONS (Flux 10.3)\n├── TLB1: Livraisons B2C        ├── ALB1: Achats biens\n├── TPS1: Prestations B2C       └── APS1: Achats services\n├── TLB2: Export biens\n├── TPS2: Export services\n├── TLB3: DOM-TOM biens\n└── TPS3: DOM-TOM services\n```\n\n## Périodicité de déclaration\n\n| Régime | Délai | Date limite |\n|--------|-------|-------------|\n| Mensuel | M+25 | 25 du mois suivant |\n| Trimestriel | T+25 | 25 du mois suivant le trimestre |\n\n## Calendrier d'entrée en vigueur\n\n- **Septembre 2026**: Grandes entreprises\n- **Septembre 2027**: PME et micro-entreprises\n\n## Modes de soumission\n\n- **Détaillé**: Chaque transaction individuellement\n- **Agrégé**: Résumé par catégorie et période\n"},{"name":"Authentification","description":"**Gestion des tokens JWT pour l'accès à l'API**\n\nCette API utilise l'authentification JWT (JSON Web Token). Les endpoints de ce groupe\npermettent d'obtenir et de gérer vos tokens d'accès.\n\n## Flux d'authentification\n\n```\n1. POST /auth/token      → Obtenir access_token + refresh_token\n2. Utiliser access_token → Header: Authorization: Bearer <token>\n3. POST /auth/refresh    → Renouveler quand le token expire\n```\n\n## Durée de vie des tokens\n\n| Token | Durée | Usage |\n|-------|-------|-------|\n| Access Token | 1 heure | Authentification API |\n| Refresh Token | 24 heures | Renouvellement du token d'accès |\n"},{"name":"Audit","description":"**Journal de preuves et traçabilité (NF Z42-013)**\n\nCe module fournit un journal d'audit immuable et vérifiable pour\nassurer la traçabilité complète des opérations sur les factures.\n\n## Conformité NF Z42-013\n\nLe journal respecte les exigences de la norme française NF Z42-013\nrelative à l'archivage électronique à valeur probante.\n\n## Architecture du journal\n\n```\n┌─────────────────────────────────────────────────────────┐\n│                    CHAÎNE DE PREUVES                     │\n├─────────────────────────────────────────────────────────┤\n│                                                         │\n│  Entry N-2          Entry N-1          Entry N          │\n│  ┌─────────┐        ┌─────────┐        ┌─────────┐      │\n│  │ Hash    │◀──────▶│ Hash    │◀──────▶│ Hash    │      │\n│  │ prev: 0 │        │prev:N-2 │        │prev:N-1 │      │\n│  └─────────┘        └─────────┘        └─────────┘      │\n│                                                         │\n└─────────────────────────────────────────────────────────┘\n```\n\n## Structure d'une entrée\n\n| Champ | Description |\n|-------|-------------|\n| `id` | Identifiant unique (UUID) |\n| `documentId` | Référence du document concerné |\n| `operation` | Type d'opération (CREATE, VALIDATE, SUBMIT...) |\n| `timestamp` | Date/heure précise (ISO 8601 + µs) |\n| `clientId` | Client API ayant déclenché l'action |\n| `previousHash` | Hash de l'entrée précédente |\n| `currentHash` | Hash SHA-256 de l'entrée courante |\n| `details` | Détails de l'opération (JSON) |\n\n## Types d'opérations auditées\n\n- `DOCUMENT_CREATED`: Création d'un document\n- `DOCUMENT_VALIDATED`: Validation XSD/Schematron\n- `DOCUMENT_SIGNED`: Signature XAdES\n- `DOCUMENT_TIMESTAMPED`: Horodatage TSA\n- `DOCUMENT_SUBMITTED`: Soumission PPF/Chorus\n- `STATUS_CHANGED`: Changement de statut\n- `DOCUMENT_EXPORTED`: Export du document\n\n## Vérification d'intégrité\n\nL'endpoint `/verify` permet de valider:\n- L'intégrité de chaque entrée (hash)\n- La continuité de la chaîne (liens)\n- L'absence de modification/suppression\n"},{"name":"Health","description":"Endpoints de santé et monitoring"},{"name":"Conversion","description":"**Conversion vers Factur-X (PDF/A-3 + XML embarqué)**\n\nGénère des factures électroniques conformes aux normes françaises et européennes.\n\n## Format Factur-X\n\nFactur-X est un format hybride qui combine:\n- **PDF/A-3**: Document lisible par tous\n- **XML embarqué**: Données structurées machine-readable\n\n## Profils disponibles\n\n| Profil | Usage | Données |\n|--------|-------|---------|\n| **MINIMUM** | B2B simple | Identifiants, totaux |\n| **BASIC** | B2B standard | + Lignes simplifiées |\n| **EN16931** | Conformité EU | + Toutes données obligatoires |\n| **EXTENDED** | Données riches | + Champs optionnels |\n\n## Processus de conversion\n\n```\n┌─────────┐    ┌───────────┐    ┌──────────┐    ┌──────────┐\n│PDF + JSON│───▶│ Génération│───▶│ PDF/A-3  │───▶│ Factur-X │\n│  Données │    │    XML    │    │Conversion│    │  Validé  │\n└──────────┘    └───────────┘    └──────────┘    └──────────┘\n```\n\n## Conformité\n\n✅ EN16931 CIUS-FR\n✅ Factur-X 1.0\n✅ PDF/A-3 ISO 19005-3\n"},{"name":"Factures Entrantes","description":"Gestion des factures reçues via PPF/Chorus"},{"name":"Signature XAdES","description":"**Signature électronique au format XAdES (compatible eIDAS)**\n\nCe module implémente la signature numérique XAdES sur documents XML\n(factures B2G, attestations) selon les spécifications ETSI EN 319 132.\n\n> ⚠️ **Note importante** — Le caractère « qualifié » au sens du règlement\n> eIDAS dépend du **certificat de signature** utilisé (émis par un\n> Prestataire de Services de Confiance qualifié, inscrit sur la Liste de\n> Confiance EU/EEA) et **non** du logiciel ParaphiX. ParaphiX produit la\n> structure XAdES ; la valeur juridique de la signature dépend du certificat\n> fourni par le client ou son PSC.\n\n## Formats XAdES supportés\n\n| Format | Niveau | Description | Usage |\n|--------|--------|-------------|-------|\n| **XAdES-B** | Baseline | Signature de base | Standard |\n| **XAdES-T** | Timestamp | + Horodatage TSA | Recommandé |\n| **XAdES-LT** | Long Term | + Données de validation | Archivage |\n| **XAdES-LTA** | Archive | + Timestamps d'archivage | Long terme |\n\n## Modes de packaging\n\n```\nENVELOPED (recommandé)       ENVELOPING              DETACHED\n┌─────────────────┐          ┌─────────────────┐     ┌────────┐ ┌────────┐\n│   <Document>    │          │   <Signature>   │     │  Doc   │ │  Sig   │\n│   <Signature/>  │          │   <Document/>   │     │        │ │        │\n│   </Document>   │          │   </Signature>  │     └────────┘ └────────┘\n└─────────────────┘          └─────────────────┘     Fichiers séparés\n```\n\n## Conformité B2G\n\nPour les factures destinées aux entités publiques (Chorus Pro),\nla signature XAdES-B ou XAdES-T est **obligatoire** au sens technique.\n\n## Bibliothèque DSS\n\nCe module utilise la bibliothèque EU DSS (Digital Signature Service)\ndéveloppée par la Commission Européenne.\n\n## Prérequis\n\n- Certificat de signature (PKCS#12 / JKS) fourni par le client\n- TSA externe configurée pour XAdES-T et supérieur\n- (Optionnel) Trust Service List pour validation\n"},{"name":"Administration","description":"Gestion des clients API B2B (réservé aux administrateurs)"},{"name":"Annuaire PPF","description":"**Annuaire des entreprises et routage des factures (Flux 3)**\n\nCe module permet de consulter l'annuaire public de facturation (PPF)\npour déterminer vers quelle plateforme envoyer une facture électronique.\n\n## Architecture\n\n```\n┌─────────────┐     ┌─────────────┐     ┌─────────────┐\n│   Client    │────▶│  Annuaire   │────▶│  PPF API    │\n│   API B2B   │     │   Service   │     │  (officiel) │\n└─────────────┘     └──────┬──────┘     └─────────────┘\n                           │\n                    ┌──────▼──────┐\n                    │   Cache     │\n                    │  (Caffeine) │\n                    └─────────────┘\n```\n\n## Identification des entreprises\n\n| Type | Format | Description |\n|------|--------|-------------|\n| **SIREN** | 9 chiffres | Identifiant de l'unité légale (entreprise) |\n| **SIRET** | 14 chiffres | Identifiant de l'établissement (SIREN + NIC) |\n| **GLN** | 13 chiffres | Global Location Number (code routage) |\n| **ODETTE** | Variable | Code ODETTE (secteur automobile) |\n\n## Logique de routage\n\n```\n1. Le destinataire est-il une entité publique ?\n   → OUI : Chorus Pro\n   → NON : Continuer\n\n2. Le destinataire est-il dans l'annuaire PPF ?\n   → OUI avec PDP : Utiliser la PDP\n   → OUI sans PDP : PPF par défaut\n   → NON : Erreur (entreprise non inscrite)\n```\n\n## Cache\n\nLes données sont mises en cache pour optimiser les performances:\n- TTL par défaut: 1 heure\n- Invalidation manuelle possible\n- Statistiques de cache disponibles\n"}],"paths":{"/api/v1/webhooks/{webhookId}":{"get":{"tags":["Webhooks"],"summary":"Récupérer un webhook","description":"Récupère les détails d'un webhook spécifique","operationId":"getWebhook","parameters":[{"name":"webhookId","in":"path","description":"ID du webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Détails du webhook","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookConfig"}}}},"404":{"description":"Webhook non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookConfig"}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["Webhooks"],"summary":"Mettre à jour un webhook","description":"Met à jour la configuration d'un webhook existant","operationId":"updateWebhook","parameters":[{"name":"webhookId","in":"path","description":"ID du webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"Webhook mis à jour","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookConfig"}}}},"404":{"description":"Webhook non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookConfig"}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Webhooks"],"summary":"Supprimer un webhook","description":"Supprime un webhook et arrête les notifications","operationId":"deleteWebhook","parameters":[{"name":"webhookId","in":"path","description":"ID du webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Webhook supprimé"},"404":{"description":"Webhook non trouvé"}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/items/{itemId}":{"put":{"tags":["Bulk Upload"],"summary":"Modifier les données extraites d'un élément (review avant soumission)","operationId":"updateItem","parameters":[{"name":"itemId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/branding":{"get":{"tags":["White-Label"],"summary":"Récupérer la configuration branding du tenant courant","operationId":"getBranding","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["White-Label"],"summary":"Créer ou mettre à jour le branding du tenant","operationId":"updateBranding","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantBrandingEntity"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TenantBrandingEntity"}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["White-Label"],"summary":"Supprimer le branding du tenant","operationId":"deleteBranding","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/chains/{id}":{"put":{"tags":["Approbations"],"summary":"Modifier une chaîne d'approbation","operationId":"updateChain","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/admin/clients/{clientId}":{"get":{"tags":["Administration"],"summary":"Récupérer un client","description":"Retourne les détails d'un client API spécifique","operationId":"getClient","parameters":[{"name":"clientId","in":"path","description":"ID du client","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Détails du client","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"404":{"description":"Client non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"403":{"description":"Accès refusé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["Administration"],"summary":"Mettre à jour un client","description":"Met à jour les informations d'un client existant (ne modifie pas le secret)","operationId":"updateClient","parameters":[{"name":"clientId","in":"path","description":"ID du client","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateClientRequest"}}},"required":true},"responses":{"200":{"description":"Client mis à jour","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"400":{"description":"Données invalides","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"404":{"description":"Client non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"403":{"description":"Accès refusé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Administration"],"summary":"Supprimer un client","description":"Supprime définitivement un client API B2B","operationId":"deleteClient","parameters":[{"name":"clientId","in":"path","description":"ID du client","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Client supprimé"},"404":{"description":"Client non trouvé"},"401":{"description":"Non authentifié"},"403":{"description":"Accès refusé"}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks":{"get":{"tags":["Webhooks"],"summary":"Lister les webhooks","description":"Liste tous les webhooks configurés pour le client authentifié","operationId":"listWebhooks","responses":{"200":{"description":"Liste des webhooks","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/WebhookConfig"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Webhooks"],"summary":"Enregistrer un webhook","description":"**Créer un nouveau webhook**\n\nEnregistre un endpoint pour recevoir les notifications d'événements.\nUn secret HMAC-SHA256 est généré automatiquement pour la signature.\n\n## Exemple cURL\n\n```bash\ncurl -X POST \\\n  'https://api.paraphix.fr/api/v1/webhooks' \\\n  -H 'Authorization: Bearer <token>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"url\": \"https://votreapp.com/webhooks/paraphix\",\n    \"events\": [\"INVOICE_CREATED\", \"INVOICE_STATUS_CHANGED\"],\n    \"description\": \"Notifications factures\"\n  }'\n```\n\n## Exigences\n\n- URL **HTTPS** obligatoire\n- Réponse 2xx attendue en moins de 30s\n- Secret généré automatiquement (conservez-le !)\n\n## Résultat\n\nRetourne le webhook créé avec son ID et secret.\n**Le secret n'est affiché qu'une seule fois !**\n","operationId":"registerWebhook","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookRegistrationRequest"}}},"required":true},"responses":{"201":{"description":"Webhook créé avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookRegistrationResponse"}}}},"400":{"description":"Requête invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookRegistrationResponse"}}}},"409":{"description":"Un webhook avec cette URL existe déjà","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookRegistrationResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks/{webhookId}/test":{"post":{"tags":["Webhooks"],"summary":"Tester un webhook","description":"Envoie un événement de test pour vérifier la connectivité et la configuration","operationId":"testWebhook","parameters":[{"name":"webhookId","in":"path","description":"ID du webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"responses":{"200":{"description":"Test effectué","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryResult"}}}},"404":{"description":"Webhook non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks/{webhookId}/enable":{"post":{"tags":["Webhooks"],"summary":"Activer un webhook","description":"Active un webhook désactivé pour reprendre les notifications","operationId":"enableWebhook","parameters":[{"name":"webhookId","in":"path","description":"ID du webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Webhook activé","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"404":{"description":"Webhook non trouvé","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks/{webhookId}/disable":{"post":{"tags":["Webhooks"],"summary":"Désactiver un webhook","description":"Désactive un webhook pour arrêter temporairement les notifications","operationId":"disableWebhook","parameters":[{"name":"webhookId","in":"path","description":"ID du webhook","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Webhook désactivé","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}},"404":{"description":"Webhook non trouvé","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks/test-url":{"post":{"tags":["Webhooks"],"summary":"Tester une URL","description":"Teste une URL webhook sans l'enregistrer (pour valider la connectivité avant enregistrement)","operationId":"testUrl","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookTestRequest"}}},"required":true},"responses":{"200":{"description":"Test effectué","content":{"*/*":{"schema":{"$ref":"#/components/schemas/WebhookDeliveryResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/validation/auto-fix":{"post":{"tags":["Validation"],"summary":"Appliquer les corrections automatiques","description":"Valide le document, identifie les issues auto-fixables, et applique\nles corrections automatiques (date, devise, code pays, recalcul totaux).\nRetourne les données corrigées et le détail des actions effectuées.\n","operationId":"autoFix","parameters":[{"name":"profile","in":"query","required":false,"schema":{"type":"string","default":"EN16931"}},{"name":"schematron","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/validation/advanced":{"post":{"tags":["Validation"],"summary":"Validation avancée avec suggestions de correction","description":"Validation complète (XSD + Schematron + Business rules) avec en plus:\n- **Suggestions de correction** pour chaque erreur\n- **Catégorisation** des issues (STRUCTURE, CONTENT, CALCULATION, FORMAT, FRENCH_SPECIFIC)\n- **Références BT-xxx** vers la norme EN16931\n- **Score de conformité** (0-100)\n- **Corrections auto-applicables** identifiées\n","operationId":"validateAdvanced","parameters":[{"name":"profile","in":"query","required":false,"schema":{"type":"string","default":"EN16931"}},{"name":"schematron","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"suggestions","in":"query","required":false,"schema":{"type":"boolean","default":true}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}},"responses":{"200":{"description":"Validation avancée effectuée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdvancedValidationResponse"}}}},"400":{"description":"Fichier invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/AdvancedValidationResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/validate":{"post":{"tags":["Validation"],"summary":"Valider un document Factur-X","description":"**Validation complète d'une facture Factur-X**\n\nExtrait le XML embarqué du PDF et le valide contre:\n1. **XSD EN16931** - Structure du document\n2. **Schematron** - Règles métier (optionnel mais recommandé)\n3. **Cohérence** - Vérifications mathématiques\n\n## Exemple cURL\n\n```bash\ncurl -X POST /api/v1/validate \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@facture-facturx.pdf\" \\\n  -F \"profile=EN16931\" \\\n  -F \"schematron=true\"\n```\n\n## Interprétation du résultat\n\n- `is_valid: true` → Facture conforme, prête pour soumission\n- `is_valid: false` → Erreurs à corriger avant soumission\n\nChaque erreur contient:\n- **code**: Identifiant unique de la règle\n- **message**: Description de l'erreur\n- **location**: Chemin XPath vers l'élément concerné\n- **severity**: `ERROR` (bloquant) ou `WARNING` (informatif)\n","operationId":"validate","parameters":[{"name":"profile","in":"query","description":"Profil de validation cible:\n- `MINIMUM`: Validation minimale\n- `BASIC`: Profil de base\n- `EN16931`: Conformité européenne complète (recommandé)\n- `EXTENDED`: Profil étendu\n\nSi le document déclare un profil différent, une alerte sera générée.\n","required":false,"schema":{"type":"string","enum":["MINIMUM","BASIC","EN16931","EXTENDED"]},"example":"EN16931"},{"name":"schematron","in":"query","description":"Activer la validation Schematron (règles métier EN16931).\n\n**Recommandé**: Ces règles vérifient la cohérence métier\nau-delà de la simple structure XML.\n","required":false,"schema":{"type":"boolean","default":true},"example":true}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier PDF Factur-X à valider"}},"required":["file"]}}}},"responses":{"200":{"description":"Validation effectuée - Consultez `is_valid` pour le résultat","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"},"examples":{"Valid":{"summary":"Document valide","description":"Valid","value":{"success":true,"is_valid":true,"document_id":"val-550e8400-e29b-41d4","processing_time_ms":87,"profile_detected":"EN16931","profile_validated":"EN16931","validation_details":{"xsd_valid":true,"xsd_errors":[],"schematron_valid":true,"schematron_errors":[],"schematron_warnings":[],"calculation_valid":true,"calculation_errors":[]},"invoice_summary":{"invoice_number":"FACT-2025-001","total_ht":1000.0,"total_ttc":1200.0,"currency":"EUR"}}},"Invalid":{"summary":"Document avec erreurs","description":"Invalid","value":{"success":true,"is_valid":false,"document_id":"val-660e9500-f30c-52e5","processing_time_ms":92,"profile_detected":"BASIC","profile_validated":"EN16931","validation_details":{"xsd_valid":true,"xsd_errors":[],"schematron_valid":false,"schematron_errors":[{"code":"BR-CO-10","severity":"ERROR","message":"La somme des montants HT des lignes doit être égale au montant HT total","location":"/Invoice/LegalMonetaryTotal/TaxExclusiveAmount","expected_value":"1000.00","actual_value":"999.00"}],"schematron_warnings":[{"code":"CIUS-FR-01","severity":"WARNING","message":"Le numéro SIRET de l'acheteur est recommandé pour les transactions B2B françaises","location":"/Invoice/AccountingCustomerParty/Party"}],"calculation_valid":false,"calculation_errors":[{"code":"CALC_001","message":"Écart de 1.00 EUR sur le total HT"}]}}}}}}},"400":{"description":"Fichier invalide ou format non supporté","content":{"application/json":{"examples":{"NotFacturX":{"summary":"PDF sans XML embarqué","description":"NotFacturX","value":{"success":false,"error":"not_facturx","message":"Le PDF ne contient pas de fichier XML Factur-X embarqué"}},"InvalidPdf":{"summary":"Fichier PDF corrompu","description":"InvalidPdf","value":{"success":false,"error":"invalid_pdf","message":"Impossible de lire le fichier PDF"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/timestamp":{"post":{"tags":["Horodatage"],"summary":"Horodater un document","description":"**Génération d'un token d'horodatage RFC 3161**\n\nCalcule le hash SHA-256 du document et obtient un jeton\nd'horodatage auprès d'une TSA externe (qualifiée ou non selon\nle provider configuré).\n\n## Modes d'utilisation\n\n### 1. Avec fichier (recommandé)\n```bash\ncurl -X POST /api/v1/timestamp \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@document.pdf\" \\\n  -F \"provider=universign\"\n```\n\n### 2. Avec hash pré-calculé\n```bash\ncurl -X POST /api/v1/timestamp \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"hash=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\" \\\n  -F \"algorithm=SHA-256\"\n```\n\n## Résultat\n\nLe token retourné en Base64 peut être:\n- Stocké avec le document original\n- Vérifié ultérieurement via `/timestamp/verify`\n- Utilisé comme preuve légale d'antériorité\n","operationId":"timestampDocument","parameters":[{"name":"hash","in":"query","description":"Hash SHA-256 du document en hexadécimal (64 caractères).\nAlternative à l'upload du fichier si vous avez déjà calculé le hash.\n","required":false,"schema":{"type":"string"},"example":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"name":"algorithm","in":"query","description":"Algorithme de hash utilisé","required":false,"schema":{"type":"string","enum":["SHA-256","SHA-384","SHA-512"]},"example":"SHA-256"},{"name":"provider","in":"query","description":"Provider TSA à utiliser:\n- `auto`: Sélection automatique (config Infisical)\n- `universign`: Universign (eIDAS qualifié)\n- `certeurope`: CertEurope (eIDAS qualifié)\n- `freetsa`: FreeTSA (tests uniquement)\n","required":false,"schema":{"type":"string","default":"auto"},"example":"auto"},{"name":"includeCert","in":"query","description":"Inclure le certificat TSA dans la réponse","required":false,"schema":{"type":"boolean","default":true},"example":true}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier à horodater (PDF, XML, etc.)"}}}}}},"responses":{"200":{"description":"Horodatage réussi - Token RFC 3161 généré","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TimestampResponse"},"examples":{"Success":{"description":"Success","value":{"success":true,"timestamp_token":"MIIEqwYJKoZIhvcNAQcCoIIE...","timestamp_time":"2025-01-15T10:30:45.123Z","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","hash_algorithm":"SHA-256","provider":"universign","tsa_policy_id":"1.2.840.113549.1.9.16.1.4","serial_number":"123456789012345","certificate":{"subject":"CN=Universign Timestamping Authority, O=Universign, C=FR","issuer":"CN=Universign Root CA, O=Universign, C=FR","valid_from":"2024-01-01T00:00:00Z","valid_until":"2029-01-01T00:00:00Z","eidas_qualified":true},"processing_time_ms":234}}}}}},"400":{"description":"Requête invalide - Fichier manquant ou hash invalide","content":{"application/json":{"examples":{"InvalidHash":{"description":"InvalidHash","value":{"success":false,"error":"invalid_hash","message":"Le hash doit être une chaîne hexadécimale de 64 caractères (SHA-256)"}}}}}},"503":{"description":"TSA indisponible","content":{"application/json":{"examples":{"TsaUnavailable":{"description":"TsaUnavailable","value":{"success":false,"error":"tsa_unavailable","message":"Le serveur TSA Universign est temporairement indisponible"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/timestamp/verify":{"post":{"tags":["Horodatage"],"summary":"Vérifier un token d'horodatage","description":"**Vérification d'un token RFC 3161**\n\nVérifie:\n1. La validité cryptographique du token\n2. La chaîne de certificats TSA\n3. L'intégrité du hash (si fourni)\n\n## Exemple\n\n```bash\ncurl -X POST /api/v1/timestamp/verify \\\n  -H \"Authorization: Bearer <token>\" \\\n  -d \"token=MIIEqwYJKoZIhvcNAQcCoIIE...\" \\\n  -d \"expectedHash=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n```\n","operationId":"verifyTimestamp","parameters":[{"name":"token","in":"query","description":"Token d'horodatage RFC 3161 encodé en Base64","required":true,"schema":{"type":"string"}},{"name":"expectedHash","in":"query","description":"Hash attendu (hexadécimal) pour vérification d'intégrité.\nSi fourni, vérifie que le hash dans le token correspond.\n","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Vérification effectuée","content":{"application/json":{"examples":{"Valid":{"summary":"Token valide","description":"Valid","value":{"success":true,"valid":true,"timestamp_time":"2025-01-15T10:30:45.123Z","hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","hash_matches":true,"certificate_valid":true,"eidas_qualified":true,"provider":"universign"}},"Invalid":{"summary":"Token invalide","description":"Invalid","value":{"success":true,"valid":false,"reason":"certificate_expired","message":"Le certificat TSA a expiré le 2024-12-31"}}}}}},"400":{"description":"Token malformé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TimestampResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/timestamp/hash":{"post":{"tags":["Horodatage"],"summary":"Horodater un hash","description":"**Horodatage direct d'un hash pré-calculé**\n\nPermet d'horodater un hash SHA-256 sans uploader le fichier original.\nUtile pour les documents volumineux ou confidentiels.\n\n## Exemple\n\n```bash\ncurl -X POST /api/v1/timestamp/hash \\\n  -H \"Authorization: Bearer <token>\" \\\n  -d \"hash=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n```\n","operationId":"timestampHash","parameters":[{"name":"hash","in":"query","description":"Hash SHA-256 en hexadécimal (64 caractères)","required":true,"schema":{"type":"string"},"example":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"},{"name":"algorithm","in":"query","description":"Algorithme de hash","required":false,"schema":{"type":"string","default":"SHA-256"},"example":"SHA-256"},{"name":"provider","in":"query","description":"Provider TSA","required":false,"schema":{"type":"string","default":"auto"},"example":"auto"}],"responses":{"200":{"description":"Horodatage réussi","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TimestampResponse"}}}},"400":{"description":"Hash invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TimestampResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates":{"get":{"tags":["Templates"],"summary":"Lister tous les templates actifs","description":"Retourne tous les templates groupés par secteur","operationId":"listTemplates","responses":{"200":{"description":"Liste des templates par secteur","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"array","items":{"$ref":"#/components/schemas/TemplateDTO"}}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Templates"],"summary":"Créer un template custom","description":"Crée un nouveau template personnalisé (non-système)","operationId":"createTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTemplateRequest"}}},"required":true},"responses":{"201":{"description":"Template créé","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"Code déjà existant ou données invalides","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates/validate":{"post":{"tags":["Templates"],"summary":"Valider des données contre un template","description":"Vérifie les champs requis et les règles du template","operationId":"validateAgainstTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyTemplateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates/apply":{"post":{"tags":["Templates"],"summary":"Appliquer un template à des données","description":"Fusionne les valeurs par défaut du template avec les données fournies","operationId":"applyTemplate","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyTemplateRequest"}}},"required":true},"responses":{"200":{"description":"Données enrichies avec le template","content":{"*/*":{"schema":{"type":"object"}}}},"404":{"description":"Template non trouvé","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/ppf":{"post":{"tags":["Soumission"],"summary":"Soumettre au PPF","description":"**Dépôt d'une facture sur le Portail Public de Facturation**\n\nLe PPF (Portail Public de Facturation) est la plateforme officielle\npour l'échange de factures électroniques entre entreprises privées (B2B).\n\n## Prérequis\n\n- Facture au format Factur-X (PDF/A-3 + XML)\n- SIRET émetteur et destinataire valides\n- Facture validée (voir `/validate`)\n\n## Exemple cURL\n\n```bash\ncurl -X POST /api/v1/submit/ppf \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@facture-facturx.pdf\" \\\n  -F \"emitterSiret=12345678901234\" \\\n  -F \"recipientSiret=98765432109876\" \\\n  -F \"sandbox=true\"\n```\n\n## Webhook\n\nSi `webhookUrl` est fourni, vous recevrez des notifications\nHTTP POST lors des changements de statut.\n","operationId":"submitToPpf","parameters":[{"name":"documentId","in":"query","description":"ID du document dans votre système (pour traçabilité)","required":false,"schema":{"type":"string"}},{"name":"emitterSiret","in":"query","description":"SIRET de l'émetteur (14 chiffres)","required":false,"schema":{"type":"string"},"example":12345678901234},{"name":"recipientSiret","in":"query","description":"SIRET du destinataire (14 chiffres)","required":false,"schema":{"type":"string"},"example":98765432109876},{"name":"sandbox","in":"query","description":"Mode sandbox (test):\n- `true`: Test sans transmission réelle\n- `false`: Production (transmission au destinataire)\n","required":false,"schema":{"type":"boolean","default":true},"example":true},{"name":"webhookUrl","in":"query","description":"URL de callback pour les notifications de statut.\nRecevra des POST avec signature HMAC-SHA256.\n","required":false,"schema":{"type":"string"},"example":"https://mon-app.com/webhooks/ppf"},{"name":"internalRouting","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier Factur-X (PDF/A-3 avec XML embarqué)"}},"required":["file"]}}}},"responses":{"200":{"description":"Soumission acceptée par le PPF","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResponse"},"examples":{"Success":{"description":"Success","value":{"success":true,"submission_id":"PPF-2025-123456","document_id":"doc-550e8400-e29b-41d4","platform":"PPF","status":"SUBMITTED","submitted_at":"2025-01-15T10:30:45.123Z","tracking_url":"https://ppf.economie.gouv.fr/factures/PPF-2025-123456","deposit":{"deposit_number":"DEP-123456789","deposit_date":"2025-01-15T10:30:45Z","flow_id":"F1","format":"FACTURX","billing_context":"A1_FACTURE_FOURNISSEUR","emitter_siret":"12345678901234","recipient_siret":"98765432109876"},"meta":{"latency_ms":1234,"sandbox":true,"api_version":"v3.0","correlation_id":"corr-abc-123"}}}}}}},"400":{"description":"Requête invalide - Facture non conforme","content":{"application/json":{"examples":{"ValidationError":{"description":"ValidationError","value":{"success":false,"error":"validation_failed","message":"La facture n'est pas conforme au profil EN16931","validation_errors":["Champ obligatoire manquant: BuyerReference"]}}}}}},"503":{"description":"PPF indisponible","content":{"application/json":{"examples":{"ServiceUnavailable":{"description":"ServiceUnavailable","value":{"success":false,"error":"ppf_unavailable","message":"Le Portail Public de Facturation est temporairement indisponible"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/chorus":{"post":{"tags":["Soumission"],"summary":"Soumettre à Chorus Pro","description":"**Dépôt d'une facture sur Chorus Pro**\n\nChorus Pro est la plateforme obligatoire pour la facturation\nvers le secteur public français (B2G).\n\n## Prérequis\n\n- Facture au format accepté (Factur-X, UBL, CII, CPP)\n- SIRET émetteur valide\n- SIRET destinataire (structure publique)\n- Optionnel: numéro d'engagement, code service\n\n## Exemple cURL\n\n```bash\ncurl -X POST /api/v1/submit/chorus \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@facture.pdf\" \\\n  -F \"emitterSiret=12345678901234\" \\\n  -F \"recipientSiret=13002526500013\" \\\n  -F \"engagementNumber=EJ-2025-001\" \\\n  -F \"sandbox=true\"\n```\n","operationId":"submitToChorusPro","parameters":[{"name":"documentId","in":"query","description":"ID du document dans votre système","required":false,"schema":{"type":"string"}},{"name":"emitterSiret","in":"query","description":"SIRET émetteur (14 chiffres)","required":false,"schema":{"type":"string"},"example":12345678901234},{"name":"recipientSiret","in":"query","description":"SIRET de la structure publique destinataire","required":false,"schema":{"type":"string"},"example":13002526500013},{"name":"engagementNumber","in":"query","description":"Numéro d'engagement juridique (marché public).\nRequis si la structure publique l'exige.\n","required":false,"schema":{"type":"string"},"example":"EJ-2025-001"},{"name":"serviceCode","in":"query","description":"Code du service destinataire dans la structure.\nPermet le routage vers le bon service.\n","required":false,"schema":{"type":"string"}},{"name":"sandbox","in":"query","description":"Mode sandbox (test)","required":false,"schema":{"type":"boolean","default":true},"example":true},{"name":"webhookUrl","in":"query","description":"URL webhook pour notifications","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier Factur-X (PDF/A-3)"}},"required":["file"]}}}},"responses":{"200":{"description":"Soumission acceptée par Chorus Pro","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmissionResponse"},"examples":{"Success":{"description":"Success","value":{"success":true,"submission_id":"FA-2025-12345","document_id":"doc-550e8400-e29b-41d4","platform":"CHORUS_PRO","status":"DEPOSITED","submitted_at":"2025-01-15T10:30:45.123Z","tracking_url":"https://chorus-pro.gouv.fr/factures/FA-2025-12345","chorus_details":{"numero_facture_chorus":"FA-2025-12345","date_depot":"2025-01-15","statut_courant":"DEPOSEE","siret_fournisseur":"12345678901234","siret_destinataire":"13002526500013"}}}}}}},"400":{"description":"Requête invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SubmissionResponse"}}}},"503":{"description":"Chorus Pro indisponible","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SubmissionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/sign":{"post":{"tags":["Signature XAdES"],"summary":"Signer un document","description":"**Signature XAdES d'un document XML**\n\nSigne un document XML au format XAdES (compatible eIDAS).\nLe caractère « qualifié » dépend du certificat utilisé :\nvoir l'introduction du tag pour les précisions réglementaires.\n\n## Exemple cURL\n\n```bash\ncurl -X POST \\\n  'https://api.paraphix.fr/api/v1/sign' \\\n  -H 'Authorization: Bearer <token>' \\\n  -F 'file=@facture.xml' \\\n  -F 'format=XADES_T' \\\n  -F 'packaging=ENVELOPED'\n```\n\n## Formats supportés\n\n| Format | Description | Timestamp |\n|--------|-------------|-----------|\n| **XADES_B** | Baseline | Non |\n| **XADES_T** | + Timestamp TSA | Oui |\n| **XADES_LT** | + Données validation | Oui |\n| **XADES_LTA** | + Archive timestamp | Oui |\n\n## Modes de packaging\n\n- **ENVELOPED**: Signature dans le document (recommandé)\n- **ENVELOPING**: Document dans la signature\n- **DETACHED**: Fichiers séparés\n\n## Résultat\n\nLe document signé est retourné en Base64 avec:\n- ID de signature unique\n- Détails du certificat utilisé\n- Timestamp si format >= XAdES-T\n","operationId":"signDocument","parameters":[{"name":"format","in":"query","description":"Format de signature","required":false,"schema":{"type":"string","enum":["XADES_B","XADES_T","XADES_LT","XADES_LTA","PADES_B","PADES_T","PADES_LT","PADES_LTA"]}},{"name":"packaging","in":"query","description":"Packaging de la signature","required":false,"schema":{"type":"string","enum":["ENVELOPED","ENVELOPING","DETACHED"]}},{"name":"digestAlgorithm","in":"query","description":"Algorithme de digest","required":false,"schema":{"type":"string","default":"SHA256","enum":["SHA256","SHA384","SHA512"]}},{"name":"addTimestamp","in":"query","description":"Ajouter un timestamp TSA (automatique pour XAdES-T+)","required":false,"schema":{"type":"boolean","default":false}},{"name":"certificateAlias","in":"query","description":"Alias du certificat à utiliser (optionnel)","required":false,"schema":{"type":"string"}},{"name":"reason","in":"query","description":"Raison de la signature","required":false,"schema":{"type":"string"}},{"name":"location","in":"query","description":"Localisation de la signature","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Document XML à signer"}},"required":["file"]}}}},"responses":{"200":{"description":"Document signé avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SignatureResponse"}}}},"400":{"description":"Requête invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SignatureResponse"}}}},"500":{"description":"Erreur de signature","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SignatureResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/sign/verify":{"post":{"tags":["Signature XAdES"],"summary":"Vérifier une signature","description":"Valide une signature XAdES existante.\n\n## Vérifications effectuées\n- Intégrité du document (hash)\n- Validité du certificat de signature\n- Chaîne de certificats\n- Révocation (CRL/OCSP) si activé\n- Timestamp si présent\n\n## Pour les signatures détachées\nFournir le document original encodé en Base64.\n","operationId":"verifySignature","parameters":[{"name":"validateChain","in":"query","description":"Vérifier la chaîne de certificats","required":false,"schema":{"type":"boolean","default":true}},{"name":"checkRevocation","in":"query","description":"Vérifier la révocation (CRL/OCSP)","required":false,"schema":{"type":"boolean","default":true}},{"name":"validateTimestamp","in":"query","description":"Vérifier le timestamp","required":false,"schema":{"type":"boolean","default":true}},{"name":"useTsl","in":"query","description":"Utiliser la Trust Service List européenne","required":false,"schema":{"type":"boolean","default":true}},{"name":"originalDocument","in":"query","description":"Document original pour signature détachée (Base64)","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Document signé"}},"required":["file"]}}}},"responses":{"200":{"description":"Résultat de validation","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SignatureValidationResult"}}}},"400":{"description":"Document invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SignatureValidationResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/process-stream":{"post":{"tags":["Streaming"],"summary":"Traiter une facture avec progression SSE","description":"Upload un PDF et lance le pipeline complet (extraction → conversion → validation)\navec des événements SSE en temps réel pour chaque étape.\n\n**Événements SSE:**\n- `started` : Début du traitement\n- `extraction` : Extraction des données du PDF\n- `template_applied` : Template sectoriel appliqué (si spécifié)\n- `conversion` : Conversion en Factur-X PDF/A-3\n- `validation_xsd` : Validation XSD\n- `validation_schematron` : Validation Schematron EN16931 + CIUS-FR\n- `validation_business` : Validation règles métier\n- `completed` : Terminé (contient le PDF base64 et le résultat de validation)\n- `error` : Erreur durant le traitement\n\n**Exemple JavaScript:**\n```javascript\nconst formData = new FormData();\nformData.append('file', pdfFile);\n\nconst eventSource = new EventSource('/api/v1/process-stream?' + params);\n// Note: EventSource ne supporte pas POST, utiliser fetch + ReadableStream\n\nconst response = await fetch('/api/v1/process-stream', {\n  method: 'POST',\n  body: formData,\n  headers: { 'Authorization': 'Bearer ...' }\n});\nconst reader = response.body.getReader();\n```\n","operationId":"processStream","parameters":[{"name":"profile","in":"query","description":"Profil Factur-X","required":false,"schema":{"type":"string","default":"EN16931"},"example":"EN16931"},{"name":"templateCode","in":"query","description":"Code du template sectoriel (optionnel)","required":false,"schema":{"type":"string"},"example":"BTP_SITUATION"},{"name":"validate","in":"query","description":"Activer la validation","required":false,"schema":{"type":"boolean","default":true}},{"name":"watermark","in":"query","description":"Ajouter un watermark","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier PDF à traiter"}},"required":["file"]}}}},"responses":{"200":{"description":"Stream SSE d'événements de traitement","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}},"400":{"description":"Fichier invalide","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}},"401":{"description":"Non authentifié","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/{id}/refuse":{"post":{"tags":["Factures Entrantes"],"summary":"Refuser une facture reçue","description":"Refuse la facture et notifie le fournisseur avec le motif","operationId":"refuse","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/{id}/paid":{"post":{"tags":["Factures Entrantes"],"summary":"Marquer comme payée","description":"Marque la facture comme payée et notifie le fournisseur","operationId":"markPaid","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/{id}/accept":{"post":{"tags":["Factures Entrantes"],"summary":"Accepter une facture reçue","description":"Accepte la facture et notifie le fournisseur via PPF","operationId":"accept","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/webhook":{"post":{"tags":["Factures Entrantes"],"summary":"Webhook PPF","description":"Endpoint pour recevoir les notifications push du PPF","operationId":"ppfWebhook","requestBody":{"content":{"application/json":{"schema":{"type":"string"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/{id}/status":{"get":{"tags":["Cycle de vie"],"summary":"Obtenir le statut d'une facture","description":"**Consultation du statut actuel d'une facture**\n\nRetourne le statut actuel d'une facture avec les informations\ncomplètes de soumission et les métadonnées associées.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \\\n  'https://api.paraphix.fr/api/v1/invoice/550e8400-e29b-41d4/status' \\\n  -H 'Authorization: Bearer <token>'\n```\n\n## Informations retournées\n\n- Statut actuel et timestamp du dernier changement\n- Plateforme de destination (PPF, Chorus Pro)\n- Identifiants de soumission (depositNumber, submissionId)\n- Numéro de facture et parties (émetteur, destinataire)\n","operationId":"getStatus","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Statut trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"404":{"description":"Facture non trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Cycle de vie"],"summary":"Mettre à jour le statut d'une facture","description":"**Mise à jour du statut avec validation des transitions**\n\nMet à jour le statut d'une facture en vérifiant que la transition\nest valide selon les règles PPF.\n\n## Exemple cURL\n\n```bash\ncurl -X POST \\\n  'https://api.paraphix.fr/api/v1/invoice/550e8400-e29b-41d4/status' \\\n  -H 'Authorization: Bearer <token>' \\\n  -H 'Content-Type: application/json' \\\n  -H 'X-Correlation-ID: corr-123456' \\\n  -d '{\n    \"newStatus\": \"ACCEPTED\",\n    \"reason\": \"Facture conforme\"\n  }'\n```\n\n## Transitions valides\n\n| Depuis | Vers | Condition |\n|--------|------|-----------|\n| RECEIVED | ACCEPTED | Aucune |\n| RECEIVED | REFUSED | Raison obligatoire |\n| ACCEPTED | PAID | Aucune |\n| * | CANCELLED | Raison obligatoire |\n","operationId":"updateStatus","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StatusUpdateRequest"}}},"required":true},"responses":{"200":{"description":"Statut mis à jour avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"400":{"description":"Transition de statut invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"404":{"description":"Facture non trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/{id}/refuse":{"post":{"tags":["Cycle de vie"],"summary":"Refuser une facture","description":"Marque une facture comme refusée (RECEIVED -> REFUSED). Une raison est obligatoire.","operationId":"refuse_1","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"reason","in":"query","description":"Raison du refus","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Facture refusée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"400":{"description":"Raison manquante ou transition invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/{id}/paid":{"post":{"tags":["Cycle de vie"],"summary":"Marquer comme payée","description":"Marque une facture comme encaissée (ACCEPTED -> PAID).","operationId":"markAsPaid","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"reason","in":"query","description":"Raison/commentaire","required":false,"schema":{"type":"string"}},{"name":"details","in":"query","description":"Détails du paiement (JSON)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Facture marquée comme payée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"400":{"description":"Transition invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/{id}/cancel":{"post":{"tags":["Cycle de vie"],"summary":"Annuler une facture","description":"Annule une facture. Une raison est obligatoire.","operationId":"cancel","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"reason","in":"query","description":"Raison de l'annulation","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Facture annulée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"400":{"description":"Raison manquante ou transition invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/{id}/accept":{"post":{"tags":["Cycle de vie"],"summary":"Accepter une facture","description":"Raccourci pour marquer une facture comme acceptée (RECEIVED -> ACCEPTED).","operationId":"accept_1","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"reason","in":"query","description":"Raison de l'acceptation","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Facture acceptée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"400":{"description":"Transition invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/generate":{"post":{"tags":["Conversion"],"summary":"Générer une facture Factur-X à partir de données structurées","description":"Crée un PDF Factur-X complet (PDF/A-3 + XML EN16931) à partir de données JSON.\nAucun PDF source requis — le PDF est généré automatiquement.\n","operationId":"generateInvoice","parameters":[{"name":"profile","in":"query","required":false,"schema":{"type":"string","default":"EN16931"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractedData"}}},"required":true},"responses":{"200":{"description":"Factur-X généré avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ConversionResponse"}}}},"422":{"description":"Données insuffisantes ou invalides","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ConversionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/extract":{"post":{"tags":["Extraction"],"summary":"Extraire les données d'une facture","description":"**Extraction intelligente des données de facture**\n\nML Sidecar gère automatiquement le pipeline optimal:\n\n1. **Fast extraction** - Regex français (~100ms)\n2. **Mistral OCR** - Auto-enrichissement si couverture faible\n\n## Exemple cURL\n\n```bash\ncurl -X POST /api/v1/extract \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@facture.pdf\"\n```\n","operationId":"extract","parameters":[{"name":"language","in":"query","description":"Langue du document (fr, en, de, auto)","required":false,"schema":{"type":"string","default":"fr"},"example":"fr"},{"name":"forceOcr","in":"query","description":"Forcer l'OCR même si le PDF contient du texte","required":false,"schema":{"type":"boolean","default":false},"example":false},{"name":"model","in":"query","description":"Modèle d'extraction: 'auto' (fast+mistral si nécessaire), 'fast' (rapide sans mistral), 'mistral' (OCR direct)","required":false,"schema":{"type":"string","default":"auto"},"example":"auto"}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier PDF ou image de la facture"}},"required":["file"]}}}},"responses":{"200":{"description":"Extraction réussie","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionResponse"},"examples":{"SuccessfulExtraction":{"summary":"Extraction complète","description":"SuccessfulExtraction","value":{"success":true,"document_id":"ext-550e8400-e29b-41d4","processing_time_ms":847,"confidence":0.94,"data":{"invoice_number":"FACT-2025-001","issue_date":"2025-01-15","due_date":"2025-02-15","seller":{"name":"ACME SARL","siret":"12345678901234","vat_number":"FR12345678901"},"buyer":{"name":"Client SAS"},"total_ht":1000.0,"total_vat":200.0,"total_ttc":1200.0}}}}}}},"400":{"description":"Fichier invalide","content":{"application/json":{"examples":{"InvalidFile":{"description":"InvalidFile","value":{"success":false,"error":"invalid_file","message":"Format non supporté. Acceptés: PDF, PNG, JPG"}}}}}},"422":{"description":"Extraction échouée","content":{"application/json":{"examples":{"ExtractionFailed":{"description":"ExtractionFailed","value":{"success":false,"error":"extraction_failed","message":"Impossible d'extraire les données"}}}}}},"503":{"description":"Service indisponible","content":{"application/json":{"examples":{"ServiceUnavailable":{"description":"ServiceUnavailable","value":{"success":false,"error":"ml_service_unavailable","message":"Service temporairement indisponible"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/xml":{"post":{"tags":["E-Reporting"],"summary":"Soumettre un rapport XML brut","description":"Soumet un rapport e-reporting en format XML directement au PPF.","operationId":"submitXml","parameters":[{"name":"reportType","in":"query","description":"Type de rapport: transactions ou payments","required":false,"schema":{"type":"string","default":"transactions"}},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox PPF","required":false,"schema":{"type":"boolean","default":true}}],"requestBody":{"content":{"application/xml":{"schema":{"type":"string","description":"Contenu XML du rapport"}}},"required":true},"responses":{"200":{"description":"Rapport soumis avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"400":{"description":"Erreurs de validation XML","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"500":{"description":"Erreur de soumission","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/validate":{"post":{"tags":["E-Reporting"],"summary":"Valider un rapport e-reporting","description":"Valide un rapport e-reporting sans le soumettre.\n\nEffectue les validations suivantes:\n- Contraintes Jakarta (champs requis, formats)\n- Structure du rapport (document, transactions/paiements)\n- Règles métier (cohérence des totaux, catégories)\n- Règles spécifiques PPF (périodes, identifiants)\n","operationId":"validate_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EReportingSubmission"}}},"required":true},"responses":{"200":{"description":"Résultat de validation","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/validate/xml":{"post":{"tags":["E-Reporting"],"summary":"Valider un XML e-reporting contre le XSD","description":"Valide un XML e-reporting contre le schéma XSD PPF.","operationId":"validateXml","parameters":[{"name":"schemaType","in":"query","description":"Type de schéma: ereporting, transaction, payment, report","required":false,"schema":{"type":"string","default":"ereporting"}}],"requestBody":{"content":{"application/xml":{"schema":{"type":"string","description":"Contenu XML à valider"}}},"required":true},"responses":{"200":{"description":"Résultat de validation XSD","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/transactions":{"post":{"tags":["E-Reporting"],"summary":"Soumettre un rapport de transactions","description":"**Déclaration des transactions e-reporting (Flux 10.1/10.3)**\n\nSoumet un rapport de transactions e-reporting au Portail Public\nde Facturation (PPF).\n\n## Exemple cURL\n\n```bash\ncurl -X POST \\\n  'https://api.paraphix.fr/api/v1/ereporting/transactions?sandbox=true' \\\n  -H 'Authorization: Bearer <token>' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"reportDocument\": {\n      \"declarantSiret\": \"12345678901234\",\n      \"periodStart\": \"2025-01-01\",\n      \"periodEnd\": \"2025-01-31\"\n    },\n    \"transactionsReport\": {\n      \"transactions\": [...]\n    }\n  }'\n```\n\n## Flux supportés\n\n| Flux | Type | Catégories |\n|------|------|------------|\n| 10.1 | Ventes | TLB1, TPS1, TLB2, TPS2, TLB3, TPS3 |\n| 10.3 | Acquisitions | ALB1, APS1 |\n\n## Validation avant soumission\n\nLe rapport est validé avant envoi:\n- Structure du document (champs obligatoires)\n- Cohérence des totaux\n- Validité des identifiants (SIRET, TVA)\n- Respect du schéma XSD PPF\n","operationId":"submitTransactions","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox PPF","required":false,"schema":{"type":"boolean","default":true}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EReportingSubmission"}}},"required":true},"responses":{"200":{"description":"Rapport soumis avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"400":{"description":"Erreurs de validation","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"500":{"description":"Erreur de soumission","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/payments":{"post":{"tags":["E-Reporting"],"summary":"Soumettre un rapport de paiements","description":"Soumet un rapport d'encaissements e-reporting au PPF.\n\n**Flux supportés:**\n- 10.2: Encaissements sur ventes\n- 10.4: Encaissements sur acquisitions\n\nLe rapport est validé avant soumission.\n","operationId":"submitPayments","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox PPF","required":false,"schema":{"type":"boolean","default":true}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EReportingSubmission"}}},"required":true},"responses":{"200":{"description":"Rapport soumis avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"400":{"description":"Erreurs de validation","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"500":{"description":"Erreur de soumission","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/aggregate":{"post":{"tags":["E-Reporting"],"summary":"Agréger des transactions","description":"Agrège une liste de transactions par catégorie.\n\nRetourne un résumé avec les totaux par catégorie (TLB1, TPS1, etc.)\nprêt pour la soumission en mode agrégé.\n","operationId":"aggregateTransactions","requestBody":{"content":{"application/json":{"schema":{"type":"array","description":"Liste des transactions à agréger","items":{"$ref":"#/components/schemas/Transaction"}}}},"required":true},"responses":{"200":{"description":"Résumé des transactions agrégées","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TransactionSummary"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/convert":{"post":{"tags":["Conversion"],"summary":"Convertir un PDF en Factur-X","description":"**Génération d'une facture Factur-X conforme**\n\nConvertit un PDF existant en Factur-X en y embarquant un fichier XML\ncontenant les données structurées de la facture.\n\n## Modes d'utilisation\n\n### 1. PDF + Données JSON (recommandé)\nFournissez le PDF et les données extraites au format JSON.\n\n```bash\ncurl -X POST /api/v1/convert \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@facture.pdf\" \\\n  -F \"data={...json...}\" \\\n  -F \"profile=EN16931\"\n```\n\n### 2. PDF seul (extraction automatique)\nLe système extrait automatiquement les données via ML.\n\n```bash\ncurl -X POST /api/v1/convert \\\n  -H \"Authorization: Bearer <token>\" \\\n  -F \"file=@facture.pdf\" \\\n  -F \"profile=BASIC\"\n```\n\n## Résultat\n\nLe PDF retourné en base64 contient:\n- Le document PDF original (converti en PDF/A-3)\n- Un fichier XML embarqué `factur-x.xml`\n- Les métadonnées XMP requises\n","operationId":"convert","parameters":[{"name":"data","in":"query","description":"Données structurées de la facture au format JSON.\n\nSi non fourni, les données seront extraites automatiquement du PDF via ML.\n\n**Format attendu**: Conforme au schéma ExtractionResponse.data\n","required":false,"schema":{"type":"string"}},{"name":"profile","in":"query","description":"Profil Factur-X à utiliser:\n- `MINIMUM`: Données minimales (identifiants, totaux)\n- `BASIC`: Données de base (+ lignes simplifiées)\n- `EN16931`: Conformité européenne (recommandé)\n- `EXTENDED`: Toutes les données possibles\n","required":false,"schema":{"type":"string","enum":["MINIMUM","BASIC","EN16931","EXTENDED"]},"example":"EN16931"},{"name":"validate","in":"query","description":"Valider le XML généré contre les schémas XSD et Schematron","required":false,"schema":{"type":"boolean","default":true},"example":true},{"name":"watermark","in":"query","description":"Ajouter un filigrane ParaphiX discret sur le PDF","required":false,"schema":{"type":"boolean","default":false},"example":false}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary","description":"Fichier PDF source de la facture"}},"required":["file"]}}}},"responses":{"200":{"description":"Conversion réussie - PDF Factur-X généré","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversionResponse"},"examples":{"SuccessfulConversion":{"summary":"Factur-X généré","description":"SuccessfulConversion","value":{"success":true,"document_id":"conv-550e8400-e29b-41d4","processing_time_ms":1234,"profile":"EN16931","facturx_pdf_base64":"JVBERi0xLjcKJeLjz9...","facturx_xml_base64":"PD94bWwgdmVyc2lvbj0i...","xml_filename":"factur-x.xml","validation":{"valid":true,"xsd_valid":true,"schematron_valid":true,"errors":[]},"metadata":{"invoice_number":"FACT-2025-001","total_ttc":1200.0,"currency":"EUR","pdf_pages":1,"xml_size_bytes":4567}}}}}}},"400":{"description":"Fichier invalide ou données insuffisantes","content":{"application/json":{"examples":{"InvalidInput":{"description":"InvalidInput","value":{"success":false,"error":"invalid_input","message":"Le fichier fourni n'est pas un PDF valide"}}}}}},"422":{"description":"Conversion impossible - Données manquantes ou invalides","content":{"application/json":{"examples":{"MissingData":{"description":"MissingData","value":{"success":false,"error":"missing_required_data","message":"Données insuffisantes pour le profil EN16931","missing_fields":["seller.vat_number","buyer.siret","lines[0].vat_rate"]}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/cgu/withdraw":{"post":{"tags":["CGU & Conditions PDP"],"summary":"Retirer le consentement (RGPD art. 7.3)","operationId":"withdrawConsent","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/cgu/accept":{"post":{"tags":["CGU & Conditions PDP"],"summary":"Accepter les CGU/conditions PDP","operationId":"acceptCgu","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CguAcceptanceEntity"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/upload":{"post":{"tags":["Bulk Upload"],"summary":"Upload multi-fichiers pour traitement en masse","operationId":"uploadFiles","parameters":[{"name":"targetPlatform","in":"query","description":"Plateforme cible","required":false,"schema":{"type":"string","default":"AUTO"},"example":"PPF"},{"name":"emitterSiret","in":"query","description":"SIRET émetteur par défaut","required":false,"schema":{"type":"string"}},{"name":"profile","in":"query","description":"Profil Factur-X","required":false,"schema":{"type":"string","default":"EN16931"},"example":"EN16931"},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"files":{"type":"array","description":"Fichiers PDF/CSV/XLSX à traiter","items":{"type":"string","format":"binary"}}},"required":["files"]}}}},"responses":{"201":{"description":"Job créé avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BulkUploadResponse"}}}},"400":{"description":"Aucun fichier fourni","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BulkUploadResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/jobs/{id}/submit":{"post":{"tags":["Bulk Upload"],"summary":"Soumettre les éléments prêts à la plateforme cible","operationId":"submitJob","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkSubmitRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BulkJobResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/jobs/{id}/retry":{"post":{"tags":["Bulk Upload"],"summary":"Rejouer les éléments en erreur","operationId":"retryJob","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BulkJobResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/jobs/{id}/process":{"post":{"tags":["Bulk Upload"],"summary":"Lancer le traitement (extraction + validation + conversion) avec SSE","description":"Lance le pipeline de traitement pour tous les fichiers du job.\nRetourne un stream SSE avec la progression en temps réel.\n\n**Événements SSE:**\n- `job_started` : Début du traitement\n- `item_started` : Début du traitement d'un fichier\n- `item_extraction` : Extraction ML en cours\n- `item_validation` : Validation EN16931\n- `item_conversion` : Conversion Factur-X\n- `item_completed` : Fichier traité avec succès\n- `item_error` : Erreur sur un fichier\n- `job_progress` : Progression globale\n- `job_completed` : Tous les fichiers traités\n- `job_error` : Erreur globale\n","operationId":"processJob","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"text/event-stream":{"schema":{"$ref":"#/components/schemas/SseEmitter"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/auth/token":{"post":{"tags":["Authentification"],"summary":"Obtenir un token JWT","description":"**Authentification avec credentials client**\n\nÉchange vos identifiants client (client_id et client_secret) contre un token JWT.\n\n## Exemple d'utilisation\n\n```bash\ncurl -X POST /api/v1/auth/token \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"client_id\": \"mon-app\", \"client_secret\": \"secret-xxx\"}'\n```\n\n## Réponse\n\nLa réponse contient:\n- `access_token`: Token à utiliser pour les appels API\n- `refresh_token`: Token pour renouveler l'accès\n- `expires_in`: Durée de validité en secondes\n- `scopes`: Permissions accordées\n","operationId":"getToken","requestBody":{"description":"Credentials du client API","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthRequest"},"examples":{"Standard":{"summary":"Authentification standard","description":"Standard","value":{"client_id":"mon-application-b2b","client_secret":"secret-xxxx-xxxx-xxxx"}},"Test":{"summary":"Client de test (sandbox)","description":"Test","value":{"client_id":"test-client","client_secret":"test-secret"}}}}},"required":true},"responses":{"200":{"description":"Authentification réussie - Token JWT généré","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"},"examples":{"Success":{"description":"Success","value":{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...","token_type":"Bearer","expires_in":3600,"refresh_expires_in":86400,"scopes":["invoice:read","invoice:write","submit"]}}}}}},"401":{"description":"Credentials invalides - Client ID ou secret incorrect","content":{"application/json":{"examples":{"InvalidCredentials":{"description":"InvalidCredentials","value":{"error":"invalid_credentials","message":"Client ID ou secret invalide"}}}}}},"400":{"description":"Requête invalide - Champs manquants ou mal formatés","content":{"application/json":{"examples":{"ValidationError":{"description":"ValidationError","value":{"error":"validation_error","message":"client_id est requis"}}}}}}}}},"/api/v1/auth/refresh":{"post":{"tags":["Authentification"],"summary":"Rafraîchir un token JWT","description":"**Renouvellement du token d'accès**\n\nÉchange un refresh token valide contre un nouveau token d'accès.\nUtilisez cette méthode quand votre access token expire, sans avoir\nà renvoyer vos credentials.\n\n## Exemple d'utilisation\n\n```bash\ncurl -X POST /api/v1/auth/refresh \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"refresh_token\": \"eyJhbGciOiJIUzI1NiIs...\"}'\n```\n\n## Notes\n\n- Le refresh token a une durée de vie de **24 heures**\n- Après rafraîchissement, un **nouveau** refresh token est fourni\n- L'ancien refresh token devient invalide\n","operationId":"refreshToken","requestBody":{"description":"Refresh token à échanger","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"},"examples":{"RefreshToken":{"description":"RefreshToken","value":{"refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJtb24tYXBwIiwidHlwZSI6InJlZnJlc2gifQ..."}}}}},"required":true},"responses":{"200":{"description":"Token rafraîchi avec succès","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponse"},"examples":{"Success":{"description":"Success","value":{"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(nouveau)","refresh_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...(nouveau)","token_type":"Bearer","expires_in":3600,"refresh_expires_in":86400,"scopes":["invoice:read","invoice:write","submit"]}}}}}},"401":{"description":"Refresh token invalide ou expiré","content":{"application/json":{"examples":{"ExpiredToken":{"summary":"Token expiré","description":"ExpiredToken","value":{"error":"invalid_token","message":"Refresh token invalide ou expiré"}},"WrongTokenType":{"summary":"Mauvais type de token","description":"WrongTokenType","value":{"error":"invalid_token_type","message":"Le token fourni n'est pas un refresh token"}},"ClientNotFound":{"summary":"Client supprimé","description":"ClientNotFound","value":{"error":"client_not_found","message":"Client inconnu"}}}}}}}}},"/api/v1/archive/{invoiceId}":{"get":{"tags":["Archivage Légal"],"summary":"Statut d'archivage d'une facture","operationId":"getArchiveStatus","parameters":[{"name":"invoiceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Archivage Légal"],"summary":"Archiver manuellement une facture","operationId":"archiveInvoice","parameters":[{"name":"invoiceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/archive/{invoiceId}/verify":{"post":{"tags":["Archivage Légal"],"summary":"Vérifier l'intégrité d'une archive","operationId":"verifyIntegrity","parameters":[{"name":"invoiceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/archive/export":{"post":{"tags":["Archivage Légal"],"summary":"Export ZIP des archives (réversibilité XP Z12-013 §5)","operationId":"exportArchives","parameters":[{"name":"fromDate","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"toDate","in":"query","required":false,"schema":{"type":"string","format":"date"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":100}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/{instanceId}/reject":{"post":{"tags":["Approbations"],"summary":"Rejeter une approbation","operationId":"reject","parameters":[{"name":"instanceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/{instanceId}/approve":{"post":{"tags":["Approbations"],"summary":"Approuver une étape","operationId":"approve","parameters":[{"name":"instanceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/rules":{"get":{"tags":["Approbations"],"summary":"Lister les règles d'approbation","operationId":"getRules","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":"object"}}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Approbations"],"summary":"Créer une règle d'approbation","operationId":"createRule","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/chains":{"get":{"tags":["Approbations"],"summary":"Lister les chaînes d'approbation","operationId":"getChains","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":"object"}}}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Approbations"],"summary":"Créer une chaîne d'approbation","operationId":"createChain","requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/siret/search":{"post":{"tags":["Annuaire PPF"],"summary":"Rechercher des établissements","description":"Recherche multi-critères d'établissements dans l'annuaire PPF.","operationId":"searchSiret","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnuaireSearchRequest"}}},"required":true},"responses":{"200":{"description":"Résultats de la recherche","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PagedResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/siren/search":{"post":{"tags":["Annuaire PPF"],"summary":"Rechercher des entreprises","description":"Recherche multi-critères d'entreprises dans l'annuaire PPF.","operationId":"searchSiren","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnuaireSearchRequest"}}},"required":true},"responses":{"200":{"description":"Résultats de la recherche","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PagedResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/routing/search":{"post":{"tags":["Annuaire PPF"],"summary":"Rechercher des codes routage","description":"Recherche multi-critères de codes routage dans l'annuaire PPF.","operationId":"searchRoutingCodes","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnuaireSearchRequest"}}},"required":true},"responses":{"200":{"description":"Résultats de la recherche","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PagedResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/route":{"post":{"tags":["Annuaire PPF"],"summary":"Déterminer le routage d'une facture","description":"   **Décision automatique de routage (PPF, Chorus Pro, PDP)**\n\n   Détermine automatiquement vers quelle plateforme envoyer\n   une facture en fonction du destinataire.\n\n   ## Exemple cURL\n\n   ```bash\n   curl -X POST \\\n     'https://api.paraphix.fr/api/v1/annuaire/route' \\\n     -H 'Authorization: Bearer <token>' \\\n     -H 'Content-Type: application/json' \\\n     -d '{\n       \"recipientSiret\": \"12345678901234\",\n       \"recipientName\": \"Entreprise Destinataire\",\n       \"sandbox\": true\n     }'\n   ```\n\n   ## Logique de décision\n\n   ```\n   ┌─────────────────────────────────┐\n   │ Destinataire entité publique ?  │\n   └───────────────┬─────────────────┘\n           │\n     ┌─────┴─────┐\n     │           │\n   OUI         NON\n     │           │\n     ▼           ▼\n┌────────┐  ┌───────────────────────┐\n│CHORUS  │  │ Recherche annuaire PPF│\n│PRO     │  └───────────┬───────────┘\n└────────┘        ┌─────┴─────┐\n                  │           │\n                Trouvé    Non trouvé\n                  │           │\n              ┌───┴───┐       ▼\n            PDP?    Non   ┌───────┐\n              │           │ERREUR │\n            ┌─┴─┐         └───────┘\n           OUI NON\n            │   │\n            ▼   ▼\n         ┌────┐┌────┐\n         │PDP ││PPF │\n         └────┘└────┘\n   ```\n\n   ## Résultat\n\n   - `platform`: PPF | CHORUS_PRO | PDP\n   - `routingCodes`: Codes de routage disponibles (GLN, ODETTE)\n   - `pdpInfo`: Si PDP, informations sur la plateforme\n","operationId":"determineRouting","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoutingRequest"}}},"required":true},"responses":{"200":{"description":"Décision de routage","content":{"*/*":{"schema":{"$ref":"#/components/schemas/RoutingDecision"}}}},"400":{"description":"Requête invalide","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/route/batch":{"post":{"tags":["Annuaire PPF"],"summary":"Déterminer le routage pour plusieurs factures","description":"Détermine le routage pour un lot de factures en une seule requête.","operationId":"determineRoutingBatch","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoutingRequest"}}}},"required":true},"responses":{"200":{"description":"Décisions de routage","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RoutingDecision"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/directory/search":{"post":{"tags":["Annuaire PPF"],"summary":"Rechercher des lignes d'annuaire","description":"Recherche multi-critères de lignes d'annuaire dans l'annuaire PPF.","operationId":"searchDirectoryEntries","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnnuaireSearchRequest"}}},"required":true},"responses":{"200":{"description":"Résultats de la recherche","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PagedResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/admin/clients":{"get":{"tags":["Administration"],"summary":"Lister les clients API","description":"Retourne la liste de tous les clients API B2B avec leurs quotas et statistiques. Filtrage optionnel par source.","operationId":"listClients","parameters":[{"name":"source","in":"query","description":"Filtrer par source (MANUAL ou VAULT)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Liste des clients","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientListResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientListResponse"}}}},"403":{"description":"Accès refusé - Rôle admin requis","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientListResponse"}}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["Administration"],"summary":"Créer un client","description":"Crée un nouveau client API B2B avec ses quotas. Retourne le secret en clair (une seule fois)","operationId":"createClient","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateClientRequest"}}},"required":true},"responses":{"201":{"description":"Client créé avec succès","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"400":{"description":"Données invalides","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"409":{"description":"Client ID déjà existant","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"403":{"description":"Accès refusé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/admin/clients/{clientId}/toggle":{"post":{"tags":["Administration"],"summary":"Activer/Désactiver un client","description":"Change l'état actif/inactif d'un client. Un client désactivé ne peut plus s'authentifier","operationId":"toggleClient","parameters":[{"name":"clientId","in":"path","description":"ID du client","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleClientRequest"}}},"required":true},"responses":{"200":{"description":"État modifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"404":{"description":"Client non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"403":{"description":"Accès refusé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/admin/clients/{clientId}/reset-secret":{"post":{"tags":["Administration"],"summary":"Régénérer le secret","description":"Génère un nouveau secret pour le client. L'ancien secret devient invalide immédiatement","operationId":"resetSecret","parameters":[{"name":"clientId","in":"path","description":"ID du client","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Secret régénéré - retourné en clair une seule fois","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"404":{"description":"Client non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"403":{"description":"Accès refusé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/validate/{invoiceId}":{"post":{"tags":["Expert-Comptable"],"summary":"Valider une facture (CREATED → VALIDATED)","operationId":"validateInvoice","parameters":[{"name":"invoiceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"comment","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ValidationResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/validate/batch":{"post":{"tags":["Expert-Comptable"],"summary":"Validation batch de factures","operationId":"validateBatch","requestBody":{"content":{"application/json":{"schema":{"type":"array","items":{"type":"string","format":"uuid"}}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ValidationResult"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/reject/{invoiceId}":{"post":{"tags":["Expert-Comptable"],"summary":"Rejeter une facture","operationId":"rejectInvoice","parameters":[{"name":"invoiceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"reason","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/{bt}/rollback/{version}":{"post":{"tags":["Field Management"],"summary":"Rollback vers une version antérieure","description":"Restaure un pattern vers une version précédente","operationId":"rollbackToVersion","parameters":[{"name":"bt","in":"path","description":"Code BT","required":true,"schema":{"type":"string"}},{"name":"version","in":"path","description":"Numéro de version","required":true,"schema":{"type":"integer","format":"int32"}}],"responses":{"200":{"description":"Rollback effectué","content":{"*/*":{"schema":{"$ref":"#/components/schemas/FieldConfigResponse"}}}},"404":{"description":"Champ ou version non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/FieldConfigResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/{bt}/pattern":{"post":{"tags":["Field Management"],"summary":"Créer une nouvelle version de pattern","description":"Crée une nouvelle version de pattern regex pour un champ","operationId":"createPatternVersion","parameters":[{"name":"bt","in":"path","description":"Code BT","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePatternVersionRequest"}}},"required":true},"responses":{"201":{"description":"Version créée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PatternVersionResponse"}}}},"400":{"description":"Requête invalide","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PatternVersionResponse"}}}},"404":{"description":"Champ non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PatternVersionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/{bt}/override":{"post":{"tags":["Field Management"],"summary":"Créer des overrides pour clients/groupes","description":"Force obligatoire, bypass ou pattern personnalisé pour des clients ou groupes","operationId":"createOverrides","parameters":[{"name":"bt","in":"path","description":"Code BT","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateOverrideRequest"}}},"required":true},"responses":{"201":{"description":"Overrides créés","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OverrideResponse"}}}}},"400":{"description":"Requête invalide","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OverrideResponse"}}}}},"404":{"description":"Champ non trouvé","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OverrideResponse"}}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/sync":{"post":{"tags":["Field Management"],"summary":"Synchroniser depuis la source unique","description":"Synchronise les champs EN16931 depuis ML Sidecar (source unique). Ajoute les champs manquants et met à jour les métadonnées modifiées.","operationId":"syncFromSource","responses":{"200":{"description":"Synchronisation effectuée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SyncResult"}}}},"500":{"description":"Erreur de synchronisation","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SyncResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/branding/toggle":{"patch":{"tags":["White-Label"],"summary":"Activer/désactiver le branding","operationId":"toggleBranding","parameters":[{"name":"active","in":"query","required":true,"schema":{"type":"boolean"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/ready":{"get":{"tags":["Health"],"summary":"Readiness check","description":"Vérifie que le service est prêt à recevoir des requêtes","operationId":"ready","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/health":{"get":{"tags":["Health"],"summary":"Health check","description":"Vérifie que le service est en vie","operationId":"health","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/api/v1/webhooks/signature-info":{"get":{"tags":["Webhooks"],"summary":"Information sur la signature","description":"Explique comment vérifier la signature HMAC-SHA256 des webhooks","operationId":"getSignatureInfo","responses":{"200":{"description":"Information sur la signature","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/webhooks/events":{"get":{"tags":["Webhooks"],"summary":"Lister les types d'événements","description":"Liste tous les types d'événements disponibles pour les webhooks","operationId":"listEventTypes","responses":{"200":{"description":"Liste des types d'événements","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/validation/rules":{"get":{"tags":["Validation"],"summary":"Lister les règles de validation disponibles","description":"Retourne la liste de toutes les règles de validation supportées\navec leur description, catégorie, sévérité et profil requis.\nUtile pour afficher un tableau de conformité côté frontend.\n","operationId":"getValidationRules","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/validation/auto-fix/actions":{"get":{"tags":["Validation"],"summary":"Lister les actions d'auto-correction disponibles","operationId":"getAutoFixActions","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/timestamp/providers":{"get":{"tags":["Horodatage"],"summary":"Liste des providers TSA","description":"**Providers TSA disponibles**\n\nRetourne la liste des autorités d'horodatage configurées,\nleur statut de qualification eIDAS et leur disponibilité.\n","operationId":"listProviders","responses":{"200":{"description":"Liste des providers","content":{"application/json":{"examples":{"Providers":{"description":"Providers","value":{"providers":[{"id":"universign","name":"Universign","eidasQualified":true,"country":"FR","status":"available"},{"id":"certeurope","name":"CertEurope","eidasQualified":true,"country":"FR","status":"available"},{"id":"freetsa","name":"FreeTSA","eidasQualified":false,"country":"DE","note":"Pour tests uniquement"}],"default":"auto","note":"En mode 'auto', le provider est sélectionné selon TSA_PROVIDER dans Infisical"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates/{code}":{"get":{"tags":["Templates"],"summary":"Récupérer un template par code","description":"Retourne les détails complets d'un template","operationId":"getByCode","parameters":[{"name":"code","in":"path","description":"Code unique du template","required":true,"schema":{"type":"string"},"example":"BTP_SITUATION"}],"responses":{"200":{"description":"Template trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TemplateDTO"}}}},"404":{"description":"Template non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/TemplateDTO"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates/sectors":{"get":{"tags":["Templates"],"summary":"Lister les secteurs disponibles","operationId":"listSectors","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates/sector/{sector}":{"get":{"tags":["Templates"],"summary":"Templates par secteur","description":"Retourne les templates d'un secteur spécifique","operationId":"listBySector","parameters":[{"name":"sector","in":"path","description":"Code du secteur","required":true,"schema":{"type":"string"},"example":"BTP"}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TemplateDTO"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/templates/flat":{"get":{"tags":["Templates"],"summary":"Lister tous les templates (non groupés)","operationId":"listTemplatesFlat","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TemplateDTO"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/ppf/status/{submissionId}":{"get":{"tags":["Soumission"],"summary":"Statut PPF","description":"**Récupérer le statut d'une soumission PPF**\n\nInterroge le PPF pour obtenir le statut actuel de la facture.\n\n## Statuts possibles\n\n| Statut | Description |\n|--------|-------------|\n| SUBMITTED | Soumission en cours |\n| DEPOSITED | Facture déposée |\n| RECEIVED | Reçue par le destinataire |\n| ACCEPTED | Acceptée |\n| REFUSED | Refusée |\n| PAID | Payée |\n| REJECTED | Rejetée (erreur technique) |\n","operationId":"getPpfStatus","parameters":[{"name":"submissionId","in":"path","description":"ID de soumission PPF","required":true,"schema":{"type":"string"},"example":"PPF-2025-123456"},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Statut récupéré","content":{"application/json":{"examples":{"StatusResponse":{"description":"StatusResponse","value":{"success":true,"submission_id":"PPF-2025-123456","platform":"PPF","status":"RECEIVED","status_date":"2025-01-15T14:30:00Z","status_history":[{"status":"SUBMITTED","date":"2025-01-15T10:30:45Z"},{"status":"DEPOSITED","date":"2025-01-15T10:31:00Z"},{"status":"RECEIVED","date":"2025-01-15T14:30:00Z"}]}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/ppf/cr/{idCompteRendu}":{"get":{"tags":["Soumission"],"summary":"Consulter le détail d'un compte-rendu","description":"**Récupère le détail complet** d'un compte-rendu identifié par son ID.\n\nL'ID est obtenu via `GET /ppf/cr/search`.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/submit/ppf/cr/12345?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"getCompteRendu","parameters":[{"name":"idCompteRendu","in":"path","description":"ID du compte-rendu","required":true,"schema":{"type":"integer","format":"int64"},"example":12345},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/ppf/cr/search":{"get":{"tags":["Soumission"],"summary":"Rechercher les comptes-rendus de flux PPF","description":"**Recherche les comptes-rendus** (motifs de rejet/acceptation) d'un flux déposé.\n\nLe numéro de flux est retourné lors du dépôt (ex: `CPP00111170000000003684xx`).\nPermet de comprendre pourquoi un flux a été rejeté.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/submit/ppf/cr/search?numeroFlux=CPP001111700000000368433&sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"searchCompteRendu","parameters":[{"name":"numeroFlux","in":"query","description":"Numéro de flux de dépôt","required":true,"schema":{"type":"string"},"example":"CPP001111700000000368433"},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Comptes-rendus trouvés","content":{"*/*":{"schema":{"type":"string"}}}},"404":{"description":"Aucun compte-rendu trouvé","content":{"*/*":{"schema":{"type":"string"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/platforms":{"get":{"tags":["Soumission"],"summary":"Plateformes disponibles","description":"Liste les plateformes de soumission avec leurs caractéristiques","operationId":"listPlatforms","responses":{"200":{"description":"Liste des plateformes","content":{"application/json":{"examples":{"Platforms":{"description":"Platforms","value":{"platforms":[{"id":"PPF","name":"Portail Public de Facturation","description":"Facturation B2B entre entreprises privées","mandatory":"Sept 2026 - Sept 2027 (progressif)","formats":["FACTURX","UBL","CII"],"sandboxAvailable":true,"documentation":"https://www.impots.gouv.fr/portail-public-facturation"},{"id":"CHORUS_PRO","name":"Chorus Pro","description":"Facturation vers le secteur public (B2G)","mandatory":"Obligatoire depuis 2020","formats":["FACTURX","UBL","CII","CPP"],"sandboxAvailable":true,"documentation":"https://communaute.chorus-pro.gouv.fr"}],"defaultSandbox":true}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/chorus/structure/{siret}":{"get":{"tags":["Soumission"],"summary":"Rechercher une structure","description":"**Recherche dans l'annuaire Chorus Pro**\n\nRecherche les informations d'une structure publique par SIRET\npour vérifier qu'elle est bien inscrite sur Chorus Pro.\n","operationId":"searchChorusStructure","parameters":[{"name":"siret","in":"path","description":"SIRET de la structure publique","required":true,"schema":{"type":"string"},"example":13002526500013},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Structure trouvée","content":{"application/json":{"examples":{"StructureInfo":{"description":"StructureInfo","value":{"found":true,"siret":"13002526500013","raison_sociale":"Ministère de l'Économie et des Finances","type_identifiant":"SIRET","statut_actif":true,"services":[{"code":"DAJ","nom":"Direction des Affaires Juridiques"},{"code":"DGFiP","nom":"Direction Générale des Finances Publiques"}]}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/submit/chorus/status/{submissionId}":{"get":{"tags":["Soumission"],"summary":"Statut Chorus Pro","description":"Récupère le statut d'une soumission à Chorus Pro","operationId":"getChorusStatus","parameters":[{"name":"submissionId","in":"path","description":"ID de soumission Chorus","required":true,"schema":{"type":"string"},"example":"FA-2025-12345"},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SubmissionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/status/diagnostic/piste":{"get":{"tags":["Statuts"],"summary":"Diagnostic PISTE - Compare fournisseur vs destinataire","description":"**Diagnostic complet** des appels PISTE.\n\nTeste en parallèle :\n- `rechercherFournisseur` → vérifie souscription opération fournisseur\n- `rechercherDestinataire` → vérifie souscription opération destinataire\n\nAffiche les URLs, codes HTTP, et bodies de réponse.\n\nUtile pour diagnostiquer les problèmes de souscription PISTE ou d'habilitation Chorus Pro.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/status/diagnostic/piste?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"diagnosticPiste","parameters":[{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/api/v1/status/diagnostic/e2e":{"get":{"tags":["Statuts"],"summary":"Diagnostic E2E - Vérification complète du pipeline Chorus Pro","description":"Vérifie le pipeline complet entre deux structures :\n- Recherche des structures dans l'annuaire Chorus Pro\n- Vérification des factures émises (fournisseur)\n- Vérification des factures reçues (destinataire)\n- Force un poll immédiat des factures entrantes\n\n## Paramètres\n- `emitterSiret` : SIRET de l'émetteur (ex: 15594894551514)\n- `recipientSiret` : SIRET du destinataire (ex: 99959642200017)\n- `sandbox` : Mode sandbox (défaut: true)\n- `poll` : Force poll immédiat (défaut: false)\n\n## Exemple cURL\n```bash\ncurl -X GET \"/api/v1/status/diagnostic/e2e?emitterSiret=15594894551514&recipientSiret=99959642200017&sandbox=true&poll=true\"\n```\n","operationId":"diagnosticE2E","parameters":[{"name":"emitterSiret","in":"query","required":false,"schema":{"type":"string","default":"15594894551514"}},{"name":"recipientSiret","in":"query","required":false,"schema":{"type":"string","default":"99959642200017"}},{"name":"sandbox","in":"query","required":false,"schema":{"type":"boolean","default":true}},{"name":"poll","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/api/v1/status/chorus/invoices":{"get":{"tags":["Statuts"],"summary":"Lister les factures soumises sur Chorus Pro","description":"**Récupère la liste de toutes les factures** soumises en tant que fournisseur\nvia l'API PISTE (rechercher/fournisseur).\n\nChaque facture contient :\n- `identifiantFactureCPP` : ID unique Chorus Pro\n- `statut` : Statut courant (MISE_A_DISPOSITION, REJETEE, etc.)\n- `numeroFluxDepot` : Numéro de flux (pour les soumissions API)\n- `modeDepot` : UPLOAD_API ou SAISIE_PORTAIL\n- Informations fournisseur/destinataire\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/status/chorus/invoices?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"listChorusInvoices","parameters":[{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Liste des factures","content":{"application/json":{"example":{"codeRetour":0,"libelle":"GCU_MSG_01_000","parametresRetour":{"pageCourante":1,"pages":1,"total":3},"listeFactures":[{"identifiantFactureCPP":8407056,"statut":"MISE_A_DISPOSITION","numeroFluxDepot":"CPP0011117000000000368438","modeDepot":"UPLOAD_API"}]}}}},"500":{"description":"Erreur PISTE","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/status/chorus/invoices/{identifiantCPP}":{"get":{"tags":["Statuts"],"summary":"Détails d'une facture Chorus Pro","description":"**Récupère le détail complet** d'une facture identifiée par son `identifiantFactureCPP`.\n\nL'ID est obtenu via `GET /chorus/invoices`.\n\nRetourne toutes les informations : statut, montants, TVA, destinataire,\nfournisseur, pièces jointes, lignes de poste.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/status/chorus/invoices/8407056?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"getChorusInvoiceDetail","parameters":[{"name":"identifiantCPP","in":"path","description":"Identifiant Chorus Pro de la facture","required":true,"schema":{"type":"integer","format":"int64"},"example":8407056},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Détail de la facture","content":{"*/*":{"schema":{"type":"string"}}}},"404":{"description":"Facture non trouvée sur Chorus Pro","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/status/chorus/incoming":{"get":{"tags":["Statuts"],"summary":"Rechercher les factures reçues en tant que destinataire","description":"**Appelle l'API PISTE** `POST /cpro/factures/v1/rechercher/destinataire`\npour lister les factures adressées à notre compte technique.\n\nRetourne la listeFactures avec identifiantFactureCPP, statut, montants,\nfournisseur, destinataire, dates.\n\n**Prérequis** : L'opération `rechercher/destinataire` doit être souscrite\nsur le portail PISTE pour l'application.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/status/chorus/incoming?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"listChorusIncomingInvoices","parameters":[{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Liste des factures reçues","content":{"*/*":{"schema":{"type":"string"}}}},"500":{"description":"Erreur PISTE ou 403 non souscrit","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/status/chorus/incoming/{identifiantCPP}":{"get":{"tags":["Statuts"],"summary":"Détails d'une facture reçue (destinataire)","description":"**Récupère le détail complet** d'une facture reçue identifiée par\nson `identifiantFactureCPP`, en tant que destinataire.\n\nRetourne statut, montants, fournisseur, pièces jointes, etc.\n\n**Prérequis** : L'opération `consulter/destinataire` doit être souscrite\nsur le portail PISTE.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/status/chorus/incoming/8407056?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"getChorusIncomingDetail","parameters":[{"name":"identifiantCPP","in":"path","description":"Identifiant Chorus Pro de la facture","required":true,"schema":{"type":"integer","format":"int64"},"example":8407056},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"Détail de la facture reçue","content":{"*/*":{"schema":{"type":"string"}}}},"404":{"description":"Facture non trouvée sur Chorus Pro","content":{"*/*":{"schema":{"type":"string"}}}}}}},"/api/v1/status/chorus/flux/{numeroFlux}":{"get":{"tags":["Statuts"],"summary":"Rechercher par numéro de flux","description":"**Recherche le statut d'un flux** spécifique par son numéro de flux.\n\nEssaie d'abord `rechercherCR` (compte-rendu), et si 403 (opération non souscrite),\nbascule sur `rechercherFournisseur` pour trouver la facture correspondante.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \"/api/v1/status/chorus/flux/CPP0011117000000000368438?sandbox=true\" \\\n  -H \"Authorization: Bearer <token>\"\n```\n","operationId":"getFluxStatus","parameters":[{"name":"numeroFlux","in":"path","description":"Numéro de flux","required":true,"schema":{"type":"string"},"example":"CPP0011117000000000368438"},{"name":"sandbox","in":"query","description":"Mode sandbox","required":false,"schema":{"type":"boolean","default":true},"example":true}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/api/v1/sign/info":{"get":{"tags":["Signature XAdES"],"summary":"Informations certificats","description":"Retourne les informations sur les certificats de signature disponibles\net la configuration actuelle du service.\n\n## Informations retournées\n- Liste des certificats disponibles\n- Dates de validité\n- Alias par défaut\n- Configuration TSA\n- Formats supportés\n","operationId":"getCertificateInfo","responses":{"200":{"description":"Informations certificats","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CertificateInfoResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/sign/health":{"get":{"tags":["Signature XAdES"],"summary":"État du service de signature","operationId":"healthCheck","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices":{"get":{"tags":["Cycle de vie"],"summary":"Lister les factures","description":"**Recherche et liste des factures avec filtres avancés**\n\nListe paginée des factures avec de nombreux filtres optionnels\npour le suivi et le pilotage de la facturation.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \\\n  'https://api.paraphix.fr/api/v1/invoices?status=ACCEPTED&page=0&size=20' \\\n  -H 'Authorization: Bearer <token>'\n```\n\n## Filtres disponibles\n\n| Paramètre | Description | Exemple |\n|-----------|-------------|---------|\n| status | Statut de la facture | ACCEPTED, PAID |\n| platform | Plateforme cible | PPF, CHORUS |\n| emitterSiret | SIRET émetteur | 12345678901234 |\n| recipientSiret | SIRET destinataire | 98765432109876 |\n| startDate | Date de début | 2025-01-01T00:00:00 |\n| endDate | Date de fin | 2025-12-31T23:59:59 |\n\n## Pagination et tri\n\n- Pagination 0-based (page=0 pour la première page)\n- Taille max: 100 éléments par page\n- Tri par défaut: createdAt DESC\n","operationId":"listInvoices","parameters":[{"name":"status","in":"query","description":"Filtrer par statut","required":false,"schema":{"type":"string","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]}},{"name":"platform","in":"query","description":"Filtrer par plateforme","required":false,"schema":{"type":"string","enum":["PPF","CHORUS","PDP"]}},{"name":"emitterSiret","in":"query","description":"Filtrer par SIRET émetteur","required":false,"schema":{"type":"string"}},{"name":"recipientSiret","in":"query","description":"Filtrer par SIRET destinataire","required":false,"schema":{"type":"string"}},{"name":"startDate","in":"query","description":"Date de début","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","description":"Date de fin","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","description":"Numéro de page (0-based)","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Taille de la page","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"sortBy","in":"query","description":"Champ de tri","required":false,"schema":{"type":"string","default":"created_at"}},{"name":"sortDir","in":"query","description":"Direction du tri (asc/desc)","required":false,"schema":{"type":"string","default":"desc"}}],"responses":{"200":{"description":"Liste des factures","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageInvoiceSummary"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/stats":{"get":{"tags":["Cycle de vie"],"summary":"Statistiques par statut","description":"Retourne le nombre de factures par statut.","operationId":"getStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"integer","format":"int64"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming":{"get":{"tags":["Factures Entrantes"],"summary":"Lister les factures reçues","description":"Retourne les factures entrantes avec filtres et pagination","operationId":"listIncoming","parameters":[{"name":"status","in":"query","description":"Statut","required":false,"schema":{"type":"string","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]}},{"name":"emitterSiret","in":"query","description":"SIRET émetteur","required":false,"schema":{"type":"string"}},{"name":"recipientSiret","in":"query","description":"SIRET destinataire","required":false,"schema":{"type":"string"}},{"name":"startDate","in":"query","description":"Date début","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"endDate","in":"query","description":"Date fin","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","description":"Page","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Taille page","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageInvoiceSummary"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/{id}":{"get":{"tags":["Factures Entrantes"],"summary":"Détail d'une facture reçue","operationId":"getIncoming","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/stats":{"get":{"tags":["Factures Entrantes"],"summary":"Statistiques des factures reçues","operationId":"getStats_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoices/incoming/poll":{"get":{"tags":["Factures Entrantes"],"summary":"Forcer un poll","description":"Déclenche un poll immédiat des factures entrantes pour un SIRET","operationId":"forcePoll","parameters":[{"name":"siret","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/{id}/history":{"get":{"tags":["Cycle de vie"],"summary":"Obtenir l'historique des statuts","description":"Retourne l'historique complet des changements de statut d'une facture.","operationId":"getHistory","parameters":[{"name":"id","in":"path","description":"ID de la facture","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Historique trouvé","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StatusHistoryEntry"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/transitions/{status}":{"get":{"tags":["Cycle de vie"],"summary":"Transitions valides","description":"Retourne les transitions de statut valides depuis un statut donné.","operationId":"getValidTransitions","parameters":[{"name":"status","in":"path","description":"Statut actuel","required":true,"schema":{"type":"string","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"string","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]},"uniqueItems":true}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/invoice/status":{"get":{"tags":["Cycle de vie"],"summary":"Obtenir le statut par numéro de facture","description":"Recherche une facture par son numéro et le SIRET de l'émetteur.","operationId":"getStatusByNumber","parameters":[{"name":"invoiceNumber","in":"query","description":"Numéro de facture","required":true,"schema":{"type":"string"}},{"name":"emitterSiret","in":"query","description":"SIRET de l'émetteur","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Statut trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}},"404":{"description":"Facture non trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/StatusResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting":{"get":{"tags":["E-Reporting"],"summary":"Lister les soumissions","description":"Liste les soumissions e-reporting pour une période donnée.","operationId":"listSubmissions","parameters":[{"name":"periodStart","in":"query","description":"Date de début de période (YYYY-MM-DD)","required":true,"schema":{"type":"string","format":"date"}},{"name":"periodEnd","in":"query","description":"Date de fin de période (YYYY-MM-DD)","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"Liste des soumissions","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/EReportingSubmission"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/{submissionId}":{"get":{"tags":["E-Reporting"],"summary":"Consulter une soumission","description":"Retourne le détail d'une soumission e-reporting.","operationId":"getSubmission","parameters":[{"name":"submissionId","in":"path","description":"Identifiant de la soumission","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Soumission trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingSubmission"}}}},"404":{"description":"Soumission non trouvée","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/templates/transactions":{"get":{"tags":["E-Reporting"],"summary":"Obtenir un template de rapport de transactions","description":"Retourne un exemple de rapport de transactions avec des données fictives.","operationId":"getTransactionTemplate","parameters":[{"name":"processType","in":"query","description":"Type de processus: SALES ou ACQUISITIONS","required":false,"schema":{"type":"string","default":"SALES","description":"Type de processus e-reporting","enum":["SALES","ACQUISITIONS"]}}],"responses":{"200":{"description":"Template de rapport","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingSubmission"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/templates/payments":{"get":{"tags":["E-Reporting"],"summary":"Obtenir un template de rapport de paiements","description":"Retourne un exemple de rapport de paiements avec des données fictives.","operationId":"getPaymentTemplate","parameters":[{"name":"processType","in":"query","description":"Type de processus: SALES ou ACQUISITIONS","required":false,"schema":{"type":"string","default":"SALES","description":"Type de processus e-reporting","enum":["SALES","ACQUISITIONS"]}}],"responses":{"200":{"description":"Template de rapport","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingSubmission"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/status/{submissionId}":{"get":{"tags":["E-Reporting"],"summary":"Consulter le statut d'une soumission","description":"Retourne le statut actuel d'une soumission e-reporting auprès du PPF.","operationId":"getSubmissionStatus","parameters":[{"name":"submissionId","in":"path","description":"Identifiant de la soumission","required":true,"schema":{"type":"string"}},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox PPF","required":false,"schema":{"type":"boolean","default":true}}],"responses":{"200":{"description":"Statut de la soumission","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}},"404":{"description":"Soumission non trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/EReportingResult"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/flux":{"get":{"tags":["E-Reporting"],"summary":"Documenter les flux e-reporting","description":"Retourne la description des différents flux e-reporting supportés.","operationId":"getFluxDocumentation","responses":{"200":{"description":"Documentation des flux","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/ereporting/categories":{"get":{"tags":["E-Reporting"],"summary":"Lister les catégories de transactions","description":"Retourne la liste des catégories de transactions e-reporting avec leur description.","operationId":"getCategories","responses":{"200":{"description":"Liste des catégories","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/cgu/history":{"get":{"tags":["CGU & Conditions PDP"],"summary":"Historique des acceptations CGU","operationId":"getHistory_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CguAcceptanceEntity"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/cgu/compliance":{"get":{"tags":["CGU & Conditions PDP"],"summary":"Vérifier la conformité CGU globale de l'utilisateur","operationId":"checkCompliance","parameters":[{"name":"currentVersion","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/cgu/check":{"get":{"tags":["CGU & Conditions PDP"],"summary":"Vérifier si les CGU sont acceptées","operationId":"checkAcceptance","parameters":[{"name":"cguVersion","in":"query","required":true,"schema":{"type":"string"}},{"name":"cguType","in":"query","required":false,"schema":{"type":"string","default":"GENERAL","enum":["GENERAL","PDP_ARCHIVAL","PDP_EREPORTING","API_USAGE"]}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/jobs":{"get":{"tags":["Bulk Upload"],"summary":"Lister les jobs d'upload en masse","operationId":"listJobs","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BulkJobResponse"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/bulk/jobs/{id}":{"get":{"tags":["Bulk Upload"],"summary":"Détail d'un job avec ses éléments","operationId":"getJob","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/BulkJobResponse"}}}}},"security":[{"bearerAuth":[]}]},"delete":{"tags":["Bulk Upload"],"summary":"Annuler/supprimer un job","operationId":"cancelJob","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK"}},"security":[{"bearerAuth":[]}]}},"/api/v1/branding/resolve":{"get":{"tags":["White-Label"],"summary":"Résoudre le branding par domaine personnalisé (public, sans auth)","operationId":"resolveByDomain","parameters":[{"name":"domain","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/auth/me":{"get":{"tags":["Authentification"],"summary":"Informations sur le client authentifié","description":"**Introspection du token JWT**\n\nRetourne les informations du client associé au token JWT fourni,\nainsi que les métadonnées du token lui-même.\n\n## Informations retournées\n\n- **client_id**: Identifiant du client\n- **client_name**: Nom du client\n- **scopes**: Permissions accordées\n- **issued_at**: Date d'émission du token\n- **expires_at**: Date d'expiration\n- **remaining_seconds**: Temps restant avant expiration\n\n## Exemple d'utilisation\n\n```bash\ncurl -X GET /api/v1/auth/me \\\n  -H \"Authorization: Bearer eyJhbGciOiJIUzI1NiIs...\"\n```\n","operationId":"getCurrentClient","responses":{"200":{"description":"Informations du client et du token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenInfo"},"examples":{"ClientInfo":{"description":"ClientInfo","value":{"client_id":"mon-application-b2b","client_name":"Mon Application B2B","valid":true,"token_type":"access_token","scopes":["invoice:read","invoice:write","submit"],"issued_at":"2025-01-15T10:00:00Z","expires_at":"2025-01-15T11:00:00Z","remaining_seconds":2547}}}}}},"401":{"description":"Non authentifié - Token manquant ou invalide","content":{"application/json":{"examples":{"NotAuthenticated":{"description":"NotAuthenticated","value":{"error":"not_authenticated","message":"Token d'accès requis"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/audit/stats":{"get":{"tags":["Audit"],"summary":"Statistiques du journal","description":"Récupère les statistiques globales du journal de preuves","operationId":"getStatistics","responses":{"200":{"description":"Statistiques récupérées","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/audit/recent":{"get":{"tags":["Audit"],"summary":"Entrées récentes","description":"Récupère les dernières entrées du journal global","operationId":"getRecentEntries","parameters":[{"name":"limit","in":"query","description":"Nombre d'entrées à récupérer","required":false,"schema":{"type":"integer","format":"int32","default":50}}],"responses":{"200":{"description":"Entrées récupérées","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditEntry"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/audit/document/{documentId}":{"get":{"tags":["Audit"],"summary":"Journal d'un document","description":"**Chaîne de preuves complète d'un document**\n\nRécupère toutes les entrées d'audit associées à un document,\nordonnées chronologiquement.\n\n## Exemple cURL\n\n```bash\ncurl -X GET \\\n  'https://api.paraphix.fr/api/v1/audit/document/ext-550e8400-e29b' \\\n  -H 'Authorization: Bearer <token>'\n```\n\n## Résultat\n\nListe ordonnée des opérations effectuées sur le document:\n- Création\n- Validation\n- Signature (si applicable)\n- Horodatage\n- Soumission\n- Changements de statut\n","operationId":"getDocumentAuditTrail","parameters":[{"name":"documentId","in":"path","description":"ID du document","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Journal récupéré","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditEntry"}}}}},"404":{"description":"Document non trouvé","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuditEntry"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/audit/document/{documentId}/verify":{"get":{"tags":["Audit"],"summary":"Vérifier l'intégrité du journal","description":"**Vérification cryptographique de la chaîne de preuves**\n\nVérifie l'intégrité de toutes les entrées d'audit d'un document\nen recalculant et comparant les hashes.\n\n## Vérifications effectuées\n\n1. **Intégrité individuelle**: Chaque hash correspond au contenu\n2. **Continuité de chaîne**: Liens previousHash valides\n3. **Complétude**: Aucune entrée manquante\n4. **Ordre chronologique**: Timestamps cohérents\n\n## Résultat\n\n```json\n{\n  \"valid\": true,\n  \"entriesVerified\": 5,\n  \"message\": \"Chaîne de preuves intègre\"\n}\n```\n\n## En cas d'erreur\n\n```json\n{\n  \"valid\": false,\n  \"entriesVerified\": 3,\n  \"message\": \"Rupture de chaîne détectée à l'entrée #4\"\n}\n```\n","operationId":"verifyDocumentChain","parameters":[{"name":"documentId","in":"path","description":"ID du document","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Vérification effectuée","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/audit/document/{documentId}/export":{"get":{"tags":["Audit"],"summary":"Exporter le journal","description":"Exporte le journal de preuves complet d'un document (format JSON)","operationId":"exportDocumentAuditTrail","parameters":[{"name":"documentId","in":"path","description":"ID du document","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Export réussi","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/archive/{invoiceId}/attestation":{"get":{"tags":["Archivage Légal"],"summary":"Télécharger l'attestation de conservation PDF","operationId":"getAttestation","parameters":[{"name":"invoiceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/archive/stats":{"get":{"tags":["Archivage Légal"],"summary":"Statistiques d'archivage","operationId":"getStats_2","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/archive/expiring":{"get":{"tags":["Archivage Légal"],"summary":"Nombre d'archives expirant dans les N prochains jours","operationId":"getExpiringArchives","parameters":[{"name":"days","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":30}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/stats":{"get":{"tags":["Approbations"],"summary":"Statistiques d'approbation","operationId":"getStats_3","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/approvals/pending":{"get":{"tags":["Approbations"],"summary":"Mes approbations en attente","operationId":"getMyPending","parameters":[{"name":"roles","in":"query","required":false,"schema":{"type":"string","default":""}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"object","additionalProperties":{"type":"object"}}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/siret/{siret}":{"get":{"tags":["Annuaire PPF"],"summary":"Consulter un établissement par SIRET","description":"Retourne les informations d'un établissement identifié par son numéro SIRET.","operationId":"getSiret","parameters":[{"name":"siret","in":"path","description":"Numéro SIRET (14 chiffres)","required":true,"schema":{"type":"string"},"example":12345678901234},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Établissement trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SiretInfo"}}}},"404":{"description":"Établissement non trouvé","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"SIRET invalide","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/siren/{siren}":{"get":{"tags":["Annuaire PPF"],"summary":"Consulter une entreprise par SIREN","description":"Retourne les informations d'une entreprise (unité légale) identifiée par son numéro SIREN.","operationId":"getSiren","parameters":[{"name":"siren","in":"path","description":"Numéro SIREN (9 chiffres)","required":true,"schema":{"type":"string"},"example":123456789},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Entreprise trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/SirenInfo"}}}},"404":{"description":"Entreprise non trouvée","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"SIREN invalide","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/routing/{siret}":{"get":{"tags":["Annuaire PPF"],"summary":"Obtenir les codes routage d'un SIRET","description":"Retourne les codes de routage disponibles pour un établissement (GLN, ODETTE, code service).","operationId":"getRoutingCodes","parameters":[{"name":"siret","in":"path","description":"Numéro SIRET (14 chiffres)","required":true,"schema":{"type":"string"},"example":12345678901234},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Codes routage trouvés","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"SIRET invalide","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/health":{"get":{"tags":["Annuaire PPF"],"summary":"Vérifier la disponibilité de l'API Annuaire","description":"Vérifie si l'API Annuaire PPF est accessible.","operationId":"healthCheck_1","parameters":[{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/directory/{identifiantAdressage}":{"get":{"tags":["Annuaire PPF"],"summary":"Consulter une ligne d'annuaire","description":"Retourne les informations d'une ligne d'annuaire par son identifiant d'adressage.","operationId":"getDirectoryEntry","parameters":[{"name":"identifiantAdressage","in":"path","description":"Identifiant d'adressage","required":true,"schema":{"type":"string"},"example":"123456789+12345678901234"},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Ligne trouvée","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DirectoryEntry"}}}},"404":{"description":"Ligne non trouvée","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/directory/siret/{siret}":{"get":{"tags":["Annuaire PPF"],"summary":"Lister les lignes d'annuaire d'un SIRET","description":"Retourne toutes les lignes d'annuaire associées à un SIRET.","operationId":"getDirectoryEntriesForSiret","parameters":[{"name":"siret","in":"path","description":"Numéro SIRET (14 chiffres)","required":true,"schema":{"type":"string"},"example":12345678901234},{"name":"sandbox","in":"query","description":"Utiliser l'environnement sandbox","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"Lignes trouvées","content":{"*/*":{"schema":{"type":"object"}}}},"400":{"description":"SIRET invalide","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/cache/stats":{"get":{"tags":["Annuaire PPF"],"summary":"Statistiques du cache","description":"Retourne les statistiques du cache de l'annuaire.","operationId":"getCacheStats","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/CacheStats"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/admin/stats":{"get":{"tags":["Administration"],"summary":"Statistiques clients","description":"Retourne les statistiques globales des clients API","operationId":"getStats_4","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/admin/clients/vault/{userId}":{"get":{"tags":["Administration"],"summary":"Récupérer le client d'un utilisateur Vault","description":"Retourne le client API B2B associé à un utilisateur Vault via son Keycloak user ID","operationId":"getClientByVaultUser","parameters":[{"name":"userId","in":"path","description":"Keycloak user ID","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Client trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"404":{"description":"Aucun client pour cet utilisateur","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}},"403":{"description":"Accès refusé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ClientResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/pending":{"get":{"tags":["Expert-Comptable"],"summary":"Factures en attente de validation comptable","operationId":"getPendingInvoices","parameters":[{"name":"clientIds","in":"query","required":true,"schema":{"type":"array","items":{"type":"string"}}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceEntity"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/dossiers":{"get":{"tags":["Expert-Comptable"],"summary":"Liste des dossiers gérés par le comptable","operationId":"getDossiers","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ClientDossier"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/dossiers/{clientId}/stats":{"get":{"tags":["Expert-Comptable"],"summary":"Statistiques d'un dossier","operationId":"getDossierStats","parameters":[{"name":"clientId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/DossierStats"}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/accountant/dossiers/{clientId}/entries":{"get":{"tags":["Expert-Comptable"],"summary":"Export écritures comptables pour une période","operationId":"getAccountingEntries","parameters":[{"name":"clientId","in":"path","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","required":true,"schema":{"type":"string","format":"date"}},{"name":"to","in":"query","required":true,"schema":{"type":"string","format":"date"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AccountingEntry"}}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields":{"get":{"tags":["Field Management"],"summary":"Liste paginée des champs EN16931","description":"Retourne les champs avec filtres optionnels sur groupe, obligatoire, formats supportés","operationId":"listFields","parameters":[{"name":"group","in":"query","description":"Groupe fonctionnel","required":false,"schema":{"type":"string"}},{"name":"required","in":"query","description":"Champs obligatoires uniquement","required":false,"schema":{"type":"boolean"}},{"name":"facturx","in":"query","description":"Supporté Factur-X","required":false,"schema":{"type":"boolean"}},{"name":"ubl","in":"query","description":"Supporté UBL","required":false,"schema":{"type":"boolean"}},{"name":"cii","in":"query","description":"Supporté CII","required":false,"schema":{"type":"boolean"}},{"name":"search","in":"query","description":"Recherche par nom/code","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","description":"Page (0-indexed)","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Taille de page","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"sortBy","in":"query","description":"Tri (btCode, fieldName, successRate)","required":false,"schema":{"type":"string","default":"btCode"}},{"name":"sortDir","in":"query","description":"Direction (asc, desc)","required":false,"schema":{"type":"string","default":"asc"}}],"responses":{"200":{"description":"Liste des champs","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageFieldConfigResponse"}}}},"401":{"description":"Non authentifié","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PageFieldConfigResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/{bt}/history":{"get":{"tags":["Field Management"],"summary":"Historique des versions de patterns","description":"Retourne l'historique paginé des versions de patterns pour un champ","operationId":"getPatternHistory","parameters":[{"name":"bt","in":"path","description":"Code BT","required":true,"schema":{"type":"string"}},{"name":"page","in":"query","description":"Page","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"Taille","required":false,"schema":{"type":"integer","format":"int32","default":10}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/PagePatternVersionResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/{bt}/details":{"get":{"tags":["Field Management"],"summary":"Détails complets d'un champ","description":"Retourne le champ avec son historique de patterns, overrides et métriques de performance","operationId":"getFieldDetails","parameters":[{"name":"bt","in":"path","description":"Code BT (ex: BT-1, BT-27)","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Détails du champ","content":{"*/*":{"schema":{"$ref":"#/components/schemas/FieldDetailResponse"}}}},"404":{"description":"Champ non trouvé","content":{"*/*":{"schema":{"$ref":"#/components/schemas/FieldDetailResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/stats":{"get":{"tags":["Field Management"],"summary":"Statistiques globales des champs","description":"Retourne les stats: total, obligatoires, taux moyen, régressions, couverture par format","operationId":"getStats_5","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/FieldStatsResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/groups":{"get":{"tags":["Field Management"],"summary":"Liste des groupes de clients","description":"Retourne les groupes de clients disponibles pour les overrides","operationId":"getClientGroups","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"array","items":{"type":"string"}}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/export":{"get":{"tags":["Field Management"],"summary":"Export des champs avec regex","description":"Exporte tous les champs EN16931 avec leurs patterns au format CSV ou JSON","operationId":"exportFields","parameters":[{"name":"format","in":"query","description":"Format (csv, json)","required":false,"schema":{"type":"string","default":"json"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/":{"get":{"tags":["Health"],"summary":"Root endpoint","description":"Informations de base sur l'API","operationId":"root","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"object"}}}}}}}},"/api/v1/annuaire/cache":{"delete":{"tags":["Annuaire PPF"],"summary":"Invalider le cache","description":"Invalide tout le cache de l'annuaire.","operationId":"invalidateCache","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}}},"security":[{"bearerAuth":[]}]}},"/api/v1/annuaire/cache/siret/{siret}":{"delete":{"tags":["Annuaire PPF"],"summary":"Invalider le cache pour un SIRET","description":"Invalide le cache de l'annuaire pour un SIRET spécifique.","operationId":"invalidateSiretCache","parameters":[{"name":"siret","in":"path","required":true,"schema":{"type":"string"}},{"name":"sandbox","in":"query","required":false,"schema":{"type":"boolean","default":false}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"object"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/pattern-version/{id}":{"delete":{"tags":["Field Management"],"summary":"Supprimer une version de pattern","description":"Supprime une version de pattern (sauf la version active)","operationId":"deletePatternVersion","parameters":[{"name":"id","in":"path","description":"ID de la version de pattern","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Version supprimée","content":{"*/*":{"schema":{"type":"string"}}}},"400":{"description":"Impossible de supprimer la version active","content":{"*/*":{"schema":{"type":"string"}}}},"404":{"description":"Version non trouvée","content":{"*/*":{"schema":{"type":"string"}}}}},"security":[{"bearerAuth":[]}]}},"/admin/api/v1/fields/override/{id}":{"delete":{"tags":["Field Management"],"summary":"Supprimer un override","description":"Désactive un override existant","operationId":"deleteOverride","parameters":[{"name":"id","in":"path","description":"ID de l'override","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"204":{"description":"Override supprimé"},"404":{"description":"Override non trouvé"}},"security":[{"bearerAuth":[]}]}}},"components":{"schemas":{"WebhookRegistrationRequest":{"type":"object","description":"Requête d'enregistrement webhook","properties":{"url":{"type":"string","description":"URL de destination du webhook","example":"https://api.client.com/webhooks/invoices","pattern":"^https://.*"},"name":{"type":"string","description":"Nom descriptif du webhook","example":"Production Invoice Webhook"},"description":{"type":"string","description":"Description","example":"Notifications factures production"},"events":{"type":"array","description":"Types d'événements à recevoir","example":["INVOICE_STATUS_CHANGED","INVOICE_ACCEPTED","INVOICE_REFUSED"],"items":{"type":"string","enum":["INVOICE_CREATED","INVOICE_VALIDATED","INVOICE_SUBMITTED","INVOICE_STATUS_CHANGED","INVOICE_ACCEPTED","INVOICE_REFUSED","INVOICE_PAID","INVOICE_CANCELLED","INVOICE_ERROR","PPF_DEPOSITED","PPF_REJECTED","PPF_RECEIVED","PPF_PAYMENT_RECEIVED","CHORUS_SUBMITTED","CHORUS_ACCEPTED","CHORUS_REJECTED","WEBHOOK_TEST","SYSTEM_NOTIFICATION"]},"uniqueItems":true},"secret":{"type":"string","description":"Secret personnalisé pour la signature HMAC (généré automatiquement si non fourni)"},"customHeaders":{"type":"object","additionalProperties":{"type":"string"},"description":"Headers HTTP personnalisés à inclure dans les requêtes webhook"},"timeoutSeconds":{"type":"integer","format":"int32","description":"Timeout en secondes (défaut: 30)","example":30},"maxRetries":{"type":"integer","format":"int32","description":"Nombre maximum de tentatives (défaut: 3)","example":3}},"required":["events","url"]},"WebhookConfig":{"type":"object","description":"Configuration webhook","properties":{"id":{"type":"string","format":"uuid","description":"ID de la configuration"},"url":{"type":"string","description":"URL de destination du webhook","example":"https://api.client.com/webhooks/invoices","pattern":"^https://.*"},"name":{"type":"string","description":"Nom descriptif","example":"Production Invoice Webhook"},"description":{"type":"string","description":"Description","example":"Webhook pour les notifications de factures en production"},"events":{"type":"array","description":"Types d'événements à recevoir","items":{"type":"string","enum":["INVOICE_CREATED","INVOICE_VALIDATED","INVOICE_SUBMITTED","INVOICE_STATUS_CHANGED","INVOICE_ACCEPTED","INVOICE_REFUSED","INVOICE_PAID","INVOICE_CANCELLED","INVOICE_ERROR","PPF_DEPOSITED","PPF_REJECTED","PPF_RECEIVED","PPF_PAYMENT_RECEIVED","CHORUS_SUBMITTED","CHORUS_ACCEPTED","CHORUS_REJECTED","WEBHOOK_TEST","SYSTEM_NOTIFICATION"]},"uniqueItems":true},"secret":{"type":"string","description":"Secret pour la signature HMAC (généré automatiquement si non fourni)"},"customHeaders":{"type":"object","additionalProperties":{"type":"string"},"description":"Headers HTTP personnalisés à envoyer"},"enabled":{"type":"boolean","description":"Webhook actif"},"payloadVersion":{"type":"string","description":"Version du payload","example":"v1"},"timeoutSeconds":{"type":"integer","format":"int32","description":"Timeout en secondes","example":30},"maxRetries":{"type":"integer","format":"int32","description":"Nombre maximum de tentatives","example":3},"retryIntervalMs":{"type":"integer","format":"int64","description":"Intervalle initial entre les tentatives (ms)","example":1000},"clientId":{"type":"string","description":"ID du client propriétaire"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"updatedAt":{"type":"string","format":"date-time","description":"Date de dernière modification"},"lastSuccessAt":{"type":"string","format":"date-time","description":"Dernière livraison réussie"},"lastErrorAt":{"type":"string","format":"date-time","description":"Dernière erreur"},"lastErrorMessage":{"type":"string","description":"Message de la dernière erreur"},"totalDeliveries":{"type":"integer","format":"int64","description":"Nombre total de livraisons"},"successfulDeliveries":{"type":"integer","format":"int64","description":"Nombre de livraisons réussies"},"failedDeliveries":{"type":"integer","format":"int64","description":"Nombre de livraisons échouées"},"successRate":{"type":"number","format":"double"}},"required":["events","url"]},"TenantBrandingEntity":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"clientId":{"type":"string"},"displayName":{"type":"string"},"logoUrl":{"type":"string"},"faviconUrl":{"type":"string"},"primaryColor":{"type":"string"},"secondaryColor":{"type":"string"},"accentColor":{"type":"string"},"customDomain":{"type":"string"},"watermarkText":{"type":"string"},"footerText":{"type":"string"},"contactEmail":{"type":"string"},"websiteUrl":{"type":"string"},"whiteLabel":{"type":"boolean"},"grayLabel":{"type":"boolean"},"customCss":{"type":"string"},"active":{"type":"boolean"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateClientRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":255,"minLength":2},"description":{"type":"string","maxLength":1000,"minLength":0},"scopes":{"type":"array","items":{"type":"string","pattern":"^[a-z]+:[a-z]+$"}},"rateLimitPerMinute":{"type":"integer","format":"int32","maximum":100000,"minimum":1},"rateLimitPerHour":{"type":"integer","format":"int32","maximum":1000000,"minimum":1},"rateLimitPerDay":{"type":"integer","format":"int32","maximum":10000000,"minimum":1},"webhookUrl":{"type":"string","maxLength":500,"minLength":0,"pattern":"^(https?://.*)?$"},"enabled":{"type":"boolean"}}},"ClientResponse":{"type":"object","properties":{"clientId":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"scopes":{"type":"array","items":{"type":"string"}},"rateLimitPerMinute":{"type":"integer","format":"int32"},"rateLimitPerHour":{"type":"integer","format":"int32"},"rateLimitPerDay":{"type":"integer","format":"int32"},"webhookUrl":{"type":"string"},"enabled":{"type":"boolean"},"requestsCount":{"type":"integer","format":"int64"},"lastUsedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"source":{"type":"string"},"vaultKeycloakUserId":{"type":"string"},"subscriptionTier":{"type":"string"},"clientSecretMasked":{"type":"string"},"clientSecret":{"type":"string"}}},"WebhookRegistrationResponse":{"type":"object","description":"Réponse d'enregistrement webhook","properties":{"webhookId":{"type":"string","format":"uuid","description":"ID du webhook créé"},"url":{"type":"string","description":"URL configurée"},"name":{"type":"string","description":"Nom du webhook"},"secret":{"type":"string","description":"Secret pour la vérification de signature HMAC-SHA256","example":"whsec_abc123..."},"events":{"type":"array","description":"Types d'événements configurés","items":{"type":"string","enum":["INVOICE_CREATED","INVOICE_VALIDATED","INVOICE_SUBMITTED","INVOICE_STATUS_CHANGED","INVOICE_ACCEPTED","INVOICE_REFUSED","INVOICE_PAID","INVOICE_CANCELLED","INVOICE_ERROR","PPF_DEPOSITED","PPF_REJECTED","PPF_RECEIVED","PPF_PAYMENT_RECEIVED","CHORUS_SUBMITTED","CHORUS_ACCEPTED","CHORUS_REJECTED","WEBHOOK_TEST","SYSTEM_NOTIFICATION"]},"uniqueItems":true},"enabled":{"type":"boolean","description":"Statut actif"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"success":{"type":"boolean","description":"Opération réussie"},"message":{"type":"string","description":"Message"}}},"WebhookDeliveryResult":{"type":"object","description":"Résultat de livraison webhook","properties":{"deliveryId":{"type":"string","format":"uuid","description":"ID de la livraison"},"webhookId":{"type":"string","format":"uuid","description":"ID du webhook"},"eventId":{"type":"string","format":"uuid","description":"ID de l'événement"},"url":{"type":"string","description":"URL de destination"},"status":{"type":"string","description":"Statut de la livraison","enum":["PENDING","DELIVERED","FAILED","RETRYING","DEAD_LETTER"]},"httpStatusCode":{"type":"integer","format":"int32","description":"Code HTTP de la réponse"},"responseBody":{"type":"string","description":"Corps de la réponse (tronqué)"},"errorMessage":{"type":"string","description":"Message d'erreur si échec"},"attemptNumber":{"type":"integer","format":"int32","description":"Numéro de la tentative"},"maxAttempts":{"type":"integer","format":"int32","description":"Nombre maximum de tentatives"},"durationMs":{"type":"integer","format":"int64","description":"Durée de la requête en ms"},"attemptedAt":{"type":"string","format":"date-time","description":"Timestamp de la tentative"},"nextRetryAt":{"type":"string","format":"date-time","description":"Prochaine tentative prévue (si retry)"}}},"WebhookTestRequest":{"type":"object","description":"Requête de test webhook","properties":{"webhookId":{"type":"string","format":"uuid","description":"ID du webhook à tester (optionnel si URL fournie)"},"url":{"type":"string","description":"URL à tester directement (optionnel si webhookId fourni)","example":"https://api.client.com/webhooks/test"},"eventType":{"type":"string","description":"Type d'événement à simuler","enum":["INVOICE_CREATED","INVOICE_VALIDATED","INVOICE_SUBMITTED","INVOICE_STATUS_CHANGED","INVOICE_ACCEPTED","INVOICE_REFUSED","INVOICE_PAID","INVOICE_CANCELLED","INVOICE_ERROR","PPF_DEPOSITED","PPF_REJECTED","PPF_RECEIVED","PPF_PAYMENT_RECEIVED","CHORUS_SUBMITTED","CHORUS_ACCEPTED","CHORUS_REJECTED","WEBHOOK_TEST","SYSTEM_NOTIFICATION"],"example":"INVOICE_STATUS_CHANGED"},"customData":{"type":"object","additionalProperties":{"type":"object"},"description":"Données personnalisées à inclure dans le payload de test"}}},"AdvancedValidationResponse":{"type":"object","description":"Résultat de validation avancée avec suggestions de correction","properties":{"valid":{"type":"boolean","description":"Document valide (aucune erreur)","example":false},"profile":{"type":"string","description":"Profil Factur-X détecté","example":"EN16931"},"format":{"type":"string","description":"Format détecté (CII, UBL)","example":"CII"},"errorCount":{"type":"integer","format":"int32","description":"Nombre d'erreurs","example":2},"warningCount":{"type":"integer","format":"int32","description":"Nombre d'avertissements","example":3},"autoFixableCount":{"type":"integer","format":"int32","description":"Nombre de suggestions de correction auto-applicables","example":1},"complianceScore":{"type":"integer","format":"int32","description":"Score de conformité (0-100)","example":75},"issues":{"type":"array","description":"Issues enrichies avec suggestions","items":{"$ref":"#/components/schemas/EnrichedIssue"}},"categorySummary":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/CategorySummary"},"description":"Résumé par catégorie"},"meta":{"$ref":"#/components/schemas/ValidationMeta","description":"Métadonnées de validation"}}},"CategorySummary":{"type":"object","description":"Résumé d'une catégorie de validation","properties":{"errors":{"type":"integer","format":"int32","description":"Nombre d'erreurs dans la catégorie"},"warnings":{"type":"integer","format":"int32","description":"Nombre d'avertissements dans la catégorie"},"autoFixable":{"type":"integer","format":"int32","description":"Nombre d'éléments corrigeables automatiquement"},"description":{"type":"string","description":"Description de la catégorie"}}},"EnrichedIssue":{"type":"object","description":"Issue de validation enrichie avec suggestion de correction","properties":{"severity":{"type":"string","description":"Sévérité (ERROR, WARNING, INFO)","example":"ERROR"},"code":{"type":"string","description":"Code règle (BR-xx, BT-xx, XSD-xx)","example":"BR-01"},"field":{"type":"string","description":"Champ concerné","example":"invoice_number"},"tab":{"type":"string","description":"Section/onglet","example":"informations"},"message":{"type":"string","description":"Message d'erreur"},"location":{"type":"string","description":"Emplacement XPath ou ligne","example":"Line 42"},"rule":{"type":"string","description":"Règle Schematron violée"},"category":{"type":"string","description":"Catégorie: STRUCTURE, CONTENT, CALCULATION, FORMAT, FRENCH_SPECIFIC"},"suggestion":{"type":"string","description":"Suggestion de correction","example":"Ajoutez un numéro de facture unique (BT-1)"},"btReference":{"type":"string","description":"Référence Business Term EN16931","example":"BT-1"},"documentation":{"type":"string","description":"Lien documentation"},"autoFixable":{"type":"boolean","description":"Corrigeable automatiquement ?","example":false},"autoFixAction":{"type":"string","description":"Action de correction automatique","example":"SET_CURRENT_DATE"}}},"ValidationMeta":{"type":"object","description":"Métadonnées de validation","properties":{"latencyMs":{"type":"integer","format":"int64","description":"Latence en ms","example":45},"xsdSchema":{"type":"string","description":"XSD utilisé","example":"EN16931_CIUS_FR.xsd"},"schematronSchema":{"type":"string","description":"Schematron utilisé","example":"EN16931-UBL.sch"},"xmlFound":{"type":"boolean","description":"XML embarqué trouvé","example":true},"xmlSize":{"type":"integer","format":"int32","description":"Taille du XML en bytes","example":4250}}},"ValidationIssue":{"type":"object","description":"Erreur ou avertissement de validation","properties":{"severity":{"type":"string","description":"Niveau de sévérité (ERROR, WARNING, INFO)","example":"ERROR"},"code":{"type":"string","description":"Code de l'erreur (BT-xxx pour EN16931)","example":"BT-1"},"field":{"type":"string","description":"Champ concerné","example":"invoice_number"},"tab":{"type":"string","description":"Onglet/section concernée","example":"informations"},"message":{"type":"string","description":"Message d'erreur","example":"Numéro de facture manquant (BT-1)"},"location":{"type":"string","description":"Emplacement de l'erreur (XPath ou ligne)","example":"Line 42"},"rule":{"type":"string","description":"Règle Schematron violée"}}},"ValidationResponse":{"type":"object","description":"Résultat de la validation Factur-X","properties":{"profile":{"type":"string","description":"Profil Factur-X détecté","example":"EN16931"},"version":{"type":"string","description":"Version Factur-X","example":1.0},"errorCount":{"type":"integer","format":"int32","description":"Nombre d'erreurs","example":0},"warningCount":{"type":"integer","format":"int32","description":"Nombre d'avertissements","example":2},"issues":{"type":"array","description":"Liste des erreurs et avertissements","items":{"$ref":"#/components/schemas/ValidationIssue"}},"meta":{"$ref":"#/components/schemas/ValidationMeta","description":"Métadonnées de validation"},"is_valid":{"type":"boolean","description":"Document valide","example":true}}},"TimestampMeta":{"type":"object","description":"Métadonnées de l'horodatage","properties":{"latencyMs":{"type":"integer","format":"int64","description":"Latence en ms","example":450},"tsaUrl":{"type":"string","description":"URL de la TSA utilisée"},"tokenSize":{"type":"integer","format":"int32","description":"Taille du token en bytes","example":2048},"eidasCompliant":{"type":"boolean","description":"Conformité eIDAS","example":true}}},"TimestampResponse":{"type":"object","description":"Résultat de l'horodatage TSA","properties":{"success":{"type":"boolean","description":"Succès de l'opération"},"error":{"type":"string","description":"Message d'erreur si échec"},"timestampToken":{"type":"string","description":"Token d'horodatage RFC 3161 (Base64)"},"documentHash":{"type":"string","description":"Hash du document horodaté (hex)"},"hashAlgorithm":{"type":"string","description":"Algorithme de hash utilisé","example":"SHA-256"},"timestamp":{"type":"string","format":"date-time","description":"Date/heure de l'horodatage (ISO 8601)"},"serialNumber":{"type":"string","description":"Numéro de série du token"},"provider":{"type":"string","description":"Provider TSA utilisé","example":"universign"},"tsaName":{"type":"string","description":"Nom de la TSA"},"policyOid":{"type":"string","description":"Politique TSA (OID)"},"certificate":{"type":"string","description":"Certificat TSA (Base64, si demandé)"},"nonce":{"type":"string","description":"Nonce utilisé (si fourni)"},"meta":{"$ref":"#/components/schemas/TimestampMeta","description":"Métadonnées"}}},"CreateTemplateRequest":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"sector":{"type":"string"},"profile":{"type":"string"},"templateData":{"type":"object","additionalProperties":{"type":"object"}},"defaultCurrency":{"type":"string"},"defaultVatRate":{"type":"number"},"defaultPaymentTermsDays":{"type":"integer","format":"int32"},"requiredFields":{"type":"array","items":{"type":"string"}},"optionalFields":{"type":"array","items":{"type":"string"}},"validationRules":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"clientId":{"type":"string"}}},"ApplyTemplateRequest":{"type":"object","properties":{"templateCode":{"type":"string"},"invoiceData":{"type":"object","additionalProperties":{"type":"object"}}}},"DepositDetails":{"type":"object","description":"Détails du dépôt","properties":{"depositNumber":{"type":"string","description":"Numéro de dépôt","example":"DEP-2024-123456"},"depositDate":{"type":"string","format":"date-time","description":"Date de dépôt"},"flowId":{"type":"string","description":"ID flux","example":"F1"},"format":{"type":"string","description":"Format de la facture","example":"FACTURX"},"billingContext":{"type":"string","description":"Cadre de facturation","example":"A1_FACTURE_FOURNISSEUR"},"emitterSiret":{"type":"string","description":"SIRET émetteur"},"recipientSiret":{"type":"string","description":"SIRET destinataire"},"amountTtc":{"type":"number","description":"Montant TTC"},"currency":{"type":"string","description":"Devise"}}},"SubmissionMeta":{"type":"object","description":"Métadonnées de soumission","properties":{"latencyMs":{"type":"integer","format":"int64","description":"Latence en ms","example":1250},"sandbox":{"type":"boolean","description":"Mode sandbox","example":true},"apiVersion":{"type":"string","description":"Version API utilisée","example":"v3.0"},"endpoint":{"type":"string","description":"Endpoint utilisé"},"correlationId":{"type":"string","description":"ID de corrélation"},"attempts":{"type":"integer","format":"int32","description":"Nombre de tentatives"}}},"SubmissionResponse":{"type":"object","description":"Résultat de la soumission de facture","properties":{"success":{"type":"boolean","description":"Succès de la soumission"},"error":{"type":"string","description":"Message d'erreur si échec"},"submissionId":{"type":"string","description":"ID de soumission (ticket de dépôt)"},"documentId":{"type":"string","description":"ID du document dans ParaphiX"},"platform":{"type":"string","description":"Plateforme utilisée","example":"PPF"},"status":{"type":"string","description":"Statut de la soumission","enum":["PENDING","SUBMITTED","PROCESSING","ACCEPTED","REJECTED","ERROR","CANCELLED"]},"submittedAt":{"type":"string","format":"date-time","description":"Date/heure de soumission"},"invoiceNumber":{"type":"string","description":"Numéro de facture"},"trackingUrl":{"type":"string","description":"URL de suivi sur la plateforme"},"webhookUrl":{"type":"string","description":"URL du webhook enregistré"},"deposit":{"$ref":"#/components/schemas/DepositDetails","description":"Détails du dépôt"},"meta":{"$ref":"#/components/schemas/SubmissionMeta","description":"Métadonnées de soumission"}}},"CertificateInfo":{"type":"object","description":"Informations sur le certificat de signature","properties":{"subject":{"type":"string","description":"Sujet du certificat (CN)"},"issuer":{"type":"string","description":"Émetteur du certificat"},"serialNumber":{"type":"string","description":"Numéro de série"},"validFrom":{"type":"string","format":"date-time","description":"Date de début de validité"},"validTo":{"type":"string","format":"date-time","description":"Date de fin de validité"},"signatureAlgorithm":{"type":"string","description":"Algorithme de signature du certificat"},"keySize":{"type":"integer","format":"int32","description":"Taille de clé en bits"},"qualifiedCertificate":{"type":"boolean","description":"Certificat qualifié eIDAS"}}},"SignatureResponse":{"type":"object","description":"Réponse de signature numérique","properties":{"success":{"type":"boolean","description":"Succès de l'opération"},"signatureId":{"type":"string","description":"ID unique de la signature"},"signatureFormat":{"type":"string","description":"Format de signature appliqué","example":"XAdES-B"},"packaging":{"type":"string","description":"Packaging utilisé","example":"ENVELOPED"},"signedAt":{"type":"string","format":"date-time","description":"Date/heure de signature"},"signedDocumentBase64":{"type":"string","description":"Document signé encodé en Base64"},"signedFileName":{"type":"string","description":"Nom du fichier signé"},"signedDocumentSize":{"type":"integer","format":"int64","description":"Taille du document signé en octets"},"originalDocumentHash":{"type":"string","description":"Hash du document original (SHA256)"},"signedDocumentHash":{"type":"string","description":"Hash du document signé (SHA256)"},"certificate":{"$ref":"#/components/schemas/CertificateInfo","description":"Informations sur le certificat utilisé"},"timestamp":{"$ref":"#/components/schemas/TimestampInfo","description":"Informations sur le timestamp (si XAdES-T ou supérieur)"},"errorMessage":{"type":"string","description":"Message d'erreur si échec"},"errorDetails":{"type":"array","description":"Détails d'erreur","items":{"type":"string"}}}},"TimestampInfo":{"type":"object","description":"Informations sur le timestamp TSA","properties":{"timestampTime":{"type":"string","format":"date-time","description":"Date/heure du timestamp"},"tsaName":{"type":"string","description":"Autorité TSA"},"hashAlgorithm":{"type":"string","description":"Algorithme de hash utilisé"},"qualifiedTimestamp":{"type":"boolean","description":"Timestamp qualifié eIDAS"},"tokenBase64":{"type":"string","description":"Token RFC 3161 en Base64"}}},"SignatureDetail":{"type":"object","description":"Détail d'une signature","properties":{"signatureId":{"type":"string","description":"ID de la signature"},"signatureFormat":{"type":"string","description":"Format de signature détecté"},"signatureLevel":{"type":"string","description":"Niveau de signature (B, T, LT, LTA)"},"valid":{"type":"boolean","description":"Signature valide"},"indication":{"type":"string","description":"Indication"},"subIndication":{"type":"string","description":"Sous-indication"},"signingTime":{"type":"string","format":"date-time","description":"Date de signature"},"certificate":{"$ref":"#/components/schemas/CertificateInfo","description":"Informations certificat"},"timestamp":{"$ref":"#/components/schemas/TimestampInfo","description":"Informations timestamp"},"documentIntact":{"type":"boolean","description":"Intégrité du document préservée"},"certificateValid":{"type":"boolean","description":"Certificat valide au moment de la signature"},"qualifiedCertificate":{"type":"boolean","description":"Certificat qualifié eIDAS"},"tslValid":{"type":"boolean","description":"Trust Service List (TSL) valide"}}},"SignatureValidationResult":{"type":"object","description":"Résultat de validation de signature","properties":{"valid":{"type":"boolean","description":"Signature valide"},"indication":{"type":"string","description":"Indication globale (TOTAL_PASSED, TOTAL_FAILED, INDETERMINATE)"},"subIndication":{"type":"string","description":"Sous-indication si pas TOTAL_PASSED"},"signatureCount":{"type":"integer","format":"int32","description":"Nombre de signatures trouvées"},"signatures":{"type":"array","description":"Détails de chaque signature","items":{"$ref":"#/components/schemas/SignatureDetail"}},"errors":{"type":"array","description":"Erreurs de validation","items":{"$ref":"#/components/schemas/ValidationError"}},"warnings":{"type":"array","description":"Avertissements","items":{"type":"string"}}}},"ValidationError":{"type":"object","description":"Erreur de validation","properties":{"field":{"type":"string","description":"Chemin du champ en erreur","example":"transactions[0].monetaryTotal.taxAmount"},"code":{"type":"string","description":"Code d'erreur"},"message":{"type":"string","description":"Message d'erreur"},"invalidValue":{"type":"string","description":"Valeur invalide"},"severity":{"type":"string","description":"Sévérité (ERROR, WARNING)","enum":["ERROR","WARNING"]}}},"SseEmitter":{"type":"object","properties":{"timeout":{"type":"integer","format":"int64"}}},"StatusUpdateRequest":{"type":"object","description":"Requête de mise à jour du statut d'une facture","properties":{"newStatus":{"type":"string","description":"Nouveau statut de la facture","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"],"example":"ACCEPTED"},"source":{"type":"string","description":"Source du changement","enum":["API","PPF","CHORUS","WEBHOOK","SYSTEM","USER","SCHEDULER"],"example":"API"},"reason":{"type":"string","description":"Raison du changement de statut","example":"Facture acceptée par le destinataire","maxLength":1000,"minLength":0},"details":{"type":"string","description":"Détails supplémentaires (JSON)","example":{"acceptedBy":"comptabilite@client.fr"}}},"required":["newStatus"]},"StatusResponse":{"type":"object","description":"Statut actuel d'une facture","properties":{"invoiceId":{"type":"string","format":"uuid","description":"ID de la facture"},"invoiceNumber":{"type":"string","description":"Numéro de facture","example":"FAC-2025-001"},"status":{"type":"string","description":"Statut actuel","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"],"example":"ACCEPTED"},"previousStatus":{"type":"string","description":"Statut précédent","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"],"example":"RECEIVED"},"platform":{"type":"string","description":"Plateforme de destination","enum":["PPF","CHORUS","PDP"],"example":"PPF"},"externalId":{"type":"string","description":"ID externe (PPF/Chorus)","example":"PPF-12345678"},"depositNumber":{"type":"string","description":"Numéro de dépôt","example":"DEP-2025-0001234"},"errorMessage":{"type":"string","description":"Message d'erreur si applicable"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"updatedAt":{"type":"string","format":"date-time","description":"Date de dernière mise à jour"},"success":{"type":"boolean","description":"Opération réussie"},"message":{"type":"string","description":"Message de résultat"}}},"DocumentAllowance":{"type":"object","description":"Remise de document (BT-92 à BT-98)","properties":{"amount":{"type":"number","description":"Montant remise (BT-92)","example":100.0},"baseAmount":{"type":"number","description":"Montant de base (BT-93)","example":1000.0},"percentage":{"type":"number","description":"Pourcentage (BT-94)","example":10.0},"vatCategoryCode":{"type":"string","description":"Code catégorie TVA (BT-95)","example":"S"},"vatRate":{"type":"number","description":"Taux TVA (BT-96)","example":20.0},"reason":{"type":"string","description":"Motif (BT-97)","example":"Remise commerciale"},"reasonCode":{"type":"string","description":"Code motif (BT-98)","example":95}}},"DocumentCharge":{"type":"object","description":"Charge de document (BT-99 à BT-105)","properties":{"amount":{"type":"number","description":"Montant charge (BT-99)","example":50.0},"baseAmount":{"type":"number","description":"Montant de base (BT-100)","example":1000.0},"percentage":{"type":"number","description":"Pourcentage (BT-101)","example":5.0},"vatCategoryCode":{"type":"string","description":"Code catégorie TVA (BT-102)","example":"S"},"vatRate":{"type":"number","description":"Taux TVA (BT-103)","example":20.0},"reason":{"type":"string","description":"Motif (BT-104)","example":"Frais de port"},"reasonCode":{"type":"string","description":"Code motif (BT-105)","example":"ABL"}}},"ExtractedData":{"type":"object","description":"Données structurées extraites de la facture","properties":{"invoiceNumber":{"type":"string","description":"Numéro de facture","example":"FACT-2024-001"},"issueDate":{"type":"string","format":"date","description":"Date d'émission","example":"2024-01-15"},"dueDate":{"type":"string","format":"date","description":"Date d'échéance","example":"2024-02-15"},"typeCode":{"type":"string","description":"Type de document BT-3 (380=Facture, 381=Avoir)","example":380},"currencyCode":{"type":"string","description":"Devise BT-5 (code ISO 4217)","example":"EUR"},"seller":{"$ref":"#/components/schemas/Party","description":"Informations vendeur"},"buyer":{"$ref":"#/components/schemas/Party","description":"Informations acheteur"},"taxExclusiveAmount":{"type":"number","description":"Montant HT total BT-109 (taxExclusiveAmount)","example":1000.0},"taxAmount":{"type":"number","description":"Montant TVA total BT-110 (taxAmount)","example":200.0},"taxInclusiveAmount":{"type":"number","description":"Montant TTC total BT-112 (taxInclusiveAmount)","example":1200.0},"taxCategoryRate":{"type":"number","description":"Taux TVA principal BT-119 (taxCategoryRate)","example":20.0},"lines":{"type":"array","description":"Lignes de facture","items":{"$ref":"#/components/schemas/InvoiceLine"}},"payment":{"$ref":"#/components/schemas/PaymentInfo","description":"Informations de paiement"},"confidence":{"type":"number","format":"double","description":"Score de confiance global (0-1)","example":0.92},"buyerReference":{"type":"string","description":"Référence acheteur (BT-10)","example":"PO-2024-001"},"orderReference":{"type":"string","description":"Référence commande (BT-13)","example":"CMD-2024-001"},"contractReference":{"type":"string","description":"Référence contrat (BT-12)","example":"CONTRACT-2024"},"billingPeriodStart":{"type":"string","format":"date","description":"Début période de facturation (BT-73)","example":"2024-01-01"},"billingPeriodEnd":{"type":"string","format":"date","description":"Fin période de facturation (BT-74)","example":"2024-01-31"},"deliveryDate":{"type":"string","format":"date","description":"Date de livraison (BT-72)","example":"2024-01-10"},"deliveryLocation":{"type":"string","description":"Lieu de livraison (BT-71)","example":15},"projectReference":{"type":"string","description":"Référence projet (BT-11)","example":"PROJ-2024-001"},"note":{"type":"string","description":"Note/Commentaire (BT-22)","example":"Facture mensuelle"},"prepaidAmount":{"type":"number","description":"Acompte payé (BT-113)","example":500.0},"netPayable":{"type":"number","description":"Net à payer (BT-115)","example":700.0},"discountAmount":{"type":"number","description":"Remise globale (BT-92)","example":50.0},"totalLinesNet":{"type":"number","description":"Somme des montants nets des lignes (BT-106)","example":1000.0},"totalCharges":{"type":"number","description":"Somme des charges (BT-108)","example":50.0},"roundingAmount":{"type":"number","description":"Montant arrondi (BT-114)","example":0.01},"taxCurrency":{"type":"string","description":"Devise TVA (BT-6)","example":"EUR"},"salesOrderId":{"type":"string","description":"Numéro ordre vente (BT-14)","example":"SO-2024-001"},"receiptReference":{"type":"string","description":"Référence avis réception (BT-15)","example":"RCV-2024-001"},"despatchReference":{"type":"string","description":"Référence avis expédition (BT-16)","example":"DSP-2024-001"},"tenderReference":{"type":"string","description":"Référence appel d'offres (BT-17)","example":"TENDER-2024"},"invoicedObjectId":{"type":"string","description":"Identifiant objet facturé (BT-18)","example":"OBJ-12345"},"buyerAccountingRef":{"type":"string","description":"Référence comptable acheteur (BT-19)","example":"ACCT-2024"},"noteCode":{"type":"string","description":"Code note (BT-21)","example":"AAA"},"deliveryName":{"type":"string","description":"Nom destinataire livraison (BT-70)","example":"Entrepôt Central"},"taxPointDate":{"type":"string","format":"date","description":"Date d'exigibilité TVA (BT-7)","example":"2024-01-31"},"taxPointCode":{"type":"string","description":"Code date d'exigibilité TVA (BT-8)","example":35},"invoicedObjectSchemeId":{"type":"string","description":"Identifiant du schéma objet facturé (BT-18-1)","example":"0088"},"businessProcessType":{"type":"string","description":"Type de processus métier (BT-23)","example":"urn:cen.eu:en16931:2017"},"specificationIdentifier":{"type":"string","description":"Type de profil e-invoicing (BT-24)","example":"urn:factur-x.eu:1p0:extended"},"precedingInvoiceReference":{"type":"string","description":"Référence facture antérieure (BT-25)","example":"FACT-2023-100"},"precedingInvoiceIssueDate":{"type":"string","format":"date","description":"Date facture antérieure (BT-26)","example":"2023-12-15"},"payee":{"$ref":"#/components/schemas/Payee","description":"Informations bénéficiaire paiement"},"sellerTaxRepresentative":{"$ref":"#/components/schemas/TaxRepresentative","description":"Représentant fiscal du vendeur"},"deliveryLocationId":{"type":"string","description":"Identifiant établissement livraison (BT-71)","example":"SIRET-12345"},"deliveryAddress":{"type":"string","description":"Adresse livraison ligne 1 (BT-75)","example":123},"deliveryAddress2":{"type":"string","description":"Adresse livraison ligne 2 (BT-76)","example":"Bâtiment A"},"deliveryAddress3":{"type":"string","description":"Adresse livraison ligne 3 (BT-165)","example":"Zone industrielle"},"deliveryCity":{"type":"string","description":"Ville livraison (BT-77)","example":"Lyon"},"deliveryPostalCode":{"type":"string","description":"Code postal livraison (BT-78)","example":69001},"deliveryRegion":{"type":"string","description":"Région livraison (BT-79)","example":"Auvergne-Rhône-Alpes"},"deliveryCountry":{"type":"string","description":"Pays livraison (BT-80)","example":"FR"},"documentAllowances":{"type":"array","description":"Remises au niveau document","items":{"$ref":"#/components/schemas/DocumentAllowance"}},"documentCharges":{"type":"array","description":"Charges au niveau document","items":{"$ref":"#/components/schemas/DocumentCharge"}},"totalVatAccountingCurrency":{"type":"number","description":"Total TVA devise comptabilisation (BT-111)","example":200.0},"vatBreakdown":{"type":"array","description":"Ventilation TVA par taux","items":{"$ref":"#/components/schemas/VatBreakdown"}},"supportingDocuments":{"type":"array","description":"Documents justificatifs","items":{"$ref":"#/components/schemas/SupportingDocument"}}}},"InvoiceLine":{"type":"object","description":"Ligne de facture (BT-126 à BT-158)","properties":{"lineId":{"type":"string","description":"Identifiant de ligne (BT-126)","example":1},"lineNumber":{"type":"integer","format":"int32","description":"Numéro de ligne (legacy)","example":1},"note":{"type":"string","description":"Note de ligne (BT-127)","example":"Remise exceptionnelle"},"objectIdentifier":{"type":"string","description":"Identifiant objet facturé (BT-128)","example":"PROJ-2024-001"},"objectIdentifierSchemeId":{"type":"string","description":"Schéma identifiant objet (BT-128-1)","example":"CWO"},"lineQuantity":{"type":"number","description":"Quantité facturée BT-129 (lineQuantity)","example":10.0},"lineQuantityUnitCode":{"type":"string","description":"Unité BT-130 (lineQuantityUnitCode)","example":"H"},"lineNetAmount":{"type":"number","description":"Montant net ligne BT-131 (lineNetAmount)","example":1000.0},"orderLineReference":{"type":"string","description":"Référence commande ligne (BT-132)","example":"PO-2024-001-01"},"accountingCost":{"type":"string","description":"Référence comptable (BT-133)","example":607100},"periodStart":{"type":"string","format":"date","description":"Début période facturation (BT-134)","example":"2024-01-01"},"periodEnd":{"type":"string","format":"date","description":"Fin période facturation (BT-135)","example":"2024-01-31"},"lineAllowances":{"type":"array","description":"Remises de ligne (BT-136 à BT-140)","items":{"$ref":"#/components/schemas/LineAllowance"}},"lineCharges":{"type":"array","description":"Charges de ligne (BT-141 à BT-145)","items":{"$ref":"#/components/schemas/LineCharge"}},"itemNetPrice":{"type":"number","description":"Prix unitaire net BT-146 (itemNetPrice)","example":100.0},"priceDiscount":{"type":"number","description":"Remise sur prix unitaire (BT-147)","example":5.0},"itemGrossPrice":{"type":"number","description":"Prix unitaire brut BT-148 (itemGrossPrice)","example":105.0},"baseQuantity":{"type":"number","description":"Quantité de base prix (BT-149)","example":1},"baseQuantityUnit":{"type":"string","description":"Unité quantité de base (BT-150)","example":"C62"},"lineTaxRate":{"type":"number","description":"Taux TVA ligne BT-152 (lineTaxRate)","example":20.0},"lineTaxCategoryCode":{"type":"string","description":"Code catégorie TVA ligne BT-151 (lineTaxCategoryCode)","example":"S"},"itemName":{"type":"string","description":"Nom article (BT-153)","example":"Prestation de conseil"},"itemDescription":{"type":"string","description":"Description article BT-154 (itemDescription)","example":"Prestation de conseil informatique"},"sellerItemId":{"type":"string","description":"Identifiant vendeur article (BT-155)","example":"PREST-001"},"buyerItemId":{"type":"string","description":"Identifiant acheteur article (BT-156)","example":"ART-CONSEIL"},"standardItemId":{"type":"string","description":"Identifiant standard article (BT-157)","example":1234567890123},"standardItemSchemeId":{"type":"string","description":"Schéma identifiant standard (BT-157-1)","example":"0160"},"itemClassifications":{"type":"array","description":"Classifications article (BT-158)","items":{"$ref":"#/components/schemas/ItemClassification"}},"countryOfOrigin":{"type":"string","description":"Pays d'origine (BT-159)","example":"FR"},"itemAttributes":{"type":"array","description":"Attributs article (BT-160, BT-161)","items":{"$ref":"#/components/schemas/ItemAttribute"}}}},"ItemAttribute":{"type":"object","description":"Attribut article (BT-160, BT-161)","properties":{"name":{"type":"string","description":"Nom attribut (BT-160)","example":"Couleur"},"value":{"type":"string","description":"Valeur attribut (BT-161)","example":"Bleu"}}},"ItemClassification":{"type":"object","description":"Classification article (BT-158)","properties":{"code":{"type":"string","description":"Code classification","example":"S-62.01"},"schemeId":{"type":"string","description":"Schéma classification (BT-158-1)","example":"CPV"},"schemeVersion":{"type":"string","description":"Version du schéma (BT-158-2)","example":2014}}},"LineAllowance":{"type":"object","description":"Remise de ligne (BT-136 à BT-140)","properties":{"amount":{"type":"number","description":"Montant remise (BT-136)","example":50.0},"baseAmount":{"type":"number","description":"Montant de base (BT-137)","example":500.0},"percentage":{"type":"number","description":"Pourcentage remise (BT-138)","example":10.0},"reason":{"type":"string","description":"Motif remise (BT-139)","example":"Remise fidélité"},"reasonCode":{"type":"string","description":"Code motif remise (BT-140)","example":95}}},"LineCharge":{"type":"object","description":"Charge de ligne (BT-141 à BT-145)","properties":{"amount":{"type":"number","description":"Montant charge (BT-141)","example":25.0},"baseAmount":{"type":"number","description":"Montant de base (BT-142)","example":500.0},"percentage":{"type":"number","description":"Pourcentage charge (BT-143)","example":5.0},"reason":{"type":"string","description":"Motif charge (BT-144)","example":"Frais de livraison"},"reasonCode":{"type":"string","description":"Code motif charge (BT-145)","example":"FC"}}},"Party":{"type":"object","description":"Partie (vendeur ou acheteur)","properties":{"siren":{"type":"string","description":"Numéro SIREN (9 chiffres)","example":123456789,"pattern":"^[0-9]{9}$"},"siret":{"type":"string","description":"Numéro SIRET (14 chiffres)","example":12345678901234,"pattern":"^[0-9]{14}$"},"vatNumber":{"type":"string","description":"Numéro de TVA intracommunautaire","example":"FR12345678901","pattern":"^FR[0-9A-Z]{2}[0-9]{9}$"},"name":{"type":"string","description":"Nom ou raison sociale","example":"ACME SARL","maxLength":200,"minLength":0},"tradingName":{"type":"string","description":"Nom commercial (si différent)","example":"ACME France","maxLength":200,"minLength":0},"address":{"$ref":"#/components/schemas/Address","description":"Adresse postale"},"nafCode":{"type":"string","description":"Code NAF/APE","example":"6201Z","maxLength":10,"minLength":0},"legalForm":{"type":"string","description":"Forme juridique","example":"SARL","maxLength":50,"minLength":0},"registrationNumber":{"type":"string","description":"Numéro RCS","example":"Paris B 123 456 789","maxLength":50,"minLength":0},"sirenFromSiret":{"type":"string"}},"required":["name","siren"]},"Payee":{"type":"object","description":"Bénéficiaire (BT-59 à BT-63)","properties":{"name":{"type":"string","description":"Nom du bénéficiaire (BT-59)","example":"ACME Factoring"},"identifier":{"type":"string","description":"Identifiant du bénéficiaire (BT-60)","example":"BEN-001"},"identifierSchemeId":{"type":"string","description":"Schéma identifiant (BT-60-1)","example":"0088"},"legalRegistrationId":{"type":"string","description":"Identifiant légal (BT-61)","example":123456789},"legalRegistrationSchemeId":{"type":"string","description":"Schéma identifiant légal (BT-61-1)","example":"0002"}}},"PaymentInfo":{"type":"object","description":"Informations de paiement (BT-81 à BT-91)","properties":{"paymentMeansCode":{"type":"string","description":"Code moyen de paiement BT-81 (paymentMeansCode)","example":30},"paymentMeansName":{"type":"string","description":"Libellé moyen de paiement BT-82 (paymentMeansName)","example":"Virement bancaire"},"paymentId":{"type":"string","description":"Référence du paiement BT-83 (paymentId)","example":"REF-PAY-2024"},"paymentTerms":{"type":"string","description":"Conditions de paiement BT-20 (paymentTerms)","example":30},"paymentAccountId":{"type":"string","description":"Identifiant compte BT-84 (paymentAccountId/IBAN)","example":"FR7630001007941234567890185"},"iban":{"type":"string","description":"IBAN (alias pour compatibilité legacy)","example":"FR7630001007941234567890185"},"paymentAccountName":{"type":"string","description":"Nom du compte BT-85 (paymentAccountName)","example":"BNP Paribas"},"bankName":{"type":"string","description":"Nom de la banque (alias)","example":"BNP Paribas"},"paymentServiceProviderId":{"type":"string","description":"BIC BT-86 (paymentServiceProviderId)","example":"BNPAFRPP"},"paymentCardPan":{"type":"string","description":"Numéro carte BT-87 (paymentCardPan, masqué)","example":"****1234"},"paymentCardHolderName":{"type":"string","description":"Titulaire carte BT-88 (paymentCardHolderName)","example":"Jean Dupont"},"mandateReferenceId":{"type":"string","description":"Référence mandat BT-89 (mandateReferenceId)","example":"RUM-2024-001"},"debitAccountId":{"type":"string","description":"IBAN débiteur (BT-90)","example":"FR7612345678901234567890123"},"creditorId":{"type":"string","description":"Identifiant créancier SEPA (BT-91)","example":"FR72ZZZ123456"}}},"SupportingDocument":{"type":"object","description":"Document justificatif (BT-122 à BT-125)","properties":{"reference":{"type":"string","description":"Référence document (BT-122)","example":"DOC-2024-001"},"description":{"type":"string","description":"Description (BT-123)","example":"Bon de commande"},"externalLocation":{"type":"string","description":"URL document externe (BT-124)","example":"https://example.com/doc.pdf"},"embeddedDocumentBase64":{"type":"string","description":"Document embarqué base64 (BT-125)","example":"JVBERi0xLjQ..."},"mimeCode":{"type":"string","description":"Type MIME (BT-125 attr)","example":"application/pdf"},"filename":{"type":"string","description":"Nom fichier (BT-125 attr)","example":"bon-commande.pdf"}}},"TaxRepresentative":{"type":"object","description":"Représentant fiscal vendeur (BT-62 à BT-69)","properties":{"name":{"type":"string","description":"Nom (BT-62)","example":"Représentant Fiscal FR"},"vatNumber":{"type":"string","description":"Numéro TVA (BT-63)","example":"FR12345678901"},"address":{"type":"string","description":"Adresse ligne 1 (BT-64)","example":10},"address2":{"type":"string","description":"Adresse ligne 2 (BT-65)","example":"Bâtiment B"},"address3":{"type":"string","description":"Adresse ligne 3 (BT-164)","example":"Étage 3"},"city":{"type":"string","description":"Ville (BT-66)","example":"Lyon"},"postalCode":{"type":"string","description":"Code postal (BT-67)","example":69001},"region":{"type":"string","description":"Région (BT-68)","example":"Rhône-Alpes"},"country":{"type":"string","description":"Pays (BT-69)","example":"FR"}}},"VatBreakdown":{"type":"object","description":"Ventilation TVA (BT-116 à BT-121)","properties":{"taxableAmount":{"type":"number","description":"Montant taxable (BT-116)","example":1000.0},"vatAmount":{"type":"number","description":"Montant TVA (BT-117)","example":200.0},"vatCategoryCode":{"type":"string","description":"Code catégorie TVA (BT-118)","example":"S"},"vatRate":{"type":"number","description":"Taux TVA (BT-119)","example":20.0},"exemptionReason":{"type":"string","description":"Motif exonération (BT-120)","example":"Export hors UE"},"exemptionReasonCode":{"type":"string","description":"Code motif exonération (BT-121)","example":"VATEX-EU-G"}}},"ConversionMeta":{"type":"object","description":"Métadonnées de conversion","properties":{"latencyMs":{"type":"integer","format":"int64","description":"Latence totale en ms","example":1250},"extractionMs":{"type":"integer","format":"int64","description":"Latence extraction en ms"},"xmlGenerationMs":{"type":"integer","format":"int64","description":"Latence génération XML en ms"},"pdfGenerationMs":{"type":"integer","format":"int64","description":"Latence PDF/A-3 en ms"},"pageCount":{"type":"integer","format":"int32","description":"Nombre de pages"},"pdfSize":{"type":"integer","format":"int64","description":"Taille du PDF final en bytes"}}},"ConversionResponse":{"type":"object","description":"Résultat de la conversion Factur-X","properties":{"success":{"type":"boolean","description":"Succès de la conversion"},"error":{"type":"string","description":"Message d'erreur si échec"},"documentId":{"type":"string","description":"ID du document généré"},"downloadUrl":{"type":"string","description":"URL de téléchargement du PDF Factur-X"},"pdfBase64":{"type":"string","description":"PDF Factur-X encodé en base64"},"profile":{"type":"string","description":"Profil Factur-X utilisé","example":"BASIC"},"xmlSize":{"type":"integer","format":"int32","description":"Taille du XML embarqué en bytes"},"validated":{"type":"boolean","description":"Document validé XSD","example":true},"watermarked":{"type":"boolean","description":"Watermark ajouté","example":false},"meta":{"$ref":"#/components/schemas/ConversionMeta","description":"Métadonnées de conversion"}}},"ExtractionMeta":{"type":"object","description":"Métadonnées de l'extraction","properties":{"model":{"type":"string","description":"Modèle utilisé","example":"rwkv-7b"},"latencyMs":{"type":"integer","format":"int64","description":"Latence en ms","example":456},"tokens":{"type":"integer","format":"int32","description":"Nombre de tokens traités","example":1250},"ocrEngine":{"type":"string","description":"OCR utilisé","example":"surya-ocr"},"pageCount":{"type":"integer","format":"int32","description":"Nombre de pages","example":2},"fieldConfidences":{"type":"object","additionalProperties":{"type":"number","format":"double"},"description":"Scores de confiance par champ"}}},"ExtractionResponse":{"type":"object","description":"Résultat de l'extraction des données de facture","properties":{"success":{"type":"boolean","description":"Succès de l'extraction"},"error":{"type":"string","description":"Message d'erreur si échec"},"data":{"$ref":"#/components/schemas/ExtractedData","description":"Données extraites"},"meta":{"$ref":"#/components/schemas/ExtractionMeta","description":"Métadonnées de l'extraction"}}},"EReportingResult":{"type":"object","description":"Résultat d'opération e-reporting","properties":{"success":{"type":"boolean","description":"Opération réussie"},"submissionId":{"type":"string","description":"Identifiant de soumission"},"ppfId":{"type":"string","description":"Identifiant PPF (après soumission)"},"depositNumber":{"type":"string","description":"Numéro de dépôt PPF"},"status":{"type":"string","description":"Statut actuel","enum":["PENDING","VALIDATING","SUBMITTING","SUBMITTED","ACCEPTED","REJECTED","VALIDATION_ERROR","ERROR"]},"message":{"type":"string","description":"Message de résultat"},"errorCode":{"type":"string","description":"Code d'erreur (si échec)"},"validationErrors":{"type":"array","description":"Liste des erreurs de validation","items":{"$ref":"#/components/schemas/ValidationError"}},"timestamp":{"type":"string","format":"date-time","description":"Date/heure du résultat"}}},"Address":{"type":"object","properties":{"numeroVoie":{"type":"string"},"indiceRepetition":{"type":"string"},"typeVoie":{"type":"string"},"libelleVoie":{"type":"string"},"complementAdresse":{"type":"string"},"distributionSpeciale":{"type":"string"},"codePostal":{"type":"string"},"libelleCommune":{"type":"string"},"codeCommuneEtranger":{"type":"string"},"libelleCommuneEtranger":{"type":"string"},"codePays":{"type":"string"},"libellePays":{"type":"string"},"formattedAddress":{"type":"string"}}},"EReportingSubmission":{"type":"object","description":"Soumission e-reporting complète","properties":{"submissionId":{"type":"string","description":"Identifiant unique de la soumission"},"document":{"$ref":"#/components/schemas/ReportDocument","description":"En-tête du document e-reporting"},"transactionsReport":{"$ref":"#/components/schemas/TransactionsReport","description":"Rapport de transactions (Flux 10.1 ou 10.3)"},"paymentsReport":{"$ref":"#/components/schemas/PaymentsReport","description":"Rapport de paiements (Flux 10.2 ou 10.4)"},"reportType":{"type":"string","description":"Type de rapport soumis","enum":["SALES_TRANSACTIONS","SALES_PAYMENTS","ACQUISITION_TRANSACTIONS","ACQUISITION_PAYMENTS"]},"status":{"type":"string","description":"Statut de la soumission","enum":["PENDING","VALIDATING","SUBMITTING","SUBMITTED","ACCEPTED","REJECTED","VALIDATION_ERROR","ERROR"]},"ppfSubmissionId":{"type":"string","description":"ID de soumission PPF (après envoi)"},"ppfDepositNumber":{"type":"string","description":"Numéro de dépôt PPF (après acceptation)"},"errorMessage":{"type":"string","description":"Message d'erreur si échec"},"errorCode":{"type":"string","description":"Code d'erreur PPF"},"createdAt":{"type":"string","format":"date-time","description":"Date/heure de création"},"submittedAt":{"type":"string","format":"date-time","description":"Date/heure de soumission"},"statusUpdatedAt":{"type":"string","format":"date-time","description":"Date/heure de mise à jour du statut"},"valid":{"type":"boolean"}},"required":["document"]},"MonetaryTotal":{"type":"object","description":"Totaux monétaires","properties":{"taxExclusiveAmount":{"type":"number","description":"Montant total HT (hors taxes)","example":1000.0},"taxAmount":{"type":"number","description":"Montant total de TVA","example":200.0,"minimum":0},"taxInclusiveAmount":{"type":"number","description":"Montant total TTC (toutes taxes comprises)","example":1200.0},"prepaidAmount":{"type":"number","description":"Montant total des acomptes déjà versés","example":0.0,"minimum":0},"payableAmount":{"type":"number","description":"Montant net à payer (TTC - acomptes)","example":1200.0},"allowanceTotalAmount":{"type":"number","description":"Montant total des remises","example":0.0,"minimum":0},"chargeTotalAmount":{"type":"number","description":"Montant total des frais supplémentaires","example":0.0,"minimum":0},"currencyCode":{"type":"string","description":"Code devise ISO 4217","example":"EUR","maxLength":3,"minLength":3},"consistent":{"type":"boolean"}},"required":["currencyCode","taxAmount","taxExclusiveAmount","taxInclusiveAmount"]},"Payment":{"type":"object","description":"Paiement/Encaissement e-reporting","properties":{"paymentId":{"type":"string","description":"Identifiant unique du paiement"},"processType":{"type":"string","description":"Type de processus (ventes ou acquisitions)","enum":["SALES","ACQUISITIONS"]},"paymentDate":{"type":"string","format":"date","description":"Date du paiement/encaissement","example":"2025-01-20"},"paymentMeansCode":{"type":"string","description":"Moyen de paiement utilisé","enum":["CASH","CHEQUE","CREDIT_TRANSFER","DEBIT_TRANSFER","BANK_CARD","SEPA_DIRECT_DEBIT","SEPA_CREDIT_TRANSFER","CLEARING","NOT_DEFINED"],"example":48},"paidAmount":{"type":"number","description":"Montant du paiement TTC","example":1200.0,"minimum":0.01},"currencyCode":{"type":"string","description":"Code devise ISO 4217","example":"EUR"},"seller":{"$ref":"#/components/schemas/Party","description":"Vendeur/Créancier"},"buyer":{"$ref":"#/components/schemas/Party","description":"Acheteur/Débiteur (optionnel)"},"invoiceReference":{"type":"string","description":"Référence de la facture payée","maxLength":100,"minLength":0},"transactionReference":{"type":"string","description":"Référence de la transaction associée","maxLength":100,"minLength":0},"bankReference":{"type":"string","description":"Référence bancaire du paiement","maxLength":100,"minLength":0},"batchNumber":{"type":"string","description":"Numéro de lot de paiement","maxLength":50,"minLength":0},"partialPayment":{"type":"boolean","description":"Indicateur de paiement partiel"},"remainingAmount":{"type":"number","description":"Montant restant dû après ce paiement"},"note":{"type":"string","description":"Notes ou commentaires","maxLength":500,"minLength":0},"salesPayment":{"type":"boolean"},"acquisitionPayment":{"type":"boolean"},"complete":{"type":"boolean"}},"required":["paidAmount","paymentDate","paymentMeansCode","processType"]},"PaymentsReport":{"type":"object","description":"Rapport d'encaissements e-reporting","properties":{"processType":{"type":"string","description":"Type de processus (ventes ou acquisitions)","enum":["SALES","ACQUISITIONS"],"example":"S1"},"periodStartDate":{"type":"string","format":"date","description":"Date de début de la période","example":"2025-01-01"},"periodEndDate":{"type":"string","format":"date","description":"Date de fin de la période","example":"2025-01-31"},"periodType":{"type":"string","description":"Type de période de reporting","enum":["DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"]},"payments":{"type":"array","description":"Liste des paiements","items":{"$ref":"#/components/schemas/Payment"}},"totalAmount":{"type":"number","description":"Montant total des encaissements","example":150000.0},"totalPaymentCount":{"type":"integer","format":"int32","description":"Nombre total de paiements"},"currencyCode":{"type":"string","description":"Code devise ISO 4217","example":"EUR"},"breakdownByPaymentMeans":{"type":"object","additionalProperties":{"type":"number"},"description":"Répartition par moyen de paiement"},"aggregated":{"type":"boolean","description":"Indicateur de rapport agrégé"},"salesPaymentsReport":{"type":"boolean"},"acquisitionsPaymentsReport":{"type":"boolean"}},"required":["payments","periodEndDate","periodStartDate","processType","totalAmount"]},"ReportDocument":{"type":"object","description":"En-tête de document e-reporting","properties":{"documentId":{"type":"string","description":"Identifiant unique du document"},"documentNumber":{"type":"string","description":"Numéro de document attribué par l'émetteur","example":"EREP-2025-001","maxLength":50,"minLength":0},"issueDateTime":{"type":"string","format":"date-time","description":"Date et heure d'émission du document"},"processType":{"type":"string","description":"Type de processus (ventes ou acquisitions)","enum":["SALES","ACQUISITIONS"]},"periodStartDate":{"type":"string","format":"date","description":"Date de début de la période de reporting","example":"2025-01-01"},"periodEndDate":{"type":"string","format":"date","description":"Date de fin de la période de reporting","example":"2025-01-31"},"periodType":{"type":"string","description":"Type de période","enum":["DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"]},"sender":{"$ref":"#/components/schemas/Party","description":"Partie émettrice du rapport"},"formatVersion":{"type":"string","description":"Version du format de rapport"},"sandbox":{"type":"boolean","description":"Environnement (sandbox ou production)"},"testIndicator":{"type":"boolean","description":"Indicateur de document de test"},"note":{"type":"string","description":"Notes ou commentaires","maxLength":500,"minLength":0}},"required":["documentNumber","issueDateTime","periodEndDate","periodStartDate","processType","sender"]},"TaxSubtotal":{"type":"object","description":"Ventilation TVA par taux","properties":{"taxableAmount":{"type":"number","description":"Montant HT taxable pour ce taux","example":1000.0,"minimum":0},"taxAmount":{"type":"number","description":"Montant de TVA calculé","example":200.0,"minimum":0},"taxCategoryCode":{"type":"string","description":"Code de catégorie TVA","enum":["S","AA","H","I","E","Z","AE","K","G","O","L","M"],"example":"S"},"taxRate":{"type":"number","description":"Taux de TVA en pourcentage","example":20.0,"minimum":0},"exemptionReason":{"type":"string","description":"Motif d'exonération (si applicable)"},"exemptionReasonCode":{"type":"string","description":"Code motif d'exonération VATEX"}},"required":["taxAmount","taxCategoryCode","taxRate","taxableAmount"]},"Transaction":{"type":"object","description":"Transaction e-reporting","properties":{"transactionId":{"type":"string","description":"Identifiant unique de la transaction"},"category":{"type":"string","description":"Catégorie de transaction","enum":["TLB1","TLB2","TLB3","TLB4","TPS1","TPS2","TPS3","TPS4","TMX1","TMX2","ALB1","ALB2","ALB3","ALB4","APS1","APS2","APS3","APS4","AMX1","AMX2"],"example":"TLB1"},"seller":{"$ref":"#/components/schemas/Party","description":"Vendeur / Émetteur"},"buyer":{"$ref":"#/components/schemas/Party","description":"Acheteur (optionnel pour B2C anonyme)"},"transactionDate":{"type":"string","format":"date","description":"Date de la transaction","example":"2025-01-15"},"periodStartDate":{"type":"string","format":"date","description":"Période de début (si agrégation)","example":"2025-01-01"},"periodEndDate":{"type":"string","format":"date","description":"Période de fin (si agrégation)","example":"2025-01-31"},"invoices":{"type":"array","description":"Facture(s) associée(s) à la transaction","items":{"$ref":"#/components/schemas/TransactionInvoice"}},"monetaryTotal":{"$ref":"#/components/schemas/MonetaryTotal","description":"Totaux monétaires de la transaction"},"taxSubtotals":{"type":"array","description":"Ventilation TVA par taux","items":{"$ref":"#/components/schemas/TaxSubtotal"}},"aggregated":{"type":"boolean","description":"Indicateur de transaction agrégée"},"documentCount":{"type":"integer","format":"int32","description":"Nombre de documents agrégés (si agrégation)"},"externalReference":{"type":"string","description":"Référence externe","maxLength":100,"minLength":0},"note":{"type":"string","description":"Notes ou commentaires","maxLength":500,"minLength":0},"acquisition":{"type":"boolean"},"invoiceCount":{"type":"integer","format":"int32"},"sales":{"type":"boolean"},"complete":{"type":"boolean"}},"required":["category","monetaryTotal","seller"]},"TransactionInvoice":{"type":"object","description":"Facture dans une transaction e-reporting","properties":{"invoiceNumber":{"type":"string","description":"Numéro de facture","example":"FA-2025-0001","maxLength":100,"minLength":0},"issueDate":{"type":"string","format":"date","description":"Date de la facture","example":"2025-01-15"},"typeCode":{"type":"string","description":"Code type de facture","enum":["INVOICE","CREDIT_NOTE","DEBIT_NOTE","CORRECTIVE_INVOICE","PROFORMA","SELF_BILLED","SIMPLIFIED"],"example":380},"originalInvoiceReference":{"type":"string","description":"Référence de la facture originale (pour avoirs)","maxLength":100,"minLength":0},"deliveryDate":{"type":"string","format":"date","description":"Date de livraison ou période de prestation"},"periodStartDate":{"type":"string","format":"date","description":"Début de période de prestation"},"periodEndDate":{"type":"string","format":"date","description":"Fin de période de prestation"},"monetaryTotal":{"$ref":"#/components/schemas/MonetaryTotal","description":"Totaux monétaires de la facture"},"taxSubtotals":{"type":"array","description":"Ventilation TVA par taux","items":{"$ref":"#/components/schemas/TaxSubtotal"}},"note":{"type":"string","description":"Notes ou commentaires","maxLength":500,"minLength":0},"corrective":{"type":"boolean"},"creditNote":{"type":"boolean"}},"required":["invoiceNumber","issueDate","monetaryTotal","typeCode"]},"TransactionSummary":{"type":"object","description":"Résumé de transaction par catégorie","properties":{"category":{"type":"string","description":"Catégorie de transaction","enum":["TLB1","TLB2","TLB3","TLB4","TPS1","TPS2","TPS3","TPS4","TMX1","TMX2","ALB1","ALB2","ALB3","ALB4","APS1","APS2","APS3","APS4","AMX1","AMX2"],"example":"TLB1"},"transactionCount":{"type":"integer","format":"int32","description":"Nombre de transactions dans cette catégorie","example":150,"minimum":1},"totalTaxExclusiveAmount":{"type":"number","description":"Montant total HT pour cette catégorie","example":50000.0},"totalTaxAmount":{"type":"number","description":"Montant total de TVA pour cette catégorie","example":10000.0,"minimum":0},"totalTaxInclusiveAmount":{"type":"number","description":"Montant total TTC pour cette catégorie","example":60000.0},"taxBreakdown":{"type":"array","description":"Ventilation TVA par taux pour cette catégorie","items":{"$ref":"#/components/schemas/TaxSubtotal"}}},"required":["category","totalTaxAmount","totalTaxExclusiveAmount","totalTaxInclusiveAmount","transactionCount"]},"TransactionsReport":{"type":"object","description":"Rapport de transactions e-reporting","properties":{"processType":{"type":"string","description":"Type de processus (ventes ou acquisitions)","enum":["SALES","ACQUISITIONS"],"example":"S1"},"periodStartDate":{"type":"string","format":"date","description":"Date de début de la période","example":"2025-01-01"},"periodEndDate":{"type":"string","format":"date","description":"Date de fin de la période","example":"2025-01-31"},"periodType":{"type":"string","description":"Type de période de reporting","enum":["DAILY","WEEKLY","MONTHLY","QUARTERLY","YEARLY"]},"transactions":{"type":"array","description":"Liste des transactions","items":{"$ref":"#/components/schemas/Transaction"}},"summaries":{"type":"array","description":"Résumés par catégorie (pour rapports agrégés)","items":{"$ref":"#/components/schemas/TransactionSummary"}},"grandTotal":{"$ref":"#/components/schemas/MonetaryTotal","description":"Totaux du rapport"},"totalTransactionCount":{"type":"integer","format":"int32","description":"Nombre total de transactions"},"aggregated":{"type":"boolean","description":"Indicateur de rapport agrégé"},"salesReport":{"type":"boolean"},"acquisitionsReport":{"type":"boolean"}},"required":["grandTotal","periodEndDate","periodStartDate","processType","transactions"]},"CguAcceptanceEntity":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"userId":{"type":"string"},"cguVersion":{"type":"string"},"cguType":{"type":"string","enum":["GENERAL","PDP_ARCHIVAL","PDP_EREPORTING","API_USAGE"]},"acceptedAt":{"type":"string","format":"date-time"},"ipAddress":{"type":"string"},"userAgent":{"type":"string"},"contentHash":{"type":"string"},"withdrawn":{"type":"boolean"},"withdrawnAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"}}},"BulkUploadResponse":{"type":"object","description":"Résultat de la création d'un job d'upload groupé","properties":{"jobId":{"type":"string","format":"uuid","description":"ID du job créé"},"totalFiles":{"type":"integer","format":"int32","description":"Nombre total de fichiers dans le job"},"status":{"type":"string","description":"Statut du job","example":"CREATED"},"createdAt":{"type":"string","format":"date-time","description":"Date de création du job"}}},"BulkSubmitRequest":{"type":"object","description":"Requête de soumission groupée à la plateforme cible","properties":{"targetPlatform":{"type":"string","description":"Plateforme cible","example":"PPF"},"sandbox":{"type":"boolean","description":"Mode sandbox/test","example":true},"itemIds":{"type":"array","description":"Liste des IDs d'éléments à soumettre (null = tous les éléments prêts)","items":{"type":"string","format":"uuid"}}}},"BulkJobItemResponse":{"type":"object","description":"Détail d'un élément dans un job d'upload groupé","properties":{"id":{"type":"string","format":"uuid","description":"ID de l'élément"},"originalFilename":{"type":"string","description":"Nom du fichier original"},"fileType":{"type":"string","description":"Type de fichier","example":"PDF"},"stepStatus":{"type":"string","description":"Statut de traitement","example":"EXTRACTED"},"invoiceNumber":{"type":"string","description":"Numéro de facture extrait"},"emitterSiret":{"type":"string","description":"SIRET de l'émetteur"},"emitterName":{"type":"string","description":"Nom de l'émetteur"},"recipientSiret":{"type":"string","description":"SIRET du destinataire"},"recipientName":{"type":"string","description":"Nom du destinataire"},"amountExclTax":{"type":"number","description":"Montant HT"},"amountInclTax":{"type":"number","description":"Montant TTC"},"vatAmount":{"type":"number","description":"Montant TVA"},"invoiceDate":{"type":"string","format":"date","description":"Date de la facture"},"dueDate":{"type":"string","format":"date","description":"Date d'échéance"},"profile":{"type":"string","description":"Profil Factur-X utilisé","example":"EN16931"},"targetPlatform":{"type":"string","description":"Plateforme cible","example":"PPF"},"externalId":{"type":"string","description":"ID externe (PPF/Chorus)"},"depositNumber":{"type":"string","description":"Numéro de dépôt"},"validationValid":{"type":"boolean","description":"Résultat de validation"},"validationErrors":{"type":"integer","format":"int32","description":"Nombre d'erreurs de validation"},"validationWarnings":{"type":"integer","format":"int32","description":"Nombre d'avertissements de validation"},"errorMessage":{"type":"string","description":"Message d'erreur si échec"},"errorStep":{"type":"string","description":"Étape où l'erreur s'est produite"},"retryCount":{"type":"integer","format":"int32","description":"Nombre de tentatives effectuées"},"extractionConfidence":{"type":"number","format":"double","description":"Score de confiance de l'extraction ML (0.0-1.0)"},"extractedData":{"type":"object","additionalProperties":{"type":"object"},"description":"Données extraites structurées"}}},"BulkJobResponse":{"type":"object","description":"Détail complet d'un job d'upload groupé","properties":{"id":{"type":"string","format":"uuid","description":"ID du job"},"totalFiles":{"type":"integer","format":"int32","description":"Nombre total de fichiers"},"processedCount":{"type":"integer","format":"int32","description":"Nombre de fichiers traités"},"successCount":{"type":"integer","format":"int32","description":"Nombre de fichiers traités avec succès"},"errorCount":{"type":"integer","format":"int32","description":"Nombre de fichiers en erreur"},"status":{"type":"string","description":"Statut du job","example":"PROCESSING"},"targetPlatform":{"type":"string","description":"Plateforme cible","example":"PPF"},"emitterSiret":{"type":"string","description":"SIRET émetteur par défaut"},"sandbox":{"type":"boolean","description":"Mode sandbox"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"updatedAt":{"type":"string","format":"date-time","description":"Date de dernière mise à jour"},"items":{"type":"array","description":"Éléments du job (factures individuelles)","items":{"$ref":"#/components/schemas/BulkJobItemResponse"}}}},"AuthRequest":{"type":"object","description":"Requête d'authentification pour obtenir un token JWT","properties":{"clientId":{"type":"string","description":"Identifiant du client API","example":"my-api-client"},"clientSecret":{"type":"string","description":"Secret du client API","example":"my-secret-key"}},"required":["clientId","clientSecret"]},"AuthResponse":{"type":"object","description":"Réponse d'authentification avec tokens JWT","properties":{"accessToken":{"type":"string","description":"Token JWT d'accès","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"refreshToken":{"type":"string","description":"Token de rafraîchissement (validité plus longue)","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."},"tokenType":{"type":"string","description":"Type de token","example":"Bearer"},"expiresIn":{"type":"integer","format":"int64","description":"Durée de validité du token d'accès en secondes","example":3600},"refreshExpiresIn":{"type":"integer","format":"int64","description":"Durée de validité du refresh token en secondes","example":86400},"scopes":{"type":"array","description":"Scopes accordés au client","example":["read","write","submit"],"items":{"type":"string"}}}},"RefreshRequest":{"type":"object","description":"Requête pour rafraîchir un token JWT expiré","properties":{"refreshToken":{"type":"string","description":"Token de rafraîchissement obtenu lors de l'authentification","example":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}},"required":["refreshToken"]},"AnnuaireSearchRequest":{"type":"object","description":"Requête de recherche dans l'annuaire PPF","properties":{"filtres":{"type":"object","additionalProperties":{"type":"object"},"description":"Filtres de recherche","example":{"siren":"123456789"}},"tris":{"type":"array","description":"Critères de tri","example":[{"champ":"raisonSociale","ordre":"ASC"}],"items":{"$ref":"#/components/schemas/SortCriteria"}},"champs":{"type":"array","description":"Champs à inclure dans la réponse","items":{"type":"string"}},"inclure":{"type":"array","description":"Relations à inclure","example":["siren"],"items":{"type":"string"}},"limite":{"type":"integer","format":"int32","default":"100","description":"Limite de résultats","example":50},"ignorer":{"type":"integer","format":"int32","default":"0","description":"Offset pour pagination","example":0},"dateObservation":{"type":"string","format":"date","description":"Date d'observation pour les données historisées"}}},"SortCriteria":{"type":"object","properties":{"champ":{"type":"string","description":"Nom du champ à trier"},"ordre":{"type":"string","description":"Ordre de tri","enum":["ASC","DESC"]}}},"PagedResponse":{"type":"object","description":"Réponse paginée","properties":{"data":{"type":"array","description":"Liste des résultats","items":{"type":"object"}},"total":{"type":"integer","format":"int64","description":"Nombre total de résultats","example":150},"count":{"type":"integer","format":"int32","description":"Nombre de résultats dans cette page","example":50},"offset":{"type":"integer","format":"int32","description":"Offset de pagination actuel","example":0},"limit":{"type":"integer","format":"int32","description":"Limite de résultats demandée","example":50},"hasMore":{"type":"boolean","description":"Indique s'il y a une page suivante"}}},"RoutingRequest":{"type":"object","description":"Requête de décision de routage","properties":{"recipientSiret":{"type":"string","description":"SIRET du destinataire","example":12345678901234,"pattern":"^[0-9]{14}$"},"serviceCode":{"type":"string","description":"Code service pour Chorus Pro (optionnel)","example":"SERVICE_001"},"gln":{"type":"string","description":"Code GLN du destinataire (optionnel)","example":3012345678901,"pattern":"^[0-9]{13}$"},"odette":{"type":"string","description":"Code ODETTE du destinataire (optionnel)"},"sandbox":{"type":"boolean","default":"false","description":"Utiliser l'environnement sandbox"},"siren":{"type":"string"}},"required":["recipientSiret"]},"Contact":{"type":"object","properties":{"nom":{"type":"string"},"email":{"type":"string"},"telephone":{"type":"string"}}},"DirectoryEntry":{"type":"object","properties":{"identifiantAdressage":{"type":"string"},"siren":{"type":"string"},"siret":{"type":"string"},"suffixeAdressage":{"type":"string"},"codeRoutage":{"$ref":"#/components/schemas/RoutingCode"},"plateforme":{"$ref":"#/components/schemas/Platform"},"dateCreation":{"type":"string","format":"date"},"dateDebutEffet":{"type":"string","format":"date"},"dateFinEffet":{"type":"string","format":"date"},"dateFinEffective":{"type":"string","format":"date"},"creePar":{"type":"string"},"idInstance":{"type":"integer","format":"int64"},"active":{"type":"boolean"}}},"Platform":{"type":"object","properties":{"idPlateforme":{"type":"string"},"typePlateforme":{"type":"string"},"nomPlateforme":{"type":"string"},"contact":{"$ref":"#/components/schemas/Contact"}}},"RoutingCode":{"type":"object","properties":{"identifiantRoutage":{"type":"string"},"typeCodeRoutage":{"type":"string"},"siret":{"type":"string"},"siren":{"type":"string"},"libelle":{"type":"string"},"etatAdministratif":{"type":"string"},"dateDebutEffet":{"type":"string","format":"date"},"dateFinEffet":{"type":"string","format":"date"},"dateCreation":{"type":"string","format":"date"},"idInstance":{"type":"integer","format":"int64"},"creePar":{"type":"string"},"serviceCode":{"type":"boolean"},"gln":{"type":"boolean"},"odette":{"type":"boolean"},"active":{"type":"boolean"}}},"RoutingDecision":{"type":"object","description":"Décision de routage pour l'envoi de facture","properties":{"platform":{"type":"string","description":"Plateforme de destination","enum":["PPF","CHORUS_PRO","PDP","UNKNOWN"],"example":"PPF"},"recipientSiret":{"type":"string","description":"SIRET du destinataire","example":12345678901234},"recipientSiren":{"type":"string","description":"SIREN du destinataire","example":123456789},"recipientName":{"type":"string","description":"Raison sociale du destinataire"},"routingIdentifier":{"type":"string","description":"Identifiant d'adressage pour le routage","example":"123456789+12345678901234+GLN123"},"serviceCode":{"type":"string","description":"Code service pour Chorus Pro"},"availableRoutingCodes":{"type":"array","description":"Codes de routage disponibles pour ce destinataire","items":{"$ref":"#/components/schemas/RoutingCode"}},"directoryEntry":{"$ref":"#/components/schemas/DirectoryEntry","description":"Ligne d'annuaire PPF correspondante"},"found":{"type":"boolean","description":"Destinataire trouvé dans l'annuaire"},"publicEntity":{"type":"boolean","description":"Indique si le destinataire est une entité publique"},"message":{"type":"string","description":"Message d'information"}}},"CreateClientRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":255,"minLength":2},"description":{"type":"string","maxLength":1000,"minLength":0},"scopes":{"type":"array","items":{"type":"string","pattern":"^[a-z]+:[a-z]+$"}},"rateLimitPerMinute":{"type":"integer","format":"int32","maximum":100000,"minimum":1},"rateLimitPerHour":{"type":"integer","format":"int32","maximum":1000000,"minimum":1},"rateLimitPerDay":{"type":"integer","format":"int32","maximum":10000000,"minimum":1},"webhookUrl":{"type":"string","maxLength":500,"minLength":0,"pattern":"^(https?://.*)?$"},"enabled":{"type":"boolean"},"source":{"type":"string"},"vaultKeycloakUserId":{"type":"string"},"subscriptionTier":{"type":"string"}},"required":["name","scopes"]},"ToggleClientRequest":{"type":"object","properties":{"enabled":{"type":"boolean"}}},"ValidationResult":{"type":"object","properties":{"invoiceId":{"type":"string","format":"uuid"},"success":{"type":"boolean"},"errorMessage":{"type":"string"},"warnings":{"type":"array","items":{"type":"string"}}}},"FieldConfigResponse":{"type":"object","description":"Configuration d'un champ EN16931","properties":{"id":{"type":"string","format":"uuid","description":"ID unique","example":"550e8400-e29b-41d4-a716-446655440000"},"btCode":{"type":"string","description":"Code Business Term","example":"BT-1"},"fieldName":{"type":"string","description":"Nom technique","example":"invoice_number"},"displayName":{"type":"string","description":"Nom d'affichage","example":"Numéro de facture"},"description":{"type":"string","description":"Description EN16931"},"fieldGroup":{"type":"string","description":"Groupe fonctionnel","example":"document"},"required":{"type":"boolean","description":"Obligatoire EN16931"},"cardinality":{"type":"string","description":"Cardinalité","example":"1..1"},"supportFacturx":{"type":"boolean","description":"Supporté Factur-X"},"supportUbl":{"type":"boolean","description":"Supporté UBL"},"supportCii":{"type":"boolean","description":"Supporté CII"},"supportEdifact":{"type":"boolean","description":"Supporté EDIFACT"},"activePattern":{"type":"string","description":"Pattern regex actif"},"activePatternVersion":{"type":"integer","format":"int32","description":"Version du pattern actif"},"successRate":{"type":"number","format":"double","description":"Taux de succès (%)","example":95.5},"totalExtractions":{"type":"integer","format":"int64","description":"Nombre total d'extractions"},"overrideCount":{"type":"integer","format":"int32","description":"Nombre d'overrides actifs"},"lastPatternUpdate":{"type":"string","format":"date-time","description":"Dernière mise à jour pattern"}}},"CreatePatternVersionRequest":{"type":"object","description":"Requête de création d'une nouvelle version de pattern","properties":{"pattern":{"type":"string","description":"Pattern regex"},"alternativePatterns":{"type":"string","description":"Patterns alternatifs (JSON array)"},"source":{"type":"string","description":"Source","example":"manual"},"notes":{"type":"string","description":"Notes"}},"required":["pattern"]},"PatternVersionResponse":{"type":"object","description":"Version d'un pattern ML","properties":{"id":{"type":"string","format":"uuid","description":"ID de la version"},"version":{"type":"integer","format":"int32","description":"Numéro de version","example":3},"pattern":{"type":"string","description":"Pattern regex"},"alternativePatterns":{"type":"string","description":"Patterns alternatifs (JSON)"},"source":{"type":"string","description":"Source","example":"training"},"successRate":{"type":"number","format":"double","description":"Taux de succès (%)","example":94.2},"totalTests":{"type":"integer","format":"int64","description":"Nombre de tests"},"successfulTests":{"type":"integer","format":"int64","description":"Nombre de succès"},"rateDelta":{"type":"number","format":"double","description":"Delta par rapport à version précédente (%)","example":-1.5},"regressionAlert":{"type":"boolean","description":"Alerte régression (delta < -2%)"},"isActive":{"type":"boolean","description":"Version actuellement active"},"notes":{"type":"string","description":"Notes"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"createdBy":{"type":"string","description":"Créé par (UUID Keycloak)"}}},"CreateOverrideRequest":{"type":"object","description":"Requête de création/modification d'override","properties":{"clientIds":{"type":"array","description":"IDs des clients (pour override individuel)","items":{"type":"string","format":"uuid"}},"clientGroups":{"type":"array","description":"Groupes de clients (pour override groupe)","items":{"type":"string"}},"overrideType":{"type":"string","description":"Type d'override","example":"FORCE_REQUIRED"},"customPattern":{"type":"string","description":"Pattern personnalisé (si CUSTOM_PATTERN)"},"reason":{"type":"string","description":"Raison de l'override"},"expiresAt":{"type":"string","format":"date-time","description":"Date d'expiration (null = permanent)"}},"required":["overrideType"]},"OverrideResponse":{"type":"object","description":"Override de champ pour client/groupe","properties":{"id":{"type":"string","format":"uuid","description":"ID de l'override"},"btCode":{"type":"string","description":"Code BT du champ"},"clientId":{"type":"string","format":"uuid","description":"ID du client (si individuel)"},"clientName":{"type":"string","description":"Nom du client"},"clientGroup":{"type":"string","description":"Groupe de clients (si groupe)"},"overrideType":{"type":"string","description":"Type d'override"},"customPattern":{"type":"string","description":"Pattern personnalisé"},"active":{"type":"boolean","description":"Override actif"},"reason":{"type":"string","description":"Raison"},"expiresAt":{"type":"string","format":"date-time","description":"Date d'expiration"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"createdBy":{"type":"string","description":"Créé par"}}},"SyncResult":{"type":"object","properties":{"success":{"type":"boolean"},"error":{"type":"string"},"totalInSource":{"type":"integer","format":"int32"},"totalInDatabase":{"type":"integer","format":"int32"},"fieldsAdded":{"type":"integer","format":"int32"},"fieldsUpdated":{"type":"integer","format":"int32"},"patternsUpdated":{"type":"integer","format":"int32"},"addedBtCodes":{"type":"array","items":{"type":"string"}},"updatedBtCodes":{"type":"array","items":{"type":"string"}},"syncedAt":{"type":"string","format":"date-time"}}},"TemplateDTO":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"sector":{"type":"string"},"profile":{"type":"string"},"templateData":{"type":"object","additionalProperties":{"type":"object"}},"defaultCurrency":{"type":"string"},"defaultVatRate":{"type":"number"},"defaultPaymentTermsDays":{"type":"integer","format":"int32"},"defaultPaymentMeansCode":{"type":"string"},"requiredFields":{"type":"array","items":{"type":"string"}},"optionalFields":{"type":"array","items":{"type":"string"}},"validationRules":{"type":"array","items":{"type":"object","additionalProperties":{"type":"string"}}},"isSystem":{"type":"boolean"},"usageCount":{"type":"integer","format":"int64"}}},"CertificateEntry":{"type":"object","description":"Certificat disponible","properties":{"alias":{"type":"string","description":"Alias du certificat dans le keystore"},"subject":{"type":"string","description":"Sujet (CN)"},"issuer":{"type":"string","description":"Émetteur"},"serialNumber":{"type":"string","description":"Numéro de série"},"validFrom":{"type":"string","format":"date-time","description":"Date de début de validité"},"validTo":{"type":"string","format":"date-time","description":"Date de fin de validité"},"valid":{"type":"boolean","description":"Certificat valide"},"daysUntilExpiration":{"type":"integer","format":"int64","description":"Jours restants avant expiration"},"keyType":{"type":"string","description":"Type de clé (RSA, EC)"},"keySize":{"type":"integer","format":"int32","description":"Taille de clé en bits"},"keyUsage":{"type":"array","description":"Usage prévu (signature, encryption)","items":{"type":"string"}},"qualifiedCertificate":{"type":"boolean","description":"Certificat qualifié eIDAS"}}},"CertificateInfoResponse":{"type":"object","description":"Informations sur les certificats de signature disponibles","properties":{"certificates":{"type":"array","description":"Certificats disponibles pour signature","items":{"$ref":"#/components/schemas/CertificateEntry"}},"defaultCertificateAlias":{"type":"string","description":"Certificat par défaut"},"keystoreConfigured":{"type":"boolean","description":"Keystore configuré"},"tsaConfigured":{"type":"boolean","description":"TSA configurée"},"tsaProvider":{"type":"string","description":"Fournisseur TSA"},"supportedFormats":{"type":"array","description":"Formats de signature supportés","items":{"type":"string"}}}},"InvoiceSummary":{"type":"object","description":"Résumé d'une facture","properties":{"id":{"type":"string","format":"uuid","description":"ID de la facture"},"invoiceNumber":{"type":"string","description":"Numéro de facture","example":"FAC-2025-001"},"emitterSiret":{"type":"string","description":"SIRET émetteur","example":12345678901234},"emitterName":{"type":"string","description":"Nom de l'émetteur"},"recipientSiret":{"type":"string","description":"SIRET destinataire","example":98765432109876},"recipientName":{"type":"string","description":"Nom du destinataire"},"amountInclTax":{"type":"number","description":"Montant TTC"},"currency":{"type":"string","description":"Devise","example":"EUR"},"invoiceDate":{"type":"string","format":"date","description":"Date de la facture"},"profile":{"type":"string","description":"Profil Factur-X","enum":["MINIMUM","BASIC_WL","BASIC","EN16931","EXTENDED"],"example":"EN16931"},"platform":{"type":"string","description":"Plateforme","enum":["PPF","CHORUS","PDP"],"example":"PPF"},"status":{"type":"string","description":"Statut actuel","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"],"example":"ACCEPTED"},"externalId":{"type":"string","description":"ID externe"},"depositNumber":{"type":"string","description":"Numéro de dépôt"},"createdAt":{"type":"string","format":"date-time","description":"Date de création"},"updatedAt":{"type":"string","format":"date-time","description":"Date de dernière mise à jour"}}},"PageInvoiceSummary":{"type":"object","properties":{"totalPages":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"pageable":{"$ref":"#/components/schemas/PageableObject"},"numberOfElements":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"content":{"type":"array","items":{"$ref":"#/components/schemas/InvoiceSummary"}},"number":{"type":"integer","format":"int32"},"sort":{"$ref":"#/components/schemas/SortObject"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"PageableObject":{"type":"object","properties":{"pageNumber":{"type":"integer","format":"int32"},"paged":{"type":"boolean"},"pageSize":{"type":"integer","format":"int32"},"unpaged":{"type":"boolean"},"offset":{"type":"integer","format":"int64"},"sort":{"$ref":"#/components/schemas/SortObject"}}},"SortObject":{"type":"object","properties":{"sorted":{"type":"boolean"},"unsorted":{"type":"boolean"},"empty":{"type":"boolean"}}},"StatusHistoryEntry":{"type":"object","description":"Entrée d'historique de statut","properties":{"id":{"type":"string","format":"uuid","description":"ID de l'entrée"},"previousStatus":{"type":"string","description":"Statut précédent","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]},"newStatus":{"type":"string","description":"Nouveau statut","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]},"source":{"type":"string","description":"Source du changement","enum":["API","PPF","CHORUS","WEBHOOK","SYSTEM","USER","SCHEDULER"],"example":"PPF"},"changedBy":{"type":"string","description":"Acteur ayant effectué le changement","example":"api-client-123"},"reason":{"type":"string","description":"Raison du changement"},"details":{"type":"string","description":"Détails supplémentaires (JSON)"},"changedAt":{"type":"string","format":"date-time","description":"Date/heure du changement"}}},"TokenInfo":{"type":"object","description":"Information sur le client authentifié et son token","properties":{"clientId":{"type":"string","description":"Identifiant du client API","example":"my-api-client"},"clientName":{"type":"string","description":"Nom du client","example":"Mon Application"},"scopes":{"type":"array","description":"Scopes accordés au client","example":["read","write","submit"],"items":{"type":"string"}},"issuedAt":{"type":"string","format":"date-time","description":"Date d'émission du token"},"expiresAt":{"type":"string","format":"date-time","description":"Date d'expiration du token"},"remainingSeconds":{"type":"integer","format":"int64","description":"Temps restant avant expiration en secondes","example":3542},"valid":{"type":"boolean","description":"Le token est-il valide","example":true},"tokenType":{"type":"string","description":"Type de token","example":"access_token"}}},"AuditEntry":{"type":"object","description":"Entrée du journal de preuves (audit trail)","properties":{"id":{"type":"string","description":"ID unique de l'entrée","example":"aud_a1b2c3d4"},"documentId":{"type":"string","description":"ID du document concerné","example":"doc_x1y2z3"},"operationType":{"type":"string","description":"Type d'opération","enum":["EXTRACTION_STARTED","EXTRACTION_COMPLETED","EXTRACTION_FAILED","CONVERSION_STARTED","CONVERSION_COMPLETED","CONVERSION_FAILED","VALIDATION_STARTED","VALIDATION_COMPLETED","VALIDATION_FAILED","TIMESTAMP_REQUESTED","TIMESTAMP_RECEIVED","TIMESTAMP_FAILED","SUBMISSION_PPF_STARTED","SUBMISSION_PPF_COMPLETED","SUBMISSION_PPF_FAILED","SUBMISSION_CHORUS_STARTED","SUBMISSION_CHORUS_COMPLETED","SUBMISSION_CHORUS_FAILED","ARCHIVE_CREATED","ARCHIVE_VERIFIED","DOCUMENT_ACCESSED","DOCUMENT_DOWNLOADED","SYSTEM_EVENT"],"example":"CONVERSION"},"timestamp":{"type":"string","format":"date-time","description":"Timestamp de l'opération (ISO 8601)"},"inputHash":{"type":"string","description":"Hash du document avant opération (hex)"},"outputHash":{"type":"string","description":"Hash du document après opération (hex)"},"previousEntryHash":{"type":"string","description":"Hash de l'entrée précédente (chaînage)"},"entryHash":{"type":"string","description":"Hash de cette entrée (calculé)"},"timestampToken":{"type":"string","description":"Token d'horodatage TSA (si horodaté)"},"userId":{"type":"string","description":"Utilisateur ayant effectué l'opération"},"sourceIp":{"type":"string","description":"Adresse IP source"},"success":{"type":"boolean","description":"Succès de l'opération"},"errorMessage":{"type":"string","description":"Message d'erreur si échec"},"metadata":{"type":"object","additionalProperties":{"type":"object"},"description":"Métadonnées supplémentaires"},"signature":{"type":"string","description":"Signature de l'entrée (optionnel)"}}},"B2gData":{"type":"object","properties":{"codeService":{"type":"string"},"libelleService":{"type":"string"},"gestionEngagementJuridique":{"type":"boolean"},"gestionStatutMiseEnPaiement":{"type":"boolean"}}},"SirenInfo":{"type":"object","properties":{"siren":{"type":"string"},"raisonSociale":{"type":"string"},"typeEntite":{"type":"string"},"etatAdministratif":{"type":"string"},"diffusible":{"type":"boolean"},"categorieJuridique":{"type":"string"},"dateCreation":{"type":"string","format":"date"},"idInstance":{"type":"integer","format":"int64"},"dateObservation":{"type":"string","format":"date"},"entitePublique":{"type":"boolean"},"personneMorale":{"type":"boolean"},"active":{"type":"boolean"}}},"SiretInfo":{"type":"object","properties":{"siret":{"type":"string"},"siren":{"type":"string"},"nic":{"type":"string"},"denomination":{"type":"string"},"typeEtablissement":{"type":"string"},"etatAdministratif":{"type":"string"},"diffusible":{"type":"boolean"},"adresse":{"$ref":"#/components/schemas/Address"},"dateCreation":{"type":"string","format":"date"},"idInstance":{"type":"integer","format":"int64"},"dateObservation":{"type":"string","format":"date"},"donneesB2g":{"$ref":"#/components/schemas/B2gData"},"uniteLegale":{"$ref":"#/components/schemas/SirenInfo"},"siege":{"type":"boolean"},"entitePublique":{"type":"boolean"},"active":{"type":"boolean"}}},"CacheStats":{"type":"object","properties":{"sirenHitRate":{"type":"number","format":"double"},"sirenSize":{"type":"integer","format":"int64"},"siretHitRate":{"type":"number","format":"double"},"siretSize":{"type":"integer","format":"int64"},"routingCodeHitRate":{"type":"number","format":"double"},"routingCodeSize":{"type":"integer","format":"int64"},"directoryEntryHitRate":{"type":"number","format":"double"},"directoryEntrySize":{"type":"integer","format":"int64"},"routingDecisionHitRate":{"type":"number","format":"double"},"routingDecisionSize":{"type":"integer","format":"int64"}}},"ClientListResponse":{"type":"object","properties":{"clients":{"type":"array","items":{"$ref":"#/components/schemas/ClientResponse"}},"total":{"type":"integer","format":"int32"},"activeCount":{"type":"integer","format":"int32"}}},"InvoiceEntity":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"invoiceNumber":{"type":"string"},"emitterSiret":{"type":"string"},"emitterName":{"type":"string"},"recipientSiret":{"type":"string"},"recipientName":{"type":"string"},"amountExclTax":{"type":"number"},"vatAmount":{"type":"number"},"amountInclTax":{"type":"number"},"currency":{"type":"string"},"invoiceDate":{"type":"string","format":"date"},"dueDate":{"type":"string","format":"date"},"profile":{"type":"string","enum":["MINIMUM","BASIC_WL","BASIC","EN16931","EXTENDED"]},"platform":{"type":"string","enum":["PPF","CHORUS","PDP"]},"status":{"type":"string","enum":["CREATED","VALIDATED","SUBMITTED","DEPOSITED","RECEIVED","PENDING_APPROVAL","ACCEPTED","REFUSED","PAID","REJECTED","CANCELLED","ERROR"]},"errorMessage":{"type":"string"},"externalId":{"type":"string"},"depositNumber":{"type":"string"},"documentHash":{"type":"string"},"storagePath":{"type":"string"},"clientId":{"type":"string"},"correlationId":{"type":"string"},"direction":{"type":"string","enum":["INCOMING","OUTGOING"]},"receivedAt":{"type":"string","format":"date-time"},"senderPlatform":{"type":"string"},"originalFormat":{"type":"string"},"rawXml":{"type":"string"},"rawPdfPath":{"type":"string"},"sourceExternalId":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"ClientDossier":{"type":"object","properties":{"clientId":{"type":"string"},"clientName":{"type":"string"},"siret":{"type":"string"},"pendingCount":{"type":"integer","format":"int64"}}},"DossierStats":{"type":"object","properties":{"clientId":{"type":"string"},"totalInvoices":{"type":"integer","format":"int64"},"pendingValidation":{"type":"integer","format":"int64"},"validated":{"type":"integer","format":"int64"},"submitted":{"type":"integer","format":"int64"},"accepted":{"type":"integer","format":"int64"},"refused":{"type":"integer","format":"int64"},"paid":{"type":"integer","format":"int64"},"errors":{"type":"integer","format":"int64"},"totalAmountHT":{"type":"number"},"totalAmountTTC":{"type":"number"}}},"AccountingEntry":{"type":"object","properties":{"invoiceId":{"type":"string","format":"uuid"},"invoiceNumber":{"type":"string"},"invoiceDate":{"type":"string","format":"date"},"journalCode":{"type":"string"},"accountCode":{"type":"string"},"label":{"type":"string"},"debit":{"type":"number"},"credit":{"type":"number"},"currency":{"type":"string"}}},"PageFieldConfigResponse":{"type":"object","properties":{"totalPages":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"pageable":{"$ref":"#/components/schemas/PageableObject"},"numberOfElements":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"content":{"type":"array","items":{"$ref":"#/components/schemas/FieldConfigResponse"}},"number":{"type":"integer","format":"int32"},"sort":{"$ref":"#/components/schemas/SortObject"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"PagePatternVersionResponse":{"type":"object","properties":{"totalPages":{"type":"integer","format":"int32"},"totalElements":{"type":"integer","format":"int64"},"pageable":{"$ref":"#/components/schemas/PageableObject"},"numberOfElements":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"content":{"type":"array","items":{"$ref":"#/components/schemas/PatternVersionResponse"}},"number":{"type":"integer","format":"int32"},"sort":{"$ref":"#/components/schemas/SortObject"},"first":{"type":"boolean"},"last":{"type":"boolean"},"empty":{"type":"boolean"}}},"FieldDetailResponse":{"type":"object","description":"Détails complets d'un champ avec historique","properties":{"field":{"$ref":"#/components/schemas/FieldConfigResponse"},"history":{"type":"array","description":"Historique des versions de patterns","items":{"$ref":"#/components/schemas/PatternVersionResponse"}},"overrides":{"type":"array","description":"Overrides actifs","items":{"$ref":"#/components/schemas/OverrideResponse"}},"performance":{"$ref":"#/components/schemas/PerformanceMetrics","description":"Métriques de performance"},"xpathCii":{"type":"string","description":"XPath CII/Factur-X"},"xpathUbl":{"type":"string","description":"XPath UBL"}}},"PerformanceMetrics":{"type":"object","description":"Métriques de performance d'un champ","properties":{"averageSuccessRate":{"type":"number","format":"double","description":"Taux de succès moyen (%)"},"minSuccessRate":{"type":"number","format":"double","description":"Taux minimum (%)"},"maxSuccessRate":{"type":"number","format":"double","description":"Taux maximum (%)"},"versionCount":{"type":"integer","format":"int64","description":"Nombre de versions"},"regressionCount":{"type":"integer","format":"int64","description":"Nombre de régressions"},"trend":{"type":"string","description":"Tendance (positive/negative/stable)"},"evolution":{"type":"array","description":"Évolution du taux par version","items":{"$ref":"#/components/schemas/VersionMetric"}}}},"VersionMetric":{"type":"object","description":"Métrique d'une version","properties":{"version":{"type":"integer","format":"int32"},"successRate":{"type":"number","format":"double"},"createdAt":{"type":"string","format":"date-time"}}},"FieldStatsResponse":{"type":"object","description":"Statistiques globales des champs","properties":{"totalFields":{"type":"integer","format":"int64","description":"Nombre total de champs"},"fieldsWithPattern":{"type":"integer","format":"int64","description":"Champs avec pattern actif"},"requiredFields":{"type":"integer","format":"int64","description":"Champs obligatoires"},"averageSuccessRate":{"type":"number","format":"double","description":"Taux de succès moyen global (%)"},"activeRegressions":{"type":"integer","format":"int64","description":"Nombre de régressions actives"},"formatCoverage":{"$ref":"#/components/schemas/FormatCoverage","description":"Couverture par format"},"groupStats":{"type":"array","description":"Stats par groupe","items":{"$ref":"#/components/schemas/GroupStats"}}}},"FormatCoverage":{"type":"object","description":"Couverture par format","properties":{"facturx":{"type":"integer","format":"int64"},"ubl":{"type":"integer","format":"int64"},"cii":{"type":"integer","format":"int64"},"edifact":{"type":"integer","format":"int64"},"total":{"type":"integer","format":"int64"}}},"GroupStats":{"type":"object","description":"Stats d'un groupe de champs","properties":{"group":{"type":"string"},"fieldCount":{"type":"integer","format":"int64"},"requiredCount":{"type":"integer","format":"int64"},"averageSuccessRate":{"type":"number","format":"double"}}}}}}