Liaisons d'actions
L'écran Liaisons d'actions est l'endroit où les actions réglementaires vendeur — les boutons qui apparaissent dans la modale de détail facture selon le statut — sont câblées à une séquence d'appels de connecteur. Renvoyer à la PA sur une facture en 9904 doit rappeler la PA, Paiement reçu sur un 204 peut mettre à jour l'ERP source et notifier l'acheteur, Avoir sur un 206 peut exécuter une requête SQL qui marque la ligne rejetée. La liste des actions est figée par la réglementation française ; ce qui se passe au clic se configure ici.
La page est sur le même pied que les Règles de notification : les deux surfaces portent une liste d'appels de connecteur avec la même structure Description / Connecteur / Cible / Paramètres / Arrêt sur échec et le même contrat de chaînage de réponses {call.N.fieldName}.
La page fonctionne quel que soit le système source — JD Edwards, SAP, NetSuite ou ERP personnalisé. Le menu déroulant des connecteurs liste tous les connecteurs API et SQL fusionnés avec les suffixes · API / · SQL ; le type est ainsi visible d'un coup d'œil.
Les liaisons d'actions portaient un seul appel par action. Depuis 2026.05.7, chaque liaison porte une liste d'appels de connecteur, avec un drapeau Arrêt sur échec par appel, le chaînage des réponses via les placeholders {call.N.fieldName}, et la prise en charge des connecteurs SQL en plus des api-connecteurs. Les liaisons mono-appel existantes continuent de fonctionner — les anciennes clés à plat sont lues comme une liste à un élément au chargement et réécrites au format canonique action.N.call.M.* à la prochaine sauvegarde. Voir les notes de version 2026.05.7 pour la liste complète.
Accès à l'éditeur
- Barre latérale → Gestion → Liaisons d'actions.
- La page s'ouvre sur le template
e-invoicingpar défaut. Le sélecteur Portée permet de basculer sur une surcharge par société (e-invoicing-{kco}) — la liste des liaisons est rechargée depuis le template sélectionné ; le bouton Enregistrer écrit dans la même portée.
Vue d'ensemble
Sélecteur de portée
Le sélecteur de portée en haut de page choisit dans quel template les liaisons sont enregistrées :
| Portée | Template | Effet |
|---|---|---|
| Défaut (e-invoicing) | e-invoicing | Les liaisons par défaut héritées par chaque société. Modifier ici quand la même séquence d'appels s'applique à toute la plateforme. |
Société 00070 (e-invoicing-00070) | e-invoicing-00070 | Surcharge par société. Apparaît dans la liste pour chaque template e-invoicing-{kco} qui existe. Le résolveur côté runtime regarde d'abord le template par société puis retombe sur le défaut — une liaison présente dans les deux est surchargée par la version par société. |
La liste des surcharges disponibles est lue dans le catalogue des templates : tout template nommé e-invoicing-{kco} apparaît comme Société {kco}. Pour en créer une, copier le template e-invoicing par défaut sous le nouveau nom depuis Paramètres ; cette page chargera alors la nouvelle portée à la sélection.
Le bouton Enregistrer écrit dans la portée sélectionnée uniquement — un changement de portée avant enregistrement abandonne les modifications non sauvegardées de la précédente. Le badge Modifications non enregistrées apparaît à côté du sélecteur quand l'état en mémoire diverge de ce qui se trouve sur disque.
La liste des actions
Chaque liaison est rendue sous forme de carte. La carte porte une liste déroulante Action en haut (verrouillée aux sept ID réglementaires ci-dessous), une liste d'appels de connecteur dans des sous-cartes repliables et un bouton 🗑 par liaison.
ID d'actions réglementaires
La liste déroulante propose sept ID — les mêmes boutons que la modale de détail de facture affiche selon le statut dans l'onglet Actions. Une action sans liaison apparaît en désactivée dans la modale.
| ID d'action | Libellé | Déclenché sur le statut |
|---|---|---|
paymentReceived | Paiement reçu | 205 (statut réglementaire Encaissement constaté). |
creditNote | Avoir | 206 / 207 (rejet acheteur, réémission en avoir). |
correctedInvoice | Facture corrigée | 206 / 207 (réémission avec corrections plutôt qu'un avoir). |
sendCompleted | Envoi terminé | 208 (suspension acheteur, marquer le flux en cours comme résolu). |
cancelAccounting | Annulation comptable | 210 / 213 (litige, contre-passer l'écriture comptable). |
newInvoice | Nouvelle facture | 213 (litige clos, émettre une nouvelle facture pour la même livraison). |
resendPA | Renvoyer à la PA | 9904 / 9907 (rejet technique PA, re-soumettre le même UBL). |
Chaque ID peut être lié au plus une fois par portée. La liste déroulante exclut les ID déjà liés — pas de doublon accidentel possible. Supprimer une liaison libère l'ID pour réutilisation.
Liste d'appels
Sous l'ID d'action, la liaison porte une liste d'appels rendus sous forme de cartes repliables. L'en-tête de carte affiche l'index de l'appel (#1, #2, …) et soit le champ Description, soit connecteur · cible quand la description est vide.
| Champ | Description |
|---|---|
| Description | Libellé court libre pour cet appel (par exemple Mettre à jour le statut client CRM). Affiché en en-tête de carte repliée — une liaison à plusieurs appels se lit comme une liste à cocher d'un coup d'œil. Stocké uniquement comme métadonnée d'interface. |
| Connecteur | Liste déroulante de tous les connecteurs API et SQL fusionnés avec les suffixes · API / · SQL pour que le type soit visible. |
| Cible | Liste déroulante alimentée par api.connectors.listEndpoints(connecteur) pour un connecteur API ou par api.sqlConnectors.listQueries(connecteur) pour un connecteur SQL. Désactivée tant qu'aucun connecteur n'est choisi. |
| Paramètres | Pré-remplis à partir des paramètres déclarés sur la cible, une ligne étiquetée par paramètre. Les valeurs peuvent mêler texte libre et jetons {{placeholder}}. Quand la cible ne déclare aucun paramètre, une ligne Params libre remplace la mise en page par ligne. |
| Arrêt sur échec | Case unique. Cochée, un échec sur cet appel interrompt la chaîne et saute tous les appels restants. Décochée par défaut — la chaîne continue par défaut, comme dans les règles de notification. |
+ Ajouter un appel au pied de chaque liaison ajoute un nouvel appel. Les appels nouvellement ajoutés s'ouvrent automatiquement ; le chargement d'une liaison depuis le disque replie chaque appel pour que la page se lise comme un aperçu rapide.
Placeholders — valeurs de la facture
Les valeurs de paramètres acceptent des placeholders {{fieldName}} résolus au clic à partir de la ligne sur laquelle l'utilisateur agit. Champs disponibles :
| Placeholder | Source |
|---|---|
{{fedoc}} | Numéro de document (UHDOC / UHFEDOC). |
{{fedct}} | Type de document (UHDCT). |
{{kco}} | Code société (UHKCO). |
{{ublNumber}} | Identifiant UBL de la facture (UHK74UBLNB). |
{{statusCode}} | Code de statut courant (UHK74RSCD). |
{{customerName}} | Nom du client (UHALPH). |
{{totalHT}} | Montant total HT. |
{{totalTTC}} | Montant total TTC. |
{{currency}} | Code devise ISO 4217. |
{{amountDue}} | Solde restant dû. |
{{invoiceType}} | Type de facture UBL (380, 381, …). |
{{orderRef}} | Référence du bon de commande client. |
{{contractRef}} | Référence du contrat client. |
Texte libre et placeholders peuvent se mélanger — Y;reason={{statusCode}} est une valeur valide.
Chaînage des réponses
Quand la liaison porte deux appels ou plus, les sorties de chaque appel sont versées dans le contexte de dispatch sous des clés call.N.*, et les appels suivants y accèdent via les placeholders {call.N.fieldName} dans leurs valeurs de paramètres.
| Champ | Source — appel API | Source — appel SQL |
|---|---|---|
call.N.success | true quand le statut HTTP est inférieur à 400. | true quand l'instruction s'est exécutée sans erreur. |
call.N.statusCode | Code de statut HTTP renvoyé par l'endpoint. | — |
call.N.statementType | — | SELECT / INSERT / UPDATE / DELETE / MERGE. |
call.N.rowCount | — | Pour SELECT — nombre de lignes renvoyées. |
call.N.updateCount | — | Pour les non-SELECT — nombre de lignes affectées. |
call.N.error | Message d'erreur quand success vaut false. | Idem. |
call.N.<nom> | Tout mapping endpoint.N.response.<nom> que le connecteur définit. | Chaque colonne de la première ligne du résultat, par son nom. |
Exemple : une liaison Renvoyer à la PA qui re-soumet d'abord la facture à la PA via un appel API, puis enregistre une ligne d'audit dans l'ERP source via un appel SQL, donne au paramètre SQL submission_uuid la valeur {call.1.uuid} (le champ uuid du mapping de réponse du connecteur API). Si l'appel API échoue et que Arrêt sur échec est coché, l'appel SQL ne part pas et la trace d'audit indique STOP · 1 appel(s) restant(s) ignoré(s).
Déroulement d'une liaison
Quand l'utilisateur clique sur un bouton d'action dans la modale de détail facture :
- Le frontend résout d'abord le template par société (
e-invoicing-{kco}) et retombe sure-invoicingquand aucune surcharge n'existe. - Le bloc
action.Ncorrespondant sur ce template est lu ; sans liaison, la modale grise le bouton (le clic n'atteint jamais l'étape 3). - Les appels liés partent dans l'ordre de déclaration. Chaque appel passe par
executeConnectorAction, qui route vers/api/connectors/{nom}/call/{endpoint}pour un connecteur API ou vers/api/sql-connectors/{nom}/call/{requête}pour un connecteur SQL. - Les sorties sont versées dans
call.N.*. Les valeurs{{placeholder}}et{call.N.…}du prochain appel sont résolues sur le contexte fusionné. - Un
FAILsur un appel avec Arrêt sur échec coché interrompt la chaîne et traceSTOP · N appel(s) restant(s) ignoré(s). Sinon la chaîne continue avec l'appel suivant. - Le résultat agrégé est affiché dans une bannière de la modale facture — Action terminée · 2 / 2 appels réussis en cas de succès, le motif d'échec sinon.
Le dispatch est synchrone ; la modale reste ouverte jusqu'au retour de chaque appel. Les requêtes SQL longues sont bornées par le Query timeout du connecteur SQL ; les appels HTTP longs sont bornés par le Default timeout du connecteur API.
Conseils & bonnes pratiques
- Commencer par la portée par défaut. Configurer
e-invoicingd'abord, ne surcharger par société que quand un client demande un connecteur différent ou un paramètre supplémentaire. Le résolveur de repli garde la lecture claire. - Une finalité par liaison. Renvoyer à la PA ne doit pas en plus mettre à jour l'ERP et notifier les comptables — séparer en plusieurs appels dans la même liaison. Le champ Description sur chaque appel rend la chaîne lisible depuis la vue repliée.
- Activer Arrêt sur échec uniquement sur l'appel amont. Une chaîne typique est
soumission PA · audit ERP · notification finance. Cocher Arrêt sur échec uniquement sur le premier appel — si la soumission PA échoue, la ligne d'audit n'a pas de sens. Un échec sur l'audit ou la notification ne justifie pas de sauter le reste. - Référencer les appels précédents avec
{call.N.fieldName}. Une ligne d'audit SQL qui a besoin de l'UUID de la soumission PA le récupère via{call.1.uuid}plutôt que de re-questionner la PA. La chaîne reste cohérente lors des relances. - Tester avec la portée qui sera utilisée. Une liaison enregistrée sur
e-invoicingmais testée sur une facture de la société00070exécute la surcharge par société quand elle existe — basculer la portée d'abord lors de la validation. - Préserver l'exactitude des
{{placeholder}}. Les noms de placeholders listés ci-dessus sont les seuls que le runtime substitue ; une faute ({{customer}}au lieu de{{customerName}}) est laissée telle quelle et envoyée au connecteur sous forme de chaîne littérale. Le panneau Test des pages connecteur capture l'écart. - Désactiver une liaison en la vidant. Il n'y a pas de drapeau actif / inactif — pour suspendre une action, retirer sa liaison (le bouton est grisé dans la modale) ou retirer l'appel défaillant (le reste de la chaîne s'exécute toujours).