← Rétro-ingénierie BizTalk

STM.ICUTexto.EAI — Spécification de l'état actuel (BizTalk)

Produit à partir de l'analyse du code source des orchestrations, schémas et liaisons de ports dans STM.ICUTexto.EAI et STM.ICUTextoExtraction.EAI. Horodatage du fichier de liaisons de ports : 2015-10-14. Nom de l'application dans les liaisons : STM.ICUTexto.EAI.

Objectif

Cette application BizTalk constitue la couche d'intégration du canal SMS ICU (Information Clientèle Urgence) de la STM, nommé en interne « Texto ». Elle gère :

  1. Envoi de SMS sortants — réception des demandes de messages provenant de systèmes internes et acheminement vers un fournisseur SMS externe (Vudu) via REST/HTTP.
  2. Interrogation du statut de livraison — requête vers Vudu pour les confirmations de livraison (DeliveryReport) et persistance des résultats dans la base de données SQL ICU.
  3. Boucle de mise à jour du statut — interrogation de la base de données SQL ICU pour les lots nécessitant une actualisation de statut et envoi de requêtes de statut par lot.
  4. Réception de SMS entrants — réception des messages entrants de Vudu (webhook /inbound) et acheminement en tant que MessageUsagerEntrant.
  5. Extraction de données — une application compagnon (STM.ICUTextoExtraction.EAI) extrait les enregistrements SMS du schéma SQL icuextraction et les publie en aval.

Systèmes externes

Système Rôle Protocole / Transport
Vudu (fournisseur SMS) Passerelle SMS pour l'envoi unitaire, l'envoi en lot, le statut de diffusion, la récupération de flux WCF-WebHttp (HTTPS), application/x-www-form-urlencoded sortant, réponse JSON entrante
Base de données SQL ICU Magasin de persistance pour les enregistrements d'envoi SMS, le suivi des lots, les mises à jour de statut, la purge WCF-SQL (adaptateur SQL BizTalk), procédures stockées
Appelants internes Envoi de requêtes SMS à BizTalk via HTTP REST Emplacement de réception WCF-WebHttp, authentification Basic sur TLS
Webhook entrant Vudu Livraison des messages SMS entrants (MO) à BizTalk Emplacement de réception WCF-WebHttp, authentification Basic sur TLS
SSPO / base de données icuextraction Source des données d'extraction SMS pour le traitement en aval WCF-SQL (procédure typée selExtractionTexto_SPPO)

Points d'intégration / Endpoints

Emplacements de réception

Nom du port Adresse Transport Méthode Pipeline Notes
STM.ICUTexto.EAI_EnvoiTexto /icutexto/api.svc WCF-WebHttp POST /texto Rcv_Json (désérialisation JSON) MaxConcurrentCalls=200, MaxReceivedMessageSize=204800, Auth : Basic sur TLS, AuthorizationManager personnalisé
STM.ICUTexto.EAI_ReceptionVudu /icutexto/vudu/api.svc WCF-WebHttp POST /inbound Rcv_JsonPromote MaxConcurrentCalls=200, Auth : Basic sur TLS, transformation vuduInbound2MessageUsagerEntrant
STM.ICUTexto.EAI_PollTraitementSmsBroadcast ${IcuDbAdress} InboundId=SmsBroadcast WCF-SQL TypedPolling — XMLReceive Interroge dbo.PollTraitementSMSBroadcast avec intervalle configurable (${IntervalPollingBroadcast}) et nombre maximum de lignes (${MaxPollingBroadcast})
STM.ICUTexto.EAI_PollTraitementSmsFeed ${IcuDbAdress} InboundId=SmsFeed WCF-SQL TypedPolling — XMLReceive Interroge dbo.PollTraitementSMSFeed avec intervalle configurable (${IntervalPollingFeed}) et nombre maximum de lignes (${PoolingFeedNbrRow})
STM.ICUTexto.EAI_PurgerTraitementTexto Planification (quotidienne) Adaptateur Schedule — Rcv_Nullify Se déclenche quotidiennement à 03:00, exécute exec PurgerTraitementTexto 100 via connexion ADO ${IcuDbAdoAdress}

Ports d'envoi

