Aller au contenu principal

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.

Refonte en 2026.05.7

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-invoicing par 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

Liaisons d'actions↻ Rafraîchir💾 EnregistrerPORTÉEDéfaut (e-invoicing) ▾basculer sur e-invoicing-00070 pour surchargerACTIONRenvoyer à la PA (statut 9904 / 9907) ▾🗑Appel #1Re-soumettre la facture à la PA via api-connector×CONNECTEURmy-pa · API ▾CIBLEimport — POST /invoices ▾PARAMÈTRESNuméro UBL | {{ublNumber}}Forcer renvoi | YArrêt de la chaîne sur échec (saute les appels restants)Appel #2Audit dans l'ERP source via sql-connectorSQL×+ Ajouter un appelLes appels partent dans l'ordre. Référencer un appel précédent via {call.N.fieldName}.ACTIONPaiement reçu (statut 205) ▾Appel #1Mettre à jour le statut de paiement dans le CRMAppel #2Notifier l'acheteur via webhook — utilise {call.1.confirmationId}+ Ajouter une liaisonSélecteur de portéedéfaut + surcharges par sociétéIdentifiant d'action7 ID réglementaires, liste fixeListe multi-appelscartes repliables · ordre déclarationValeurs {{placeholder}}résolues au clicArrêt sur échecstoppe la chaîne au premier échecChaînage des réponses{call.N.fieldName} d'un appel précédent

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éeTemplateEffet
Défaut (e-invoicing)e-invoicingLes 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-00070Surcharge 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'actionLibelléDéclenché sur le statut
paymentReceivedPaiement reçu205 (statut réglementaire Encaissement constaté).
creditNoteAvoir206 / 207 (rejet acheteur, réémission en avoir).
correctedInvoiceFacture corrigée206 / 207 (réémission avec corrections plutôt qu'un avoir).
sendCompletedEnvoi terminé208 (suspension acheteur, marquer le flux en cours comme résolu).
cancelAccountingAnnulation comptable210 / 213 (litige, contre-passer l'écriture comptable).
newInvoiceNouvelle facture213 (litige clos, émettre une nouvelle facture pour la même livraison).
resendPARenvoyer à la PA9904 / 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.

ChampDescription
DescriptionLibellé 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.
ConnecteurListe déroulante de tous les connecteurs API et SQL fusionnés avec les suffixes · API / · SQL pour que le type soit visible.
CibleListe 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ètresPré-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 échecCase 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 :

PlaceholderSource
{{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.

ChampSource — appel APISource — appel SQL
call.N.successtrue quand le statut HTTP est inférieur à 400.true quand l'instruction s'est exécutée sans erreur.
call.N.statusCodeCode de statut HTTP renvoyé par l'endpoint.
call.N.statementTypeSELECT / INSERT / UPDATE / DELETE / MERGE.
call.N.rowCountPour SELECT — nombre de lignes renvoyées.
call.N.updateCountPour les non-SELECT — nombre de lignes affectées.
call.N.errorMessage 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 :

  1. Le frontend résout d'abord le template par société (e-invoicing-{kco}) et retombe sur e-invoicing quand aucune surcharge n'existe.
  2. Le bloc action.N correspondant sur ce template est lu ; sans liaison, la modale grise le bouton (le clic n'atteint jamais l'étape 3).
  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.
  4. Les sorties sont versées dans call.N.*. Les valeurs {{placeholder}} et {call.N.…} du prochain appel sont résolues sur le contexte fusionné.
  5. Un FAIL sur un appel avec Arrêt sur échec coché interrompt la chaîne et trace STOP · N appel(s) restant(s) ignoré(s). Sinon la chaîne continue avec l'appel suivant.
  6. 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-invoicing d'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-invoicing mais testée sur une facture de la société 00070 exé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).