Nom du port Adresse Transport Opérations Notes
STM.ICUTexto.EAI_vuduSend ${uriFournisseur} WCF-WebHttp HTTPS POST /send, POST /send_batch, POST /get_broadcast Pipeline : Snd_wwwFormEncoded (encodage formulaire) / Rcv_Json (réponse JSON). TLS + inspecteur STM.WCFHttpHeaderBehavior.EAI. RetryCount=0. RouteFailedMessage=true
STM.ICUTexto.EAI_vuduSendbatch ${uriFournisseur} WCF-WebHttp HTTPS POST /send_batch Même ensemble de pipelines. RetryCount=0. RouteFailedMessage=true
STM.ICUTexto.EAI_vuduGetBroadcast ${uriFournisseur} WCF-WebHttp HTTPS POST /get_broadcast RetryCount=0
STM.ICUTexto.EAI_vuduGetFeed ${uriFournisseur} WCF-WebHttp HTTPS POST /get_feed RetryCount=3
STM.ICUTexto.EAI_SQLTraitementSms ${IcuDbAdress} WCF-SQL SauvegarderTraitementSMS, CreerTraitementSMSBatch, UpdTraitementSMSBatch Unidirectionnel. IsolationLevel=Serializable, livraison ordonnée
STM.ICUTexto.EAI_SQLTraitementSmsResponse ${IcuDbAdress} WCF-SQL updFeed, updBroadcast Bidirectionnel. IsolationLevel=Serializable
STM.ICUTexto.EAI_ResultatExecution ${RepertoireArchive}\Out\%MessageID%.xml FILE — Filtre : MessageType = ResultatExecution ET Medium = Texto. Pipeline : Snd_Nullify
STM.ICUTexto.EAI_Erreur ${RepertoireArchive}\%datetime%_%MessageID%.xml FILE — Archive d'erreurs. Capture les messages en échec provenant des ports de réception vuduSend, vuduSendbatch, ReceptionClx, ReceptionVudu

Authentification HTTP sur les appels sortants Vudu

Tous les ports d'envoi WCF-WebHttp Vudu utilisent SecurityMode=Transport, TransportClientCredentialType=None, avec STM.WCFHttpHeaderBehavior.EAI.Inspector (comportement WCF personnalisé de point de terminaison qui injecte un en-tête HTTP Authorization) et STM.TLSEndpointBehavior.EAI (TLS mutuel). Le jeton d'autorisation est récupéré à l'exécution par EnvoyerSMSVuduHelper.ObtenirHeader() et DemanderStatusHelper.ObtenirHeaderAuthorization(Source).


Flux de messages

Flux 1 : EnvoyerSMS (Orchestration — STM.ICUTexto.EAI.EnvoiSMS.EnvoyerSMS)

Module : STM.ICUTexto.EAI.EnvoiSMS

Fichier : EnvoyerSMS.odx

Déclencheur

Activée par un message de type STM.ICUSchema.EAI.Schema.MessageUsager.Texto arrivant sur MessageUsagerTextoPort (DirectBinding — MessageBox). Ce message provient de l'orchestration Mediator qui reçoit le POST HTTP entrant sur /icutexto/api.svc/texto.

Étapes

  1. Réception de MessageUsagerTexto (activation).
  2. Initialisation des variables locales : messageErreur, IdMessage, Source, Contenu, EnteteTexto, numero, indBatch=false, Statut="".
  3. Décision : Decide_VerifierFiltreDestinataire
  1. Envoi de MessageResultatExecution sur ResultatExecutionPort (DirectBinding — MessageBox). Ce message est finalement acheminé vers le port d'envoi FILE STM.ICUTexto.EAI_ResultatExecution.

Points de décision / Gestion des erreurs

Schémas de données référencés


Flux 2 : EnvoyerSMSVudu (Sous-orchestration — STM.ICUTexto.EAI.EnvoiSMS.EnvoyerSMSVudu)

Module : STM.ICUTexto.EAI.EnvoiSMS

Fichier : EnvoyerSMSVudu.odx

IsInvokable : true (appelée de façon synchrone par EnvoyerSMS)

Déclencheur

Appelée par l'orchestration parente avec le paramètre MessageUsagerTexto (type STM.ICUSchema.EAI.Schema.MessageUsager.Texto).

Étapes

  1. Journalisation DEBUT_TRAITEMENT_INFO.
  2. Extraction de Contenu, IdMessage, Source via XPath ; appel de ObtenirEnteteTexto, ObtenirNombreDeDestinataire.
  3. Calcul indBatch = (nbDestinataires != 1), nbEnvoi = ObtenirNombreDeTextoAEnvoyer(nbDestinataires), idxEnvoi = 0.
  4. Journalisation du nombre d'envois par rapport au nombre de destinataires.
  5. Décision : Decide_NombreDestinataires

Branche Rule_Unique (nbDestinataires == 1) : Chemin destinataire unique

Sinon (chemin multi-destinataires / lot) :

Points de décision / Gestion des erreurs

Schémas de données référencés


Flux 3 : SauvegarderDetailsEnvoi (Sous-orchestration — appelée par EnvoyerSMS et EnvoyerSMSVudu)

Module : STM.ICUTexto.EAI.EnvoiSMS

Déclarée dans les liaisons de ports comme STM.ICUTexto.EAI.EnvoiSMS.SauvegarderDetailsEnvoi, liée à SauvegarderTraitementSMSPort → STM.ICUTexto.EAI_SQLTraitementSms.

Objectif

Persiste l'enregistrement d'envoi SMS dans la base de données SQL ICU en appelant la procédure stockée dbo.SauvegarderTraitementSMS. Invoquée de façon synchrone par EnvoyerSMS (pour les chemins filtre/erreur) et par EnvoyerSMSVudu (pour les chemins succès et exception).

Paramètres (tous en entrée)

msgId: int, IdMessage: string, Source: string, EnteteTexto: string, numero: string, broadcastId: int, Contenu: string, messageErreur: string, indBatch: boolean, Statut: string


Flux 4 : DemanderStatus (Orchestration — STM.ICUTexto.EAI.ObtiensStatus.DemanderStatus)

Module : STM.ICUTexto.EAI.ObtiensStatus

Fichier : DemanderStatus.odx

Déclencheur

Activée par un message DemanderStatusSchema sur ObtenirStatusPort (DirectBinding — MessageBox). Ce message est publié par l'orchestration MettreAJourStatus (voir Flux 5).

Étapes

  1. Réception de MessageDemanderStatus (activation).
  2. Entrée dans la portée atomique Scope_DemanderFullDeliveryReport :
  1. Capture System.Exception Ex :

Points de décision / Gestion des erreurs

Schémas de données référencés


Flux 5 : MettreAJourStatus (Orchestration — STM.ICUTexto.EAI.ObtiensStatus.MettreAJourStatus)

Module : STM.ICUTexto.EAI.ObtiensStatus

Fichier : MettreAJourStatus.odx

Déclencheur

Activée par un message TypedPolling_ObtenirClxTextoStatus.TypedPolling arrivant sur PollingTraitementStatusPort (DirectBinding — MessageBox). Ceci est piloté par les emplacements de réception WCF-SQL TypedPolling (STM.ICUTexto.EAI_PollTraitementSmsBroadcast ou STM.ICUTexto.EAI_PollTraitementSmsFeed).

Le schéma du message d'interrogation est http://schemas.microsoft.com/Sql/2008/05/TypedPolling/SmsBroadcast avec l'élément TypedPolling → TypedPollingResultSet0[] → chaque ligne contenant BroadcastId: int. La procédure stockée interrogée est dbo.PollTraitementSMSBroadcast.

Étapes

  1. Réception de MsgPollingStatus (activation).
  2. Comptage des enregistrements : nbRecord = count(//*[local-name()='ClxBatchId']), idxRecord = 1.
  3. Construction du premier MessageMAJTraitementTexto (schéma : TypedProcedure_dbo.MettreAJourTraitementTexto) via MettreAJourStatusHelper.ObtenirMettreAJourTraitementTexto(MsgPollingStatus, 1).
  4. Envoi de MessageMAJTraitementTexto sur MettreAJourTraitementTextoPort (LogicalBinding, DeliveryNotification=Transmitted) → lié à STM.ICUTexto.EAI_SQLTraitementSms (procédure stockée UpdTraitementSMSBatch).
  5. Boucle (while idxRecord <= nbRecord) :

Points de décision / Gestion des erreurs

Schémas de données référencés


Flux 6 : ExtraireSSPO (Orchestration — STM.ICUTextoExtraction.EAI.Extraction.ExtraireSSPO)

Module : STM.ICUTextoExtraction.EAI.Extraction

Fichier : ExtraireSSPO.odx

Application : STM.ICUTextoExtraction.EAI (application BizTalk distincte)

Déclencheur

Activée par un message Schema.declencheur sur declencheurPort (DirectBinding — MessageBox). Il s'agit d'un message déclencheur/planificateur.

Étapes

  1. Réception de msgDeclencheur (activation).
  2. Journalisation DEBUT_TRAITEMENT_INFO.
  3. Construction de msgSelExtractionTexto_SPPO (schéma : TypedProcedure_icuextraction.selExtractionTexto_SPPO, espace de noms http://schemas.microsoft.com/Sql/2008/05/TypedProcedures/icuextraction) :
  1. Envoi de msgSelExtractionTexto_SPPO sur selExtractionTexto_SPPOPort (LogicalBinding, requête-réponse) → appel de la procédure stockée icuextraction.selExtractionTexto_SPPO.
  2. Réception de msgSelExtractionTexto_SPPOResponse (schéma : selExtractionTexto_SPPOResponse).
  3. Construction de msgExtractionSPPO (schéma : Schema.extractionSPPO) en utilisant la carte BizTalk selExtractionTexto_SPPO2extractionSPPO appliquée à la réponse.
  4. Envoi de msgExtractionSPPO sur ExtractionSPPOPort (DirectBinding — MessageBox) — publication des données extraites pour consommation en aval.
  5. Journalisation FIN_TRAITEMENT_INFO.

Points de décision / Gestion des erreurs

Schémas de données référencés


Problèmes connus et risques

1. Récupération de jeton d'authentification codée en dur dans le code d'orchestration

DemanderStatusHelper.ObtenirAuthorizationToken(Source), ObtenirHeaderAuthorization(Source) et EnvoyerSMSVuduHelper.ObtenirHeader() récupèrent les identifiants à l'exécution depuis le code helper — probablement en lisant depuis le SSO BizTalk ou des fichiers de configuration. Le mécanisme est opaque et non externalisé vers un magasin de secrets. La rotation des identifiants Vudu nécessite un redéploiement ou une reconfiguration SSO.

2. Zéro réessai sur les ports d'envoi Vudu

STM.ICUTexto.EAI_vuduSend et STM.ICUTexto.EAI_vuduSendbatch ont RetryCount=0. Les échecs HTTP transitoires entraînent une capture d'exception immédiate dans la portée de l'orchestration, qui affecte statusDetail="ERREUR" et persiste en SQL — mais ne réessaie pas l'envoi. Si l'API Vudu est temporairement indisponible, les messages sont marqués comme échoués de manière permanente sans mécanisme de remise en file.

3. Absorption silencieuse des erreurs dans DemanderStatus

Le gestionnaire Catch_All dans DemanderStatus journalise l'erreur, mais complète l'orchestration normalement. Les échecs d'interrogation du statut de livraison (p. ex. Vudu retourne 5xx, délai d'attente réseau) sont invisibles pour les opérations, sauf par l'analyse des journaux.

4. MettreAJourStatus n'a pas de gestionnaire d'exception

Tout échec dans la boucle de mise à jour du statut (erreur SQL, erreur réseau) suspend l'instance complète de l'orchestration de lot d'interrogation dans BizTalk. Tous les enregistrements restants dans le lot interrogé ne sont pas traités tant que l'instance n'est pas manuellement reprise ou terminée.

5. Boucle séquentielle dans MettreAJourStatus

Les enregistrements sont traités un à la fois (while idxRecord <= nbRecord). Pour les lots d'interrogation volumineux, cela crée un goulot d'étranglement de traitement linéaire. BizTalk ne parallélise pas cette boucle.

6. ExtraireSSPO n'a pas de gestion d'erreur

L'orchestration d'extraction n'a aucune gestion d'exception. Un délai d'attente SQL ou une base de données icuextraction indisponible suspend l'instance de manière permanente.

7. Sortie de résultat basée sur le système de fichiers

STM.ICUTexto.EAI_ResultatExecution écrit les résultats d'exécution dans le système de fichiers (${RepertoireArchive}\Out\). Il s'agit d'un patron de dépôt sans accusé de réception, sans TTL, sans nettoyage. Le disque se remplit s'il n'est pas géré.

8. Archive d'erreurs dans le système de fichiers

STM.ICUTexto.EAI_Erreur archive les messages en échec dans ${RepertoireArchive}\%datetime%_%MessageID%.xml. Mêmes préoccupations que ci-dessus.

9. Adresses paramétrées absentes du code source

${uriFournisseur}, ${IcuDbAdress}, ${IcuDbAdoAdress}, ${RepertoireArchive}, ${BtsProcessingHostInstance}, ${IntervalPollingBroadcast}, ${MaxPollingBroadcast}, etc. sont des variables de substitution au déploiement. Leurs valeurs réelles ne sont pas dans le code analysé ; les valeurs doivent être obtenues à partir des scripts de déploiement BizTalk ou de la configuration d'environnement.

10. Le service MettreAJourFeed est désinscrit

STM.ICUTexto.EAI.ObtiensStatus.MettreAJourFeed est listé dans les liaisons de ports avec State="Unenlisted", suggérant que le chemin de statut basé sur le flux a été désactivé ou n'a jamais été mis en production. L'emplacement de réception du flux d'interrogation (STM.ICUTexto.EAI_PollTraitementSmsFeed) est présent dans les liaisons, mais l'orchestration consommatrice n'est pas en cours d'exécution.

11. Composants de sérialisation JSON personnalisés

Les pipelines JSON entrants et sortants utilisent des composants personnalisés STM.JsonAssembler.EAI.PipelineComponents.JsonDisassembler et STM.ICUTexto.EAI.Mediator.Pipeline.Rcv_Json/Snd_Json. Ce ne sont pas des composants BizTalk standard et nécessitent une planification de migration séparée.


Dépendances

Assemblages BizTalk (internes)

Infrastructure externe


Diagramme d'architecture

Le diagramme ci-dessous montre la topologie d'intégration BizTalk complète pour STM.ICUTexto.EAI. Les emplacements de réception à gauche acceptent le trafic entrant ; les orchestrations exécutent la logique métier au centre ; les ports d'envoi à droite acheminent vers les systèmes externes.

graph LR
    subgraph InternalCallers["Appelants internes"]
        IC[Clients HTTP internes]
        VW[Webhook Vudu]
    end

    subgraph ReceiveLocations["Emplacements de réception"]
        RL1["EAI_EnvoiTexto\n/icutexto/api.svc POST /texto\nWCF-WebHttp · Rcv_Json"]
        RL2["EAI_ReceptionVudu\n/icutexto/vudu/api.svc POST /inbound\nWCF-WebHttp · Rcv_JsonPromote"]
        RL3["EAI_PollTraitementSmsBroadcast\nWCF-SQL TypedPolling\ndbo.PollTraitementSMSBroadcast"]
        RL4["EAI_PollTraitementSmsFeed\nWCF-SQL TypedPolling\ndbo.PollTraitementSMSFeed\n[Désinscrit]"]
        RL5["EAI_PurgerTraitementTexto\nAdaptateur Schedule · quotidien 03:00"]
    end

    subgraph MessageBox["BizTalk MessageBox (pub/sub)"]
        MB[(MessageBox\nSQL Server)]
    end

    subgraph Orchestrations["Orchestrations"]
        O1["EnvoyerSMS\nFiltre → Validation → Envoi"]
        O2["EnvoyerSMSVudu\nEnvoi unitaire ou en lot vers Vudu"]
        O3["SauvegarderDetailsEnvoi\nHelper de persistance SQL"]
        O4["MettreAJourStatus\nInterrogation SQL → publication de requêtes de statut"]
        O5["DemanderStatus\nRequête de rapport de livraison Vudu"]
        O6["ExtraireSSPO\nExtraction SQL → publication en aval"]
    end

    subgraph SendPorts["Ports d'envoi"]
        SP1["EAI_vuduSend\nPOST /send · HTTPS"]
        SP2["EAI_vuduSendbatch\nPOST /send_batch · HTTPS"]
        SP3["EAI_vuduGetBroadcast\nPOST /get_broadcast · HTTPS"]
        SP4["EAI_vuduGetFeed\nPOST /get_feed · HTTPS"]
        SP5["EAI_SQLTraitementSms\nWCF-SQL unidirectionnel\nSauvegarder / Creer / Upd"]
        SP6["EAI_SQLTraitementSmsResponse\nWCF-SQL bidirectionnel\nupdFeed / updBroadcast"]
        SP7["EAI_ResultatExecution\nFILE · ${RepertoireArchive}\\Out"]
        SP8["EAI_Erreur\nFILE · archive d'erreurs"]
    end

    subgraph ExternalSystems["Systèmes externes"]
        VUDU[Passerelle SMS Vudu\nhttps://uriFournisseur]
        ICUDB[(Base de données SQL ICU\n${IcuDbAdress})]
        SPPO[(Base de données icuextraction\n${IcuDbAdoAdress})]
        FS[Système de fichiers d'archive\n${RepertoireArchive}]
    end

    IC -->|POST /texto| RL1
    VW -->|POST /inbound| RL2
    RL1 --> MB
    RL2 --> MB
    RL3 -->|TypedPolling broadcast| MB
    RL4 -->|TypedPolling feed| MB
    RL5 -->|Déclencheur planifié| MB

    MB -->|MessageUsagerTexto| O1
    MB -->|TypedPolling| O4
    MB -->|declencheur| O6

    O1 -->|appel| O2
    O1 -->|appel| O3
    O2 -->|appel| O3
    O4 -->|publication DemanderStatusSchema| MB
    MB -->|DemanderStatusSchema| O5

    O2 --> SP1
    O2 --> SP2
    O5 --> SP3
    O5 --> SP6
    O4 --> SP5
    O3 --> SP5
    O1 --> SP7
    O6 -->|publication extractionSPPO| MB

    SP1 -->|HTTPS| VUDU
    SP2 -->|HTTPS| VUDU
    SP3 -->|HTTPS| VUDU
    SP4 -->|HTTPS| VUDU
    SP5 -->|WCF-SQL| ICUDB
    SP6 -->|WCF-SQL| ICUDB
    SP7 --> FS
    SP8 --> FS
    RL3 -->|interrogation| ICUDB
    RL4 -->|interrogation| ICUDB
    RL5 -->|purge ADO| ICUDB
    O6 --> SPPO

Diagramme de séquence

Cette séquence couvre le flux principal d'envoi de SMS sortants — du POST HTTP entrant à la validation, l'envoi vers Vudu et la persistance SQL.

sequenceDiagram
    autonumber
    actor Caller as Appelant interne
    participant APIM as Emplacement de réception BizTalk<br/>(EAI_EnvoiTexto)
    participant MB as BizTalk MessageBox
    participant EnvSMS as EnvoyerSMS<br/>orchestration
    participant EnvVudu as EnvoyerSMSVudu<br/>sous-orchestration
    participant SaveDB as SauvegarderDetailsEnvoi<br/>sous-orchestration
    participant Vudu as Passerelle SMS Vudu
    participant SQL as Base de données SQL ICU

    Caller->>APIM: POST /icutexto/api.svc/texto (JSON, auth Basic)
    APIM->>MB: Publication de MessageUsagerTexto (désérialisé)
    MB->>EnvSMS: Activation (liaison directe sur MessageUsager.Texto)

    alt Destinataire filtré
        EnvSMS->>SaveDB: appel(msgId=-1, Statut=FILTRE)
        SaveDB->>SQL: exec SauvegarderTraitementSMS
        EnvSMS->>MB: Publication ResultatExecution (FILTRE)
    else Message invalide
        EnvSMS->>SaveDB: appel(msgId=-1, Statut=ERREUR)
        SaveDB->>SQL: exec SauvegarderTraitementSMS
        EnvSMS->>MB: Publication ResultatExecution (ERREUR)
    else Destinataire unique
        EnvSMS->>EnvVudu: appel(MessageUsagerTexto)
        EnvVudu->>Vudu: POST /send {to, message} encodé formulaire<br/>Authorization: Bearer (du helper SSO)
        Vudu-->>EnvVudu: {status, status_detail, msg_id}
        EnvVudu->>SaveDB: appel(msgId, Statut=status_detail)
        SaveDB->>SQL: exec SauvegarderTraitementSMS
        EnvSMS->>MB: Publication ResultatExecution (SUCCES)
    else Destinataires multiples (lot)
        EnvSMS->>EnvVudu: appel(MessageUsagerTexto)
        EnvVudu->>SQL: exec CreerTraitementSMSBatch(idMessage, nbEnvois)
        SQL-->>EnvVudu: broadcastId
        loop pour chaque segment de lot
            EnvVudu->>Vudu: POST /send_batch {to, message}
            Vudu-->>EnvVudu: {status, status_detail, msg_id}
            EnvVudu->>SaveDB: appel(résultat par segment)
            SaveDB->>SQL: exec SauvegarderTraitementSMS
        end
        EnvSMS->>MB: Publication ResultatExecution (SUCCES)
    end

    MB->>Caller: Réponse ResultatExecution (via port FILE vers archive)

    Note over MB,SQL: L'interrogation de statut s'exécute séparément sur minuterie
    MB->>MettreAJourStatus: Activation sur TypedPolling broadcast
    activate MettreAJourStatus
    MettreAJourStatus->>SQL: exec PollTraitementSMSBroadcast
    SQL-->>MettreAJourStatus: List<BroadcastId>
    loop pour chaque BroadcastId
        MettreAJourStatus->>SQL: exec UpdTraitementSMSBatch
        MettreAJourStatus->>MB: Publication DemanderStatusSchema
        MB->>DemanderStatus: Activation
        activate DemanderStatus
        DemanderStatus->>Vudu: POST /get_broadcast {broadcast: batchId}
        Vudu-->>DemanderStatus: ClxFullDeliveryReport
        DemanderStatus->>SQL: exec updBroadcast
        deactivate DemanderStatus
    end
    deactivate MettreAJourStatus

Estimation de l'effort de migration

Orchestration Complexité Effort (jours) Bloquant Équivalent Azure
EnvoyerSMS Moyenne 3 Nécessite la décompilation de EnvoyerSMSHelper pour la logique de filtrage et de validation avant le codage Azure Function (isolated worker) déclenchée par Service Bus
EnvoyerSMSVudu Haute 5 Le contrat de l'API Vudu (limites de débit, taille des lots, codes d'erreur) doit être confirmé ; décompilation du helper requise Azure Durable Function (Orchestrator + Activity, fan-out pour lot)
SauvegarderDetailsEnvoi Basse 1 Aucun — la signature de la procédure stockée est entièrement visible Méthode en ligne SqlService.SaveSendDetail() dans les Functions appelantes
MettreAJourStatus Moyenne 3 Confirmer que MettreAJourFeed est intentionnellement désinscrit avant de délimiter la migration Azure Function avec déclencheur minuterie + fan-out Service Bus
DemanderStatus Moyenne 2 Nécessite une décision explicite sur la politique de gestion d'erreurs (dead-letter vs absorption) avec approbation des opérations STM Azure Function déclenchée par Service Bus sms-status-request
ExtraireSSPO Basse 2 La carte BizTalk selExtractionTexto_SPPO2extractionSPPO doit être récupérée depuis le fichier source .btm Azure Function avec déclencheur minuterie + transformation JSON en ligne
Pipelines JSON personnalisés (Rcv_Json, Snd_wwwFormEncoded) Moyenne 2 Les assemblages des composants de pipeline personnalisés doivent être décompilés pour comprendre le comportement non standard System.Text.Json + FormUrlEncodedContent en .NET
STM.WCFHttpHeaderBehavior / STM.TLSEndpointBehavior Basse 1 Aucun — remplacés entièrement par HttpClient + récupération de secret Key Vault DefaultAzureCredential + HttpClient avec en-tête Authorization
Migration des identifiants SSO Haute 3 Toutes les valeurs des applications affiliées SSO (${uriFournisseur}, jetons d'auth par Source) doivent être inventoriées et extraites avant tout déploiement Azure Secrets Azure Key Vault, accès par identité managée
Inventaire des variables de déploiement Moyenne 2 Neuf variables paramétrées ne sont pas dans le code source — doivent être récupérées des scripts de déploiement BizTalk ou de la configuration d'environnement Azure App Settings / références Key Vault dans local.settings.json et Bicep

Effort total estimé : 24 jours-développeur (développeur unique ; des pistes parallèles sont possibles une fois les bloquants levés).


Liste de vérification pour le développeur

Compléter ces étapes avant d'écrire tout code Azure pour cette intégration.

1. Récupération du code source

2. Extraction des identifiants et de la configuration

3. Base de données

4. Vérification opérationnelle

5. Environnement de développement local