Files
Omika/docs/Documentation_WebService_GET.md
T
2026-10-23 18:46:50 +02:00

422 KiB
Raw Blame History

DOCUMENTATION TECHNIQUE DU PROJET Batik_WS_Com_Mob 12/08/2026

Partie 1 › Projet Partie 1 Projet

12/08/2026 Batik_WS_Com_Mob 2

Partie 1 › Projet Projet Informations générales Batik_WS_Com_Mob Répertoire D:\Projets Windev\Batik\Nouvelle Version\WebService\Batik_WS_Com_Mob Analyse associée D:\Projets Windev\Batik\Nouvelle Version\WebService\Batik_WS_Com_Mob\WS_SYNCHRO.ana\WS_SYNCHRO.wda Gabarit 190 Gensteel Projet Liste des éléments du projet Nom Libellé FEN_Connexion FEN_Log FEN_Principal LIB_COMMUNE LIB_DEBUG LIB_EXE LIB_GENERALE LIB_GestionTableParamètres LIB_ProcéduresGlobales LIB_ProcéduresGlobales2 LIB_Structures LIB_Traitements LIB_WS LIB_WS_MOB WS_COM_MOBILE WS_LICENCE Statistiques Nombre de fenêtres : 3 Nombre de collections de procédures : 11 12/08/2026 Batik_WS_Com_Mob 3

Partie 1 › Projet › Code Projet Code Initialisation de Batik_WS_Com_Mob CONSTANT gcVersionWS ="Prod.A.002" //Pensez à incrémenter cette constante à chaque déploiement gcCLE_HASH_PASS ="MQC256Eex949eGgo" gcCLE_CRYPT_TOKEN ="mtS321WdQ280Lysz" gcPASS_FICHIERS ="marakech" gcPasErreur ="0" gcErreur_MauvaisToken ="401" gcErreur_ParamIncorrect ="501" gcErreur_Interne ="999" Mdp1 = "62" Mdp2 = "Langénieux" Mdp3 = "eBdFfDxVfB" //Constantes utilisées dans l'application mobile cDoc_Brouillon = 0 cDoc_AEnvoyer = 1 cDoc_ARecevoir = 3 cDoc_Synchronisé = 5 cDoc_ASupprimer = 6 cDoc_ErreurSync = 7 //Commande utilisée par le mobile pour communiquer avec le WebService // Commandes interprétées par le service cCMD_ListeDocDmd = "S.DOC.LS" cCMD_DocRpRecup = "S.DRpRc.EC" cCMD_DocEcrit = "S.DOC.EC" sCMD_DocSupprime = "S.DOC.SU" cCMD_DocNoteEcrit = "S.DNT.EC" cCMD_DocNoteSupprime = "S.DNT.SU" cCMD_NoteEcrit = "S.NTE.EC" cCMD_NoteSupprime = "S.NTE.SU" cCMD_TempsEcrit = "S.TPS.EC" cCMD_TempsEcrit_V2 = "S.TPS.EC.V2" cCMD_TempsSupprime = "S.TPS.SU" cCMD_CREcrit = "S.RPT.EC" cCMD_CREcrit_V2 = "S.RPT.EC.V2" cCMD_CRSupprime = "S.RPT.SU" cCMD_RdvEcrit = "S.RDV.EC" cCMD_RdvSupprime = "S.RDV.SU" cCMD_RdvAPlanifierEcrit = "S.RDV.PL" cCMD_RDVValidation = "S.RDV.V" cCMD_RDVAnnulation = "S.RDV.ANN" 12/08/2026 Batik_WS_Com_Mob 4

Partie 1 › Projet › Code cCMD_ParamAppliEcrit = "S.PRM.EC" cCMD_MsgExtEcrit = "S.MSGEXT.EC" //Commandes interprétées par le WebService cCMD_RecupImgRapport ="W.IMG.Sauve" cCMD_RechercheRDV ="W.RDV.RC" cCMD_ListeRDV ="W.RDV.LS" cCMD_ListeRDV_V2 ="W.RDV.LS.V2" cCMD_LitINTER ="W.INT.LI" //Récupère le contenu d'une intervention cCMD_LitINTER_V2 ="W.INT.LI.V2" cCMD_ListeNonPlanifié="W.NPL.LS" cCMD_ListeDOC ="W.DOC.LS" cCMD_ListeTEMPS ="W.TPS.LS" cCMD_LitParam ="W.PRM.LI" cCMD_LitParam_V2 ="W.PRM.LI.V2" //Lit les paramètres métiers cCMD_LitContexte ="W.CTX.LI" //Lit le contexte utilisateur cCMD_IdClbRdvDroitC ="W.IDCLB.PL.D" cCMD_ListeRDV_Clb ="W.RDV.Clb" cCMD_ListeCh_Rapport ="W.INT.Ch.Rp" // liste des champs rapport cCMD_Creation_Rapport="W.INT.Cr.Rp" // Création d'un rapport cCMD_Cr_Structure_Mail ="W.INT.Cr.ME" // Création d'un email a partir d'un modèle cCMD_ListeCh_Mail = "W.INT.Ch.ME" // liste des champs Modele Mail cCMD_Envoyer_Mail = "W.INT.Cr.ME.EXT" // Envoie et création de message externe //Paramètres cParam_Mobile_Fonction_Recherche = "MOB_FONC_RECHERCHE" cParam_Mobile_Saisie_Temps = "MOB_SAISIE_TEMPS" cParam_Mobile_Rapport_Vers_Temps = "MOB_RAPPORT_VERS_TEMPS" cParam_Mobile_Inter_Non_Planifiées = "MOB_INTER_NON_PLANIFIEES" cParam_Mobile_NiveauTrace = "MOB_NIVEAU_TRACE" cParam_Mobile_ChangeDateRDV = "MOB_CHANGER_DATE_DRV" // Raport mobile cRp_Inter = "INTER" cRp_Dossier = "DOSSIER" cRp_Client = "CLIENT" cRp_CtSite = "CONTACT_SITE" cRp_CR = "CR_INTER" cRp_CtDonneurs = "DONNEURS_ORDRE" cRp_Photo = "PHOTO_INTER" cRp_RDV = "RDV_INTER" cRp_Extra = "EXTRA" cBufferHorsSer = "BufferHorsSerealisation" cRubriquesModeleMail = "RubriquesModeleMail" cCorpsModeleMail = "CorpsModeleMail" NBPixelesXMilimetres = 3.7795275591 cParam_Civilite = "T.CV" cParam_TypeRDV = "T.RDV" cParam_StatusRDV = "S.RDV" cParam_TypeInter = "T.INTER" cParam_EtatInter = "E.INTER" cParam_TypeDossier = "T.DOSS" cParam_StatutDossier = "S.DOSS" cParam_TypeClient = "T.CL" cParam_StatutClient = "S.CL" cParam_ApportClient = "T.APPOR.CL" cParam_ApportOrigClient = "O.CL" cParam_ModeReglClient = "M.REG" cParam_TypeAction = "T.ACT" 12/08/2026 Batik_WS_Com_Mob 5

Partie 1 › Projet › Code cParam_TypeSignCR = "T.SIGN" cParam_RoleContact = "R.CT" cParam_LigneRqSql = "L.RQ.SQL" cParam_PeriodeRqSql = "P.RQ.SQL" cParam_OrigAnnuRDV = "O.ANU.RDV" cParam_MotifAnnuRDV = "M.ANU.RDV" cParam_TypeDoc = "T.DOC" cParam_EtatDoc = "E.DOC" cparam_TypeLieu = "T.LIEU" cparam_TypeTemps = "T.TEMPS" cparam_TypeAdresse = "T.ADR" cParam_ListeRapportMob = "Rapport_Mob" cParam_ListeMailModele = "Mail_Modele" cCle_RDVFait = "S.RDV.FAIT" cCle_RDVAnnule = "S.RDV.ANNU" cCle_RDVInter = "T.RDV.INTER" cCle_RDVAPlanifier = "S.RDV.PLNF" cCle_RDVConfirme = "S.RDV.CONF" cCle_DossierAnnule = "S.DOSS.ANNU" cCle_DossierOuvert = "S.DOSS.OUVT" cCle_ClientParticulier = "T.CL.PRT" cCle_CiviliteMadame = "T.CV.MME" cCle_TypeDocRapport = "T.DOC.RAPPRT" cCle_TypeDocImg = "T.DOC.PHOT" cCle_TypeDocAutre = "T.DOC.AUTRE" cCle_TypeDocNull = "T.DOC.NULL" cCle_TypeDocMsgExt = "T.DOC.MSG.EXT" cCle_TypeDocBatigest = "T.DOC.BTGEST" cCle_TypeTempsGlobal = "T.TEMPS.GLB" cCle_TypeTempsNull = "T.TEMPS.NULL" cCle_TypeTempsNonAffecte = "T.TEMPS.TMPSNNFF" cCle_TypeTempsInter = "T.TEMPS.INTER" cCle_NumLigneReq200 = "L.RQ.SQL.200" cCle_PeriodeSqlReq1Mois = "P.RQ.SQL.1M" cCle_EtatDocAbsent = "E.DOC.ABS" cCle_EtatDocPresent = "E.DOC.PRS" cCle_EtatDocSyncro = "E.DOC.SYNCRO" cCle_EtatInterTraite = "E.INTER.TRT" cCle_EtatInterSansSuite = "E.INTER.CLSSSNSS" cGestion_Colb = "A.GEST.CLB" cGestion_ActionInter = "A.GEST.ACT.INTER" cGestion_SuiviInter = "A.Suivi.Colb.Inter" cGestion_NotesInter = "A.GEST.NOTES.INT" cGestion_Rapport = "A.GEST.RAPPORT.INTER" cGestion_MsgExt = "A.GEST.MSG.EXT" cGestion_Param = "A.PARAM" cGestion_Temps = "A.GEST.TEMPS" cGestion_Equipe = "A.GEST.EQ" cGestion_Dossier = "A.GEST.DOSSIER" cGestion_Document = "A.GEST.DOC" cGestion_R_I_SOC_ATCH = "A.R.IT.SOC.ATCH" cGestion_R_I_RDV_EXST = "A.R.IT.RDV.EXST" cGestion_R_I_RDV_EXST_DS = "A.R.IT.RDV.EXST.DS" cGestion_Envoi_Email = "A.ENVOI.EMAIL" cGestion_Creation_Rp = "A.CREATION.RAPPORT" cGestion_A_PL_SOC_PRCP = "A.C.PL.SOC.PRCP" cGestion_A_PL_SOC = "A.C.PL.SOC" 12/08/2026 Batik_WS_Com_Mob 6

Partie 1 › Projet › Code cGestion_A_PL_EQ = "A.C.PL.EQ" cGestion_DocNull = "A.DOC.NULL" cGestion_DocPhoto = "A.DOC.PHOTO" cGestion_DocAutre = "A.DOC.AUTRE" cGestion_DocMsgExt = "A.DOC.MGS.EXT" cGestion_DocRapport = "A.DOC.RAPPORT" cGestion_DocBatigest = "A.DOC.BATIGEST" cRub_Dossier = "DOSSIER" cRub_Client = "CLIENT" cRub_Inter = "INTER" cRub_CtSite = "CONTACT_SITE" cRub_CR = "CR_INTER" cRub_CtDonneurs = "DONNEURS_ORDRE" cRub_Photo = "PHOTO_INTER" cRub_RDV = "RDV_INTER" cRub_Extra = "EXTRA" FIN CONSTANTE gcVersionNom ="Isis_WS_COM_MOBILE" FIN CONSTANTE gcVersionNom ="WS_COM_MOBILE" FIN gsdParamApplication est une Source de Données gnNbJoursLog est un entier = 10 gstContexte est un ST_ContexteMobile gstParametres est un ST_TAB_PARAM gtbaCleParametre est un tableau associatif d'entiers sur 8 octets gtbaLibParametre est un tableau associatif de chaînes ANSI gtbaGUIDCollaborateur est un tableau associatif de chaînes ANSI gcnxBaseSync est une Connexion gcnxReplica est une Connexion gcnxBaseSync..Serveur ="127.0.0.1" gcnxBaseSync..Provider =hAccèsHFClientServeur gcnxBaseSync..Utilisateur ="superuser" gcnxBaseSync..MotDePasse ="F911-Q927-K880-N196" gcnxBaseSync..BaseDeDonnées ="" gcnxReplica..Serveur ="127.0.0.1" gcnxReplica..Provider =hAccèsHFClientServeur gcnxReplica..Utilisateur ="superuser" gcnxReplica..MotDePasse ="F911-Q927-K880-N196" gcnxReplica..BaseDeDonnées ="" gcnxReplica..Cryptage =hCryptageRC5_16 gsaPass est une chaîne ANSI 12/08/2026 Batik_WS_Com_Mob 7

Partie 1 › Projet › Code gbContexteEnMemoire est un booléen gbContexteEnMemoire=Vrai //#A FAIRE Changer URL avec celle de SLAMM WS_LICENCE..Adresse="https://crm.artisanspartenaires.com/WS_LICENCE_V3_WEB/awws/WS_LICENCE_V3.awws" WS_LICENCE..Adresse ="http://batik.slamm-bergeroux.com/WS_LICENCE_WEB/awws/WS_LICENCE.awws" WS_LICENCE..Adresse ="http://83.206.103.161:8010/WS_LICENCE_WEB/awws/WS_LICENCE.awws" WS_LICENCE..Adresse ="https://omika.applilogik.fr/WS_LICENCE_WEB/awws/WS_LICENCE.awws" LitConfigurationINI() gsTEST est une chaîne ="VIDE" //TraceINFO("Init projet : " + WebserviceAdresseIPClient()) gsCleMdp est une chaîne = Mdp1+Mdp3+Mdp2 LanceWebService() FinProgramme() Initialisation lors d'une connexion à une session prélancée de Batik_WS_Com_Mob SI PAS DéclareContexteWebservice(gstContexte,gsTEST) ALORS TraceCUMUL("Le contexte n'est pas restauré") SINON TraceCUMUL("Contexte Restauré " ) TraceCUMUL("gstContexte.bAuthentifié =" + gstContexte.bAuthentifié) TraceCUMUL("=================") TraceCUMUL("Contexte =" + SerialiseContexte()) TraceCUMUL("TEST =" + gsTEST) TraceCUMUL("=================") FIN gstContexte.nNbConnexions ++ SI LIB_COMMUNE.gbTraceBufferReception ALORS bufTest est un Buffer = WebserviceParamètre(paramBuffer) TraceCUMUL("======== BUFFER =========") TraceCUMUL(bufTest) TraceCUMUL("======== BUFFER\ =========") FIN //InitialiseFichierTrace("Trace_" + gstContexte.saIdClient + DateSys() +".txt") //TraceINFO("Init après Connexion : WS_COM_MOBILE " + ExeInfo(exeNom) + " " + ExeInfo(exeVersion) ) //TraceINFO("WebService : " + gcVersionNom + " Version : " + gcVersionWS) //TraceINFO("Client :" + WebserviceAdresseIPClient( )) //si gstContexte.bAuthentifié alors // gstContexte.nNbConnexions++ ////TraceINFO( "IdClient : " + gstContexte.saIdClient + rc ... // + "Mobile : " + gstContexte.saIdMobile + rc ... // + "Nb Connexions : " + gstContexte.nNbConnexions + rc ... // + "Utilisateur : " + gstContexte.saNomUser ) //sinon // TraceINFO("Ouverture de session") //FIN // ////Mémorise le contexte utilisateur mobile entre deux appels au WS Fermeture de Batik_WS_Com_Mob 12/08/2026 Batik_WS_Com_Mob 8

Partie 1 › Projet › Code HFermeConnexion(gcnxBaseSync) HFermeConnexion(gcnxReplica) TraceINFO("Fermeture de WS " ) TraceINFO("Contexte en sortie :" + SerialiseContexte()) TraceINFO("Fermeture de WS_COM_MOBILE") Fermeture de session de Batik_WS_Com_Mob TraceINFO("Fermeture de session ") Projet Erreurs, warnings et informations ennoloC engiL Détail de l'erreur Localisation La variable locale 'vRub' n'est pas utilisée. LIB_Traitements.ConstruireListeCha mpModeleEmail 9 1 Procédure locale Tous les chemins d'exécution possibles ne renvoient pas de valeur : il manque un RENVOYER LIB_Traitements.CreationTableauInt

ou un RETOUR = dans le traitement. DocRapport
0 0
Procédure locale
Tous les chemins d'exécution possibles ne renvoient pas de valeur : il manque un RENVOYER LIB_Traitements.RqCompteRenduRe
ou un RETOUR = dans le traitement. mplirRapport 0 0
------------------------------------------- --- ------------ --- ---
Procédure locale
La variable locale 'n' n'est pas utilisée. LIB_Traitements.ConstruitTableauInt
erventions_V2 9 2
--- --- ------------- --- ---
Procédure locale
Projet
Statistiques sur le code
¹ .mmoc % ¹ .tiart/.giL
--- --- --- --------- -------------
¹ sengiL
LIB_COMMUNE 79 10 7
-------------------------- ---------------- --- ------ ---
LIB_DEBUG 272 13 54
LIB_EXE 120 19 40
LIB_GENERALE 35 14 7
LIB_GestionTableParamètres 42 0 7
LIB_ProcéduresGlobales 309 7 34
12/08/2026 Batik_WS_Com_Mob 9

Partie 1 › Projet › Statistiques sur le code

¹ .mmoc % ¹ .tiart/.giL
¹ sengiL
LIB_ProcéduresGlobales2 8 38 8
----------------------- --- ------- ---
LIB_Structures 706 6 706
LIB_Traitements 4915 9 78
LIB_WS 67 0 67
LIB_WS_MOB 336 16 48
FEN_Connexion 84 0 28
FEN_Log 68 0 34
FEN_Principal 329 14 10
Batik_WS_Com_Mob 362 10 90
7359 10 48
% comm. : Pourcentage de commentaires dans le code.
¹ Lignes : Nombre total de lignes de code.
Lig./trait. : Nombre de lignes de code par traitement.
12/08/2026 Batik_WS_Com_Mob 10
---------- ---------------- --- ---

Partie 2 › Analyse Partie 2 Analyse

12/08/2026 Batik_WS_Com_Mob 11

Partie 2 › Analyse Analyse Graphe

12/08/2026 Batik_WS_Com_Mob 12

Partie 2 › ... › D:\Projets Windev\Batik\Nouvelle Version\WebService\Batik_WS_Com_Mob\WS_SYNCHRO.ana\WS_SYNCHRO.wda › Graphe

12/08/2026 Batik_WS_Com_Mob 13

Partie 2 › ... › Informations générales Analyse Informations générales WS_SYNCHRO.wda D:\Projets Windev\Batik\Nouvelle Répertoire Version\WebService\Batik_WS_Com_Mob\WS_SYNCHRO.ana\

Répertoire des fichiers de données Répertoire de l'application
N°génération Nb. fichiers Nb. rubriques Nb. liaisons Nb. connexions Nb. groupes
20 4 39 0 1 0
--- --- --- --- --- --- --- ---
Analyse
Dictionnaire des rubriques
nolbuoD élC
euqinU élC
Rubrique Type Utilisée par...
--- -------- --- ---- --- --- --------------- ---
elliaT
CL_ID <Inutilisée>
--------- --- ------ --- --- ------------ --- ---
CL_IP <Inutilisée>
CL_IPv4 <Inutilisée>
CL_IPv6 <Inutilisée>
CL_NOM <Inutilisée>
CL_Port <Inutilisée>
CLE Chaîne 50 PARAMETRES
CleComp <Inutilisée>
IDCLIENTS <Inutilisée>
IDMOBILES <Inutilisée>
Identifiant automatique (8
IDTOMOB TOMOB
------------ --- --------------------------- ---------------- --- ------------ --- ---
IDTOSRV Identifiant automatique (4 TOSRV
IDTRAMES <Inutilisée>
MO_ACTIF Booléen MOBILES
MO_CLIENT <Inutilisée>
MO_GUID <Inutilisée>
MO_ID Identifiant automatique (8 MOBILES
MO_ID_CLIENT <Inutilisée>
MO_Mobile Chaîne 50 MOBILES
TM_Buffer Autre mémo binaire TOMOB
TM_CMD Chaîne 50 TOMOB
TM_Date Date et Heure TOMOB
TM_JSON Mémo texte TOMOB
TM_Lu Booléen TOMOB
12/08/2026 Batik_WS_Com_Mob 14

Partie 2 › ... › Dictionnaire des rubriques nolbuoD élC euqinU élC

Rubrique Type Utilisée par...
elliaT
TM_Mobile Chaîne 50 TOMOB
--------------- --- --- ------------------ --- ------------ --- ---
TM_MobileTM_CMD Clé composée 101 TOMOB
TR_DATA <Inutilisée>
TR_DEST <Inutilisée>
TR_ETAT <Inutilisée>
TR_ID <Inutilisée>
TR_ID_CLIENT <Inutilisée>
TR_ID_MOBILE <Inutilisée>
TS_Buffer Autre mémo binaire TOSRV
TS_CMD Chaîne 50 TOSRV
TS_Date Date et Heure TOSRV
TS_JSON Mémo texte TOSRV
TS_Lu Booléen TOSRV
TS_Mobile Chaîne 50 TOSRV
VALTEXT Mémo texte PARAMETRES
Analyse
Connexions
¹ *nnoC .mT
ruetasilitU ¹ *cexE .mT
------ --------- --- ----------------- ----------- --------------------- --- -----------
Connexion Source de données Provider
cnxDev didier WinDevClientServeurHF 30 30
localhost:4900
Connexion à 'localhost'
Utilisée par... PARAMETRES MOBILES TOSRV
--------------- --- ---------- --- ------- --- ----- ---
TOMOB
¹ Tm. Conn* : Timeout de connexion Tm. Exec* : Timeout d'exécution
Analyse
Fichiers et rubriques
12/08/2026 Batik_WS_Com_Mob 15
---------- --- --- ---------------- --- --- --- ---

Partie 2 › ... › Fichiers et rubriques › Analyse somém .sserpmoC ¹ * rcE/tceL .lnJ seénnod .tpyrC noitarénég°N .gerne elliaT xedni .tpyrC omém .tpyrC

noitaivérbA noitacilpéR ¹ * étirucéS
¹ * secapsE
¹ * rcE .lnJ
.otua .dI oG2 ed +
--- --- --------- -------- --- ---
epyT
MOBILES 3 69 HFSQL
------- --- ----- --- --- ------
Client/Serv
eur
PARAMETRES 2 68 HFSQL
---------- --- ----- --- --- ------
Client/Serv
eur
TOMOB 6 145 HFSQL
----- --- ------ --- --- ------
Client/Serv
eur
TOSRV 7 140 HFSQL
----- --- ------ --- --- ------
Client/Serv
eur
¹ Espaces * : Complétion des chaînes par des espaces Jnl. Ecr * : Journalisation des écritures
Jnl. Lect/Ecr * : Journalisation des lectures et écritures Sécurité * : Mode sécurité renforcée
MOBILES
Fichiers et rubriques
Informations générales
MOBILES MOBILES
-------------- --- ----------------------- --- --- ---
Nom sur disque MOBILES.fic
Connexion Connexion à 'localhost'
Rubriques du fichier MOBILES
nolbuoD élC
euqinU élC tuaféd .laV
Libellé Type
elliaT sneS
----- ---------------------- --- ------------------------ ------ ----
MO_ID Identifiant de MOBILES Identifiant automatique
(8 octets)
MO_Mobile Code unique Chaîne 50
---------- ------------ --- ---------------- --- ---
MO_ACTIF Mobile actif Booléen 0
12/08/2026 Batik_WS_Com_Mob 16

Partie 2 › ... › Fichiers et rubriques › PARAMETRES › Fichiers et rubriques PARAMETRES Fichiers et rubriques Informations générales PARAMETRES PARAMETRES Nom sur disque PARAMETRES.fic Connexion Connexion à 'localhost' Rubriques du fichier PARAMETRES nolbuoD élC

euqinU élC tuaféd .laV
Libellé Type
elliaT
sneS
CLE CLE 50
--- --- --- --- ---
Chaîne
VALTEXT VALTEXT Mémo texte
---------- ------- ---------------- --- ---
12/08/2026 Batik_WS_Com_Mob 17

Partie 2 › ... › Fichiers et rubriques › TOMOB › Fichiers et rubriques TOMOB Fichiers et rubriques Informations générales TOMOB TOMOB Nom sur disque TOMOB.fic Connexion Connexion à 'localhost' Rubriques du fichier TOMOB nolbuoD élC

euqinU élC tuaféd .laV
Libellé Type
elliaT
sneS
IDTOMOB Identifiant de TOMOB Identifiant automatique
------- -------------------- ------------------------ --- ---
(8 octets)
TM_Date TM_Date Date et Heure
------- ------- -------------- --- ---
(aaaammjjhhmmssccc)
TM_JSON TM_JSON Mémo texte
--------------- ------------------ ------------------ --- ---
TM_Mobile TM_Mobile Chaîne 50
TM_Lu TM_Lu Booléen 0
TM_Buffer TM_Buffer Autre mémo binaire
TM_CMD TM_CMD Chaîne 50
TM_MobileTM_CMD TM_Mobile + TM_CMD Clé composée : 101
TM_Mobile+TM_CMD+TM
_Lu
12/08/2026 Batik_WS_Com_Mob 18
---------- --- ---------------- --- ---

Partie 2 › ... › Fichiers et rubriques › TOSRV › Fichiers et rubriques TOSRV Fichiers et rubriques Informations générales TOSRV TOSRV Nom sur disque TOSRV.fic Connexion Connexion à 'localhost' Rubriques du fichier TOSRV nolbuoD élC

euqinU élC tuaféd .laV
Libellé Type
elliaT
sneS
IDTOSRV Identifiant de TOSRV Identifiant automatique
------- -------------------- ------------------------ --- ---
(4 octets)
TS_Date Date heure création Date et Heure SYSDATE
------- ------------------- -------------- --- --------
(aaaammjjhhmmssccc)
TS_JSON Données Mémo texte
---------- --------- ------------------ --- ---
TS_Lu Lu Booléen 0
TS_Mobile ID Mobile Chaîne 50
TS_Buffer Buffer Autre mémo binaire
TS_CMD Commande Chaîne 50
12/08/2026 Batik_WS_Com_Mob 19

Partie 3 › Fenêtre WINDEV Partie 3 Fenêtre WINDEV

12/08/2026 Batik_WS_Com_Mob 20

Partie 3 › Fenêtre WINDEV FEN_Principal Image FEN_Principal Informations générales FEN_Principal D:\Projets Windev\Batik\Nouvelle Fichier physique Version\WebService\Batik_WS_Com_Mob\FEN_Principal.wdw Créé par susana@applilogik.fr Date de création 14/01/2026 08:47:29 Dernière modification par susana@applilogik.fr Date dernière modification 16/01/2026 16:08:05 Titre FR: Principal 12/08/2026 Batik_WS_Com_Mob 21

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations générales

Type fenêtre Fenêtre libre
Mode ouverture (Desktop) Centrée par rapport à la mère
Position X 0 Position Y 0 Largeur 1200 Hauteur 599
Visible Barre de titre Menu système
Icône réduction Icône agrandissement Icône aide ctx.
Barre de message Détourer le fond Mode 9 images
Redimensionnable Avec grip Grip dans image
Déplace/fond Sauve position Ascenseur auto.
Gestion grande police Thème XP
Ctx. HFSQL indép.
Etat initial Actif
------------------------------- --- ----------------------------------- --- --- ---
Curseur survol 0
Copie d'écran Oui
Unité des tailles Plateforme unique desktop OU mobile
Ancrage au contenu
Opacité 100
Titre personnalisé Oui
Titre perso. : hauteur 30
Titre perso. : Affiche le titre Oui
Pos. Menu Perso Non
Icône de fermeture Oui
Type cadre Double
Transparence Vista Non
Transparence gérée par Vista Non
Appliquer le gabarit du projet <Défaut>
Grisé : Utiliser couleur perso. Non
Grisé : Algo pour images <Défaut>
Style du menu Office XP
Mode bulle d'aide Non
Mode Bulle : Point chaud Haut gauche
Mode Bulle : Décalage X 0
Mode Bulle : Décalage Y 0
Valide auto. 0
Lib. + tps restant Oui
Pos. X Menu 6
Pos. Y Menu 28
Texte Markdown Non
Mode menu ctx.
M.C.U. Oui
Anim. Ouverture 0
Anim. Fermeture 0
Durée Anim. Ouverture 100
Durée Anim. Fermeture 50
Adapte Taille contenu Non
Assombri quand inactif Oui
Déplace souris sur bouton par
Non
12/08/2026 Batik_WS_Com_Mob 22
---------- --- --- ---------------- --- ---

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations générales

Compact. barres outils Non
Statistiques de la fenêtre
Champ de saisie 3 Bouton 1
--- ------------------- --- --- ---------------- --- ---
Sélecteur 1 Image 1
Table 5 Combo 5
Onglet 1 Superchamp 1
Option de sélecteur 2 Colonne de table 19
Volet (Onglet) 3
Nombre d'éléments dans la fenêtre : 42
FEN_Principal
Informations sur les champs
Fenêtre : FEN_Principal
Champ de saisie
euqitamotua tnemecaffE
euqitamotua eisias niF
reihcif eétsissa eisiaS
eriotagilbo eisiaS .zroH tnemeliféD .trev tnemeliféD
--- --- --- --- ------------------ --- ---------------------------------
latnoziroh .csA
essap ed toM
BAT ehcuoT cnalb à esiM ediv is LLUN lacitrev .csA
--- --------------------- --- ------------------------ --------------------- ------------------------- -------------
laitini tatE eisias epyT engilitluM FTR tamroF
X noitisoP Y noitisoP
ruegraL ruetuaH
elbisiV
nalP
SAI_DateDebut 606 19 131 41 0 Actif Date Non
------------- ------ -------- ---------- --- --- ---
SAI_DateFin 743 19 131 41 0 Actif Date Non
Sélecteur
ellennoitroporp .loC
BAT ehcuoT sennoloc .bN
--- --- --- --- ------------ ----------------------- -----------
laitini tatE staté siorT
X noitisoP Y noitisoP
ruegraL ruetuaH
elbisiV
nalP
SEL_WSCom 880 29 295 28 0 Actif 2
---------- --- ------ ---------------- ------- --- ---
12/08/2026 Batik_WS_Com_Mob 23

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Image

cilc ruop eriatiroirP tuaféd rap eéminA
laitini tatE sucof cevA
X noitisoP Y noitisoP
ruegraL ruetuaH cilc cevA
elbisiV
nalP
IMG_Recharger 1143 -2 49 31 0 Actif
------------- --- --- ---- --- ----- --- --- --- ----- --- --- ---
Combo
reihcif eétsissa eisiaS
eriotagilbo eisiaS .zroH tnemeliféD
--- --- --- --- --- --- --- --- --- --- ------------------ --- ----------------
ruesnecsa elluB
ediv is LLUN
BAT ehcuoT eisias cevA
--- --- ---------- ---------- ------- ------- ------------ ---------- -------- ----------- --- --- ---
X noitisoP Y noitisoP laitini tatE
ruegraL ruetuaH sruocraP
elbisiV reihciF
eéirT
nalP
CMB_Users 6 12 594 48 0 Actif Mémoire Non
--------- --- --- ------ --- --- ----- --- ------- --- --- --- ---
Superchamp
laitini tatE BAT ehcuoT
--- --- --- --- ---------- ---------- ------- --- ------- --- --- ------------ ----------
X noitisoP Y noitisoP
ruegraL ruetuaH
elbisiV
nalP
SC_Menu 8 66 1184 491 0 Actif
------- --- --- --- --- --- ---- --- --- --- --- ----- ---
Superchamp : SC_Menu
Champ de saisie
euqitamotua tnemecaffE
euqitamotua eisias niF
reihcif eétsissa eisiaS
eriotagilbo eisiaS .zroH tnemeliféD .trev tnemeliféD
--- --- --- --- --- --- --- --- --- ------------------ --- --------------------------------- ---
latnoziroh .csA
essap ed toM cnalb à esiM ediv is LLUN lacitrev .csA
--- ---------- ---------- --------------- --- ------------ ---------------------- ---------- ------------ ------------ ------------ --- -------------
BAT ehcuoT eisias epyT FTR tamroF
X noitisoP Y noitisoP laitini tatE engilitluM
ruegraL ruetuaH
elbisiV
nalP
SAI_Recherche 754 77 339 48 0 Actif Texte Non
------------- --- --- ------ --- ---------------- ----- --- --- --- --- --- ---
12/08/2026 Batik_WS_Com_Mob 24

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Bouton notuob epyT

laitini tatE BAT ehcuoT
X noitisoP Y noitisoP
ruegraL ruetuaH
elbisiV
nalP
BTN_Recherche 1099 101 80 24 0 Actif Normal
------------- --- --- ---- --- --- ----- --- ----- ------ ---
Table
eitros ne tnemertsigernE
ruesnecsa/egahciffA
lennoitroporp .csA .loc .gifnoc .oméM
--- ---------- ---------- --- --- ------------ ---------- ----------------------------- ------------------------------ ------------------ --------------
)(ertliFH resilitU ruesnecsa elluB EERTNE noitseG eércna ennoloC 5.5 elbitapmoC
.gerne egacolB noitcelésitluM edacsac eisiaS
laitini tatE BAT ehcuoT
X noitisoP Y noitisoP sruocraP
ruegraL ruetuaH
elbisiV reihciF
--- --- --- --- ------- --- ------- --- --- --- ---
nalP
TABLE_Colb 13 229 442 321 0 affichag Mémoir 2
-------------- --- --- ------- --- -------- ------ --- --- --- ---
TABLE_Contexte 471 168 696 376 0 affichag Mémoir 2
TABLE_Param 24 224 432 328 0 affichag Mémoir 3
Mémoir
TABLE_RDV 16 222 1169 328 0 affichag 6
------------- --- -------- ------- --- -------- ------ --- --- --- ---
TABLE_RDVColb 465 229 720 317 0 affichag Mémoir 6
Combo
reihcif eétsissa eisiaS
eriotagilbo eisiaS .zroH tnemeliféD
--- --- --- --- --- --- --- --- ------------------ --- ----------------
ruesnecsa elluB
ediv is LLUN
BAT ehcuoT eisias cevA
--- ---------- ---------- ------- ------- ------- ------------ ---------- ----------- --- ---
X noitisoP Y noitisoP laitini tatE
ruetuaH sruocraP
ruegraL elbisiV reihciF
eéirT
nalP
CMB_Proc 14 77 723 48 0 Actif Mémoire Non
------------- --- --- ------ --- --- ----- ------- --- --- ---
CMB_ProcColb 14 161 1170 48 0 Actif Mémoire Non
CMB_ProcParam 24 168 432 48 0 Actif Mémoire Non
CMB_ProcRDV 16 168 1169 48 0 Actif Mémoire Non
Onglet
slennoitroporp steloV
engil/stelov .bN
BAT ehcuoT
X noitisoP Y noitisoP laitini tatE stelov .soP
--- --- ---------- ---------- --- --- --- ------------ ----------- --- ---
ruetuaH
ruegraL
elbisiV
nalP
ONG_Info 9 131 1182 425 0 Actif haut 0
---------- --- --- ----- ---- ---------------- --- ----- ---- --- ---
12/08/2026 Batik_WS_Com_Mob 25

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_Colb Colonne de table reihcif eétsissa eisiaS elbatsuja ruegraL

ehcuag à eéxiF elbairt ennoloC ehcrehcer cevA
.zroh egardaC .trev egardaC
laitini tatE elbaçalpéD eisias epyT FTR tamroF eisias cevA
engilitluM
ruegraL
elbisiV
epyT eéirT
--------------- --- ----- ------------- ------- -----
COL_C_IdColb 176 Actif Droite Centre Numériq
COL_C_NomPrenom 243 Actif Gauche Centre Texte
Table : SC_Menu.ONG_Info.TABLE_Contexte
Colonne de table
reihcif eétsissa eisiaS
elbatsuja ruegraL
ehcuag à eéxiF elbairt ennoloC ehcrehcer cevA
--- --- ------------------------------ --------------------------- --- ---
.zroh egardaC .trev egardaC
FTR tamroF
laitini tatE elbaçalpéD eisias epyT engilitluM eisias cevA
--- --- ----------------------- --- ---------------------- -----------
ruegraL
elbisiV
epyT eéirT
------------- --- ----- ------------- ----- -----
COL_C_Type 100 Actif Gauche Centre Texte
COL_C_Libelle 561 Actif Gauche Centre Texte
Table : SC_Menu.ONG_Info.TABLE_Param
Colonne de table
reihcif eétsissa eisiaS
elbatsuja ruegraL
elbairt ennoloC ehcrehcer cevA
ehcuag à eéxiF .zroh egardaC
--- --- -------------- ------------- --- ---
.trev egardaC
elbaçalpéD eisias epyT FTR tamroF eisias cevA
--- --- ---------- --- ---------------------- -----------
laitini tatE engilitluM
ruegraL elbisiV
epyT eéirT
---- --- --- --- --- -----
Numériq
COL_IdParam 118 Actif Droite Centre
----------- --- ---------------- ------------- ----- ---
COL_Type 100 Actif Gauche Centre Texte
COL_Libelle 196 Actif Gauche Centre Texte
12/08/2026 Batik_WS_Com_Mob 26

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_RDV Colonne de table reihcif eétsissa eisiaS elbatsuja ruegraL

ehcuag à eéxiF elbairt ennoloC ehcrehcer cevA
.zroh egardaC .trev egardaC
laitini tatE elbaçalpéD eisias epyT FTR tamroF eisias cevA
engilitluM
ruegraL
elbisiV
epyT eéirT
----------- --- ----- ------------- ------- -----
COL_IdRDV 176 Actif Droite Centre Numériq
COL_IdInter 133 Actif Droite Centre Numériq
COL_DateD 119 Actif Droite Centre Date
COL_DateF 114 Actif Droite Centre Date
COL_NInter 132 Actif Gauche Centre Texte
COL_Lieu 473 Actif Gauche Centre Texte
Table : SC_Menu.ONG_Info.TABLE_RDVColb
Colonne de table
reihcif eétsissa eisiaS
elbatsuja ruegraL
ehcuag à eéxiF elbairt ennoloC ehcrehcer cevA
--- --- ------------------------------ --------------------------- ---------------------- -----------
.zroh egardaC .trev egardaC
laitini tatE elbaçalpéD eisias epyT FTR tamroF eisias cevA
engilitluM
ruegraL
elbisiV
epyT eéirT
------------- --- ----- ------------- ------- -----
COL_C_IdRDV 176 Actif Droite Centre Numériq
COL_C_IdInter 133 Actif Droite Centre Numériq
COL_C_DateD 119 Actif Droite Centre Date
COL_C_DateF 114 Actif Droite Centre Date
COL_C_NInter 132 Actif Gauche Centre Texte
COL_C_Lieu 16 Actif Gauche Centre Texte
Fenêtre : FEN_Principal
12/08/2026 Batik_WS_Com_Mob 27
---------- --- ---------------- --- --- ---

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Combo : CMB_Users Libellé FR: Liste des utilisateurs Ordre navigation 1 Curseur survol 0 UI par l'utilisateur Selon fenêtre Util. gValeurMémorisée pour valeur Oui Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Cadrage horz. Gauche Cadrage vert. Centre Orientation verticale Non Hauteur liste 0 Largeur liste 592 Larg. déroulée perso. Non Hauteur ligne 20 Retrait gauche 2 Position X interne 8 Largeur interne 592 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Taille de saisie 0 Type saisie Texte Mode ellipse Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Effacement automatique Non Fin saisie automatique Non Vide si zéro Non Avec focus Oui Redimensionnable Oui Mémorise la taille Oui Historique des saisies Non Historique des sélections Non gLienActive Oui 12/08/2026 Batik_WS_Com_Mob 28

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Valeur persistante Non Texte Markdown Non Mode menu ctx. Avec recherche Non Nb. Enreg. Max 0 1ère ligne perso. Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 500 Taux anc. hauteur 1000 Image : IMG_Recharger Valeur initiale FR: D:\Projets Windev\Batik\Nouvelle Version\WebService\Batik_WS_Com_Mob\cha.png Curseur survol 0 UI par l'utilisateur Selon fenêtre Menu manip. image Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Cadrage horz. Gauche Cadrage vert. Haut Cadrage fonctions gXXX Tenir compte du cadrage Numéro aide 0 Opacité 100 Ascenseur et zoom auto. Non Autorise ChangeGabarit Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Texte Markdown Non Mode menu ctx. Mire visible Oui Zoom par double taps Oui Mode 9 images Non Chargement en fond Non Orientation EXIF Oui Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Droite Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 29

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Champ de saisie : SAI_DateDebut Libellé FR: Date Début Ordre navigation 2 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Oui Bouton Calculatrice Oui Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Droite Position X interne 606 Largeur interne 126 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: UseSystemMask Format retour AAAAMMJJ Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui 12/08/2026 Batik_WS_Com_Mob 30

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Non Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 500 Taux anc. bas 1000 Taux anc. largeur 100 Taux anc. hauteur 1000 Champ de saisie : SAI_DateFin Libellé FR: Date Fin Ordre navigation 3 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Oui Bouton Calculatrice Oui Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Droite Position X interne 743 Largeur interne 126 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non 12/08/2026 Batik_WS_Com_Mob 31

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Taille de saisie 0 Masque saisie FR: UseSystemMask Format retour AAAAMMJJ Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Non Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 600 Taux anc. bas 1000 Taux anc. largeur 100 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 32

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Superchamp : SC_Menu Ordre navigation 5 UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Largeur externe 1182 Hauteur externe 489 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Autorise ChangeGabarit Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Valeur persistante Non Texte Markdown Non Source de remplissage Fichier chargé en mémoire Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur et hauteur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Sélecteur : SEL_WSCom Libellé FR: &Sélecteur 2 colonnes Valeur initiale 1 Ordre navigation 4 Curseur survol 0 UI par l'utilisateur Selon fenêtre Avec ValeurRenvoyée Oui Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Cadrage vert. Haut Hauteur options auto Oui Compacter option Oui Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Look Vista Non 12/08/2026 Batik_WS_Com_Mob 33

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Type bandeau Libellé et sous-libellé Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Saisie obligatoire Non Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Valeur persistante Non Option multilignes Non Option format RTF Non Texte Markdown Non Mode menu ctx. Image D:\Projets Windev\Batik\Nouvelle Version\WebService\Batik_WS_Com_Mob\Gabarits\WD\270 Nb. états image 1 Largeur image 64 Nb. étapes animation 1 Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Droite Taux anc. droite 700 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Superchamp : SC_Menu Bouton : SC_Menu.BTN_Recherche Libellé FR: Rechercher Ordre navigation 3 Curseur survol 0 UI par l'utilisateur Selon fenêtre On/Off Non Recopie Option menu flèche Non Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Retrait gauche 0 Réduction Ruban Ne pas réduire le bouton Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Animée par défaut Oui Mode ellipse Alignement sur l'axe secondaire défini par le champ flexbox (auto) 12/08/2026 Batik_WS_Com_Mob 34

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Facteur de rétrécissement 0 Facteur d'agrandissement 0 Type flèche Texte Markdown Non Mode menu ctx. Nb. états image 1 Nb. états fond 1 Etirement de l'image de fond Largeur et hauteur Nb. étapes animation 1 Largeur Halo 0 Hauteur Halo 0 Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Droite Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Combo : SC_Menu.CMB_Proc Libellé FR: Procédures Ordre navigation 1 Curseur survol 0 UI par l'utilisateur Selon fenêtre Util. gValeurMémorisée pour valeur Oui Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Cadrage horz. Gauche Cadrage vert. Centre Orientation verticale Non Hauteur liste 0 Largeur liste 721 Larg. déroulée perso. Non Hauteur ligne 20 Retrait gauche 2 Position X interne 16 Largeur interne 721 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Taille de saisie 0 Type saisie Texte Mode ellipse Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 12/08/2026 Batik_WS_Com_Mob 35

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Effacement automatique Non Fin saisie automatique Non Vide si zéro Non Avec focus Oui Redimensionnable Oui Mémorise la taille Oui Historique des saisies Non Historique des sélections Non gLienActive Oui Valeur persistante Non Texte Markdown Non Mode menu ctx. Avec recherche Non Nb. Enreg. Max 0 1ère ligne perso. Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 600 Taux anc. hauteur 1000 Combo : SC_Menu.ONG_Info.CMB_ProcColb Libellé FR: Procédures lié a un rendez-vous/ collaborateur sélectionné Ordre navigation 1 Curseur survol 0 UI par l'utilisateur Selon fenêtre Util. gValeurMémorisée pour valeur Oui Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Cadrage horz. Gauche Cadrage vert. Centre Orientation verticale Non Hauteur liste 0 Largeur liste 1168 Larg. déroulée perso. Non Hauteur ligne 20 12/08/2026 Batik_WS_Com_Mob 36

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Retrait gauche 2 Position X interne 16 Largeur interne 1168 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Taille de saisie 0 Type saisie Texte Mode ellipse Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Effacement automatique Non Fin saisie automatique Non Vide si zéro Non Avec focus Oui Redimensionnable Oui Mémorise la taille Oui Historique des saisies Non Historique des sélections Non gLienActive Oui Valeur persistante Non Texte Markdown Non Mode menu ctx. Avec recherche Non Nb. Enreg. Max 0 1ère ligne perso. Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 37

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Combo : SC_Menu.ONG_Info.CMB_ProcParam Libellé FR: Procédures lié aux paramètres Ordre navigation 1 Curseur survol 0 UI par l'utilisateur Selon fenêtre Util. gValeurMémorisée pour valeur Oui Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Cadrage horz. Gauche Cadrage vert. Centre Orientation verticale Non Hauteur liste 0 Largeur liste 432 Larg. déroulée perso. Non Hauteur ligne 20 Retrait gauche 2 Position X interne 24 Largeur interne 432 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Taille de saisie 0 Type saisie Texte Mode ellipse Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Effacement automatique Non Fin saisie automatique Non Vide si zéro Non Avec focus Oui Redimensionnable Oui Mémorise la taille Oui Historique des saisies Non Historique des sélections Non gLienActive Oui 12/08/2026 Batik_WS_Com_Mob 38

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Valeur persistante Non Texte Markdown Non Mode menu ctx. Avec recherche Non Nb. Enreg. Max 0 1ère ligne perso. Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Taux anc. droite 0 Taux anc. bas 0 Taux anc. largeur 350 Taux anc. hauteur 1000 Combo : SC_Menu.ONG_Info.CMB_ProcRDV Libellé FR: Procédures lié a un rendez-vous sélectionné Ordre navigation 1 Curseur survol 0 UI par l'utilisateur Selon fenêtre Util. gValeurMémorisée pour valeur Oui Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Cadrage horz. Gauche Cadrage vert. Centre Orientation verticale Non Hauteur liste 0 Largeur liste 1169 Larg. déroulée perso. Non Hauteur ligne 20 Retrait gauche 2 Position X interne 16 Largeur interne 1169 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Taille de saisie 0 Type saisie Texte Mode ellipse Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non 12/08/2026 Batik_WS_Com_Mob 39

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Effacement automatique Non Fin saisie automatique Non Vide si zéro Non Avec focus Oui Redimensionnable Oui Mémorise la taille Oui Historique des saisies Non Historique des sélections Non gLienActive Oui Valeur persistante Non Texte Markdown Non Mode menu ctx. Avec recherche Non Nb. Enreg. Max 0 1ère ligne perso. Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Onglet : SC_Menu.ONG_Info Libellé FR: &Onglet Valeur initiale 1 Ordre navigation 4 Curseur survol 0 Onglet dynamique Non Libellé volet FR: Nouvel onglet UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Retrait gauche 0 Retrait des onglets 0 Numéro aide 0 Autorise ChangeGabarit Oui Bouton Fermer Oui Bouton Nouveau Oui Volets détachables Oui Mémoriser Configuration Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 12/08/2026 Batik_WS_Com_Mob 40

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Facteur d'agrandissement 0 Swipe Non Mode affichage volets < Standard > Valeur persistante Non Texte Markdown Non Mode menu ctx. Nb. états image 1 Ancrage Largeur et hauteur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SC_Menu.SAI_Recherche Libellé FR: Recherche d'une intervention Ordre navigation 2 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 754 Largeur interne 339 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais 12/08/2026 Batik_WS_Com_Mob 41

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Asc. vertical Automatique Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Non Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 600 Taux anc. bas 1000 Taux anc. largeur 300 Taux anc. hauteur 1000 Table : SC_Menu.ONG_Info.TABLE_Colb Libellé FR: Table Ordre navigation 2 Curseur survol 0 Mode Loupe Filtre UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Hauteur ligne max. 0 Hauteur ligne (sans marges) 18 12/08/2026 Batik_WS_Com_Mob 42

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Marge en haut 2 Marge en bas 2 Marge à gauche 5 Marge à droite 3 Sens Vertical Retrait gauche 0 Angle titre 0 Cadrage fonctions gXXX Tenir compte du cadrage Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Hauteur des lignes Non Sélection multiple Non Bulle sur tronqués Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Scroll au pixel Oui Scroll au doigt Non Asc. horizontal Automatique Asc. vertical Toujours visible Mode de sélection Sélection simple Sélect. colonnes Sans sélection Sélect. cellules Sans sélection Ajout éléments supplémentaires Non Nb. max d'éléments 10000 Etat chargement Non Retrait gauche FI détail 0 FI détail au survol Non Même contenu/ligne Non Aff. résultats Sans affichage Somme FR: Somme Moyenne FR: Moyenne Compteur FR: Compteur Minimum FR: Minimum Maximum FR: Maximum Sauve position auto Non Ruptures Enroulables Oui Titre multiligne Oui Menu ctx. colonne Oui Texte Markdown Non Mode menu ctx. Mémoriser filtres Non Mémoriser tris Non Nb. Enreg. Max 0 Ajout/Suppr. dans variable Oui Synchro HFSQL C/S Jamais Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur et hauteur Taux anc. droite 1000 Taux anc. bas 500 Taux anc. largeur 350 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 43

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_Contexte Libellé FR: Table Ordre navigation 2 Curseur survol 0 Mode Loupe Filtre UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Hauteur ligne max. 5 Hauteur ligne (sans marges) 18 Marge en haut 2 Marge en bas 2 Marge à gauche 5 Marge à droite 3 Sens Vertical Retrait gauche 0 Angle titre 0 Cadrage fonctions gXXX Tenir compte du cadrage Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Hauteur des lignes Non Sélection multiple Non Bulle sur tronqués Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Scroll au pixel Oui Scroll au doigt Non Asc. horizontal Automatique Asc. vertical Toujours visible Mode de sélection Sélection simple Sélect. colonnes Sans sélection Sélect. cellules Sans sélection Ajout éléments supplémentaires Non Nb. max d'éléments 10000 Etat chargement Non Retrait gauche FI détail 0 FI détail au survol Non Même contenu/ligne Non Aff. résultats Sans affichage Somme FR: Somme Moyenne FR: Moyenne Compteur FR: Compteur Minimum FR: Minimum Maximum FR: Maximum Sauve position auto Non Ruptures Enroulables Oui 12/08/2026 Batik_WS_Com_Mob 44

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Titre multiligne Oui Menu ctx. colonne Oui Texte Markdown Non Mode menu ctx. Mémoriser filtres Non Mémoriser tris Non Nb. Enreg. Max 0 Ajout/Suppr. dans variable Oui Synchro HFSQL C/S Jamais Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Droite, largeur et hauteur Taux anc. droite 350 Taux anc. bas 1000 Taux anc. largeur 650 Taux anc. hauteur 1000 Table : SC_Menu.ONG_Info.TABLE_Param Libellé FR: Table Ordre navigation 3 Curseur survol 0 Mode Loupe Filtre UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Hauteur ligne max. 5 Hauteur ligne (sans marges) 18 Marge en haut 2 Marge en bas 2 Marge à gauche 5 Marge à droite 3 Sens Vertical Retrait gauche 0 Angle titre 0 Cadrage fonctions gXXX Tenir compte du cadrage Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Hauteur des lignes Non Sélection multiple Non Bulle sur tronqués Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Scroll au pixel Oui Scroll au doigt Non Asc. horizontal Automatique Asc. vertical Toujours visible 12/08/2026 Batik_WS_Com_Mob 45

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Mode de sélection Sélection simple Sélect. colonnes Sans sélection Sélect. cellules Sans sélection Ajout éléments supplémentaires Non Nb. max d'éléments 10000 Etat chargement Non Retrait gauche FI détail 0 FI détail au survol Non Même contenu/ligne Non Aff. résultats Sans affichage Somme FR: Somme Moyenne FR: Moyenne Compteur FR: Compteur Minimum FR: Minimum Maximum FR: Maximum Sauve position auto Non Ruptures Enroulables Oui Titre multiligne Oui Menu ctx. colonne Oui Texte Markdown Non Mode menu ctx. Mémoriser filtres Non Mémoriser tris Non Nb. Enreg. Max 0 Ajout/Suppr. dans variable Oui Synchro HFSQL C/S Jamais Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Droite, largeur et hauteur Taux anc. droite 0 Taux anc. bas 0 Taux anc. largeur 350 Taux anc. hauteur 1000 Table : SC_Menu.ONG_Info.TABLE_RDV Libellé FR: Table Ordre navigation 2 Curseur survol 0 Mode Loupe Filtre UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Hauteur ligne max. 0 Hauteur ligne (sans marges) 18 Marge en haut 2 Marge en bas 2 Marge à gauche 5 Marge à droite 3 12/08/2026 Batik_WS_Com_Mob 46

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Sens Vertical Retrait gauche 0 Angle titre 0 Cadrage fonctions gXXX Tenir compte du cadrage Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Hauteur des lignes Non Sélection multiple Non Bulle sur tronqués Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Scroll au pixel Oui Scroll au doigt Non Asc. horizontal Automatique Asc. vertical Toujours visible Mode de sélection Sélection simple Sélect. colonnes Sans sélection Sélect. cellules Sans sélection Ajout éléments supplémentaires Non Nb. max d'éléments 10000 Etat chargement Non Retrait gauche FI détail 0 FI détail au survol Non Même contenu/ligne Non Aff. résultats Sans affichage Somme FR: Somme Moyenne FR: Moyenne Compteur FR: Compteur Minimum FR: Minimum Maximum FR: Maximum Sauve position auto Non Ruptures Enroulables Oui Titre multiligne Oui Menu ctx. colonne Oui Texte Markdown Non Mode menu ctx. Mémoriser filtres Non Mémoriser tris Non Nb. Enreg. Max 0 Ajout/Suppr. dans variable Oui Synchro HFSQL C/S Jamais Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Largeur et hauteur Taux anc. droite 300 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 47

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_RDVColb Libellé FR: Table Ordre navigation 3 Curseur survol 0 Mode Loupe Filtre UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Hauteur ligne max. 0 Hauteur ligne (sans marges) 18 Marge en haut 2 Marge en bas 2 Marge à gauche 5 Marge à droite 3 Sens Vertical Retrait gauche 0 Angle titre 0 Cadrage fonctions gXXX Tenir compte du cadrage Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Hauteur des lignes Non Sélection multiple Non Bulle sur tronqués Oui Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Scroll au pixel Oui Scroll au doigt Non Asc. horizontal Automatique Asc. vertical Toujours visible Mode de sélection Sélection simple Sélect. colonnes Sans sélection Sélect. cellules Sans sélection Ajout éléments supplémentaires Non Nb. max d'éléments 10000 Etat chargement Non Retrait gauche FI détail 0 FI détail au survol Non Même contenu/ligne Non Aff. résultats Sans affichage Somme FR: Somme Moyenne FR: Moyenne Compteur FR: Compteur Minimum FR: Minimum Maximum FR: Maximum Sauve position auto Non Ruptures Enroulables Oui 12/08/2026 Batik_WS_Com_Mob 48

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Titre multiligne Oui Menu ctx. colonne Oui Texte Markdown Non Mode menu ctx. Mémoriser filtres Non Mémoriser tris Non Nb. Enreg. Max 0 Ajout/Suppr. dans variable Oui Synchro HFSQL C/S Jamais Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Droite, largeur et hauteur Taux anc. droite 350 Taux anc. bas 500 Taux anc. largeur 650 Taux anc. hauteur 1000 Table : SC_Menu.ONG_Info.TABLE_Colb Colonne de table : SC_Menu.ONG_Info.TABLE_Colb.COL_C_IdColb (1) Titre FR: Id Colb Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 99 999 999 999 999 999 999 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 200 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 49

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Colonne de table : SC_Menu.ONG_Info.TABLE_Colb.COL_C_NomPrenom (2) Titre FR: Nom Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 800 Taux anc. hauteur 1000 Table : SC_Menu.ONG_Info.TABLE_Contexte Colonne de table : SC_Menu.ONG_Info.TABLE_Contexte.COL_C_Type (1) Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non 12/08/2026 Batik_WS_Com_Mob 50

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_Contexte.COL_C_Libelle (2) Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Oui Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 51

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_Param Colonne de table : SC_Menu.ONG_Info.TABLE_Param.COL_IdParam (1) Titre FR: Id Paramètre Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 99 999 999 999 999 999 999 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_Param.COL_Type (2) Titre FR: Type Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 52

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_Param.COL_Libelle (3) Titre FR: Libelle Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Oui Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 53

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_RDV Colonne de table : SC_Menu.ONG_Info.TABLE_RDV.COL_IdRDV (1) Titre FR: Id rdv Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 99 999 999 999 999 999 999 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDV.COL_IdInter (2) Titre FR: Id Inter Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 54

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Mot de passe Non Masque saisie FR: 99 999 999 999 999 999 999 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDV.COL_DateD (3) Titre FR: Début Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: JJ/MM/AAAA HH:mm:SS Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 55

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Colonne de table : SC_Menu.ONG_Info.TABLE_RDV.COL_DateF (4) Titre FR: Fin Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: JJ/MM/AAAA HH:mm:SS Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDV.COL_NInter (5) Titre FR: NInter Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non 12/08/2026 Batik_WS_Com_Mob 56

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDV.COL_Lieu (6) Titre FR: Lieu Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 57

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Table : SC_Menu.ONG_Info.TABLE_RDVColb Colonne de table : SC_Menu.ONG_Info.TABLE_RDVColb.COL_C_IdRDV (1) Titre FR: Id rdv Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 99 999 999 999 999 999 999 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDVColb.COL_C_IdInter (2) Titre FR: Id Inter Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 58

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Mot de passe Non Masque saisie FR: 99 999 999 999 999 999 999 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDVColb.COL_C_DateD (3) Titre FR: Début Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: JJ/MM/AAAA HH:mm:SS Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 59

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Colonne de table : SC_Menu.ONG_Info.TABLE_RDVColb.COL_C_DateF (4) Titre FR: Fin Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: JJ/MM/AAAA HH:mm:SS Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDVColb.COL_C_NInter (5) Titre FR: C_NInter Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non 12/08/2026 Batik_WS_Com_Mob 60

Partie 3 › Fenêtre WINDEV › FEN_Principal › Informations sur les champs Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 Colonne de table : SC_Menu.ONG_Info.TABLE_RDVColb.COL_C_Lieu (6) Titre FR: C_Lieu Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calculatrice Non Touche TAB Accessible par TAB Marge en haut 0 Marge en bas 0 Marge à gauche 0 Marge à droite 0 Retrait gauche 0 Numéro aide 0 Bandeau visible Oui Taille de saisie 0 Mot de passe Non Masque saisie FR: 0 Mode ellipse Verifier l'orthographe Non Unicode Non Saisie obligatoire Non Export/Impression Si visible (défaut) Vide si zéro Non Retour à la ligne Non Coche tous dans entête Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 0 Taux anc. hauteur 1000 FEN_Principal Code Déclarations globales de FEN_Principal 12/08/2026 Batik_WS_Com_Mob 61

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code PROCÉDURE FEN_Principal() Fin d'initialisation de FEN_Principal OuvreSoeur(FEN_Log) InitComboProc() Fermeture de FEN_Principal SI OuiNon("Voulez-vous fermer l'application") = Oui ALORS FinProgramme() SINON RepriseSaisie(FEN_Principal) FIN FEN_Principal Code des champs Initialisation de CMB_Users // Version 1 // Description // Combo liste simple ListeSupprimeTout(CMB_Users) POUR TOUT stUser, saCle de LIB_DEBUG.gtbaListeUsers ListeAjoute(CMB_Users,saCle+gLien(saCle)) FIN Sélection d'une ligne de CMB_Users SelectUser() Clic sur IMG_Recharger SelectUser() Initialisation de SAI_DateDebut // Version 1 // Description // Saisie d'une date avec calendrier dDate est une Date = DateSys() dDate..Mois -= 2 SAI_DateDebut = dDate A chaque modification de SAI_DateDebut LIB_DEBUG.gdDateDeb = SAI_DateDebut Initialisation de SAI_DateFin 12/08/2026 Batik_WS_Com_Mob 62

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs // Version 1 // Description // Saisie d'une date avec calendrier dDate est une Date = DateSys() dDate..Mois += 2 SAI_DateFin = dDate A chaque modification de SAI_DateFin LIB_DEBUG.gdDateFin = SAI_DateFin Initialisation de BTN_Recherche ( SC_Menu ) // Version 1 // Description // Bouton simple Clic sur BTN_Recherche ( SC_Menu ) TraiteReponse(cCMD_RechercheRDV) Initialisation de CMB_Proc ( SC_Menu ) // Version 1 // Description // Combo liste simple Sélection d'une ligne de CMB_Proc ( SC_Menu ) SelectProcGlobal() Initialisation de CMB_ProcColb ( SC_Menu ) // Version 1 // Description // Combo liste simple Sélection d'une ligne de CMB_ProcColb ( SC_Menu ) SelectProcColb() Initialisation de CMB_ProcParam ( SC_Menu ) // Version 1 // Description // Combo liste simple Sélection d'une ligne de CMB_ProcParam ( SC_Menu ) SI LIB_DEBUG.gnIdInterChoisi <= 0 ALORS Erreur("Veuillez sélectionner un rendez-vous") RETOUR FIN 12/08/2026 Batik_WS_Com_Mob 63

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs SI CMB_ProcParam = cCMD_ListeCh_Rapport ET LIB_DEBUG.gnIdRapportChoisi <= 0 ALORS Erreur("Veuillez sélectionner un modèle de rapport") RETOUR FIN SI CMB_ProcParam = cCMD_ListeCh_Mail ET LIB_DEBUG.gnIdEmailChoisi <= 0 ALORS Erreur("Veuillez sélectionner un modèle d'email") RETOUR FIN SI CMB_ProcParam = cCMD_ListeCh_Rapport ALORS TraiteReponse(cCMD_ListeCh_Rapport) FIN SI CMB_ProcParam = cCMD_ListeCh_Mail ALORS TraiteReponse(cCMD_ListeCh_Mail) FIN Initialisation de CMB_ProcRDV ( SC_Menu ) // Version 1 // Description // Combo liste simple Sélection d'une ligne de CMB_ProcRDV ( SC_Menu ) SelectProcRDV() Sélection d'une ligne de TABLE_Colb SI TABLE_Colb > 0 ET COL_C_IdColb[TABLE_Colb] > 0 ALORS LIB_DEBUG.gnIdCollabChoisi = COL_C_IdColb[TABLE_Colb] FIN Ajout d'un jeton dans COL_C_IdColb ( TABLE_Colb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_IdColb ( TABLE_Colb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_IdColb ( TABLE_Colb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_IdColb ( TABLE_Colb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) 12/08/2026 Batik_WS_Com_Mob 64

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_IdColb ( TABLE_Colb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_NomPrenom ( TABLE_Colb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_NomPrenom ( TABLE_Colb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_NomPrenom ( TABLE_Colb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_NomPrenom ( TABLE_Colb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_NomPrenom ( TABLE_Colb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_Libelle ( TABLE_Contexte ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_Libelle ( TABLE_Contexte ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_Libelle ( TABLE_Contexte ) 12/08/2026 Batik_WS_Com_Mob 65

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_Libelle ( TABLE_Contexte ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_Libelle ( TABLE_Contexte ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_Type ( TABLE_Contexte ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_Type ( TABLE_Contexte ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_Type ( TABLE_Contexte ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_Type ( TABLE_Contexte ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_Type ( TABLE_Contexte ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Sélection d'une ligne de TABLE_Param SI TABLE_Param > 0 ET COL_IdParam[TABLE_Param] > 0 ALORS SI COL_Type[TABLE_Param] = cParam_ListeMailModele ALORS LIB_DEBUG.gnIdEmailChoisi = COL_IdParam[TABLE_Param] SINON SI COL_Type[TABLE_Param] = cParam_ListeRapportMob ALORS LIB_DEBUG.gnIdRapportChoisi = COL_IdParam[TABLE_Param] 12/08/2026 Batik_WS_Com_Mob 66

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs FIN FIN Ajout d'un jeton dans COL_IdParam ( TABLE_Param ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_IdParam ( TABLE_Param ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_IdParam ( TABLE_Param ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_IdParam ( TABLE_Param ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_IdParam ( TABLE_Param ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_Libelle ( TABLE_Param ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_Libelle ( TABLE_Param ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_Libelle ( TABLE_Param ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_Libelle ( TABLE_Param ) 12/08/2026 Batik_WS_Com_Mob 67

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_Libelle ( TABLE_Param ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_Type ( TABLE_Param ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_Type ( TABLE_Param ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_Type ( TABLE_Param ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_Type ( TABLE_Param ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_Type ( TABLE_Param ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Sélection d'une ligne de TABLE_RDV SI TABLE_RDV > 0 ET COL_IdRDV[TABLE_RDV] > 0 ALORS LIB_DEBUG.gnIdInterChoisi = COL_IdInter[TABLE_RDV] FIN Ajout d'un jeton dans COL_DateD ( TABLE_RDV ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton 12/08/2026 Batik_WS_Com_Mob 68

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs RENVOYER Vrai Suppression d'un jeton dans COL_DateD ( TABLE_RDV ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_DateD ( TABLE_RDV ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_DateD ( TABLE_RDV ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_DateD ( TABLE_RDV ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_DateF ( TABLE_RDV ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_DateF ( TABLE_RDV ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_DateF ( TABLE_RDV ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_DateF ( TABLE_RDV ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_DateF ( TABLE_RDV ) 12/08/2026 Batik_WS_Com_Mob 69

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_IdInter ( TABLE_RDV ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_IdInter ( TABLE_RDV ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_IdInter ( TABLE_RDV ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_IdInter ( TABLE_RDV ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_IdInter ( TABLE_RDV ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_IdRDV ( TABLE_RDV ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_IdRDV ( TABLE_RDV ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_IdRDV ( TABLE_RDV ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_IdRDV ( TABLE_RDV ) 12/08/2026 Batik_WS_Com_Mob 70

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_IdRDV ( TABLE_RDV ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_Lieu ( TABLE_RDV ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_Lieu ( TABLE_RDV ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_Lieu ( TABLE_RDV ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_Lieu ( TABLE_RDV ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_Lieu ( TABLE_RDV ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_NInter ( TABLE_RDV ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_NInter ( TABLE_RDV ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) 12/08/2026 Batik_WS_Com_Mob 71

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_NInter ( TABLE_RDV ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_NInter ( TABLE_RDV ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_NInter ( TABLE_RDV ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Sélection d'une ligne de TABLE_RDVColb SI TABLE_RDVColb > 0 ET COL_C_IdRDV[TABLE_RDVColb] > 0 ALORS LIB_DEBUG.gnIdInterChoisi = COL_C_IdInter[TABLE_RDVColb] FIN Ajout d'un jeton dans COL_C_DateD ( TABLE_RDVColb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_DateD ( TABLE_RDVColb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_DateD ( TABLE_RDVColb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_DateD ( TABLE_RDVColb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_DateD ( TABLE_RDVColb ) 12/08/2026 Batik_WS_Com_Mob 72

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_DateF ( TABLE_RDVColb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_DateF ( TABLE_RDVColb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_DateF ( TABLE_RDVColb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_DateF ( TABLE_RDVColb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_DateF ( TABLE_RDVColb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_IdInter ( TABLE_RDVColb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_IdInter ( TABLE_RDVColb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_IdInter ( TABLE_RDVColb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_IdInter ( TABLE_RDVColb ) 12/08/2026 Batik_WS_Com_Mob 73

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_IdInter ( TABLE_RDVColb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_IdRDV ( TABLE_RDVColb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_IdRDV ( TABLE_RDVColb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_IdRDV ( TABLE_RDVColb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_IdRDV ( TABLE_RDVColb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_IdRDV ( TABLE_RDVColb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_Lieu ( TABLE_RDVColb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_Lieu ( TABLE_RDVColb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) 12/08/2026 Batik_WS_Com_Mob 74

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_Lieu ( TABLE_RDVColb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_Lieu ( TABLE_RDVColb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_Lieu ( TABLE_RDVColb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Ajout d'un jeton dans COL_C_NInter ( TABLE_RDVColb ) PROCÉDURE AjoutJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'ajout du jeton RENVOYER Vrai Suppression d'un jeton dans COL_C_NInter ( TABLE_RDVColb ) PROCÉDURE SuppressionJeton(MonJeton est un Jeton) //RENVOYER Faux pour interdire la suppression du jeton RENVOYER Vrai Clic sur un jeton de COL_C_NInter ( TABLE_RDVColb ) PROCÉDURE ClicJeton (MonJeton est un Jeton) Entrée en saisie d'un jeton de COL_C_NInter ( TABLE_RDVColb ) PROCÉDURE EntreSaisieJeton (MonJeton est un Jeton) //RENVOYER Faux pour interdire l'entrée en saisie du jeton RENVOYER Vrai Modification d'un jeton de COL_C_NInter ( TABLE_RDVColb ) PROCÉDURE ModificationJeton (MonJeton est un Jeton) // RENVOYER Faux pour interdire la modification du jeton RENVOYER Vrai Initialisation de SAI_Recherche ( SC_Menu ) 12/08/2026 Batik_WS_Com_Mob 75

Partie 3 › Fenêtre WINDEV › FEN_Principal › Code des champs // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SEL_WSCom // Version 1 // Description // Sélecteur simple en lignes sur 2 colonnes SEL_WSCom = 0 LIB_DEBUG.gbEnvoiWebService = SEL_WSCom A chaque modification de SEL_WSCom LIB_DEBUG.gbEnvoiWebService = SEL_WSCom FEN_Principal Procédures Procédure locale InitComboProc PROCÉDURE InitComboProc() ListeSupprimeTout(CMB_Proc) ListeAjoute(CMB_Proc,"Liste des interventions (RDV)"+gLien(cCMD_ListeRDV_V2)) ListeAjoute(CMB_Proc,"Récupérer les paramètres de l'application"+gLien(cCMD_LitParam_V2)) ListeAjoute(CMB_Proc,"Récupérer les contexte de l'application"+gLien(cCMD_LitContexte)) ListeAjoute(CMB_Proc,"Récupérer la liste des collaborateurs (Droit de consulter leur agenda)"+gLien( cCMD_IdClbRdvDroitC)) ListeSupprimeTout(CMB_ProcRDV) ListeAjoute(CMB_ProcRDV,"Récupérer une intervention"+gLien(cCMD_LitINTER_V2)) ListeAjoute(CMB_ProcRDV,"Récupérer le temps saisie d'une rendez-vous"+gLien(cCMD_ListeTEMPS)) ListeSupprimeTout(CMB_ProcParam) ListeAjoute(CMB_ProcParam,"Récupérer les champs a remplir d'un rapport"+gLien(cCMD_ListeCh_Rapport)) ListeAjoute(CMB_ProcParam,"Récupérer les champs a remplir d'un email "+gLien(cCMD_ListeCh_Mail)) ListeSupprimeTout(CMB_ProcColb) ListeAjoute(CMB_ProcColb,"Liste des interventions (RDV)"+gLien(cCMD_ListeRDV_Clb)) ListeAjoute(CMB_ProcColb,"Récupérer une intervention"+gLien(cCMD_LitINTER_V2)) ListeAjoute(CMB_ProcColb,"Récupérer le temps saisie d'une rendez-vous"+gLien(cCMD_ListeTEMPS)) Procédure locale SelectProcColb PROCÉDURE SelectProcColb() SI CMB_ProcColb <> Null ET CMB_ProcColb <> "" ET TABLE_Colb > 0 ALORS SI COL_C_IdColb[TABLE_Colb] <= 0 ALORS Erreur("Veuillez choisir un collaborateur") RENVOYER Faux FIN 12/08/2026 Batik_WS_Com_Mob 76

Partie 3 › Fenêtre WINDEV › FEN_Principal › Procédures LIB_DEBUG.gnIdCollabChoisi = COL_C_IdColb[TABLE_Colb] SI TABLE_RDVColb > 0 ET COL_C_IdRDV[TABLE_RDVColb] > 0 ALORS LIB_DEBUG.gnIdInterChoisi = COL_C_IdInter[TABLE_RDVColb] FIN TraiteReponse(CMB_ProcColb) FIN SI TABLE_Colb <= 0 ALORS Erreur("Veuillez choisir un collaborateur") RENVOYER Faux FIN Procédure locale SelectProcGlobal PROCÉDURE SelectProcGlobal() SI CMB_Proc <> Null ET CMB_Proc <> "" ALORS TraiteReponse(CMB_Proc) FIN Procédure locale SelectProcRDV PROCÉDURE SelectProcRDV() SI CMB_ProcRDV <> Null ET CMB_ProcRDV <> "" ALORS SI LIB_DEBUG.gnIdInterChoisi <= 0 ALORS Erreur("Veuillez choisir un rendez-vous") RENVOYER Faux FIN LIB_DEBUG.gnIdCollabChoisi = LIB_DEBUG.gtbaListeUsers[CMB_Users].nIdColb SI TABLE_RDV > 0 ET COL_IdRDV[TABLE_RDV] > 0 ALORS LIB_DEBUG.gnIdInterChoisi = COL_IdInter[TABLE_RDV] FIN TraiteReponse(CMB_ProcRDV) FIN Procédure locale SelectUser PROCÉDURE SelectUser() SI CMB_Users <> Null ET LIB_DEBUG.gtbaListeUsers[CMB_Users]..Existe = Vrai ALORS LIB_DEBUG.gID.saLicence = LIB_DEBUG.gtbaListeUsers[CMB_Users].saLicence LIB_DEBUG.gID.saIdMob = LIB_DEBUG.gtbaListeUsers[CMB_Users].saIdMob LIB_DEBUG.gID.saNumPort = LIB_DEBUG.gtbaListeUsers[CMB_Users].saNumPort LIB_DEBUG.gID.nIdUser = LIB_DEBUG.gtbaListeUsers[CMB_Users].nIdUser LIB_DEBUG.gID.saBaseData = LIB_DEBUG.gtbaListeUsers[CMB_Users].saBaseData LIB_DEBUG.gID.saBaseSync = LIB_DEBUG.gtbaListeUsers[CMB_Users].saBaseSync LIB_DEBUG.gID.saIdClient = LIB_DEBUG.gtbaListeUsers[CMB_Users].saIdClient LIB_DEBUG.gnIdCollabSID = LIB_DEBUG.gtbaListeUsers[CMB_Users].nIdColb LIB_DEBUG.gnIdCollabChoisi = LIB_DEBUG.gtbaListeUsers[CMB_Users].nIdColb SC_Menu..Visible = Vrai FIN Procédure locale TraiteReponse PROCÉDURE TraiteReponse(saType est une chaîne ANSI) Sablier(Vrai) bufRes est un Buffer 12/08/2026 Batik_WS_Com_Mob 77

Partie 3 › Fenêtre WINDEV › FEN_Principal › Procédures bufRes = D_LanceProcedure(saType) i est un entier SELON saType CAS cCMD_ListeDOC CAS cCMD_ListeRDV_V2 tblRDV est un tableau de ST_RDV_INTER SI bufRes <> "" ALORS Désérialise(tblRDV,bufRes,psdJSON) FIN TableSupprimeTout(TABLE_RDV) POUR TOUT stORdv DE tblRDV i = TableAjouteLigne(TABLE_RDV) COL_IdRDV[i] = stORdv.stRDV.nPKID COL_IdInter[i] = stORdv.stRDV.nIDIntervention COL_DateD[i] = stORdv.stRDV.saDateDebut COL_DateF[i] = stORdv.stRDV.saDateFin COL_NInter[i] = stORdv.stINTER.saInt_RfI COL_Lieu[i] = stORdv.saRDV_Lieu FIN ONG_Info = ONG_Info.RDV CAS cCMD_LitINTER_V2 CAS cCMD_RechercheRDV CAS cCMD_ListeTEMPS CAS cCMD_LitParam_V2 //Appelé par la fonction RécupContexte du mobile TableSupprimeTout(TABLE_Param) tbParam est un tableau de ST_PARAMETRE_METIER_V2 SI bufRes <> "" ALORS Désérialise(tbParam,bufRes,psdJSON) FIN POUR TOUT stOParam DE tbParam SI stOParam.saCode DANS(cParam_ListeMailModele,cParam_ListeRapportMob) ALORS i = TableAjouteLigne(TABLE_Param) COL_IdParam[i] = stOParam.nIdParam COL_Libelle[i] = stOParam.saLib COL_Type[i] = stOParam.saCode FIN SI TABLE_Param..Occurrence > 0 ALORS TableTrie(TABLE_Param,"COL_Type") FIN FIN ONG_Info.Contexte..Visible = Vrai ONG_Info = ONG_Info.Contexte CAS cCMD_LitContexte TableSupprimeTout(TABLE_Contexte) stCtx est un ST_CONTEXTE SI bufRes <> "" ALORS Désérialise(stCtx,bufRes,psdJSON) FIN TableAjouteLigne(TABLE_Contexte,"Profil",stCtx.stUser.saProfil) TableAjouteLigne(TABLE_Contexte,"Annulation des RDVs",stCtx.stUser.bDroit_AnnulationRDV ? "OUI" SINON "NON") TableAjouteLigne(TABLE_Contexte,"Création de rapport",stCtx.stUser.bDroit_CreationRapport ? "OUI" SINON "NON") TableAjouteLigne(TABLE_Contexte,"Envoi d'email",stCtx.stUser.bDroit_EnvoiEmail ? "OUI" SINON "NON") TableAjouteLigne(TABLE_Contexte,"Id Collaborateur",LIB_DEBUG.gnIdCollabSID) 12/08/2026 Batik_WS_Com_Mob 78

Partie 3 › Fenêtre WINDEV › FEN_Principal › Procédures TableAjouteLigne(TABLE_Contexte,"Id Utilisateur",LIB_DEBUG.gID.nIdUser) ONG_Info.Contexte..Visible = Vrai ONG_Info = ONG_Info.Contexte CAS cCMD_IdClbRdvDroitC tbIdClb est un tableau de ST_IdRDVClbDroitC SI bufRes <> "" ALORS Désérialise(tbIdClb,bufRes,psdJSON) FIN TableSupprimeTout(TABLE_Colb) POUR TOUT stOClb DE tbIdClb i = TableAjouteLigne(TABLE_Colb) COL_C_IdColb[i] = stOClb.nIdClb COL_C_NomPrenom[i] = stOClb.sNomPrenom FIN ONG_Info.Colb..Visible = Vrai ONG_Info = ONG_Info.Colb CAS cCMD_ListeRDV_Clb tblRDV est un tableau de ST_RDV_INTER SI bufRes <> "" ALORS Désérialise(tblRDV,bufRes,psdJSON) FIN TableSupprimeTout(TABLE_RDV) POUR TOUT stORdv DE tblRDV i = TableAjouteLigne(TABLE_RDVColb) COL_C_IdRDV[i] = stORdv.stRDV.nPKID COL_C_IdInter[i] = stORdv.stRDV.nIDIntervention COL_C_DateD[i] = stORdv.stRDV.saDateDebut COL_C_DateF[i] = stORdv.stRDV.saDateFin COL_C_NInter[i] = stORdv.stINTER.saInt_RfI COL_C_Lieu[i] = stORdv.saRDV_Lieu FIN ONG_Info.Colb..Visible = Vrai ONG_Info = ONG_Info.Colb CAS cCMD_ListeCh_Rapport CAS cCMD_RecupImgRapport CAS cCMD_Creation_Rapport CAS cCMD_ListeCh_Mail CAS cCMD_Cr_Structure_Mail CAS cCMD_Envoyer_Mail AUTRE CAS FIN Sablier(fauxToutSablier) 12/08/2026 Batik_WS_Com_Mob 79

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Image FEN_Connexion Image FEN_Connexion Informations générales FEN_Connexion D:\Projets Windev\Batik\Nouvelle Fichier physique Version\WebService\Batik_WS_Com_Mob\FEN_Connexion.wdw Créé par susana@applilogik.fr Date de création 14/01/2026 08:46:17 Dernière modification par susana@applilogik.fr Date dernière modification 27/03/2026 12:13:41 Titre FR: Connexion Type fenêtre Fenêtre libre Mode ouverture (Desktop) Centrée par rapport à la mère 12/08/2026 Batik_WS_Com_Mob 80

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations générales

Position X 0 Position Y 0 Largeur 631 Hauteur 520
Visible Barre de titre Menu système
Icône réduction Icône agrandissement Icône aide ctx.
Barre de message Détourer le fond Mode 9 images
Redimensionnable Avec grip Grip dans image
Déplace/fond Sauve position Ascenseur auto.
Gestion grande police Thème XP
Ctx. HFSQL indép.
Etat initial Actif
------------------------------- --- ----------------------------------- ---------------- --- ---
Curseur survol 0
Copie d'écran Oui
Unité des tailles Plateforme unique desktop OU mobile
Ancrage au contenu
Opacité 100
Titre personnalisé Oui
Titre perso. : hauteur 30
Titre perso. : Affiche le titre Oui
Pos. Menu Perso Non
Icône de fermeture Oui
Type cadre Double
Transparence Vista Non
Transparence gérée par Vista Non
Appliquer le gabarit du projet <Défaut>
Grisé : Utiliser couleur perso. Non
Grisé : Algo pour images <Défaut>
Style du menu Office XP
Mode bulle d'aide Non
Mode Bulle : Point chaud Haut gauche
Mode Bulle : Décalage X 0
Mode Bulle : Décalage Y 0
Valide auto. 0
Lib. + tps restant Oui
Pos. X Menu 6
Pos. Y Menu 28
Texte Markdown Non
Mode menu ctx.
M.C.U. Oui
Anim. Ouverture 0
Anim. Fermeture 0
Durée Anim. Ouverture 100
Durée Anim. Fermeture 50
Adapte Taille contenu Non
Assombri quand inactif Oui
Déplace souris sur bouton par Non
Compact. barres outils Non
12/08/2026 Batik_WS_Com_Mob 81

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations générales Statistiques de la fenêtre

Champ de saisie 13 Libellé 2
Bouton 1
Nombre d'éléments dans la fenêtre : 16
FEN_Connexion
Informations sur les champs
Fenêtre : FEN_Connexion
Champ de saisie
euqitamotua tnemecaffE
euqitamotua eisias niF
reihcif eétsissa eisiaS
eriotagilbo eisiaS .zroH tnemeliféD .trev tnemeliféD
--- --- --- --- ------------------ --------------------------------- ---
latnoziroh .csA
essap ed toM
BAT ehcuoT cnalb à esiM ediv is LLUN lacitrev .csA
--- --- --- ------------------------ --------------------- ------------------------- -------------
laitini tatE eisias epyT engilitluM FTR tamroF
X noitisoP Y noitisoP
ruegraL ruetuaH
elbisiV
nalP
SAI_BaseLicence 9 90 182 49 0 Actif Texte Non
--------------- ----------- ---- ----------- --- --- ---
SAI_BaseWSCom 12 323 179 49 0 Actif Texte Non
SAI_MPLicence 197 141 206 49 0 Actif Texte Non
SAI_MPLicenceFichier
414 141 206 49 0 Actif Texte Non
------------------ ----------- ---- ---------------- --- --- ---
SAI_MPWSCom 325 374 298 49 0 Actif Texte Non
SAI_NomBaseLicence 320 90 300 49 0 Actif Texte Non
SAI_NomBaseWSCom 323 323 300 49 0 Actif Texte Non
SAI_PortLicence 197 90 117 49 0 Actif Texte Non
SAI_PortWSCom 197 323 117 49 0 Actif Texte Non
SAI_URLLicence 9 38 611 50 0 Actif Texte Non
SAI_URLWSCom 12 271 611 50 0 Actif Texte Non
SAI_UserLicence 9 141 182 49 0 Actif Texte Non
SAI_UserWSCom 12 374 305 49 0 Actif Texte Non
12/08/2026 Batik_WS_Com_Mob 82

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Libellé tuaféd rap eéminA .zroh egardaC .trev egardaC FTR tamroF

X noitisoP Y noitisoP laitini tatE
ruetuaH
ruegraL elbisiV
--- --- ------- ------- --- --- ---
nalP
LIB_Libellé 9 6 203 26 0 Actif Gauche Haut
------------ ----- ------ --- ----- ----------- ---
LIB_Libellé1 9 221 242 26 0 Actif Gauche Haut
Bouton
notuob epyT
BAT ehcuoT
X noitisoP Y noitisoP laitini tatE
--- ---------- ---------- ------- --- ------------ ---
ruegraL ruetuaH
elbisiV
nalP
BTN_Valider 508 430 115 24 0 Actif Normal
----------- --- ------- --- --- ----- ------
Fenêtre : FEN_Connexion
Bouton : BTN_Valider
Libellé FR: Se Connecter
-------------------------------- ----------------------------------- --- --- --- --- ---
Ordre navigation 14
Curseur survol 0
UI par l'utilisateur Selon fenêtre
On/Off Non
Recopie Option menu flèche Non
Taux Paral. hauteur 0
Taux Paral. Y 0
Épinglé Non
Masquer lors du scrolling Non
Ancrage au contenu
Retrait gauche 0
Réduction Ruban Ne pas réduire le bouton
Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité)
Numéro aide 0
Opacité 100
Autorise ChangeGabarit Oui
Animée par défaut Oui
Mode ellipse
Alignement sur l'axe secondaire défini par le champ flexbox (auto)
Facteur de rétrécissement 0
Facteur d'agrandissement
0
Type flèche
--------------- ------- ---------------- --- --- --- ---
Texte Markdown Non
Mode menu ctx.
Nb. états image 1
12/08/2026 Batik_WS_Com_Mob 83

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Nb. états fond 5 Etirement de l'image de fond Mode 9 images personnalisé Nb. étapes animation 1 Largeur Halo 0 Hauteur Halo 0 Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Libellé : LIB_Libellé Libellé FR: Serveur Licence Curseur survol 0 UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Taille police min 0 Autorise ChangeGabarit Oui Type saisie Texte Masque saisie FR: 0 Mode ellipse Unicode Non Transforme le & Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Mise à blanc Oui Texte Markdown Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 84

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Libellé : LIB_Libellé1 Libellé FR: Serveur WS Com Mobile Curseur survol 0 UI par l'utilisateur Selon fenêtre Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Taille police min 0 Autorise ChangeGabarit Oui Type saisie Texte Masque saisie FR: 0 Mode ellipse Unicode Non Transforme le & Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Mise à blanc Oui Texte Markdown Non Personnaliser le picto AMI Non Indice du picto AMI 1 Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_BaseLicence Libellé FR: Base de données serveur Ordre navigation 2 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 11 12/08/2026 Batik_WS_Com_Mob 85

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Largeur interne 180 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non 12/08/2026 Batik_WS_Com_Mob 86

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_BaseWSCom Libellé FR: Base de données serveur Ordre navigation 9 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 14 Largeur interne 177 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non 12/08/2026 Batik_WS_Com_Mob 87

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_MPLicence Libellé FR: Mot de passe Ordre navigation 6 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 197 Largeur interne 206 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) 12/08/2026 Batik_WS_Com_Mob 88

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non 12/08/2026 Batik_WS_Com_Mob 89

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_MPLicenceFichiers Libellé FR: Mot de passe (Fichiers) Ordre navigation 7 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 414 Largeur interne 206 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non 12/08/2026 Batik_WS_Com_Mob 90

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_MPWSCom Libellé FR: Mot de passe Ordre navigation 13 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 325 Largeur interne 298 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 12/08/2026 Batik_WS_Com_Mob 91

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 92

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Champ de saisie : SAI_NomBaseLicence Libellé FR: Nom de la base de données Ordre navigation 4 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 322 Largeur interne 298 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui 12/08/2026 Batik_WS_Com_Mob 93

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_NomBaseWSCom Libellé FR: Nom de la base de données Ordre navigation 11 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 325 Largeur interne 298 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 94

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 95

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Champ de saisie : SAI_PortLicence Libellé FR: Port Ordre navigation 3 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 197 Largeur interne 117 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui 12/08/2026 Batik_WS_Com_Mob 96

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_PortWSCom Libellé FR: Port Ordre navigation 10 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 197 Largeur interne 117 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 97

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 98

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Champ de saisie : SAI_URLLicence Libellé FR: URL Web Service Licence Ordre navigation 1 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 11 Largeur interne 609 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui 12/08/2026 Batik_WS_Com_Mob 99

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_URLWSCom Libellé FR: URL Web Service Ordre navigation 8 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 14 Largeur interne 609 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 100

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 101

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Champ de saisie : SAI_UserLicence Libellé FR: Utilisateur Ordre navigation 5 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 11 Largeur interne 180 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui 12/08/2026 Batik_WS_Com_Mob 102

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 Champ de saisie : SAI_UserWSCom Libellé FR: Utilisateur Ordre navigation 12 Curseur survol 0 UI par l'utilisateur Selon fenêtre Bouton Calendrier Non Bouton Calculatrice Non Bouton Suppression Touche TAB Accessible par TAB Taux Paral. hauteur 0 Taux Paral. Y 0 Épinglé Non Masquer lors du scrolling Non Ancrage au contenu Cadrage horz. Gauche Position X interne 14 Largeur interne 303 Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 12/08/2026 Batik_WS_Com_Mob 103

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Informations sur les champs Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Jamais Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Oui Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Oui Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non Ancrage Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 12/08/2026 Batik_WS_Com_Mob 104

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Code FEN_Connexion Code Déclarations globales de FEN_Connexion PROCÉDURE FEN_Connexion() FEN_Connexion Code des champs Initialisation de BTN_Valider // Version 1 // Description // Bouton simple Clic sur BTN_Valider SeConnecter() Initialisation de LIB_Libellé // Version 1 // Description // Libellé pour écrire un titre Initialisation de LIB_Libellé1 // Version 1 // Description // Libellé pour écrire un titre Initialisation de SAI_BaseLicence // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_BaseWSCom // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_MPLicence 12/08/2026 Batik_WS_Com_Mob 105

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Code des champs // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_MPLicenceFichiers // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_MPWSCom // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_NomBaseLicence // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_NomBaseWSCom // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_PortLicence // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_PortWSCom // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_URLLicence // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_URLWSCom // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_UserLicence 12/08/2026 Batik_WS_Com_Mob 106

Partie 3 › Fenêtre WINDEV › FEN_Connexion › Code des champs // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne Initialisation de SAI_UserWSCom // Version 1 // Description // Champ de saisie pour un texte simple sur une ligne FEN_Connexion Procédures Procédure locale SeConnecter PROCÉDURE SeConnecter() LIB_DEBUG.gcnxD_ServeurLicence..Provider =hAccèsHFClientServeur LIB_DEBUG.gcnxD_ServeurLicence..BaseDeDonnées = SAI_NomBaseLicence

LIB_DEBUG.gcnxD_ServeurLicence..MotDePasse = SAI_MPLicence
LIB_DEBUG.gcnxD_ServeurLicence..Serveur = SAI_BaseLicence+":"+SAI_PortLicence
LIB_DEBUG.gcnxD_ServeurLicence..Utilisateur = SAI_UserLicence
-------------------------------------------- ----------------- ---
LIB_DEBUG.gsaPortWSCOM = SAI_PortWSCom
LIB_DEBUG.gsaServeurWSCOM = SAI_BaseWSCom
LIB_DEBUG.gcnxD_ServeurWSCom..Provider =hAccèsHFClientServeur
LIB_DEBUG.gcnxD_ServeurWSCom..BaseDeDonnées = SAI_NomBaseWSCom
------------------------------------------- ------------------ ---
LIB_DEBUG.gcnxD_ServeurWSCom..MotDePasse = SAI_MPWSCom
LIB_DEBUG.gcnxD_ServeurWSCom..Serveur = SAI_BaseWSCom+":"+SAI_PortWSCom
LIB_DEBUG.gcnxD_ServeurWSCom..Utilisateur = SAI_UserWSCom
----------------------------------------- ---------------- ---
WS_LICENCE..Adresse = SAI_URLLicence
WS_COM_MOBILE..Adresse = SAI_URLWSCom
D_OuvreConnexionHFSQLLicence(SAI_MPLicenceFichiers)
D_RecupIdentiteLicence()
SI D_OuvreConnexionHFSQL() ALORS
Ouvre(FEN_Principal)
FIN
12/08/2026 Batik_WS_Com_Mob 107
---------- ---------------- ---

Partie 3 › Fenêtre WINDEV › FEN_Log › Image FEN_Log Image FEN_Log Informations générales FEN_Log Fichier physique D:\Projets Windev\Batik\Nouvelle Version\WebService\Batik_WS_Com_Mob\FEN_Log.wdw Créé par susana@applilogik.fr Date de création 15/01/2026 10:20:07 Dernière modification par susana@applilogik.fr Date dernière modification 15/01/2026 10:22:29 Titre FR: Log Type fenêtre Fenêtre libre 12/08/2026 Batik_WS_Com_Mob 108

Partie 3 › Fenêtre WINDEV › FEN_Log › Informations générales

Mode ouverture (Desktop) Centrée par rapport à la mère
Position X 0 Position Y 0 Largeur 800 Hauteur 599
Visible Barre de titre Menu système
Icône réduction Icône agrandissement Icône aide ctx.
Barre de message Détourer le fond Mode 9 images
Redimensionnable Avec grip Grip dans image
Déplace/fond Sauve position Ascenseur auto.
Gestion grande police Thème XP
Ctx. HFSQL indép.
Etat initial Actif
------------------------------- --- ----------------------------------- ---------------- --- ---
Curseur survol 0
Copie d'écran Oui
Unité des tailles Plateforme unique desktop OU mobile
Ancrage au contenu
Opacité 100
Titre personnalisé Oui
Titre perso. : hauteur 30
Titre perso. : Affiche le titre Oui
Pos. Menu Perso Non
Icône de fermeture Oui
Type cadre Double
Transparence Vista Non
Transparence gérée par Vista Non
Appliquer le gabarit du projet <Défaut>
Grisé : Utiliser couleur perso. Non
Grisé : Algo pour images <Défaut>
Style du menu Office XP
Mode bulle d'aide Non
Mode Bulle : Point chaud Haut gauche
Mode Bulle : Décalage X 0
Mode Bulle : Décalage Y 0
Valide auto. 0
Lib. + tps restant Oui
Pos. X Menu 6
Pos. Y Menu 28
Texte Markdown Non
Mode menu ctx.
M.C.U. Oui
Anim. Ouverture 0
Anim. Fermeture 0
Durée Anim. Ouverture 100
Durée Anim. Fermeture 50
Adapte Taille contenu Non
Assombri quand inactif Oui
Déplace souris sur bouton par Non
Compact. barres outils Non
12/08/2026 Batik_WS_Com_Mob 109

Partie 3 › Fenêtre WINDEV › FEN_Log › Informations générales Statistiques de la fenêtre

Champ de saisie 1
Nombre d'éléments dans la fenêtre : 1
FEN_Log
Informations sur les champs
Fenêtre : FEN_Log
Champ de saisie
euqitamotua tnemecaffE
euqitamotua eisias niF
reihcif eétsissa eisiaS
eriotagilbo eisiaS .zroH tnemeliféD .trev tnemeliféD
--- --- --- --- ---------------------------------------------------- ---
latnoziroh .csA
essap ed toM
cnalb à esiM ediv is LLUN lacitrev .csA
--- --- --- ---------------------------------------------- ------------------------- -------------
laitini tatE BAT ehcuoT eisias epyT FTR tamroF
X noitisoP Y noitisoP engilitluM
ruegraL ruetuaH
elbisiV
nalP
SAI_Log 10 16 778 546 0 Actif Texte Non
------- --------- ----- ----------- --- ---
Fenêtre : FEN_Log
Champ de saisie : SAI_Log
Ordre navigation 1
------------------------- --- ------------------ ---------------- --- ---
Curseur survol 0
UI par l'utilisateur Selon fenêtre
Bouton Calendrier Non
Bouton Calculatrice Non
Bouton Suppression
Touche TAB Accessible par TAB
Taux Paral. hauteur 0
Taux Paral. Y 0
Épinglé Non
Masquer lors du scrolling Non
Ancrage au contenu
Cadrage horz. Gauche
Position X interne 11
Largeur interne 777
12/08/2026 Batik_WS_Com_Mob 110

Partie 3 › Fenêtre WINDEV › FEN_Log › Informations sur les champs Cadrage fonctions gXXX Cadrage ignoré (pour compatibilité) Numéro aide 0 Opacité 100 Autorise ChangeGabarit Oui Sécurité HTML Oui Visualisation markdown Non Saisie manuscrite Non Taille de saisie 0 Masque saisie FR: 0 Borne dans bulle Non Borne dans texte d'indication Oui Sélection multiple Non Mode ellipse Lien automatique Non Verifier l'orthographe Non Unicode Non Alignement sur l'axe secondaire défini par le champ flexbox (auto) Facteur de rétrécissement 0 Facteur d'agrandissement 0 Asc. horizontal Jamais Asc. vertical Automatique Complétion système de fichier Non Saisie invalide Oui, bloquant Saisie obligatoire (erreur) : Style Oui Saisie obligatoire (erreur) : Texte Non Saisie obligatoire (erreur) : Picto Non Saisie obligatoire (indication) : Picto Non Saisie obligatoire (indication) : Texte Non Saisie obligatoire (indication) : Style Oui Saisie invalide : Picto Non Saisie invalide : Texte Non Saisie invalide : Style Oui Avec focus Oui Historique des saisies Non Valeurs multiples (jetons) Non Autoriser les doublons Non Jeton supprimable Oui Valeur persistante Non Barre d'outils RTF En saisie Texte Markdown Non Mode menu ctx. Gestion Euro Non Personnaliser le picto AMI Non Indice du picto AMI 1 Bouton gauche : Nombre d'états 1 Bouton droit : Nombre d'états 1 Bouton gauche : Largeur 0 Bouton droit : Largeur 0 Bouton gauche : Hauteur 0 Bouton droit : Hauteur 0 Bouton gauche : Monochrome Non Bouton droit : Monochrome Non 12/08/2026 Batik_WS_Com_Mob 111

Partie 3 › Fenêtre WINDEV › FEN_Log › Informations sur les champs Ancrage Largeur et hauteur Taux anc. droite 1000 Taux anc. bas 1000 Taux anc. largeur 1000 Taux anc. hauteur 1000 FEN_Log Code Déclarations globales de FEN_Log PROCÉDURE FEN_Log() Fermeture de FEN_Log SI OuiNon("Voulez-vous fermer l'application") = Oui ALORS FinProgramme() SINON RepriseSaisie(FEN_Log) FIN FEN_Log Code des champs Initialisation de SAI_Log // Version 1 // Description // Champ de saisie pour un texte multiligne simple, sans mise en forme 12/08/2026 Batik_WS_Com_Mob 112

Partie 4 › Collection de procédures Partie 4 Collection de procédures

12/08/2026 Batik_WS_Com_Mob 113

Partie 4 › Collection de procédures LIB_GestionTableParamètres Code Procédure globale ParamApplication_Ecrit PROCÉDURE ParamApplication_Ecrit(saCle est une chaîne ANSI,saValeurParDefaut est une chaîne ANSI="", saDescription est une chaîne ANSI="") HRAZ(TOSRV) TOSRV.TS_JSON="{""sType"":""A"",""sCLE"":"""+ saCle +""",""sValeur"":""" + saValeurParDefaut + """,""bCrypte"":0,""sDescript"":"""+saDescription+"""}" TOSRV.TS_CMD =cCMD_ParamAppliEcrit HAjoute(TOSRV) Procédure globale ParamApplication_Lit PROCÉDURE ParamApplication_Lit(saCle est une chaîne ANSI,saValeurParDefaut est une chaîne ANSI="", saDescription est une chaîne ANSI="") SI PAS HLitRecherchePremier(gsdParamApplication,PAP_Code,saCle) ALORS ParamApplication_Ecrit(saCle,saValeurParDefaut,saDescription) TraceINFO("PARAMETRE CREATION : " + saCle + " = ["+gsdParamApplication.PAP_Valeur +"]") RENVOYER saValeurParDefaut SINON TraceINFO("PARAMETRE LECTURE : " + saCle + " = ["+gsdParamApplication.PAP_Valeur +"]") FIN RENVOYER gsdParamApplication.PAP_Valeur Procédure globale ParamApplication_Lit_Booleen PROCÉDURE ParamApplication_Lit_Booleen(saCle est une chaîne ANSI,bValeurParDefaut est un booléen=Faux, saDescription est une chaîne ANSI="") bRep est un booléen = ParamApplication_Lit(saCle,(bValeurParDefaut ? "1" SINON "0") ,saDescription)= "1" RENVOYER bRep Procédure globale Parametre_Ecrit PROCÉDURE PRIVÉ Parametre_Ecrit(saCle est une chaîne ANSI,saValeur est une chaîne ANSI) SI PAS HLitRecherchePremier(PARAMETRES,CLE,saCle) ALORS HRAZ(PARAMETRES) PARAMETRES.CLE=saCle FIN PARAMETRES.VALTEXT=saValeur HEnregistre(PARAMETRES) Procédure globale Parametre_Lit 12/08/2026 Batik_WS_Com_Mob 114

Partie 4 › Collection de procédures › LIB_GestionTableParamètres › Code PROCÉDURE PRIVÉ Parametre_Lit(saCle est une chaîne ANSI,saValeurParDefaut est une chaîne ANSI="") SI PAS HLitRecherchePremier(PARAMETRES,CLE,saCle) ALORS HRAZ(PARAMETRES) PARAMETRES.CLE=saCle PARAMETRES.VALTEXT=saValeurParDefaut HAjoute(PARAMETRES) TraceINFO("PARAMETRE CREATION : " + saCle + " = ["+PARAMETRES.VALTEXT +"]") SINON TraceINFO("PARAMETRE LECTURE : " + saCle + " = ["+PARAMETRES.VALTEXT +"]") FIN RENVOYER PARAMETRES.VALTEXT Procédure globale Parametre_Lit_Booleen PROCÉDURE Parametre_Lit_Booleen(saCle est une chaîne ANSI,bValeurParDefaut est un booléen=Faux) bRep est un booléen = Parametre_Lit(saCle,(bValeurParDefaut ? "1" SINON "0") )="1" RENVOYER bRep 12/08/2026 Batik_WS_Com_Mob 115

Partie 4 › Collection de procédures › LIB_WS › Code LIB_WS Code Déclaration de LIB_WS ST_PARAM_INFO est une Structure saCMD est une chaîne ANSI saDATA est une chaîne ANSI FIN ST_REP_INFO est une Structure saCodeErreur est une chaîne ANSI saDATA est une chaîne ANSI nNumRec est un entier saDate est une chaîne ANSI FIN ST_JSON_Type_RDV est une Structure envoi_mobile est un booléen present_devis est un booléen valider_rdv est un booléen saisir_temps_obligatoire est un booléen FIN 12/08/2026 Batik_WS_Com_Mob 116

Partie 4 › Collection de procédures › LIB_GENERALE › Code LIB_GENERALE Code Déclaration de LIB_GENERALE Procédure globale CalculToken PROCÉDURE CalculToken() sMessage est un Buffer = HasardCryptoBuffer(20) bufCle est un Buffer = HashChaîne(HA_MD5_128, gcCLE_CRYPT_TOKEN) bufCrypte est un Buffer = CrypteStandard(sMessage, bufCle, crypteAES128) sChaîneCryptée est une chaîne = "#"+BufferVersHexa(bufCrypte,SansRegroupement,SansLigne)+"#" RENVOYER sChaîneCryptée Procédure globale ChaineHasard PROCÉDURE PRIVÉE ChaineHasard(nNbCaracteres est un entier) // Initialise le générateur de nombres aléatoires InitHasard() sChaîneAléatoire est une chaîne // Génère la chaîne aléatoire BOUCLE (nNbCaracteres) // Génère un nombre au hasard dans l'intervalle 65-122 (A-z) nCaractère est un entier = Hasard(65,122) // On ne prend pas les caractères compris entre 91 et 96 TANTQUE (91 <= nCaractère <= 96) nCaractère = Hasard(65,122) FIN // Complète la chaîne sChaîneAléatoire += Caract(nCaractère) FIN sChaîneAléatoire = Majuscule(sChaîneAléatoire) RENVOYER sChaîneAléatoire Procédure globale EnNomDeFichier PROCÉDURE EnNomDeFichier(saNom chaîne ANSI) saNomFic est chaîne ANSI =Majuscule(SansEspace(saNom,sscTout)) 12/08/2026 Batik_WS_Com_Mob 117

Partie 4 › Collection de procédures › LIB_GENERALE › Code saNomFic=Remplace(saNomFic,["/","",":","?","*","""","<",">","|","'"],"") saNomFic=SansAccent(saNomFic) RENVOYER saNomFic Procédure globale HashMotDePasse PROCÉDURE HashMotDePasse(saLogin,saPass) RENVOYER HashChaîne(HA_HMAC_SHA_256,saLogin+RC+saPass,gcCLE_HASH_PASS) 12/08/2026 Batik_WS_Com_Mob 118

Partie 4 › Collection de procédures › LIB_COMMUNE › Code LIB_COMMUNE Code Déclaration de LIB_COMMUNE CONSTANT gsCleCryptage ="" cTrace_Info =0 cTrace_Debug =1 cTrace_Erreur =2 FIN gnNiveauTraceMini est un entier = cTrace_Info gsaCumulTrace est une chaîne ANSI gbTraceBufferReception est un booléen //gnNbJoursLog est un entier Procédure globale InfoWS PROCÉDURE PRIVÉ InfoWS() saREP est une chaîne ANSI saREP="-----------------------------------------------" saREP+=RC+"Executable :" + ExeInfo(exeNom) + " version :" + ExeInfo(exeVersion) saREP+=RC+"Date serveur :" + DateVersChaîne(DateHeureSys(),"JJ/MM/AAAA HH:mm:SS") saREP+=RC+"Analyse :" + Remplace(HInfoAnalyse(),RC," N° :") saREP+=RC+"Rep Données :" + fRepDonnées() saREP+=RC+"Rep Web :" + fRepWeb() saREP+=RC+"Ini :" + NomDuFichierIni() saREP+=RC+"IP Client :" + WebserviceAdresseIPClient(Vrai) saREP+=RC+"-----------------------------------------------" RENVOYER saREP Procédure globale LitConfigurationINI PROCÉDURE RESTREINT LitConfigurationINI() saFicIni est une chaîne = NomDuFichierIni() SI PAS fFichierExiste(saFicIni) ALORS INIEcrit("DEBUG","NIVEAU","0",saFicIni) FIN // Lit la valeur du niveau de trace par défaut gnNiveauTraceMini = Val( INILit("DEBUG", "NIVEAU", "0",saFicIni) ) gbTraceBufferReception = Val(INILit("DEBUG","TRACE BUFFER","0",saFicIni))=1 gnNbJoursLog = Val( INILit("LOG", "NB JOURS", "10",saFicIni) ) Procédure globale NomDuFichierIni PROCÉDURE PRIVÉ NomDuFichierIni() RENVOYER ComplèteRep(fRepDonnées()) + "Config" + gcVersionNom +".ini" Procédure globale ParametreSQLCorrect 12/08/2026 Batik_WS_Com_Mob 119

Partie 4 › Collection de procédures › LIB_COMMUNE › Code PROCÉDURE PRIVÉ ParametreSQLCorrect(LOCAL saParam chaîne ANSI) //Vérifie si la chaine ne contient pas d'instruction SQL injectées //Test à minima SI saParam="" ALORS RENVOYER Vrai FIN tabChaine est un tableau de chaînes = ["SELECT","INSERT","UPDATE","DELETE","WHERE","INNER"] SI Contient(saParam,tabChaine,SansCasse) ALORS RENVOYER Faux RENVOYER Vrai Procédure globale Tesla PROCÉDURE Tesla() //T'es là RENVOYER "OUI" Procédure globale TraceCUMUL PROCÉDURE RESTREINT TraceCUMUL(s) //Stock un message de trace pour l'écrire quand la trace sera ouverte saTxt est une chaîne ANSI = DateVersChaîne(DateHeureSys(),"JJ/MM/AA HH:mm:SS")+ TAB + cTrace_Info + TAB + Remplace(s,TAB,"") gsaCumulTrace += [RC] + saTxt Procédure globale TraceDEBUG PROCÉDURE RESTREINT TraceDEBUG(s) saTxt est une chaîne ANSI = DateVersChaîne(DateHeureSys(),"JJ/MM/AA HH:mm:SS")+ TAB + cTrace_Debug + TAB + Remplace(s,TAB,"") SI gnNiveauTraceMini <= cTrace_Debug ALORS SI gsaCumulTrace<>"" ALORS Trace(gsaCumulTrace) gsaCumulTrace="" FIN Trace(saTxt) SINON gsaCumulTrace += RC + saTxt FIN Procédure globale TraceERREUR PROCÉDURE RESTREINT TraceERREUR(s) //EN cas d'erreur, on trace le contenu du Cumul de trace de tout niveau SI gsaCumulTrace<>"" ALORS Trace(gsaCumulTrace) gsaCumulTrace="" FIN Trace(DateVersChaîne(DateHeureSys(),"JJ/MM/AA HH:mm:SS")+ TAB + cTrace_Erreur + TAB + Remplace(s, TAB,"")) Procédure globale TraceINFO PROCÉDURE RESTREINT TraceINFO(s) saTxt est une chaîne ANSI = DateVersChaîne(DateHeureSys(),"JJ/MM/AA HH:mm:SS")+ TAB + cTrace_Info + TAB + Remplace(s,TAB,"") SI gnNiveauTraceMini <= cTrace_Info ALORS 12/08/2026 Batik_WS_Com_Mob 120

Partie 4 › Collection de procédures › LIB_COMMUNE › Code Trace(saTxt) SINON gsaCumulTrace += RC + saTxt FIN Procédure globale TraceTOUT //Trace quelque soit le niveau de trace courant PROCÉDURE RESTREINT TraceTOUT(s) Trace(DateVersChaîne(DateHeureSys(),"JJ/MM/AA HH:mm:SS")+ TAB + cTrace_Info + TAB + Remplace(s,TAB, "")) 12/08/2026 Batik_WS_Com_Mob 121

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code LIB_ProcéduresGlobales Code Procédure globale ConnexionValide // Résumé : Vérifie si la session est déjà ouverte en comparant le dernier token mémorisé à celui présenté // Syntaxe : //[ <Résultat> = ] ConnexionValide ( est ST_MOB_IDENTITE) // // Paramètres : // stID (ST_MOB_IDENTITE) : Token reçu dans la commande de WS // Valeur de retour : // multi-valeur : <indiquez ici le rôle de la valeur de retour> PROCÉDURE ConnexionValide(stID est un ST_MOB_IDENTITE) TraceINFO("Client : " + stID.saIdClient + " IdMob:" + stID.saIdMob + " NumPort:"+stID.saNumPort) gstContexte.saNumPort = stID.saNumPort gstContexte.saIdMobile=stID.saIdMob gstContexte.saIdClient=stID.sAIdClient gstContexte.saBaseData=stID.sABaseData gstContexte.saBaseSync=stID.sABaseSync SI PAS OuvreConnexionsHF() ALORS RENVOYER (Faux,cERR_SRV) SINON //Si le contexte de la session s'est ré-initialisé, il faut re-vérifier la licence (toute les 1h mini) dhLimite est une DateHeure = gstContexte.dhAuthentification dhLimite..Heure +=1 SI (PAS gstContexte.bAuthentifié) OU dhLimite < DateHeureSys() ALORS gstContexte.bAuthentifié = Faux gstContexte.dhAuthentification=DateHeureSys() stDMD est un ST_WS_VERIF_LM sAJson est une chaîne ANSI stDMD.saCodeClient =stID.saIdClient stDMD.saIdMobile =stID.saIdMob stDMD.saLicence =stID.saLicence InitialiseContexteUtilisateur(stID.nIdUser) Sérialise(stDMD,sAJson,psdJSON) <COMPILE SI Configuration<>"WS_COM_MOBILE" ET Configuration<>"Debug WS_COM_MOBILE"> stRep est un ST_REP_CLIENT = WS_LICENCE.LicenceVerifie(sAJson) SI ErreurDétectée() ALORS TraceINFO("Problème de communication avec le serveur de Licence.") 12/08/2026 Batik_WS_Com_Mob 122

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code TraceINFO(ErreurInfo(errComplet)) RENVOYER (Faux,cERR_SRV) FIN SI stRep.saEtatReponse..Valeur<>cREP_LIC_OK ALORS TraceERREUR("ERREUR ConnexionValide : Code erreur = " +stRep.saEtatReponse..Valeur ) TraceERREUR("Pour :" + sAJson) RENVOYER (Faux,stRep.saEtatReponse..Valeur) SINON TraceDEBUG("Licence Validée par le serveur de Licence") gstContexte.bAuthentifié =Vrai RENVOYER (Vrai,cRep_OK) FIN gstContexte.bAuthentifié =Vrai RENVOYER (Vrai,cRep_OK) SINON InitialiseContexteUtilisateur(stID.nIdUser) TraceDEBUG("Reconnexion n° :" + gstContexte.nNbConnexions ) RENVOYER (Vrai,cRep_OK) FIN FIN Procédure globale DonneGuidIdColb PROCÉDURE DonneGuidIdColb(LOCAL saCle est une chaîne ANSI) TraceINFO("Recherche GUID Colb :"+saCle) SI SansEspace(saCle) = "" ALORS RENVOYER "" FIN SI gtbaGUIDCollaborateur[saCle]..Existe = Vrai ALORS RENVOYER gtbaGUIDCollaborateur[saCle] SINON SI gtbaGUIDCollaborateur[Val(saCle)]..Existe = Vrai ALORS RENVOYER gtbaGUIDCollaborateur[Val(saCle)] FIN FIN RENVOYER "" Procédure globale DonneIdParametre PROCÉDURE DonneIdParametre(LOCAL saCle est une chaîne ANSI) nIdParam est un entier sur 8 octets = 0 SI saCle <> "" ET gtbaCleParametre[saCle]..Existe = Vrai ET gtbaCleParametre[saCle] > 0 ALORS nIdParam = gtbaCleParametre[saCle] FIN RENVOYER nIdParam Procédure globale DonneLibParametre PROCÉDURE DonneLibParametre(LOCAL saCle est une chaîne ANSI) SI SansEspace(saCle) = "" ALORS RENVOYER "" 12/08/2026 Batik_WS_Com_Mob 123

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code FIN SI saCle <> "" ET gtbaLibParametre[saCle]..Existe = Vrai ET gtbaLibParametre[saCle] <> "" ALORS RENVOYER gtbaLibParametre[saCle] SINON SI Val(saCle) > 0 ET gtbaLibParametre[Val(saCle)]..Existe = Vrai ET gtbaLibParametre[Val(saCle) ] <> "" ALORS RENVOYER gtbaLibParametre[Val(saCle)] FIN FIN RENVOYER "" Procédure globale DonneListeConfigMail PROCÉDURE DonneListeConfigMail(LOCAL nIdUser est un entier sur 8 octets = 0) ParamEmailConfig est un tableau associatif de STParamEnvoiEmailPerso ParamEmailPerso est un tableau de STParamEnvoiEmailPerso sMsg est une chaîne Unicode stParametreEmail est une STParamEnvoiEmailPerso n est un entier SI nIdUser <= 0 ALORS RENVOYER (sMsg,ParamEmailConfig) saRQSoc est une chaîne ANSI = [ SELECT SO_Parametres, SO_PKID FROM Societe_Collaborateur INNER JOIN societe ON societe.SO_PKID = Societe_Collaborateur.SC_IDCSociete INNER JOIN Utilisateur on Utilisateur.UT_IDCollaborateur = Societe_Collaborateur.SC_IDCollaborateur WHERE Utilisateur.UT_PKID = ] saRQSoc += nIdUser sdRqSoc est une Source de Données SI PAS HExécuteRequêteSQL(sdRqSoc,gcnxReplica,saRQSoc) ALORS sMsg = "Configuration de mail introuvable" TraceINFO(sMsg +RC+HErreurInfo(errComplet)) SINON POUR TOUT sdRqSoc Désérialise(stParametreEmail,sdRqSoc.SO_Parametres,psdJSON) AjouterListe(sdRqSoc.SO_PKID) RempliListe(sdRqSoc.SO_PKID) FIN FIN AjoutConfigPerso() RENVOYER (sMsg, ParamEmailConfig) PROCÉDURE INTERNE AjouterListe(LOCAL nIdSoc est un entier sur 8 octets = 0) SI nIdUser > 0 ET nIdSoc > 0 ET (stParametreEmail.Compte.sEmail <> "" OU stParametreEmail. Compte.sCompte <> "") ALORS sCode est une chaîne ANSI = "EMAIL_ENVOI_"+nIdSoc SI PAS ParamEmailConfig[sCode]..Existe ALORS stParametreEmail.SMTP.sMdp = Décrypte(stParametreEmail.SMTP.sMdp,gsCleMdp) ParamEmailConfig[sCode] = stParametreEmail 12/08/2026 Batik_WS_Com_Mob 124

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code FIN // Conserver les paramètres de la société login et mot de passe ne peuvent etre changés

ParamEmailConfig[sCode].Compte = stParametreEmail.Compte
ParamEmailConfig[sCode].SMTP.bEnCopieCachee = stParametreEmail.SMTP.bEnCopieCachee
ParamEmailConfig[sCode].SMTP.bufSignature = stParametreEmail.SMTP.bufSignature
ParamEmailConfig[sCode].SMTP.tabCC_CopieEmail = stParametreEmail.SMTP.
tabCC_CopieEmail
FIN
FIN
PROCÉDURE INTERNE RempliListe(LOCAL nIdSoc est un entier sur 8 octets = 0)
bAncienVersion est un booléen = Faux
-------------- --- ------------------- --- ----------------------- --- --- ---
sCode est une chaîne ANSI = "EMAIL_ENVOI_"+nIdSoc
SI nIdUser > 0 ET nIdSoc > 0 ALORS
saRQColP est une chaîne ANSI = [
--- -------- --- ------------------- --- --- --- ---
SELECT PU_Valeur FROM ParametreUtilisateur WHERE ParametreUtilisateur.PU_Code = '
]
saRQColP += sCode +"' AND "
saRQColP += "ParametreUtilisateur.PU_IDUtilisateur = "+nIdUser
sdRqColP est une Source de Données
--- -------- ------------------------- --- --- --- --- ---
SI PAS HExécuteRequêteSQL(sdRqColP,gcnxReplica,saRQColP) ALORS
sMsg = "Configuration de mail de la société introuvable dans la fiche collaborateur"
TraceINFO(sMsg +RC+HErreurInfo(errComplet))
SINON
SI sdRqColP.PU_Valeur <> "" ALORS
SI ParamEmailConfig[sCode]..Existe ALORS
Désérialise(stParametreEmail,sdRqColP.PU_Valeur,psdJSON)
Ajouterliste(nIdSoc)
FIN
FIN
FIN
FIN
FIN
PROCÉDURE INTERNE AjoutConfigPerso()
SI nIdUser <= 0 ALORS RETOUR
sCode est une chaîne ANSI
------------- --- --------------------- ----------------------------- --- --- --- ---
stParamRecep est STParamEnvoiEmail
stParamAncien est un STParamEnvoiEmailPerso
saRQColP est une chaîne ANSI = [
SELECT PU_Valeur FROM ParametreUtilisateur WHERE ParametreUtilisateur.PU_Code =
'EMAIL_ENVOI' AND ParametreUtilisateur.PU_IDUtilisateur =
]
saRQColP += nIdUser
sdRqColP est une Source de Données
SI PAS HExécuteRequêteSQL(sdRqColP,gcnxReplica,saRQColP) ALORS
sMsg =
"Configuration de mail de personnel introuvable dans la fiche paramètres utilisateur"
TraceINFO(sMsg +RC+HErreurInfo(errComplet))
SINON
SI sdRqColP.PU_Valeur <> "" ALORS
QUAND EXCEPTION DANS
Désérialise(ParamEmailPerso,sdRqColP.PU_Valeur,psdJSON)
FAIRE
bufCle est un Buffer = HashChaîne(HA_MD5_128,gsCleMdp)
---------- --- --------- ------------- ---------------- --- --------------------------------- ---
bufCrypte est un Buffer = sdRqColP.PU_Valeur
12/08/2026 Batik_WS_Com_Mob 125

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code bufRep est un Buffer = DécrypteStandard(bufCrypte, bufCle, crypteAES128) Désérialise(stParamRecep,bufRep,psdJSON) FIN SI ParamEmailPerso..Occurrence <= 0 ET stParamRecep.sLogin <> "" ALORS stParamAncien.SMTP = stParamRecep stParamAncien.Compte.sEmail = stParamRecep.sLogin stParamAncien.Compte.sCompte = "" TableauAjoute(ParamEmailPerso,stParamAncien) FIN POUR TOUT stParam,n de ParamEmailPerso SI stParam.SMTP.sLogin <> "" ALORS sCode = "EMAIL_ENVOI_Perso_"+n SI PAS ParamEmailConfig[sCode]..Existe ALORS stParam.SMTP.sMdp = Décrypte(stParam.SMTP.sMdp,gsCleMdp) ParamEmailConfig[sCode] = stParam FIN FIN FIN FIN FIN FIN Procédure globale InitGUIDCollaborateurs PROCÉDURE InitGUIDCollaborateurs() TableauSupprimeTout(gtbaGUIDCollaborateur) QUAND EXCEPTION DANS sd est une Source de Données HExécuteRequêteSQL(sd, gcnxReplica,hRequêteDéfaut,"SELECT CO_PKID,GUID FROM Collaborateur") POUR TOUT sd gtbaGUIDCollaborateur[sd.CO_PKID] = sd.GUID gtbaGUIDCollaborateur[sd.GUID] = sd.CO_PKID FIN TraceINFO("TBA Colbs Taille : "+gtbaGUIDCollaborateur..Occurrence) FAIRE RENVOYER Faux FIN RENVOYER Vrai Procédure globale InitialisationParametres PROCÉDURE InitialisationParametres() // //si gstContexte.bParamChargés alors // // Désérialise(gstParam,gstContexte.sParamJson,psdJSON) // renvoyer Vrai //FIN InitGUIDCollaborateurs() 12/08/2026 Batik_WS_Com_Mob 126

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code QUAND EXCEPTION DANS //Paramètres Métiers sd est une Source de Données HExécuteRequêteSQL(sd, gcnxReplica,hRequêteDéfaut, "SELECT PA_PKID,PA_CLE,PA_Categorie,PA_Libelle FROM ParametreMetier WHERE PA_Categorie IN ('"+ cParam_Civilite+"','"+cParam_TypeDossier+"','"+... cParam_StatutDossier+"','"+cparam_TypeLieu+"','"+cParam_RoleContact+"','"+cParam_TypeInter+"','"+ cParam_EtatInter+"','"+cParam_TypeRDV+"','"+cParam_StatusRDV+"','"+cParam_TypeDoc+ "') ORDER BY PA_CLE,PA_Categorie") POUR TOUT sd gtbaCleParametre[sd.PA_CLE] = sd.PA_PKID gtbaLibParametre[sd.PA_CLE] = sd.PA_Libelle gtbaLibParametre[sd.PA_PKID] = sd.PA_Libelle SELON sd.PA_Categorie CAS cParam_Civilite

gstParametres.TbaCivilite[sd.PA_CLE] =sd.PA_Libelle
CAS cParam_TypeDossier
gstParametres.TbaTypeDossier[sd.PA_CLE] =sd.PA_Libelle
--- ---------------------------------------- --- -------------- --- --- ---
CAS cParam_StatutDossier
gstParametres.TbaStatutDossier[sd.PA_CLE] =sd.PA_Libelle
--- ------------------------------------------ --- -------------- --- --- ---
CAS cparam_TypeLieu
gstParametres.TbaTypeLieu[sd.PA_CLE] =sd.PA_Libelle
--- ------------------------------------- --- -------------- --- --- ---
CAS cParam_RoleContact
gstParametres.TbaRoleCntctLieu[sd.PA_CLE] = sd.PA_Libelle
--- ----------------------------------------- --- --------------- --- --- ---
gstParametres.TbaRoleContact[sd.PA_CLE] = sd.PA_Libelle
CAS cParam_TypeInter
gstParametres.TbaTypeInter[sd.PA_CLE] =sd.PA_Libelle
--- -------------------------------------- --- -------------- --- --- ---
CAS cParam_EtatInter
gstParametres.TbaEtatInter[sd.PA_CLE] =sd.PA_Libelle
--- -------------------------------------- --- -------------- --- --- ---
CAS cParam_TypeRDV
gstParametres.TbaTypActivite[sd.PA_CLE] =sd.PA_Libelle
--- ---------------------------------------- --- -------------- --- --- ---
CAS cParam_StatusRDV
gstParametres.TbaStatutRDV[sd.PA_CLE] =sd.PA_Libelle
--- -------------------------------------- --- -------------- --- --- ---
CAS cParam_TypeDoc
gstParametres.TbaCategorieDoc[sd.PA_CLE] =sd.PA_Libelle
--- ----------------------------------------- --- -------------- --- --- ---
FIN
FIN
// Sérialise(gstParam,gstContexte.sParamJson,psdJSON)
FAIRE
RENVOYER Faux
FIN
gstContexte.bParamChargés=Vrai
RENVOYER Vrai
Procédure globale SerialiseContexte
PROCÉDURE SerialiseContexte()
12/08/2026 Batik_WS_Com_Mob 127
---------- --- ---------------- --- --- --- ---

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales › Code sBuf est une chaîne ANSI Sérialise(gstContexte,sBuf,psdJSON) RENVOYER sBuf Procédure globale TraceRequete PROCÉDURE TraceRequete(saSQL est une chaîne ANSI) TraceINFO (RC + "SQL " + Répète("-",40)+ RC+ Remplace(saSQL,[RC,TAB]," ")+ RC + Répète("-",40) + " SQL"

  • RC) 12/08/2026 Batik_WS_Com_Mob 128

Partie 4 › Collection de procédures › LIB_WS_MOB › Code LIB_WS_MOB Code Déclaration de LIB_WS_MOB CONSTANT cCMD_ServiceActif="WOUF" cCMD_ServiceInfo ="INFO" // //Commandes destinées au Service // cCMD_ListeDocDmd = "S.DOC.LS" // cCMD_DocVersSRV = "S.DOC.EC" // cCMD_EcritNote = "S.NTE.EC" // cCMD_EcritDocNote = "S.DNT.EC" // cCMD_TempsEcrit = "S.TPS.EC" // cCMD_TempsSupprime = "S.TPS.SU" // cCMD_CREcrit = "S.RPT.EC" // // //Commandes interprétées par ce WebService // cCMD_RechercheRDV ="W.RDV.RC" // cCMD_ListeRDV ="W.RDV.LS" // cCMD_ListeDOC ="W.DOC.LS" // cCMD_ListeTEMPS ="W.TPS.LS" // cCMD_LitParam ="W.PRM.LI" //Lit les paramètres métiers // cCMD_LitContexte ="W.CTX.LI" //Lit le contexte utilisateur cRep_OK ="R" cErreur ="E" FIN ST_MOB_IDENTITE est une Structure saLicence est une chaîne ANSI saIdMob est une chaîne ANSI saNumPort est une chaîne ANSI nIdUser est un entier sur 8 octets nIdColb est un entier sur 8 octets saBaseData est une chaîne ANSI saBaseSync est une chaîne ANSI saIdClient est une chaîne ANSI FIN ST_MOB_DATA est une Structure saCMD est une chaîne ANSI saJSON est une chaîne ANSI FIN Procédure globale InitTraceLog PROCÉDURE InitTraceLog(stID est un ST_MOB_IDENTITE) SI gstContexte.saFichierLog="" ALORS gstContexte.saFichierLog =ComplèteRep(fRepDonnées()) + "Trace_" + stID.saIdClient + "_" + DateSys( ) + ".txt" TraceDébut(trFichier, gstContexte.saFichierLog ) 12/08/2026 Batik_WS_Com_Mob 129

Partie 4 › Collection de procédures › LIB_WS_MOB › Code TraceINFO("Init après Connexion : "+gcVersionNom+" " + ExeInfo(exeNom) + " " + ExeInfo(exeVersion) ) TraceINFO("WebService : " + gcVersionNom + " Version : " + gcVersionWS) TraceINFO("Client :" + WebserviceAdresseIPClient( )) SINON TraceDébut(trFichier, gstContexte.saFichierLog ) FIN SI LIB_COMMUNE.gsaCumulTrace<>"" ALORS Trace(LIB_COMMUNE.gsaCumulTrace) LIB_COMMUNE.gsaCumulTrace="" FIN TraceINFO("Niveau Trace " + LIB_COMMUNE.gnNiveauTraceMini ) //Purge des anciens log suLstLog est une chaîne Unicode = fListeFichier(ComplèteRep(fRepDonnées()) + "Trace_*.txt", frInformationComplète + frNonRécursif + fCheminUnicode ) POUR TOUTE CHAÎNE sasufic DE suLstLog SÉPARÉE PAR RC SI DateDifférence(Gauche(ExtraitChaîne(sasufic,3,TAB),8),DateSys) > gnNbJoursLog ALORS fSupprime(ExtraitChaîne(sasufic,1,TAB)) FIN FIN Procédure globale MOB_CMD PROCÉDURE MOB_CMD(LOCAL stID est un ST_MOB_IDENTITE, LOCAL stData est une ST_MOB_DATA, LOCAL bufDocument est un Buffer) InitTraceLog(stID) TraceDEBUG("MOB_IDENTITE : User = " + stID.nIdUser +" IdMob = " +stID.saIdMob +" Licence = " + stID. saLicence ) TraceDEBUG("MOB_CMD : CMD = " + stData.saCMD +" JSON = " + stData.saJSON+" Taille buf :"+Taille( bufDocument)) bufRep est un Buffer bCnxOK est un booléen sErr est une chaîne (bCnxOK,sErr)=ConnexionValide(stID) SI PAS bCnxOK ALORS bufRep= cErreur + sErr TraceDEBUG("Pb Connexion refusée") RENVOYER bufRep SINON TraceINFO("Connecté") FIN SELON stData.saCMD CAS cCMD_NoteEcrit,cCMD_DocNoteEcrit,cCMD_TempsEcrit,cCMD_TempsSupprime,cCMD_CREcrit, cCMD_CREcrit_V2,cCMD_ListeDocDmd,cCMD_RdvEcrit,cCMD_TempsEcrit_V2,cCMD_RDVValidation, cCMD_RDVAnnulation,cCMD_DocRpRecup //Le contenu JSON de stData est transmis au serveur BO sans traitement. //Le type de données transmise est identifié par la commande stData.saCMD HRAZ(TOSRV) TOSRV.TS_CMD = stData.saCMD TOSRV.TS_Date = DateHeureSys() TOSRV.TS_JSON = stData.saJSON TOSRV.TS_Lu=0 12/08/2026 Batik_WS_Com_Mob 130

Partie 4 › Collection de procédures › LIB_WS_MOB › Code TOSRV.TS_Mobile = gstContexte.saIdMobile TOSRV.TS_Buffer = bufDocument //Utilisé pour transférer l'image de la signature HAjoute(TOSRV) bufRep= "R" CAS cCMD_RdvAPlanifierEcrit bufRep=ControleRdvAPlanifier(stData) SI bufRep="R" ALORS HRAZ(TOSRV) TOSRV.TS_CMD = cCMD_RdvAPlanifierEcrit//stData.saCMD TOSRV.TS_Date = DateHeureSys() TOSRV.TS_JSON = stData.saJSON TOSRV.TS_Lu = 0 TOSRV.TS_Mobile = gstContexte.saIdMobile TOSRV.TS_Buffer = bufDocument //Utilisé pour transférer l'image de la signature HAjoute(TOSRV) FIN CAS cCMD_ListeDOC bufRep=ListeReferenceDOC(stData) CAS cCMD_ListeRDV bufRep=ConstruitListeIntervention(Vrai,stData) CAS cCMD_ListeRDV_V2 bufRep=ConstruitListeIntervention_V2(Vrai,stData) CAS cCMD_LitINTER bufRep=RecupereUneIntervention(stData) CAS cCMD_LitINTER_V2 bufRep=RecupereUneIntervention_V2(stData) CAS cCMD_RechercheRDV bufRep=RechercheInterventions(stData) CAS cCMD_ListeNonPlanifié bufRep=ConstruitListeIntervention(Faux,stData) CAS cCMD_ListeTEMPS bufRep=ListeTempsPasse(stData)//ListeTemps(stData) CAS cCMD_LitParam //Appelé par la fonction RécupContexte du mobile bufRep=RecupListeParamMetiers() CAS cCMD_LitParam_V2 //Appelé par la fonction RécupContexte du mobile bufRep=RecupListeParamMetiers_V2(stID.nIdUser) CAS cCMD_LitContexte bufRep=RecupereContexte(stData) CAS cCMD_IdClbRdvDroitC bufRep=RecupererIdClbRDVDroitConsultation() CAS cCMD_ListeRDV_Clb bufRep=RecupererRDVAutreClb(stData) CAS cCMD_ListeCh_Rapport bufRep=RecupererChampRapportInter(stData) CAS cCMD_RecupImgRapport RecupererImgRp()// Recuperation des images rapport bufRep= "R" CAS cCMD_Creation_Rapport RecupererImgRp()// Recuperation des images rapport TraceINFO("json" + stData.saJSON ) bufRep= CreationRapport(stID,stData) CAS cCMD_ListeCh_Mail RecupererImgRp()// Recuperation des images rapport TraceINFO("json" + stData.saJSON ) bufRep= RecupererChampMailModele(stData) CAS cCMD_Cr_Structure_Mail RecupererImgRp()// Recuperation des images rapport TraceINFO("json" + stData.saJSON ) bufRep= CreationModeleMail(stData) 12/08/2026 Batik_WS_Com_Mob 131

Partie 4 › Collection de procédures › LIB_WS_MOB › Code CAS cCMD_Envoyer_Mail RecupererImgRp()// Recuperation des images rapport TraceINFO("json" + stData.saJSON ) bufRep= CreationETEnvoiEmail(stID,stData) AUTRE CAS bufRep= cErreur + stData.saCMD +"?" FIN RENVOYER bufRep Procédure globale MOB_EnvoieDoc PROCÉDURE MOB_EnvoieDoc(stID est un ST_MOB_IDENTITE, saJSON est une chaîne ANSI, bufDocument est un Buffer ) InitTraceLog(stID) TraceDEBUG("MOB_EnvoieDoc :" + saJSON) SI bufDocument="" ALORS RENVOYER "1" saRep est une chaîne ANSI bCnxOK est un booléen sErr est une chaîne (bCnxOK,sErr)=ConnexionValide(stID) SI PAS bCnxOK ALORS saRep= cErreur + sErr TraceDEBUG("Pb Connexion refusée") RENVOYER saRep SINON TraceINFO("Connecté") FIN HRAZ(TOSRV) TOSRV.TS_CMD = cCMD_DocEcrit TOSRV.TS_Date = DateHeureSys() TOSRV.TS_JSON = saJSON TOSRV.TS_Buffer = bufDocument HAjoute(TOSRV) saRep=cRep_OK RENVOYER saRep Procédure globale MOB_RecupDoc PROCÉDURE MOB_RecupDoc(stID est un ST_MOB_IDENTITE, nID_TOMOB est un entier sur 8 octet) InitTraceLog(stID) bufRep est un Buffer bCnxOK est un booléen sErr est une chaîne (bCnxOK,sErr)=ConnexionValide(stID) SI PAS bCnxOK ALORS bufRep= cErreur + sErr TraceDEBUG("Pb Connexion refusée") RENVOYER bufRep SINON TraceINFO("Connecté") FIN 12/08/2026 Batik_WS_Com_Mob 132

Partie 4 › Collection de procédures › LIB_WS_MOB › Code QUAND EXCEPTION DANS SI HLitRecherchePremier(TOMOB,IDTOMOB,nID_TOMOB) ALORS bufRep = TOMOB.TM_Buffer TOMOB.TM_Lu=Vrai HModifie(TOMOB) RENVOYER bufRep SINON bufRep="R0000" RENVOYER bufRep FIN FAIRE bufRep="E"+ExceptionInfo(errComplet) TraceINFO(bufRep) RENVOYER bufRep FIN Procédure globale MOB_RecupDocID PROCÉDURE MOB_RecupDocID(stID est un ST_MOB_IDENTITE) InitTraceLog(stID) //Donne au mobile demandeur l'ID et la description JSON du premier document non lu à récupérer saRep est une chaîne ANSI bCnxOK est un booléen sErr est une chaîne (bCnxOK,sErr)=ConnexionValide(stID) SI PAS bCnxOK ALORS saRep= cErreur + sErr TraceDEBUG("Pb Connexion refusée") RENVOYER saRep SINON TraceINFO("Connecté") FIN TraceINFO("MOB_RecupDocID " +stID.saIdMob) QUAND EXCEPTION DANS //Réalise une purge des documents non lu à destination des mobiles d est une DateHeure d..Jour -= 1 rqPurge est une Requête SQL = [ DELETE FROM TOMOB WHERE TM_Date < {pDate} AND TM_CMD='DOC' ] rqPurge.pDate=d HExécuteRequête(rqPurge) SI HLitRecherchePremier(TOMOB,TM_MobileTM_CMD,[stID.saIdMob,"DOC",Faux]) ALORS saRep ="R" + TOMOB.IDTOMOB + RC +TOMOB.TM_JSON 12/08/2026 Batik_WS_Com_Mob 133

Partie 4 › Collection de procédures › LIB_WS_MOB › Code RENVOYER saRep SINON saRep="V" //Vide RENVOYER saRep FIN FAIRE saRep="E"+ExceptionInfo(errComplet) TraceINFO(saRep) RENVOYER saRep FIN Procédure globale MOB_RecupValide PROCÉDURE MOB_RecupValide(stID est un ST_MOB_IDENTITE,nIdToMob est un entier sur 8 octets) InitTraceLog(stID) saRep est une chaîne ANSI bCnxOK est un booléen sErr est une chaîne (bCnxOK,sErr)=ConnexionValide(stID) SI PAS bCnxOK ALORS saRep= cErreur + sErr TraceDEBUG("Pb Connexion refusée") RENVOYER saRep SINON TraceINFO("Connecté") FIN SI HLitRecherchePremier(TOMOB,IDTOMOB,nIdToMob) ALORS HSupprime(TOMOB) FIN saRep="R" PurgeTOMOB_24h() RENVOYER saRep 12/08/2026 Batik_WS_Com_Mob 134

Partie 4 › Collection de procédures › LIB_Traitements › Code LIB_Traitements Code Procédure globale AjouterDonnesBDDansChampRapport PROCÉDURE AjouterDonnesBDDansChampRapport(nIdInter est un entier sur 8 octets, tbRubASaisir est un tableau de STJSONMembreRubRapport) saRQ est une chaîne = [ SELECT Intervention.IN_Titre AS IN_Titre, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.CreationDate AS IN_CreationDate, Intervention.IN_NumDevis, Intervention.IN_DateDevis, Intervention.IN_NumFacture, Intervention.IN_DateFacture, Intervention.IN_RefExterne AS IN_RefExterne, Intervention.IN_Description AS IN_Description, Intervention.IN_DureePrevue, CONCAT(Collaborateur.CO_Prenom, ' ', Collaborateur.CO_Nom) AS IN_CO_Nom, PA_TypeInter.PA_Libelle as IN_PA_Type, Lieu.LI_CodeLieu AS LI_CodeLieu, ( CASE WHEN AdLieu.AD_Adresse IS NOT NULL AND AdLieu.AD_Adresse <> '' THEN CONCAT(AdLieu.AD_Adresse, ' CHAR(13) ') ELSE '' END + CASE WHEN AdLieu.AD_CodePostal IS NOT NULL AND AdLieu.AD_CodePostal <> '' THEN CONCAT(AdLieu.AD_CodePostal, ' ') ELSE '' END + CASE WHEN AdLieu.AD_Ville IS NOT NULL AND AdLieu.AD_Ville <> '' THEN AdLieu.AD_Ville ELSE '' END ) AS LI_Adresse, Lieu.LI_CodeAcces AS LI_CodeAcces, Client.CL_Nom AS CL_Nom, CONCAT(AdClient.AD_Adresse, ' ', AdClient.AD_CodePostal, ' ',AdClient.AD_Ville) AS AD_Presentation, Societe.SO_Nom FROM Intervention LEFT OUTER JOIN (Lieu LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID ) ON Intervention.IN_IDLieu = Lieu.LI_PKID, Intervention INNER JOIN (Dossier LEFT OUTER JOIN (Client LEFT OUTER JOIN Adresse AdClient ON Client.CL_IDAdressePrincipale = AdClient.AD_PKID) ON Dossier.DO_IDClient = Client.CL_PKID ) ON Intervention.IN_IDDossier = Dossier.DO_PKID , Intervention LEFT OUTER JOIN Collaborateur ON Intervention.IN_IDSuiviPar=Collaborateur.CO_PKID, Intervention LEFT OUTER JOIN Societe ON Intervention.IN_IDSociete = Societe.SO_PKID, Intervention LEFT OUTER JOIN ParametreMetier PA_TypeInter ON Intervention.IN_CleType = PA_TypeInter.PA_CLE WHERE IN_PKID={pIdInter} ] 12/08/2026 Batik_WS_Com_Mob 135

Partie 4 › Collection de procédures › LIB_Traitements › Code saRQ=Remplace(saRQ,"{pIdInter}",nIdInter ) sARQAdresseClient est une chaîne ANSI = [ SELECT CONCAT(AdLieu.AdClient.AD_Adresse, ' ',AdLieu.AD_CodePostal, ' ', AdLieu.AD_Ville, ' ') AS Adresse FROM Client INNER JOIN Intervention on Intervention.IN_IDClient = Client.CL_PKID LEFT JOIN Client_Adresse on Client_Adresse.CA_IDClient = Client.CL_PKID INNER JOIN Adresse AdLieu on adlieu.AD_PKID = Client_Adresse.CA_IDAdresse WHERE Intervention.IN_PKID = {pIdInter} ] sARQAdresseClient=Remplace(sARQAdresseClient,"{pIdInter}",nIdInter ) sARQDossier est une chaîne ANSI = [ SELECT Dossier.DO_Titre as DOSSIER_TITRE , dossier.DO_RefExterne as DOSSIER_REFEXT , dossier.DO_NumDossier as DOSSIER_NUM, Dossier.DO_DateDebut as DOSSIER_DATE, PA_StatutDossier.PA_Libelle as DOSSIER_STATUT FROM Dossier INNER JOIN Intervention on Intervention.IN_IDDossier = Dossier.DO_PKID LEFT OUTER JOIN ParametreMetier PA_StatutDossier ON Dossier.DO_CleStatut = PA_StatutDossier.PA_CLE WHERE Intervention.IN_PKID = {pIdInter} ] sARQDossier=Remplace(sARQDossier,"{pIdInter}",nIdInter ) saRqCR est une chaîne ANSI = [ SELECT CompteRendu.CR_PKID, CompteRendu.CR_DateHeureDebut, CompteRendu.CR_DateHeureFin, CompteRendu.CR_NoteCollaborateur, CompteRendu.CR_NomSignataire, CompteRendu.CR_NomSignataireTech, CompteRendu.CR_NoteSignataire, CompteRendu.CR_DevisConforme, CompteRendu.CR_AvecReserve, CompteRendu.CR_ReserveCommentaire, CompteRendu.CR_DateHeureSignature, CompteRendu.CR_Signature, CompteRendu.CR_SignatureTech, CompteRendu.CR_IDTypeSignataire, CompteRendu.GUID, ParametreMetier.PA_Libelle AS CR_PA_Type FROM CompteRendu INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_PKID = CR_IDRdv INNER JOIN RDV_Planning ON RDV_Planning.GUID = RDV_Collaborateur.RVC_GUID_RDV LEFT OUTER JOIN ParametreMetier ON ParametreMetier.PA_CLE = CompteRendu.CR_CleTypeSignataire and CompteRendu.CR_CleTypeSignataire <> '' WHERE RDV_Collaborateur.Archive=0 AND RDV_Planning.Archive = 0 AND RDV_Planning.RV_IdInter = {p_IdInter} ] saRqCR = Remplace(saRqCR,"{p_IdInter}",nIdInter) saRQRDV est une chaîne ANSI = [ SELECT RDV_Planning.GUID, RDV_Collaborateur.RVC_DateDeb, RDV_Collaborateur.RVC_DateFin, RDV_Planning.RV_Objet, 12/08/2026 Batik_WS_Com_Mob 136

Partie 4 › Collection de procédures › LIB_Traitements › Code RDV_Planning.RV_Description, RDV_Planning.RV_Groupe, RDV_Collaborateur.RVC_PKID, CONCAT(Collaborateur.CO_Prenom, ' ', Collaborateur.CO_Nom) AS PL_CO_NOM FROM RDV_Planning INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_GUID_RDV = RDV_Planning.GUID LEFT OUTER JOIN Collaborateur ON RDV_Collaborateur.RVC_GUID_Colb = Collaborateur.GUID WHERE RDV_Planning.Archive=0 AND RDV_Collaborateur.Archive = 0 AND RDV_Planning.RV_IdInter = {p_IdInter} ORDER BY RDV_Collaborateur.RVC_DateDeb ] saRQRDV = Remplace(saRQRDV,"{p_IdInter}",nIdInter) sdRReqInter est une Source de Données sdRReqClient est une Source de Données sdRReqDossier est une Source de Données sdRReqCR est une Source de Données sdReqRDV est une Source de Données y est un entier y = TableauCherche(tbRubASaisir,tcLinéaire,"GroupeApp",cRub_Inter) SI y > 0 ET PAS HExécuteRequêteSQL(sdRReqInter,hRequêteDéfaut,saRQ) ALORS // ne pas exécuter la req pour rien FIN y = 0 y = TableauCherche(tbRubASaisir,tcLinéaire,"GroupeApp",cRub_Client) SI y > 0 ET PAS HExécuteRequêteSQL(sdRReqClient,hRequêteDéfaut,sARQAdresseClient) ALORS // ne pas exécuter la req pour rien FIN y = 0 y = TableauCherche(tbRubASaisir,tcLinéaire,"GroupeApp",cRub_Dossier) SI y > 0 ET PAS HExécuteRequêteSQL(sdRReqDossier,hRequêteDéfaut,sARQDossier) ALORS // ne pas exécuter la req pour rien FIN y = 0 y = TableauCherche(tbRubASaisir,tcLinéaire,"GroupeApp",cRub_CR) SI y > 0 ET PAS HExécuteRequêteSQL(sdRReqCR,hRequêteDéfaut,saRqCR) ALORS // ne pas exécuter la req pour rien FIN y = 0 y = TableauCherche(tbRubASaisir,tcLinéaire,"GroupeApp",cRub_RDV) SI y > 0 ET PAS HExécuteRequêteSQL(sdReqRDV,hRequêteDéfaut,saRQRDV) ALORS // ne pas exécuter la req pour rien FIN POUR TOUT stEle DE tbRubASaisir SI stEle:TypeMembre = "Tableau" OU stEle:GroupeApp DANS (cRub_Inter, cRub_Dossier, cRub_Client) ALORS SELON stEle:GroupeApp CAS cRub_Inter QUAND EXCEPTION DANS 12/08/2026 Batik_WS_Com_Mob 137

Partie 4 › Collection de procédures › LIB_Traitements › Code SI "IN_Description" = stEle.MembreMob ALORS stEle:ListeDonnesBD = RTFVersTexte({sdRReqInter+"."+stEle.MembreMob}) SINON stEle:ListeDonnesBD = Remplace({sdRReqInter+"."+stEle.MembreMob},"CHAR(13)", RC,MotComplet) FIN FAIRE stEle:ListeDonnesBD = "" FIN CAS cRub_Dossier QUAND EXCEPTION DANS stEle:ListeDonnesBD = {sdRReqDossier+"."+stEle.MembreMob} FAIRE stEle:ListeDonnesBD = "" FIN CAS cRub_Client tbClientAd est un tableau de ST_ClientAd stUnCliAd est un ST_ClientAd POUR TOUT sdRReqClient stUnCliAd.sAAdresse = sdRReqClient.Adresse TableauAjoute(tbClientAd,stUnCliAd) FIN sJson est une chaîne ANSI Sérialise(tbClientAd,sJson,psdJSON) stEle:ListeDonnesBD = sJson stEle:Type = "Tableau" CAS cRub_CR tbCrest un tableau de ST_CR_Rp stUnCr est un ST_CR_Rp POUR TOUT sdRReqCR stUnCr.saGuidCR = sdRReqCR.GUID stUnCr.saDebut = sdRReqCR.CR_DateHeureDebut stUnCr.saFin = sdRReqCR.CR_DateHeureFin stUnCr.saSignataire = sdRReqCR.cR_NomSignataire stUnCr.saNomCollaborateur = sdRReqCR.CR_NomSignataireTech TableauAjoute(tbCr,stUnCr) FIN sJson est une chaîne ANSI Sérialise(tbCr,sJson,psdJSON) stEle:ListeDonnesBD = sJson TraceINFO("Donnees CR "+sJson) CAS cRub_RDV bDouble est un booléen tbRDV est un tableau de ST_RDV_Rp stUnRDV est un ST_RDV_Rp POUR TOUT sdReqRDV stUnRDV:saGuid = sdReqRDV.GUID stUnRDV:saCollaborateurs = sdReqRDV.PL_CO_NOM stUnRDV:saDateDebut = sdReqRDV.RVC_DateDeb stUnRDV:saDateFin = sdReqRDV.RVC_DateFin stUnRDV:saObjet = sdReqRDV.RV_Objet stUnRDV:saNote = RTFVersTexte(sdReqRDV.RV_Description) bDouble = Faux SI sdReqRDV.RV_Groupe ALORS 12/08/2026 Batik_WS_Com_Mob 138

Partie 4 › Collection de procédures › LIB_Traitements › Code POUR TOUT stRDV DE tbRDV SI stRDV:saGuid = sdReqRDV.GUID ALORS stRDV:saCollaborateurs += RC + stUnRDV:saCollaborateurs bDouble = Vrai SORTIR FIN FIN SI PAS bDouble ALORS TableauAjoute(tbRDV,stUnRDV) FIN SINON TableauAjoute(tbRDV,stUnRDV) FIN FIN sJson est une chaîne ANSI Sérialise(tbRDV,sJson,psdJSON) stEle:ListeDonnesBD = sJson AUTRE CAS FIN FIN FIN Procédure globale CelluleAvecPlusiersRub PROCÉDURE CelluleAvecPlusiersRub(unTerme est un STJSONMembreRubRapport, TexteInitial est une chaîne ANSI, tabListeRubCol est un tableau de entiers) nNbTermeCellule est un entier POUR TOUT stTerme DE unTerme.ListeMembre SI Contient(TexteInitial,stTerme:Rubrique,MotComplet+SansCasse) ALORS nNbTermeCellule += 1 TableauAjoute(tabListeRubCol,stTerme:Ordre) FIN FIN SI nNbTermeCellule > 1 ALORS RENVOYER Vrai SINON RENVOYER Faux FIN Procédure globale ChargeListeRubDoc PROCÉDURE ChargeListeRubDoc() gtbListeRubDoc est un tableau de STJSONMembreRubRapport sReqRub est une chaîne ANSI = [ SELECT * FROM RubriquesDocument ORDER BY RD_IdRubParent ASC ] stUnRub est un STJSONMembreRubRapport dynamique n est un entier ReqRub est une Source de Données SI HExécuteRequêteSQL(ReqRub,gcnxReplica,sReqRub) ALORS POUR TOUT ReqRub stUnRub = allouer un STJSONMembreRubRapport 12/08/2026 Batik_WS_Com_Mob 139

Partie 4 › Collection de procédures › LIB_Traitements › Code stUnRub.nIdRub = ReqRub.RD_PKID stUnRub.Nom = ReqRub.RD_Nom stUnRub.Description = ReqRub.RD_Description stUnRub.Rubrique = ReqRub.RD_Rubrique stUnRub.Ordre = ReqRub.RD_Ordre stUnRub.MembreMob = ReqRub.RD_MembreMob stUnRub.MasqueSaisie = ReqRub.RD_MasqueSaisie stUnRub.EnvoiMob = ReqRub.RD_EnvoiMob stUnRub.Modifiable = ReqRub.RD_Modifiable stUnRub.BD = ReqRub.RD_BD stUnRub.GroupeApp = ReqRub.RD_Groupe stUnRub.TypeMembre = ReqRub.RD_TypeMembre stUnRub.Type = ReqRub.RD_TypeMembre SI ReqRub.RD_IdRubParent > 0 ALORS n = TableauCherche(gtbListeRubDoc,tcLinéairePremier,"nIdRub",ReqRub.RD_IdRubParent) SI n > 0 ALORS TableauAjoute(gtbListeRubDoc[n].ListeMembre,stUnRub) FIN SINON TableauAjoute(gtbListeRubDoc,stUnRub) FIN FIN FIN RENVOYER gtbListeRubDoc Procédure globale ConstructionTbRubBaseRapport PROCÉDURE ConstructionTbRubBaseRapport(TermeRapport est un STJSONRubriqueRapport, tabToutesRub est un tableau de STJSONMembreRubRapport, LeDoc est un Document,bSujetEmail est un booléen = Faux) k est un entier ListeMembreNull est un tableau de STJSONListeMembre MonDoc est un Document = LeDoc POUR i = 1 À TermeRapport.ListeTerme..Occurrence k = 0 stUnTerme est un STJSONMembreRubRapport = TermeRapport.ListeTerme[i] SI stUnTerme.Rubrique <> "" ALORS tabFragments est tableau de docFragment = DocRecherche(MonDoc,stUnTerme.Rubrique,MotComplet+ SansCasse) SI tabFragments.Occurrence > 0 ALORS POUR b = 1 À tabFragments.Occurrence stUnTerme.Ordre = tabFragments[b].PositionFin stUnTerme.Ordre = tabFragments[b].PositionFin SI bSujetEmail ALORS // si c'est dans le sujet un transforme le numéro d'ordre en décimal afin que le sujet soit demande et traite avant le corps de l'email stUnTerme.Ordre ="0."+tabFragments[b].PositionFin FIN k = TableauAjoute(tabToutesRub,stUnTerme) tabToutesRub[k].ListeMembre = ListeMembreNull // toujours car pas tous les termes son requis FIN FIN SI stUnTerme.ListeMembre..Occurrence > 0 ET k <= 0 ALORS POUR c = 1 À stUnTerme.ListeMembre..Occurrence 12/08/2026 Batik_WS_Com_Mob 140

Partie 4 › Collection de procédures › LIB_Traitements › Code tabFragment2 est tableau de docFragment = DocRecherche(MonDoc,stUnTerme.ListeMembre[c] .Rubrique,MotComplet+SansCasse) SI tabFragment2.Occurrence > 0 ALORS POUR l = 1 À tabFragment2.Occurrence stUnTerme2 est un STJSONMembreRubRapport = stUnTerme.Listemembre[c] stUnTerme2.Ordre = tabFragment2[l].PositionFin k = TableauAjoute(tabToutesRub,stUnTerme2) tabToutesRub[k].ListeMembre = ListeMembreNull FIN FIN FIN FIN FIN FIN TableauTrie(tabToutesRub,ttMembre+tccRespecteNumérique,"+Ordre") Procédure globale ConstructionTbRubEnvoyerMob PROCÉDURE ConstructionTbRubEnvoyerMob(tbTermeRapport est un STJSONRubriqueRapport, tbToutesRub est un tableau de STJSONMembreRubRapport, tbRubASaisir est un tableau de STJSONMembreRubRapport, MonDoc est un Document, bToutesRub est un booléen = Faux, tbMotCleSpec est un tableau de STJSONMembreRubRapport = Null) sGroupe est une chaîne ANSI n est un entier = -1 h est un entier POUR TOUT stEle DE tbToutesRub SI (stEle:EnvoiMob OU bToutesRub ) ALORS SI Contient(stEle:Rubrique, "$TAB") OU Contient(stEle:Rubrique, "$UN") OU Contient(stEle. Rubrique,".UNIQUE") ALORS SI sGroupe <> stEle:GroupeApp OU h <= 0 ALORS n = TableauCherche(tbTermeRapport.ListeTerme,tcLinéaire,"GroupeApp;TypeMembre",stEle: GroupeApp,"Tableau") SI n > 0 ALORS stUnTermeGr est un STJSONMembreRubRapport = tbTermeRapport.ListeTerme[n] stUnTermeGr.Ordre = stEle:Ordre TableauSupprimeTout(stUnTermeGr.ListeMembre) TableauAjoute(stUnTermeGr:ListeMembre,stEle) h = TableauAjoute(tbRubASaisir,stUnTermeGr) FIN SINON SI h > 0 ALORS stUnTermeRec est un STJSONMembreRubRapport = tbRubASaisir[h] n = 0 POUR TOUT stElem2 DE tbRubASaisir[h]:ListeMembre SI stElem2.Rubrique = stEle:Rubrique ALORS n += 1 SORTIR FIN FIN //TableauCherche(stUnTermeRec.ListeMembre,tcLinéairePremier,"Rubrique",stEle:Rubri que) SI n <= 0 ALORS 12/08/2026 Batik_WS_Com_Mob 141

Partie 4 › Collection de procédures › LIB_Traitements › Code TableauAjoute(tbRubASaisir[h].ListeMembre,stEle) SINON n = TableauCherche(tbTermeRapport.ListeTerme,tcLinéaire, "GroupeApp;TypeMembre",stEle:GroupeApp,"Tableau") SI n > 0 ALORS stUnTermeGr est un STJSONMembreRubRapport = tbTermeRapport.ListeTerme[n] stUnTermeGr.Ordre = stEle:Ordre TableauSupprimeTout(stUnTermeGr.ListeMembre) TableauAjoute(stUnTermeGr:ListeMembre,stEle) h = TableauAjoute(tbRubASaisir,stUnTermeGr) FIN FIN FIN FIN sGroupe = stEle:GroupeApp SINON SI ChaîneOccurrence(stEle.Rubrique,".LISTE") > 0 ALORS h = 0 n = TableauCherche(tbTermeRapport.ListeTerme,tcLinéaire,"GroupeApp;TypeMembre",stEle :GroupeApp,"Tableau") SI n > 0 ALORS stUnTermeGr est un STJSONMembreRubRapport = tbTermeRapport.ListeTerme[n] POUR TOUT stElem2 DE tbTermeRapport.ListeTerme[n]:ListeMembre SI stElem2.MembreMob <> "" ALORS SI h <= 0 ALORS stUnTermeGr.Ordre = stEle:Ordre TableauSupprimeTout(stUnTermeGr.ListeMembre) stUnTermeGr.ListeMembre.Ajoute(stElem2) h = TableauAjoute(tbRubASaisir,stUnTermeGr) SINON tbRubASaisir[h].ListeMembre.Ajoute(stElem2) FIN FIN FIN FIN SINON TableauAjoute(tbRubASaisir,stEle) FIN h = 0 sGroupe = "" FIN SINON h = 0 sGroupe = "" FIN FIN k est un entier SI tbMotCleSpec<> Null ALORS POUR TOUT stEleCle DE tbMotCleSpec tabFragments est tableau de docFragment = DocRecherche(MonDoc,stEleCle.Rubrique,MotComplet+ SansCasse) SI tabFragments.Occurrence > 0 ALORS POUR b = 1 À tabFragments.Occurrence stEleCle.Ordre = tabFragments[b].PositionFin k = TableauAjoute(tbRubASaisir,stEleCle) TableauSupprimeTout(tbRubASaisir[k].ListeMembre) // toujours car pas tous les termes son requis FIN FIN FIN 12/08/2026 Batik_WS_Com_Mob 142

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN TableauTrie(tbRubASaisir,ttMembre+tccRespecteNumérique,"+Ordre") bufResp est un Buffer Sérialise(tbRubASaisir,bufResp,psdJSON) TraceINFO("TabRubMob "+bufResp+RC) Procédure globale ConstruireListeChampModeleEmail PROCÉDURE ConstruireListeChampModeleEmail(stParam est un STJSONInfoModeleMailMob, bufRes est un Buffer)

nIdModeleMail est un entier sur 8 octets = stParam.nIdModele
nIdInter est un entier sur 8 octets = stParam.nIdInter
CorpEmailDoc est un Document
SujetEmailDoc est un Document
TermeRapportEmail est un STJSONRubriqueRapport
TermeRapport est un STJSONRubriqueRapport
vRub est un Variant
tabToutesRub est un tableau de STJSONMembreRubRapport
tabRubMobile est un tableau de STJSONMembreRubRapport
saSujetEmail est une chaîne ANSI
tbMotCleSpec est un tableau de STJSONMembreRubRapport
TermeRapportEmail.ListeTerme = ChargeListeRubDoc()
saRQModeleMail est une chaîne ANSI = [
-------------- ------------------- --- --- ---
SELECT * FROM MailModele WHERE MM_PKID =
]
saRQModeleMail += nIdModeleMail
sdRqModele est une Source de Données
SI PAS HExécuteRequêteSQL(sdRqModele,gcnxReplica,saRQModeleMail) ALORS
RENVOYER "Modèle introuvable"
SINON
CorpEmailDoc = sdRqModele.MM_MsgDoc
SujetEmailDoc = sdRqModele.MM_Sujet
----------------------------------- --- --- --- ---
SI sdRqModele.MM_Extra <> "" ALORS
Désérialise(tbMotCleSpec,sdRqModele.MM_Extra,psdJSON)
POUR TOUT stUnMot DE tbMotCleSpec
SI stUnMot:TypeMembre <> "" ALORS
stUnMot:Type = stUnMot:TypeMembre //Pour compatibilite dans le mobile
FIN
FIN
FIN
FIN
//saRQRub est une chaîne ANSI = [
--------- ------------------- --- --- ---
// SELECT * FROM ParametreSysteme WHERE PAS_Code = 'RUBRIQUE_RAPPORT_INTERVENTION'
//]
//
//sdRpRub est une source de données
//HExécuteRequêteSQL(sdRpRub,gcnxReplica,saRQRub)
//vRub = JSONVersVariant(sdRpRub.PAS_Valeur)
//
//SI vRub<>Null ALORS
// Désérialise(TermeRapport,sdRpRub.PAS_Valeur,psdJSON)
// TableauTrie(TermeRapport:ListeTerme,ttMembre,"Groupe;Ordre")
//FIN
SI TermeRapport.ListeTerme..Occurrence > 0 ALORS
TableauTrie(TermeRapport:ListeTerme,ttMembre,"Groupe;Ordre")
12/08/2026 Batik_WS_Com_Mob 143
---------- --- ---------------- --- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN //MotCleModeleEmail_Rub_Rapport(TermeRapportEmail,TermeRapport) SI TermeRapportEmail.ListeTerme..Occurrence > 0 ALORS ConstructionTbRubBaseRapport(TermeRapportEmail,tabToutesRub,SujetEmailDoc,Vrai) ConstructionTbRubBaseRapport(TermeRapportEmail,tabToutesRub,CorpEmailDoc) ConstructionTbRubEnvoyerMob(TermeRapportEmail, tabToutesRub ,tabRubMobile,CorpEmailDoc,Vrai, tbMotCleSpec) AjouterDonnesBDDansChampRapport(nIdInter, tabRubMobile) SI PAS EnvoiRubMob(tabRubMobile) ALORS TraiteEmailBuffer(tabToutesRub,tabRubMobile,SujetEmailDoc) TraiteEmailBuffer(tabToutesRub,tabRubMobile,CorpEmailDoc) SupprimerToutesRubRapportMob(tabToutesRub,SujetEmailDoc) SupprimerToutesRubRapportMob(tabToutesRub,CorpEmailDoc) saSujetEmail = DocVersTexte(SujetEmailDoc) stStructureMail est un ST_ModeleMailComplet stStructureMail.saType = cCorpsModeleMail stStructureMail.saSujet = saSujetEmail stStructureMail.tbDestCC = stParam.stCompteMail.SMTP.tabCC_CopieEmail DocHtmlCorps est un htmlDocument = DocVersHTML(CorpEmailDoc) SI stParam.stCompteMail <> Null ET stParam.stCompteMail.SMTP.bufSignature <> "" ALORS DocHtmlCorps..ContenuHTML= DocHtmlCorps..ContenuHTML + ChaîneVersUTF8(stParam.stCompteMail .SMTP.bufSignature) FIN bufCorpsHTML est un Buffer = DocHtmlCorps //manque recherche contact Sérialise(stStructureMail,bufRes,psdJSON) bufRes+=cBufferHorsSer+bufCorpsHTML RENVOYER "" SINON tabRubMobileEnvoyer est un tableau de STJSONMembreRubRapport POUR TOUT stEle DE tabRubMobile SI stEle:EnvoiMob ALORS TableauAjoute(tabRubMobileEnvoyer,stEle) FIN FIN TableauTrie(tabRubMobileEnvoyer,ttMembre,"Groupe;Ordre") stModeleMail est un ST_ModeleMailRub stModeleMail.saType = cRubriquesModeleMail stModeleMail.Listerub = tabRubMobileEnvoyer Sérialise(stModeleMail,bufRes,psdJSON) RENVOYER "" FIN SINON RENVOYER "E" FIN Procédure globale ConstruireModeleMailAvecInfoMob 12/08/2026 Batik_WS_Com_Mob 144

Partie 4 › Collection de procédures › LIB_Traitements › Code PROCÉDURE ConstruireModeleMailAvecInfoMob(stParam est un STJSONInfoModeleMailMob, bufRes est un Buffer)

nIdModeleMail est un entier sur 8 octets = stParam.nIdModele
nIdInter est un entier sur 8 octets = stParam.nIdInter
CorpEmailDoc est un Document
SujetEmailDoc est un Document
TermeRapportEmail est un STJSONRubriqueRapport
TermeRapport est un STJSONRubriqueRapport
tabToutesRub est un tableau de STJSONMembreRubRapport
tabRubMobile est un tableau de STJSONMembreRubRapport
saSujetEmail est une chaîne ANSI
sResRepTemp est une chaîne ANSI
sResRepTemp = ComplèteRep(fRepExe())+"TEMP"
-------------------------------------------- --- --- --- ---
sResRepTemp = ComplèteRep(fRepWeb())+"TEMP"
-------------------------------------------- --- --- --- ---
CheminImg est une chaîne ANSI = ComplèteRep(sResRepTemp+stParam.nIdInter)
SI PAS RechercheListeRubModeleMail(nIdModeleMail,CorpEmailDoc,SujetEmailDoc,TermeRapportEmail,
TermeRapport) ALORS
RENVOYER "Modèle introuvable"
FIN
SI TermeRapportEmail.ListeTerme..Occurrence > 0 ALORS
ConstructionTbRubBaseRapport(TermeRapportEmail,tabToutesRub,SujetEmailDoc,Vrai)
ConstructionTbRubBaseRapport(TermeRapportEmail,tabToutesRub,CorpEmailDoc)
ConstructionTbRubEnvoyerMob(TermeRapportEmail, tabToutesRub ,tabRubMobile,CorpEmailDoc,Vrai)
AjouterDonnesBDDansChampRapport(nIdInter, tabRubMobile)
TraiteDocumentRapportMob(tabRubMobile,stParam.ListeMob,SujetEmailDoc,CheminImg)
TraiteDocumentRapportMob(tabRubMobile,stParam.ListeMob,CorpEmailDoc,CheminImg)
SupprimerToutesRubRapportMob(tabToutesRub,SujetEmailDoc)
SupprimerToutesRubRapportMob(tabToutesRub,CorpEmailDoc)
// TraiteEmailBuffer(tabRubMobile,stParam.ListeMob,SujetEmailDoc)
// TraiteEmailBuffer(tabRubMobile,stParam.ListeMob,CorpEmailDoc)
//
// SupprimerToutesRubRapportMob(tabToutesRub,SujetEmailDoc)
// SupprimerToutesRubRapportMob(tabToutesRub,CorpEmailDoc)
saSujetEmail = UTF8VersUnicode(DocVersTexte(SujetEmailDoc))
------------------------------------------------------------ ------------------ --- --- ---
stStructureMail est un ST_ModeleMailComplet
stStructureMail.saType = cCorpsModeleMail
stStructureMail.saSujet = saSujetEmail
stStructureMail.tbDestCC = stParam.stCompteMail.SMTP.tabCC_CopieEmail
//stStructureMail.bufCorpsHTML = fChargeBuffer(sResRepTemp)
DocHtmlCorps est un htmlDocument = DocVersHTML(CorpEmailDoc)
SI stParam.stCompteMail <> Null ET stParam.stCompteMail.SMTP.bufSignature <> "" ALORS
DocHtmlCorps..ContenuHTML= DocHtmlCorps..ContenuHTML + ChaîneVersUTF8(stParam.stCompteMail.SMTP
.bufSignature)
FIN
bufCorpsHTML est un Buffer = DocHtmlCorps
//manque recherche contact
Sérialise(stStructureMail,bufRes,psdJSON)
bufRes+=cBufferHorsSer+bufCorpsHTML
//TraceINFO("res 1 "+bufRes)
12/08/2026 Batik_WS_Com_Mob 145
---------- --- ---------------- --- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code RENVOYER "" SINON RENVOYER "E" FIN Procédure globale ConstruitListeIntervention PROCÉDURE ConstruitListeIntervention(bAvecRDV est un booléen,stData est une ST_MOB_DATA) tblRDV est un tableau de ST_RDV_INTER sErreur est une chaîne bufRes est un Buffer bAvecNonPlanifie est un booléen SI bAvecRDV ALORS TraceINFO("Ajout des Interventions Planifiées") SI ParamApplication_Lit_Booleen(cParam_Mobile_Inter_Non_Planifiées,Faux) ALORS TraceINFO("Ajout des Interventions non planifiées") bAvecNonPlanifie = Vrai FIN TraceINFO("Liste RDV") sErreur = ListeRDV(stData,tblRDV,bAvecNonPlanifie) TraceINFO(sErreur) SI sErreur<>"" ALORS RENVOYER sErreur FIN SINON TraceINFO("Sans Interventions Planifiées") FIN //SI ParamApplication_Lit_Booleen(cParam_Mobile_Inter_Non_Planifiées,Faux) alors // TraceINFO("Ajout des Interventions non planifiées") // sErreur = RechercheInterventionsNonPlannifiées(tblRDV) // SI sErreur<>"" ALORS // RENVOYER sErreur // FIN //sinon // TraceINFO("Sans Interventions non planifiées") //fin Sérialise(tblRDV,bufRes,psdJSON) bufRes="R" + bufRes RENVOYER bufRes Procédure globale ConstruitListeIntervention_V2 PROCÉDURE ConstruitListeIntervention_V2(bAvecRDV est un booléen,stData est une ST_MOB_DATA) tbLRDV est un tableau de ST_RDV_INTER_V2 sErreur est une chaîne bufRes est un Buffer bAvecNonPlanifie est un booléen SI bAvecRDV ALORS TraceINFO("Ajout des Interventions Planifiées") SI ParamApplication_Lit_Booleen(cParam_Mobile_Inter_Non_Planifiées,Faux) ALORS TraceINFO("Ajout des Interventions non planifiées") bAvecNonPlanifie = Vrai FIN sErreur = ListeRDV_V2(stData,tbLRDV,bAvecNonPlanifie) SI sErreur<>"" ALORS RENVOYER sErreur 12/08/2026 Batik_WS_Com_Mob 146

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN SINON TraceINFO("Sans Interventions Planifiées") FIN //SI ParamApplication_Lit_Booleen(cParam_Mobile_Inter_Non_Planifiées,Faux) alors // TraceINFO("Ajout des Interventions non planifiées") // sErreur = RechercheInterventionsNonPlannifiées(tblRDV) // SI sErreur<>"" ALORS // RENVOYER sErreur // FIN //sinon // TraceINFO("Sans Interventions non planifiées") //fin Sérialise(tbLRDV,bufRes,psdJSON) bufRes="R" + bufRes RENVOYER bufRes Procédure globale ConstruitResultatRechercheInterventions PROCÉDURE ConstruitResultatRechercheInterventions(saRQ est une chaîne ANSI) bufRes est un Buffer QUAND EXCEPTION DANS sd est une Source de Données saLstIdInter est une chaîne ANSI tbaIndice est un tableau associatif (*, *, wlEntier) d'entiers n est un entier ChronoDébut() // TraceRequete(saRQ) SI PAS HExécuteRequêteSQL(sd,gcnxReplica,hRequêteDéfaut,saRQ) ALORS bufRes="E"+ErreurInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) TraceINFO("ConstruitResultatRechercheInterventions :"+ saRQ) RENVOYER bufRes FIN nb est un entier = HNbEnr(sd) TraceINFO("Requête ok, durée : " + ChronoValeur() + "ms, nb="+nb ) tblINT est un tableau de ST_INTER SI nb>0 ALORS POUR TOUT sd saLstIdInter+= [","] + sd.IN_PKID //Construction de la réponse (tableau) xt est un ST_INTER //Sous ensemble Intervention xt.saCli_Nom =sd.CL_Nom xt.nInt_PKID =sd.IN_PKID SI sd.IN_CleType <> "" ET gstParametres.TbaTypeInter[sd.IN_CleType]..Existe = Vrai ALORS 12/08/2026 Batik_WS_Com_Mob 147

Partie 4 › Collection de procédures › LIB_Traitements › Code xt.saInt_Typ = gstParametres.TbaTypeInter[sd.IN_CleType] FIN SI sd.IN_CleEtat <> "" ET gstParametres.TbaEtatInter[sd.IN_CleEtat]..Existe = Vrai ALORS xt.saInt_Etat = gstParametres.TbaEtatInter[sd.IN_CleEtat] FIN xt.saInt_Descrip =RTFVersTexte(sd.IN_Description) xt.saInt_Note =sd.IN_NoteInterne xt.saInt_Tit =sd.IN_Titre xt.saInt_RfI =sd.IN_RefInterne xt.saInt_RfE =sd.IN_RefExterne xt.saLieu_CodeLieu =sd.LI_CodeLieu xt.nInt_IDSociete =sd.IN_IDSociete xt.saDmd_Nom =sd.PE_Nom xt.saDmd_Prenom =sd.PE_Prenom xt.stLieu_Ad.nID =sd.AdLieu_PKID xt.stLieu_Ad.saEtiq =sd.AdLieu_Etiquette xt.stLieu_Ad.saLig =sd.AD_Adresse xt.stLieu_Ad.saCP =sd.AdLieu_CodePostal xt.stLieu_Ad.saVil =sd.AdLieu_Ville n=TableauAjoute(tblINT,xt) tbaIndice[sd.IN_PKID]=n //Tableau d'indice permettant de retrouver l'intervention dans tblINTER par son PKID FIN TraceINFO("Tableau Inter, durée : " + ChronoValeur() + "ms" ) sdPers est une Source de Données saRQ=[ SELECT Intervention_Personne.IP_Etage AS IP_Etage, Intervention_Personne.IP_Lot AS IP_Lot, Intervention_Personne.IP_IDPersonne AS IP_IDPersonne, Personne.PE_IDCivilite AS PE_IDCivilite, Personne.PE_Nom AS PE_Nom, Personne.PE_Prenom AS PE_Prenom, Personne.PE_TelFixe AS PE_TelFixe, Personne.PE_TelMobile AS PE_TelMobile, Personne.PE_Email AS PE_Email, Personne.PE_CleRole AS PE_CleRole, Personne.PE_Note AS PE_Note, Intervention_Personne.IP_IDIntervention AS IP_IDIntervention, Intervention_Personne.IP_IDLieu AS IP_IDLieu, Intervention_Personne.IP_IDClient AS IP_IDClient, Lieu_Personne.LIP_Etage AS LIP_Etage, Lieu_Personne.LIP_Lot AS LIP_Lot, Lieu_Personne.LIP_EtiquetteAdresse AS LIP_EtiquetteAdresse FROM Intervention_Personne INNER JOIN Personne ON (Personne.PE_PKID = Intervention_Personne.IP_IDPersonne) LEFT OUTER JOIN Lieu_Personne ON (Lieu_Personne.LIP_IDLieu=Intervention_Personne.IP_IDLieu AND Lieu_Personne.LIP_IDPersonne=Intervention_Personne.IP_IDPersonne) WHERE Intervention_Personne.IP_IDIntervention IN ({Liste_IDIntervention}) ORDER BY IP_IDIntervention ASC ] TraceINFO("Liste ID Inter : " +saLstIdInter) saRQ=Remplace(saRQ,"{Liste_IDIntervention}",saLstIdInter) SI PAS HExécuteRequêteSQL(sdPers,gcnxReplica,hRequêteDéfaut,saRQ) ALORS bufRes="E"+ErreurInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) 12/08/2026 Batik_WS_Com_Mob 148

Partie 4 › Collection de procédures › LIB_Traitements › Code RENVOYER bufRes FIN TraceINFO("Requete Personnes Intrv, durée : " + ChronoValeur() + "ms" ) stPer est un ST_PERSONNE_LIEU POUR TOUT sdPers stPer.nID = sdPers.IP_IDPersonne stPer.saNom = sdPers.PE_Nom stPer.saPren = sdPers.PE_Prenom stPer.saTFix = sdPers.PE_TelFixe stPer.saTMob = sdPers.PE_TelMobile SI sdPers.PE_CleRole <> "" ET gstParametres.TbaRoleContact[sdPers.PE_CleRole]..Existe = Vrai ALORS stPer.saRole = gstParametres.TbaRoleContact[sdPers.PE_CleRole] FIN stPer.saEtage = sdPers.IP_Etage<>"" ? sdPers.IP_Etage SINON sdPers.LIP_Etage stPer.saLot = sdPers.IP_Lot<>"" ? sdPers.IP_Lot SINON sdPers.LIP_Lot stPer.saEtiquette = sdPers.LIP_EtiquetteAdresse stPer.saNote = sdPers.PE_Note stPer.bDonneurOrdre = sdPers.IP_IDClient<>0 ET sdPers.IP_IDlieu=0 n=tbaIndice[sdPers.IP_IDIntervention] tblINT[n].tblPerLieu.Ajoute(stPer) FIN tblINT[n].tblPerLieu.Trie(ttMembre,"saRole") //Ajout du tableau des Notes Internes sdNote est une Source de Données saRQ = [ SELECT MI_Message,MessageInterne.CreationDate,UT_Nom , UT_Prenom ,MI_IDTypeMessage,MI_IDIntervention,MessageInterne.GUID as MI_GUID ,MessageInterne.CreationUser FROM MessageInterne INNER JOIN Utilisateur ON MessageInterne.CreationUser=Utilisateur.UT_PKID WHERE MI_IDIntervention IN ({Liste_IDIntervention}) AND MessageInterne.MI_IDTypeMessage < 10 ORDER BY MessageInterne.CreationDate DESC ] saRQ=Remplace(saRQ,"{Liste_IDIntervention}",saLstIdInter) SI PAS HExécuteRequêteSQL(sdNote,gcnxReplica,hRequêteDéfaut,saRQ) ALORS TraceERREUR("Erreur lecture des Notes Internes " + HErreurInfo(hErrComplet)) SINON stN est un ST_NOTE POUR TOUT sdNote stN.nIdInter =sdNote.MI_IDIntervention stN.saNote =sdNote.MI_Message stN.saAuteur =sdNote.UT_Prenom + [" "] + sdNote.UT_Nom stN.saDate =sdNote.CreationDate stN.saGuid =sdNote.MI_GUID //stN.nIdAuteur =sdNote.CreationUser stN.nIdUsr =sdNote.CreationUser //stN.saType =sdNote.MI_IDTypeMessage //toujours à 0 n=tbaIndice[sdNote.MI_IDIntervention] tblINT[n].tblNote.Ajoute(stN) FIN FIN FIN 12/08/2026 Batik_WS_Com_Mob 149

Partie 4 › Collection de procédures › LIB_Traitements › Code Sérialise(tblINT,bufRes,psdJSON) HAnnuleDéclaration(sd) TraceINFO("Fin traitement ok, durée : " + ChronoFin() + "ms" + RC + tblINT..Occurrence + " Interventions renvoyées." ) bufRes ="R" + bufRes TraceINFO("bufREs : " + bufRes) RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) RENVOYER bufRes FIN Procédure globale ConstruitTableauInterventions PROCÉDURE ConstruitTableauInterventions(saRQ est une chaîne ANSI,saRqCR est une chaîne ANSI ,bAvecRDV est un booléen,tblRDV est un tableau de ST_RDV_INTER) QUAND EXCEPTION DANS nNbInter est un entier sRes est une chaîne ANSI saLstIdInter est une chaîne ANSI saLstIdRDV est une chaîne ANSI tbaIdInter est un tableau associatif (*, , wlEntier_8) d'entiers tbaIdRDV est un tableau associatif (, *, wlEntier_8) d'entiers n est un entier tbaCompteRendu est un tableau associatif de STCompteRenduRqListe saCle est une chaîne ANSI sdSDCR est une Source de Données SI saRqCR <> "" ALORS TraceRequete(saRqCR) SI PAS HExécuteRequêteSQL(sdSDCR,gcnxReplica,hRequêteDéfaut,saRqCR) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventionsAvecCopmteRendu : " + sRes) RENVOYER sRes FIN FIN POUR TOUT sdSDCR stCpR est une STCompteRenduRqListe stCpR.saCR_GUID = sdSDCR.CR_GUID stCpR.saDateHeureDebut = sdSDCR.CR_DateHeureDebut stCpR.saDateHeureFin = sdSDCR.CR_DateHeureFin stCpR.saNoteCollaborateur = sdSDCR.CR_NoteCollaborateur stCpR.saNoteSignataire = sdSDCR.CR_NoteSignataire stCpR.saDateHeureSignature = sdSDCR.CR_DateHeureSignature stCpR.nIN_PKID = sdSDCR.CR_IDIntervention stCpR.saNomSignataire = sdSDCR.CR_NomSignataire stCpR.saPL_GUID = sdSDCR.CR_IDRdv stCpR.nPL_IDCollaborateur = sdSDCR.PL_IDCollaborateur stCpR.nPL_IDCollaborateur = sdSDCR.CR_CreationUser stCpR.bufCR_Signature = "coucou" stCpR.nRDV_PKID = sdSDCR.CR_IDRdv stCpR.nIdGroupe = sdSDCR.PL_IDGroupe SI stCpR.nRDV_PKID > 0 ET stCpR.saDateHeureDebut <> "" ET stCpR.saDateHeureFin <> "" ALORS 12/08/2026 Batik_WS_Com_Mob 150

Partie 4 › Collection de procédures › LIB_Traitements › Code SI stCpR.nIdGroupe > 0 ALORS tbaCompteRendu[stCpR.nIdGroupe] = stCpR SINON tbaCompteRendu[stCpR.nRDV_PKID] = stCpR FIN FIN FIN sd est une Source de Données TraceRequete(saRQ) SI PAS HExécuteRequêteSQL(sd,gcnxReplica,hRequêteDéfaut,saRQ) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER sRes FIN POUR TOUT sd xt est un ST_RDV_INTER saLstIdInter+= [","] + sd.IN_PKID SI bAvecRDV ALORS saLstIdRDV += [","] + sd.PL_PKID

xt.stRDV.nPKID = sd.PL_PKID
xt.stRDV.saGUID = sd.PL_GUID
xt.stRDV.nIDCollaborateur = sd.PL_IDCollaborateur
xt.stRDV.nIDIntervention = sd.PL_IDIntervention
xt.stRDV.nIDTypeActivite = sd.PL_IDTypeActivite
xt.stRDV.saObjet = sd.PL_Objet
xt.stRDV.saDescription = sd.PL_Description//RTFVersTexte(sd.PL_Description )
xt.stRDV.saDateDebut = sd.PL_DateDebut
--- ---------------------- ----------------------------------------- --- ---
xt.stRDV.saDateFin = sd.PL_DateFin
xt.stRDV.nIDStatut = sd.PL_IDStatut
xt.stRDV.saStatut = sd.saStatutRDV
xt.stRDV.nIDLieu = sd.PL_IDLieu
xt.stRDV.bGrouper = sd.PL_Grouper
xt.stRDV.nIDGroupe = sd.PL_IDGroupe
xt.stRDV.nIDDossier = sd.PL_IDDossier
xt.stRDV.bPrive = sd.PL_Prive
xt.stRDV.bSuperposable = sd.PL_Superposable
xt.stRDV.nIDEquipe = sd.PL_IDEquipe
xt.stRDV.nIDSociete = sd.PL_IDSociete
xt.saRDV_TypAct = DonneLibParametre(sd.PL_IDTypeActivite)
xt.saRDV_Statut = DonneLibParametre(sd.PL_IDStatut)
xt.saRDV_Lieu = sd.LI_CodeLieu
SI sd.PL_IDGroupe > 0 ALORS
saCle = sd.PL_IDGroupe
SINON
saCle = sd.PL_PKID
FIN
SI tbaCompteRendu[saCle]..Existe ALORS
12/08/2026 Batik_WS_Com_Mob 151
---------- --- ---------------- --- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code xt.stRDV.stCompteRendu.saGuidCR = tbaCompteRendu[saCle].saCR_GUID xt.stRDV.stCompteRendu.saDebut = tbaCompteRendu[saCle].saDateHeureDebut xt.stRDV.stCompteRendu.saFin = tbaCompteRendu[saCle].saDateHeureFin xt.stRDV.stCompteRendu.saNoteCollab = tbaCompteRendu[saCle].saNoteCollaborateur xt.stRDV.stCompteRendu.saNoteClient = tbaCompteRendu[saCle].saNoteSignataire xt.stRDV.stCompteRendu.saDateSignature = tbaCompteRendu[saCle].saDateHeureSignature xt.stRDV.stCompteRendu.nIdInter = tbaCompteRendu[saCle].nIN_PKID xt.stRDV.stCompteRendu.saSignataire = tbaCompteRendu[saCle].saNomSignataire xt.stRDV.stCompteRendu.saGuidRDV = sd.PL_GUID xt.stRDV.stCompteRendu.nIdCollab = tbaCompteRendu[saCle].nPL_IDCollaborateur xt.stRDV.stCompteRendu.nIdUser = tbaCompteRendu[saCle].nCR_CreationUser xt.stRDV.stCompteRendu.bufImgSignature = "coucou" SINON xt.stRDV.stCompteRendu.saGuidCR = "" xt.stRDV.stCompteRendu.saDebut = "" xt.stRDV.stCompteRendu.saFin = "" xt.stRDV.stCompteRendu.saNoteCollab = "" xt.stRDV.stCompteRendu.saNoteClient = "" xt.stRDV.stCompteRendu.saDateSignature = "" xt.stRDV.stCompteRendu.nIdInter = sd.IN_PKID xt.stRDV.stCompteRendu.saSignataire = "" xt.stRDV.stCompteRendu.saGuidRDV = sd.PL_GUID xt.stRDV.stCompteRendu.nIdCollab = sd.PL_IDCollaborateur xt.stRDV.stCompteRendu.nIdUser = "" xt.stRDV.stCompteRendu.bufImgSignature = "" FIN FIN //Sous ensemble Intervention xt.stINTER.nDos_IDCli = sd.DO_IDClient xt.stINTER.saDos_Type = DonneLibParametre(sd.DO_IDTypeDossier) xt.stINTER.saDos_Tit = sd.DO_Titre xt.stINTER.saDos_Etat = DonneLibParametre(sd.DO_IDStatut) xt.stINTER.saDos_RfI = sd.DO_RefInterne xt.stINTER.saDos_RfE = sd.DO_RefExterne xt.stINTER.saCli_Nom = sd.CL_Nom xt.stINTER.saCli_Tel = sd.CL_Tel xt.stINTER.saCli_Fax = sd.CL_Fax xt.stINTER.stCli_Ad.nID = sd.AdClient_PKID xt.stINTER.stCli_Ad.saEtiq = sd.AdClient_Etiquette xt.stINTER.stCli_Ad.saLig = sd.AdClient_Ligne_1 + [RC] +sd.AdClient_Ligne_2 + [RC] +sd.AdClient_Ligne_3 + [RC] +sd.AdClient_Ligne_4+ [RC] +sd.AdClient_Ligne_5 xt.stINTER.stCli_Ad.saCP = sd.AdClient_CodePostal xt.stINTER.stCli_Ad.saVil = sd.AdClient_Ville xt.stINTER.nInt_PKID = sd.IN_PKID xt.stINTER.saInt_Typ = DonneLibParametre(sd.IN_IDTypeIntervention) xt.stINTER.saInt_Etat = DonneLibParametre(sd.IN_IDEtatIntervention) xt.stINTER.nInt_IDSuiv = sd.IN_IDSuiviPar xt.stINTER.saNomSuiviPar = sd.NomSuiviPar xt.stINTER.saPrenomSuiviPar = sd.PrenomSuiviPar xt.stINTER.saTelSuiviPar = sd.TelMobSuiviPar xt.stINTER.nInt_IDDos = sd.IN_IDDossier xt.stINTER.nInt_IDCli = sd.IN_IDClient xt.stINTER.nInt_IDLieu = sd.IN_IDLieu xt.stINTER.nInt_IDSociete = sd.IN_IDSociete xt.stINTER.saSoc_Nom = sd.SO_Nom xt.stINTER.saInt_Descrip = RTFVersTexte(sd.IN_Description) xt.stINTER.bInt_AtTVA = sd.IN_AttestationTVAPresente xt.stINTER.saInt_Note = sd.IN_NoteInterne 12/08/2026 Batik_WS_Com_Mob 152

Partie 4 › Collection de procédures › LIB_Traitements › Code xt.stINTER.saInt_Tit = sd.IN_Titre xt.stINTER.saInt_RfI = sd.IN_RefInterne xt.stINTER.saInt_RfE = sd.IN_RefExterne xt.stINTER.saInt_NumDevis = sd.IN_NumDevis xt.stINTER.saInt_DateDevis = DateVersChaîne(sd.IN_DateDevis,"JJ/MM/AA") xt.stINTER.nLieu_PKID = sd.LI_PKID xt.stINTER.saLieu_CodeLieu = sd.LI_CodeLieu xt.stINTER.nLieu_IDAdresse = sd.LI_IDAdresse xt.stINTER.saLieu_Type = DonneLibParametre(sd.LI_IDType) xt.stINTER.saLieu_CodeAcces = sd.LI_CodeAcces xt.stINTER.bLieu_Badge = sd.LI_Badge xt.stINTER.bLieu_Interphone = sd.LI_Interphone xt.stINTER.saLieu_Note = sd.LI_Note xt.stINTER.stLieu_Ad.nID = sd.AdLieu_PKID xt.stINTER.stLieu_Ad.saEtiq = sd.AdLieu_Etiquette xt.stINTER.stLieu_Ad.saLig = sd.AdLieu_Ligne_1 + [RC] + sd.AdLieu_Ligne_2 + [ RC] + sd.AdLieu_Ligne_3 + [RC] + sd.AdLieu_Ligne_4 + [RC] + sd.AdLieu_Ligne_5 xt.stINTER.stLieu_Ad.saCP = sd.AdLieu_CodePostal xt.stINTER.stLieu_Ad.saVil = sd.AdLieu_Ville nNbInter = TableauAjoute(tblRDV,xt) SI bAvecRDV ALORS tbaIdRDV[sd.PL_PKID]=nNbInter FIN tbaIdInter[sd.IN_PKID]=nNbInter //Tableau d'indice permettant de retrouver l'intervention dans tblINTER par son PKID FIN SI nNbInter>0 ET bAvecRDV ALORS //Construction de la liste des Contacts RDV saRQ2 est une chaîne ANSI=[ SELECT Planning_RDV_Personne.PRP_PKID AS PRP_PKID, Planning_RDV_Personne.PRP_IDRdv AS PRP_IDRdv, Personne.PE_IDCivilite AS PE_IDCivilite, Personne.PE_Nom AS PE_Nom, Personne.PE_Prenom AS PE_Prenom, Personne.PE_Email AS PE_Email, Personne.PE_TelFixe AS PE_TelFixe, Personne.PE_TelMobile AS PE_TelMobile, Personne.PE_IDRole, Personne.PE_Note AS PE_Note, Intervention_Personne.IP_IDPersonne AS IP_IDPersonne, Intervention_Personne.IP_IDIntervention AS IP_IDIntervention, Intervention_Personne.IP_IDLieu AS IP_IDLieu, Intervention_Personne.IP_IDClient AS IP_IDClient, Intervention_Personne.IP_Etage AS IP_Etage, Intervention_Personne.IP_Lot AS IP_Lot, Lieu_Personne.LIP_Etage AS LIP_Etage, Lieu_Personne.LIP_Lot AS LIP_Lot, Lieu_Personne.LIP_EtiquetteAdresse AS LIP_EtiquetteAdresse FROM Planning_RDV_Personne INNER JOIN Personne ON (Personne.PE_PKID = Planning_RDV_Personne.PRP_IDPersonne) INNER JOIN Planning_RDV ON (Planning_RDV.PL_PKID=Planning_RDV_Personne.PRP_IDRdv) INNER JOIN Intervention_Personne ON (Intervention_Personne.IP_IDPersonne=Personne.PE_PKID AND Intervention_Personne.IP_IDIntervention=Planning_RDV.PL_IDIntervention) INNER JOIN Lieu_Personne ON (Lieu_Personne.LIP_IDPersonne=Intervention_Personne.IP_IDPersonne AND Lieu_Personne.LIP_IDLieu=Intervention_Personne.IP_IDLieu) 12/08/2026 Batik_WS_Com_Mob 153

Partie 4 › Collection de procédures › LIB_Traitements › Code WHERE Planning_RDV_Personne.PRP_IDRdv IN ({pListeIdRdv}) ] saRQ2=Remplace(saRQ2,"{pListeIdRdv}",saLstIdRDV) TraceRequete(saRQ2) sdCnt est une Source de Données SI PAS HExécuteRequêteSQL(sdCnt,gcnxReplica,hRequêteDéfaut,saRQ2) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER sRes FIN POUR TOUT sdCnt stContact est un ST_RDV_CONTACT

stContact.nIdRdvCnt = sdCnt.PRP_PKID
//stContact.nId =sdCnt.IP_IDPersonne
stContact.saCivilite = DonneLibParametre(sdCnt.PE_IDCivilite)
stContact.saNom = sdCnt.PE_Nom
stContact.saPrenom = sdCnt.PE_Prenom
stContact.saEmail = sdCnt.PE_Email
stContact.saRole = DonneLibParametre(sdCnt.PE_IDRole)
stContact.saEtage = sdCnt.IP_Etage<>"" ? sdCnt.IP_Etage SINON sdCnt.LIP_Etage
stContact.saLot = sdCnt.IP_Lot<>"" ? sdCnt.IP_Lot SINON sdCnt.LIP_Lot
stContact.saEtiquette= sdCnt.LIP_EtiquetteAdresse
stContact.saNote = sdCnt.PE_Note
--- -------------------------------- --- --- ---
stContact.bDonneurOrdre = sdCnt.IP_IDClient<>0 ET sdCnt.IP_IDlieu=0
//Ajout des téléphones dans un tableau (structure prête pour le multitéléphone)
stTel est un ST_TELEPHONE
SI sdCnt.PE_TelFixe<>"" ALORS
stTel.saTelNum = sdCnt.PE_TelFixe
--- -------------- ------------------- --- ---
stTel.saTelLib = "Tél 1"
stContact.tbLTEL.Ajoute(stTel)
FIN
SI sdCnt.PE_TelMobile<>"" ALORS
stTel.saTelNum = sdCnt.PE_TelMobile
--- -------------- --------------------- --- ---
stTel.saTelLib = "Tél 2"
stContact.tbLTEL.Ajoute(stTel)
FIN
n=tbaIdRDV[sdCnt.PRP_IDRdv]
tblRDV[n].stRDV.tblContact.Ajoute(stContact)
FIN
//Construction de la liste des Contacts Intervention/Lieu
FIN
SI nNbInter>0 ALORS
sdPers est une Source de Données
saRQ3 est une chaîne ANSI = [
----- ------------------- --- --- ---
SELECT
Intervention_Personne.IP_Etage AS IP_Etage,
Intervention_Personne.IP_Lot AS IP_Lot,
Intervention_Personne.IP_IDPersonne AS IP_IDPersonne,
Intervention_Personne.IP_EstDemandeur AS IP_EstDemandeur,
Personne.PE_IDCivilite AS PE_IDCivilite,
Personne.PE_Nom AS PE_Nom,
Personne.PE_Prenom AS PE_Prenom,
Personne.PE_TelFixe AS PE_TelFixe,
Personne.PE_TelMobile AS PE_TelMobile,
Personne.PE_IDRole AS PE_IDRole,
Personne.PE_Note AS PE_Note,
Intervention_Personne.IP_IDIntervention AS IP_IDIntervention,
Intervention_Personne.IP_IDLieu AS IP_IDLieu,
Intervention_Personne.IP_IDClient AS IP_IDClient,
Lieu_Personne.LIP_Etage AS LIP_Etage,
12/08/2026 Batik_WS_Com_Mob 154
---------- --- ---------------- --- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code Lieu_Personne.LIP_Lot AS LIP_Lot, Lieu_Personne.LIP_EtiquetteAdresse AS LIP_EtiquetteAdresse FROM Intervention_Personne INNER JOIN Personne ON (Personne.PE_PKID = Intervention_Personne.IP_IDPersonne) LEFT OUTER JOIN Lieu_Personne ON (Lieu_Personne.LIP_IDLieu=Intervention_Personne.IP_IDLieu AND Lieu_Personne.LIP_IDPersonne=Intervention_Personne.IP_IDPersonne) WHERE Intervention_Personne.IP_IDIntervention IN ({Liste_IDIntervention}) ORDER BY IP_IDIntervention ASC ] saRQ3=Remplace(saRQ3,"{Liste_IDIntervention}",saLstIdInter) TraceRequete(saRQ3) SI PAS HExécuteRequêteSQL(sdPers,gcnxReplica,hRequêteDéfaut,saRQ3) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER sRes FIN stPer est un ST_PERSONNE_LIEU POUR TOUT sdPers stPer.nID = sdPers.IP_IDPersonne stPer.saNom = sdPers.PE_Nom stPer.saPren = sdPers.PE_Prenom stPer.saTFix = sdPers.PE_TelFixe stPer.saTMob = sdPers.PE_TelMobile stPer.saRole = DonneLibParametre(sdPers.PE_IDRole) stPer.saEtage = sdPers.IP_Etage<>"" ? sdPers.IP_Etage SINON sdPers.LIP_Etage //sdPers.IP_Etage stPer.saLot = sdPers.IP_Lot<>"" ? sdPers.IP_Lot SINON sdPers.LIP_Lot //sdPers.IP_Lot stPer.saEtiquette = sdPers.LIP_EtiquetteAdresse stPer.saNote = sdPers.PE_Note stPer.bDemand = sdPers.IP_EstDemandeur stPer.bDonneurOrdre = sdPers.IP_IDClient<>0 ET sdPers.IP_IDlieu=0 n = tbaIdInter[sdPers.IP_IDIntervention] tblRDV[n].stINTER.tblPerLieu.Ajoute(stPer) FIN //Ordonne le tableau pour avoir les demandeurs en premier SI n>0 ALORS TableauTrie(tblRDV[n].stINTER.tblPerLieu,ttMembre,"-bDemand;saRole;saNom") FIN //Ajout du tableau des Notes Internes sdNote est une Source de Données saRQ4 est une chaîne ANSI = [ SELECT MI_Message,MessageInterne.CreationDate,UT_Nom , UT_Prenom ,MI_IDTypeMessage,MI_IDIntervention,MessageInterne.GUID as MI_GUID ,MessageInterne.CreationUser FROM MessageInterne INNER JOIN Utilisateur ON MessageInterne.CreationUser=Utilisateur.UT_PKID WHERE MI_IDIntervention IN ({Liste_IDIntervention}) AND MessageInterne.MI_IDTypeMessage < 10 ORDER BY MessageInterne.CreationDate DESC ] 12/08/2026 Batik_WS_Com_Mob 155

Partie 4 › Collection de procédures › LIB_Traitements › Code saRQ4=Remplace(saRQ4,"{Liste_IDIntervention}",saLstIdInter) TraceRequete(saRQ4) SI PAS HExécuteRequêteSQL(sdNote,gcnxReplica,hRequêteDéfaut,saRQ4) ALORS TraceERREUR("Erreur lecture des Notes Internes " + HErreurInfo(hErrComplet)) SINON stN est un ST_NOTE POUR TOUT sdNote stN.nIdInter = sdNote.MI_IDIntervention stN.saNote = sdNote.MI_Message stN.saAuteur = sdNote.UT_Prenom + [" "] + sdNote.UT_Nom stN.saDate = sdNote.CreationDate stN.saGuid = sdNote.MI_GUID //stN.nIdAuteur =sdNote.CreationUser stN.nIdUsr = sdNote.CreationUser //stN.saType =sdNote.MI_IDTypeMessage //toujours à 0 n = tbaIdInter[stN.nIdInter] tblRDV[n].stINTER.tblNote.Ajoute(stN) FIN FIN // //Tableau des Temps passés // sdTps est une source de données // saRQ=[ // SELECT SDT_PKID,SDT_IDIntervention,SDT_IDCollaborateur,SDT_DateDebut,SDT_DateHeureFin,SDT_Ponderation, SDT_NbMinutes,SDT_IDTypeTemps,SDT_Libelle,SDT_IDPartenaire // FROM SUIVIDESTEMPS // WHERE SDT_IDIntervention IN ({Liste_IDIntervention}) // ] // saRQ=Remplace(saRQ,"{Liste_IDIntervention}",saLstIdInter) // SI PAS HExécuteRequêteSQL(sdTps,gcnxReplica,hRequêteDéfaut,saRQ) ALORS // TraceINFO("Erreur lecture des Temps " + HErreurInfo(hErrComplet)) // SINON // stTps est un ST_TEMPS // POUR TOUT sdTps // stTps:nIdInter = sdTps.SDT_IDIntervention // stTps:nIdTps = sdTps.SDT_PKID // stTps:nIdCollab = sdTps.SDT_IDCollaborateur // stTps:saNumInter = sdTps.sdt // stTps:saHeureDebut = sdTps.SDT_DateDebut // stTps:saHeureFin = sdTps.SDT_DateHeureFin // stTps:nPond100 = sdTps.SDT_Ponderation*100 // stTps:nNbMinutes = sdTps.SDT_NbMinutes // stTps:nIdTypeTps = sdTps.SDT_IDTypeTemps // stTps:saLibelle = sdTps.SDT_Libelle // // n=tbaIndice[stTps.nIdInter] // tblRDV[n].stINTER.tblNote.Ajoute(stTps) // FIN // FIN FIN TraceINFO("Nb d'interventions : " + nNbInter) bufRes_2 est un Buffer Sérialise(tblRDV,bufRes_2,psdJSON) TraceINFO("tblRDV =" + bufRes_2) RENVOYER "" //Pas d'erreur 12/08/2026 Batik_WS_Com_Mob 156

Partie 4 › Collection de procédures › LIB_Traitements › Code FAIRE sRes=ExceptionInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER "E"+sRes FIN Procédure globale ConstruitTableauInterventions_V2 PROCÉDURE ConstruitTableauInterventions_V2(saRQ est une chaîne ANSI,saRqCR est une chaîne ANSI , bAvecRDV est un booléen,bAvecCR est un booléen,tbLRDV est un tableau de ST_RDV_INTER_V2) QUAND EXCEPTION DANS nNbInter est un entier sRes est une chaîne ANSI saLstIdInter est une chaîne ANSI saLstIdRDV est une chaîne ANSI n est un entier tbaCompteRendu est un tableau associatif de STCompteRenduRqListe_V2 saCle est une chaîne ANSI sdSDCR est une Source de Données SI saRqCR <> "" ALORS TraceRequete(saRqCR) SI PAS HExécuteRequêteSQL(sdSDCR,gcnxReplica,hRequêteDéfaut,saRqCR) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventionsAvecCopmteRendu : " + sRes) RENVOYER sRes FIN POUR TOUT sdSDCR stCpR est une STCompteRenduRqListe_V2 stCpR.saCR_GUID = sdSDCR.CR_GUID stCpR.saDateHeureDebut = sdSDCR.CR_DateHeureDebut stCpR.saDateHeureFin = sdSDCR.CR_DateHeureFin stCpR.saNoteCollaborateur = sdSDCR.CR_NoteCollaborateur stCpR.saNoteSignataire = sdSDCR.CR_NoteSignataire stCpR.saDateHeureSignature = sdSDCR.CR_DateHeureSignature stCpR.nIN_PKID = sdSDCR.CR_IDIntervention stCpR.saNomSignataire = sdSDCR.CR_NomSignataire stCpR.saPL_GUID = sdSDCR.CR_GUID_Rdv stCpR.nPL_IDCollaborateur = sdSDCR.CR_IDCollaborateur stCpR.nCR_CreationUser = sdSDCR.CR_CreationUser SI sdSDCR.CR_Signature <> "" ALORS stCpR.bCR_Signature = Vrai SINON stCpR.bCR_Signature = Faux FIN SI sdSDCR.CR_SignatureTech <> "" ALORS stCpR.bCR_SignatureTech = Vrai SINON stCpR.bCR_SignatureTech = Faux FIN stCpR.nRDV_PKID = sdSDCR.CR_IDRdv //stCpR.nIdGroupe = sdSDCR.PL_IDGroupe stCpR.nIDTypeSignataire = DonneIdParametre(sdSDCR.CR_CleTypeSignataire) stCpR.saReserveCommentaire = sdSDCR.CR_ReserveCommentaire SI sdSDCR.CR_NomSignataireTech <> "" ALORS 12/08/2026 Batik_WS_Com_Mob 157

Partie 4 › Collection de procédures › LIB_Traitements › Code

stCpR.saNomCollaborateur = sdSDCR.CR_NomSignataireTech
SINON
stCpR.saNomCollaborateur = sdSDCR.CO_Nom +" "+sdSDCR.CO_Prenom
--- ------------------------ ------------------------------------- --- ---
FIN
tbaCompteRendu[stCpR.saPL_GUID] = stCpR
FIN
FIN
sd est une Source de Données
TraceRequete(saRQ)
SI PAS HExécuteRequêteSQL(sd,gcnxReplica,hRequêteDéfaut,saRQ) ALORS
sRes="E"+HErreurInfo(errComplet)
sRes += saRQ
TraceERREUR("ConstruitTableauInterventions : " + sRes)
RENVOYER sRes
FIN
POUR TOUT sd
xt est un ST_RDV_INTER_V2
saLstIdInter+= [","] + sd.IN_PKID
SI bAvecRDV ALORS
saLstIdRDV += [","] +"'"+sd.RVC_GUID_RDV+"'"
xt.stRDV.nPKID = sd.RVC_PKID
--- ------------------------ --------------------------------- ---- ---
xt.stRDV.saGUID = sd.GUID_RDV_COLB
xt.stRDV.saGUID_RDV = sd.RVC_GUID_RDV
xt.stRDV.nIDIntervention = sd.RV_IdInter
xt.stRDV.nIDTypeActivite = DonneIdParametre(sd.RV_CleType)
xt.stRDV.saObjet = sd.RV_Objet
xt.stRDV.saDescription = sd.RV_Description//RTFVersTexte(sd.PL_Description )
xt.stRDV.saDateDebut = sd.RVC_DateDeb
--- -------------------- ------------------------------------ ---- ---
xt.stRDV.saDateFin = sd.RVC_DateFin
xt.stRDV.nIDStatut = DonneIdParametre(sd.RVC_CleStatut)
xt.stRDV.nIDLieu = sd.RV_IdLieu
xt.stRDV.bGrouper = sd.RV_Groupe
SI sd.RV_Groupe ALORS
xt.stRDV.nIDGroupe = sd.RV_PKID
--- ------------------ ------------ --- ---
SINON
xt.stRDV.nIDGroupe = 0
--- ------------------ --- --- ---
FIN
xt.stRDV.nIDDossier = sd.RV_IdDossier
--- ----------------------- ------------------------------------- --- ---
xt.stRDV.bPrive = Faux
xt.stRDV.bCR = sd.RVC_CR
xt.stRDV.bSAV = sd.RV_SAV
xt.stRDV.bSuperposable = sd.RVC_Superposable
xt.stRDV.nIDEquipe = 0
xt.stRDV.nIDSociete = sd.RV_IdSociete
xt.stRDV.saStatut = DonneLibParametre(sd.RVC_CleStatut)
xt.saRDV_TypAct = DonneLibParametre(sd.RV_CleType)
xt.saRDV_Statut = DonneLibParametre(sd.RV_CleStatut)
xt.saRDV_Lieu = sd.LI_CodeLieu
//xt.stRDV.saNoteCollab = sd.PL_NoteCollab
xt.stRDV.nIDCollaborateur = Val(DonneGuidIdColb(sd.RVC_GUID_Colb))
12/08/2026 Batik_WS_Com_Mob 158
---------- --- ---------------- --- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code saCle = sd.RVC_GUID_RDV FIN SI bAvecCR ALORS SI PAS bAvecRDV ALORS POUR TOUT stUncr, saVcle de tbaCompteRendu SI stUncr.nIN_PKID = sd.IN_PKID ALORS saCle = saVcle FIN FIN FIN SI tbaCompteRendu[saCle]..Existe ALORS xt.stRDV.stCompteRendu.saGuidCR = tbaCompteRendu[saCle].saCR_GUID xt.stRDV.stCompteRendu.saDebut = tbaCompteRendu[saCle].saDateHeureDebut xt.stRDV.stCompteRendu.saFin = tbaCompteRendu[saCle].saDateHeureFin xt.stRDV.stCompteRendu.saNoteCollab = tbaCompteRendu[saCle]. saNoteCollaborateur xt.stRDV.stCompteRendu.saNoteClient = tbaCompteRendu[saCle]. saNoteSignataire xt.stRDV.stCompteRendu.saDateSignature = tbaCompteRendu[saCle]. saDateHeureSignature xt.stRDV.stCompteRendu.nIdInter = tbaCompteRendu[saCle].nIN_PKID xt.stRDV.stCompteRendu.saSignataire = tbaCompteRendu[saCle]. saNomSignataire xt.stRDV.stCompteRendu.saNomCollaborateur = tbaCompteRendu[saCle].saNomCollaborateur xt.stRDV.stCompteRendu.saReserveCommentaire= tbaCompteRendu[saCle]. saReserveCommentaire xt.stRDV.stCompteRendu.saGuidRDV = tbaCompteRendu[saCle].saPL_GUID xt.stRDV.stCompteRendu.nIdCollab = tbaCompteRendu[saCle].nPL_IDCollaborateur xt.stRDV.stCompteRendu.nIdUser = tbaCompteRendu[saCle].nCR_CreationUser xt.stRDV.stCompteRendu.bImgSignature = tbaCompteRendu[saCle].bCR_Signature xt.stRDV.stCompteRendu.bImgSignatureTech = tbaCompteRendu[saCle].bCR_SignatureTech xt.stRDV.stCompteRendu.nIDTypeSignataire = tbaCompteRendu[saCle].nIDTypeSignataire xt.stRDV.stCompteRendu.nIdGroupeRDV = tbaCompteRendu[saCle].nIdGroupe SINON xt.stRDV.stCompteRendu.saGuidCR = "" xt.stRDV.stCompteRendu.saDebut = "" xt.stRDV.stCompteRendu.saFin = "" xt.stRDV.stCompteRendu.saNoteCollab = "" xt.stRDV.stCompteRendu.saNoteClient = "" xt.stRDV.stCompteRendu.saReserveCommentaire= "" xt.stRDV.stCompteRendu.saDateSignature = "" xt.stRDV.stCompteRendu.nIdInter = 0 xt.stRDV.stCompteRendu.saSignataire = "" xt.stRDV.stCompteRendu.saNomCollaborateur = "" xt.stRDV.stCompteRendu.saGuidRDV = "" xt.stRDV.stCompteRendu.nIdCollab = 0 xt.stRDV.stCompteRendu.nIdUser = "" xt.stRDV.stCompteRendu.bImgSignature = Faux xt.stRDV.stCompteRendu.bImgSignatureTech = Faux xt.stRDV.stCompteRendu.nIDTypeSignataire = 0 xt.stRDV.stCompteRendu.nIdGroupeRDV = 0 FIN FIN 12/08/2026 Batik_WS_Com_Mob 159

Partie 4 › Collection de procédures › LIB_Traitements › Code //Sous ensemble Intervention xt.stINTER.nDos_IDCli = sd.DO_IDClient xt.stINTER.saDos_Type = DonneIdParametre(sd.DO_CleType) xt.stINTER.saDos_Tit = sd.DO_Titre xt.stINTER.saDos_Etat = DonneIdParametre(sd.DO_CleStatut) xt.stINTER.saDos_RfI = sd.DO_RefInterne xt.stINTER.saDos_RfE = sd.DO_RefExterne xt.stINTER.saCli_Nom = sd.CL_Nom xt.stINTER.saCli_Tel = sd.CL_Tel xt.stINTER.saCli_Fax = sd.CL_Fax xt.stINTER.saCli_Email = sd.CL_Email xt.stINTER.stCli_Ad.nID = sd.AdClient_PKID xt.stINTER.stCli_Ad.saEtiq = sd.AdClient_Etiquette xt.stINTER.stCli_Ad.saLig = sd.AdClient_Adresse xt.stINTER.stCli_Ad.saCP = sd.AdClient_CodePostal xt.stINTER.stCli_Ad.saVil = sd.AdClient_Ville xt.stINTER.nInt_PKID = sd.IN_PKID xt.stINTER.saInt_Typ = DonneIdParametre(sd.IN_CleType) xt.stINTER.saInt_Etat = DonneIdParametre(sd.IN_CleEtat) xt.stINTER.nInt_IDSuiv = sd.IN_IDSuiviPar xt.stINTER.saNomSuiviPar = sd.NomSuiviPar xt.stINTER.saPrenomSuiviPar = sd.PrenomSuiviPar xt.stINTER.saTelSuiviPar = sd.TelMobSuiviPar xt.stINTER.saSuiviEmail = sd.SuiviEmail xt.stINTER.nInt_IDDos = sd.IN_IDDossier xt.stINTER.nInt_IDCli = sd.IN_IDClient xt.stINTER.nInt_IDLieu = sd.IN_IDLieu xt.stINTER.nInt_IDSociete = sd.IN_IDSociete xt.stINTER.saSoc_Nom = sd.SO_Nom xt.stINTER.saInt_Descrip = RTFVersTexte(sd.IN_Description) xt.stINTER.bInt_AtTVA = sd.IN_AttestationTVAPresente xt.stINTER.saInt_Note = sd.IN_NoteInterne xt.stINTER.saInt_Tit = sd.IN_Titre xt.stINTER.saInt_RfI = sd.IN_RefInterne xt.stINTER.saInt_RfE = sd.IN_RefExterne xt.stINTER.saInt_NumDevis = sd.IN_NumDevis xt.stINTER.saInt_DateDevis = DateVersChaîne(sd.IN_DateDevis,"JJ/MM/AA") xt.stINTER.nLieu_PKID = sd.LI_PKID xt.stINTER.saLieu_CodeLieu = sd.LI_CodeLieu xt.stINTER.nLieu_IDAdresse = sd.LI_IDAdresse xt.stINTER.saLieu_Type = DonneIdParametre(sd.LI_CleType) xt.stINTER.saLieu_CodeAcces = sd.LI_CodeAcces xt.stINTER.bLieu_Badge = sd.LI_Badge xt.stINTER.bLieu_Interphone = sd.LI_Interphone xt.stINTER.saLieu_Note = sd.LI_Note xt.stINTER.stLieu_Ad.nID = sd.AdLieu_PKID xt.stINTER.stLieu_Ad.saEtiq = sd.AdLieu_Etiquette xt.stINTER.stLieu_Ad.saLig = sd.AdLieu_Adresse xt.stINTER.stLieu_Ad.saCP = sd.AdLieu_CodePostal xt.stINTER.stLieu_Ad.saVil = sd.AdLieu_Ville nNbInter = TableauAjoute(tbLRDV,xt) FIN SI nNbInter>0 ET bAvecRDV ALORS //Construction de la liste des Contacts RDV saRQ2 est une chaîne ANSI=[ SELECT RVCT_PKID, RVCT_GUID_Pers, 12/08/2026 Batik_WS_Com_Mob 160

Partie 4 › Collection de procédures › LIB_Traitements › Code RVCT_GUID_RDV, PE_PKID, Personne.PE_CleCivilite, Personne.PE_Nom AS PE_Nom, Personne.PE_Prenom AS PE_Prenom, Personne.PE_Email AS PE_Email, Personne.PE_TelFixe AS PE_TelFixe, Personne.PE_TelMobile AS PE_TelMobile, Personne.PE_CleRole, Personne.PE_Note AS PE_Note, Intervention_Personne.IP_IDPersonne AS IP_IDPersonne, Intervention_Personne.IP_IDIntervention AS IP_IDIntervention, Intervention_Personne.IP_IDLieu AS IP_IDLieu, Intervention_Personne.IP_IDClient AS IP_IDClient, Intervention_Personne.IP_Etage AS IP_Etage, Intervention_Personne.IP_Lot AS IP_Lot, Lieu_Personne.LIP_Etage AS LIP_Etage, Lieu_Personne.LIP_Lot AS LIP_Lot, Lieu_Personne.LIP_EtiquetteAdresse AS LIP_EtiquetteAdresse FROM RDV_Contact INNER JOIN Personne ON (Personne.GUID = RDV_Contact.RVCT_GUID_Pers) INNER JOIN Intervention_Personne ON (Intervention_Personne.IP_IDPersonne=Personne.PE_PKID AND Intervention_Personne.IP_IDIntervention>0) INNER JOIN Lieu_Personne ON (Lieu_Personne.LIP_IDPersonne=Intervention_Personne.IP_IDPersonne AND Lieu_Personne.LIP_IDLieu=Intervention_Personne.IP_IDLieu) WHERE RDV_Contact.RVCT_GUID_RDV IN ({pListeIdRdv}) ] saRQ2=Remplace(saRQ2,"{pListeIdRdv}",saLstIdRDV) TraceRequete(saRQ2) sdCnt est une Source de Données SI PAS HExécuteRequêteSQL(sdCnt,gcnxReplica,hRequêteDéfaut,saRQ2) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER sRes FIN POUR TOUT sdCnt stContact est un ST_RDV_CONTACT

stContact.nIdRdvCnt = sdCnt.RVCT_PKID
//stContact.nId =sdCnt.IP_IDPersonne
stContact.saCivilite = DonneIdParametre(sdCnt.PE_CleCivilite)
stContact.saNom = sdCnt.PE_Nom
stContact.saPrenom = sdCnt.PE_Prenom
stContact.saEmail = sdCnt.PE_Email
stContact.saRole = DonneIdParametre(sdCnt.PE_CleRole)
stContact.saEtage = sdCnt.IP_Etage<>"" ? sdCnt.IP_Etage SINON sdCnt.LIP_Etage
stContact.saLot = sdCnt.IP_Lot<>"" ? sdCnt.IP_Lot SINON sdCnt.LIP_Lot
stContact.saEtiquette= sdCnt.LIP_EtiquetteAdresse
stContact.saNote = sdCnt.PE_Note
--- -------------------------------- --- --- ---
stContact.bDonneurOrdre = sdCnt.IP_IDClient<>0 ET sdCnt.IP_IDlieu=0
//Ajout des téléphones dans un tableau (structure prête pour le multitéléphone)
stTel est un ST_TELEPHONE
SI sdCnt.PE_TelFixe<>"" ALORS
stTel.saTelNum = sdCnt.PE_TelFixe
--- -------------- ------------------- --- ---
stTel.saTelLib = "Tél 1"
stContact.tbLTEL.Ajoute(stTel)
FIN
SI sdCnt.PE_TelMobile<>"" ALORS
stTel.saTelNum = sdCnt.PE_TelMobile
---------- -------------- --------------------- --- ---
stTel.saTelLib = "Tél 2"
12/08/2026 Batik_WS_Com_Mob 161

Partie 4 › Collection de procédures › LIB_Traitements › Code stContact.tbLTEL.Ajoute(stTel) FIN ResIndice est un entier ResIndice = TableauCherche(tbLRDV,tcLinéaire,"stRDV.saGUID_RDV",sdCnt.RVCT_GUID_RDV, ResIndice) TANTQUE ResIndice > 0 tbLRDV[ResIndice].stRDV.tblContact.Ajoute(stContact) ResIndice += 1 ResIndice = TableauCherche(tbLRDV,tcLinéaire,"stRDV.saGUID_RDV",sdCnt.RVCT_GUID_RDV, ResIndice) FIN FIN //Construction de la liste des Contacts Intervention/Lieu FIN SI nNbInter>0 ALORS sdPers est une Source de Données saRQ3 est une chaîne ANSI = [ SELECT Intervention_Personne.IP_Etage AS IP_Etage, Intervention_Personne.IP_Lot AS IP_Lot, Intervention_Personne.IP_IDPersonne AS IP_IDPersonne, Intervention_Personne.IP_EstDemandeur AS IP_EstDemandeur, Personne.PE_CleCivilite, Personne.PE_Nom AS PE_Nom, Personne.PE_Prenom AS PE_Prenom, Personne.PE_TelFixe AS PE_TelFixe, Personne.PE_TelMobile AS PE_TelMobile, Personne.PE_CleRole, Personne.PE_Note AS PE_Note, Personne.PE_Email AS PE_Email, Intervention_Personne.IP_IDIntervention AS IP_IDIntervention, Intervention_Personne.IP_IDLieu AS IP_IDLieu, Intervention_Personne.IP_IDClient AS IP_IDClient, Lieu_Personne.LIP_Etage AS LIP_Etage, Lieu_Personne.LIP_Lot AS LIP_Lot, Lieu_Personne.LIP_EtiquetteAdresse AS LIP_EtiquetteAdresse FROM Intervention_Personne INNER JOIN Personne ON (Personne.PE_PKID = Intervention_Personne.IP_IDPersonne) LEFT OUTER JOIN Lieu_Personne ON (Lieu_Personne.LIP_IDLieu=Intervention_Personne.IP_IDLieu AND Lieu_Personne.LIP_IDPersonne=Intervention_Personne.IP_IDPersonne) WHERE Intervention_Personne.IP_IDIntervention IN ({Liste_IDIntervention}) ORDER BY IP_IDIntervention ASC ] saRQ3=Remplace(saRQ3,"{Liste_IDIntervention}",saLstIdInter) TraceRequete(saRQ3) SI PAS HExécuteRequêteSQL(sdPers,gcnxReplica,hRequêteDéfaut,saRQ3) ALORS sRes="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER sRes FIN stPer est un ST_PERSONNE_LIEU POUR TOUT sdPers stPer.nID = sdPers.IP_IDPersonne stPer.saNom = sdPers.PE_Nom 12/08/2026 Batik_WS_Com_Mob 162

Partie 4 › Collection de procédures › LIB_Traitements › Code stPer.saPren = sdPers.PE_Prenom stPer.saTFix = sdPers.PE_TelFixe stPer.saTMob = sdPers.PE_TelMobile stPer.saRole = DonneIdParametre(sdPers.PE_CleRole) stPer.saEmail = sdPers.PE_Email stPer.saEtage = sdPers.IP_Etage<>"" ? sdPers.IP_Etage SINON sdPers.LIP_Etage //sdPers.IP_Etage stPer.saLot = sdPers.IP_Lot<>"" ? sdPers.IP_Lot SINON sdPers.LIP_Lot //sdPers.IP_Lot stPer.saEtiquette = sdPers.LIP_EtiquetteAdresse stPer.saNote = sdPers.PE_Note stPer.bDemand = sdPers.IP_EstDemandeur stPer.bDonneurOrdre = sdPers.IP_IDClient<>0 ET sdPers.IP_IDlieu=0 ResIndice est un entier ResIndice = TableauCherche(tbLRDV,tcLinéaire,"stINTER.nInt_PKID",sdPers.IP_IDIntervention) TANTQUE ResIndice > 0 tbLRDV[ResIndice].stINTER.tblPerLieu.Ajoute(stPer) TableauTrie(tbLRDV[ResIndice].stINTER.tblPerLieu,ttMembre,"-bDemand;saRole;saNom") //Ordonne le tableau pour avoir les demandeurs en premier ResIndice += 1 ResIndice = TableauCherche(tbLRDV,tcLinéaire,"stINTER.nInt_PKID",sdPers. IP_IDIntervention,ResIndice) FIN FIN //Ajout du tableau des Notes Internes sdNote est une Source de Données saRQ4 est une chaîne ANSI = [ SELECT MI_Message,MessageInterne.CreationDate,UT_Nom , UT_Prenom ,MI_IDTypeMessage,MI_IDIntervention,MessageInterne.GUID as MI_GUID ,MessageInterne.CreationUser FROM MessageInterne INNER JOIN Utilisateur ON MessageInterne.CreationUser=Utilisateur.UT_PKID WHERE MI_IDIntervention IN ({Liste_IDIntervention}) AND MessageInterne.MI_IDTypeMessage < 10 ORDER BY MessageInterne.CreationDate DESC ] saRQ4=Remplace(saRQ4,"{Liste_IDIntervention}",saLstIdInter) TraceRequete(saRQ4) SI PAS HExécuteRequêteSQL(sdNote,gcnxReplica,hRequêteDéfaut,saRQ4) ALORS TraceERREUR("Erreur lecture des Notes Internes " + HErreurInfo(hErrComplet)) SINON stN est un ST_NOTE POUR TOUT sdNote stN.nIdInter = sdNote.MI_IDIntervention stN.saNote = sdNote.MI_Message stN.saAuteur = sdNote.UT_Prenom + [" "] + sdNote.UT_Nom stN.saDate = sdNote.CreationDate stN.saGuid = sdNote.MI_GUID stN.nIdUsr = sdNote.CreationUser ResIndice est un entier ResIndice = TableauCherche(tbLRDV,tcLinéaire,"stINTER.nInt_PKID",stN.nIdInter) TANTQUE ResIndice > 0 tbLRDV[ResIndice].stINTER.tblNote.Ajoute(stN) ResIndice += 1 ResIndice = TableauCherche(tbLRDV,tcLinéaire,"stINTER.nInt_PKID",stN.nIdInter, ResIndice) 12/08/2026 Batik_WS_Com_Mob 163

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN FIN FIN FIN TraceINFO("Nb d'interventions : " + nNbInter) bufRes est un Buffer Sérialise(tbLRDV,bufRes,psdJSON) TraceINFO("tblRDV =" + bufRes) RENVOYER "" //Pas d'erreur FAIRE sRes=ExceptionInfo(errComplet) TraceERREUR("ConstruitTableauInterventions : " + sRes) RENVOYER "E"+sRes FIN Procédure globale ControleRdvAPlanifier PROCÉDURE ControleRdvAPlanifier(stData est une ST_MOB_DATA) sResultat est une chaîne=cErreur ChronoDébut() QUAND EXCEPTION DANS stRdvTemp est un ST_RDV Désérialise(stRdvTemp,stData.saJSON,psdJSON) sdTps est une Source de Données saRQ est une chaîne ANSI=[ SELECT 1 FROM RDV_Planning INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_GUID_RDV = RDV_Planning.GUID WHERE RDV_Planning.RV_CleStatut={p_CleNonPlanifier} AND RDV_Collaborateur.RVC_PKID={p_IDRdv} ] saRQ=Remplace(saRQ,"{p_IDRdv}",stRdvTemp.nPKID) saRQ=Remplace(saRQ,"{p_CleNonPlanifier}",cCle_RDVAPlanifier) SI PAS HExécuteRequêteSQL(sdTps,gcnxReplica,hRequêteDéfaut,saRQ) ALORS TraceDEBUG("Erreur ControleRdvAPlanifier " + HErreurInfo(hErrComplet)) SINON //Le rendez-vous n'a été planifié par personne SI HNbEnr(sdTps)>0 ALORS stRdvTemp.nIDStatut = DonneIdParametre(cCle_RDVConfirme) Sérialise(stRdvTemp,stData.saJSON,psdJSON) sResultat="R" SINON sResultat=cErreur + cERR_RDV_PLANIFIER FIN FIN 12/08/2026 Batik_WS_Com_Mob 164

Partie 4 › Collection de procédures › LIB_Traitements › Code FAIRE TraceDEBUG("bufREs : E" + ExceptionInfo(errComplet)) TraceDEBUG("Durée (ms) : " + ChronoFin()) FIN RENVOYER sResultat Procédure globale ContruireListeChamps PROCÉDURE ContruireListeChamps(tabRubMobile est un tableau de STJSONMembreRubRapport,stParam est un ST_REQ_LISTE_Chp_Rapport,bToutesRub est un booléen = Faux) tabToutesRub est un tableau de STJSONMembreRubRapport tbMotCleSpec est un tableau de STJSONMembreRubRapport nPKID_Rapport est un entier sur 8 octets = stParam.nIdModele nPKID_Inter est un entier sur 8 octets = stParam.nIdInter SI nPKID_Rapport <= 0 ALORS RENVOYER "Identifiant du modèle introuvable" FIN SI nPKID_Inter <= 0 ALORS RENVOYER "Identifiant de l'intervention introuvable" FIN saRQRp est une chaîne ANSI=[ SELECT * FROM ModeleRapport WHERE MRP_PKID = ] saRQRp += nPKID_Rapport sdRpest une Source de Données HExécuteRequêteSQL(sdRp,gcnxReplica,saRQRp) MonDoc est un Document SI sdRp.MRP_Modele <> "" ALORS MonDoc = sdRp.MRP_Modele SINON RENVOYER "" FIN SI sdRp.MRP_Extra <> "" ALORS Désérialise(tbMotCleSpec,sdRp.MRP_Extra,psdJSON) POUR TOUT stUnMot DE tbMotCleSpec SI stUnMot:TypeMembre <> "" ALORS stUnMot:Type = stUnMot:TypeMembre //Pour compatibilite dans le mobile FIN FIN FIN TermeRapport est un STJSONRubriqueRapport TermeRapport.ListeTerme = ChargeListeRubDoc() //vRub est un Variant // //saRQRub est une chaîne ANSI = [ // SELECT * FROM ParametreSysteme WHERE PAS_Code = 'RUBRIQUE_RAPPORT_INTERVENTION' //] // //sdRpRub est une source de données //HExécuteRequêteSQL(sdRpRub,gcnxReplica,saRQRub) //vRub = JSONVersVariant(sdRpRub.PAS_Valeur) // //SI vRub<>Null ALORS // Désérialise(TermeRapport,sdRpRub.PAS_Valeur,psdJSON) 12/08/2026 Batik_WS_Com_Mob 165

Partie 4 › Collection de procédures › LIB_Traitements › Code // TableauTrie(TermeRapport:ListeTerme,ttMembre,"Groupe;Ordre") //FIN SI TermeRapport:ListeTerme..Occurrence <= 0 ALORS TraceDEBUG("ContruireListeChamps - Recherche la liste des terme est a 0" ) RENVOYER "" FIN ConstructionTbRubBaseRapport(TermeRapport,tabToutesRub,MonDoc) ConstructionTbRubEnvoyerMob(TermeRapport,tabToutesRub,tabRubMobile,MonDoc,bToutesRub,tbMotCleSpec) AjouterDonnesBDDansChampRapport(nPKID_Inter, tabRubMobile) RENVOYER "" Procédure globale CreationETEnvoiEmail PROCÉDURE CreationETEnvoiEmail(stID est un ST_MOB_IDENTITE, stData est une ST_MOB_DATA)

stInfoMail est un ST_ModeleMailComplet
sErreur est une chaîne ANSI
Désérialise(stInfoMail,stData.saJSON,psdJSON)
bufRes est un Buffer
----------- ------------------- --- ---
sResRepTemp est une chaîne ANSI
sResRepTemp = ComplèteRep(fRepExe())+"TEMP"
----------- -------------------------------- --- ---
sResRepTemp = ComplèteRep(fRepWeb())+"TEMP"
----------- -------------------------------- --- ---
nPKID_Inter est un entier sur 8 octets = stInfoMail.nIdInter
----------- -------------------------- --------------------- ---
QUAND EXCEPTION DANS
ChronoDébut()
TraceINFO(" CreationETEnvoiEmail ")
unEmail est un Email
------- ------------ --- ---
(sErreur,unEmail) = CreationUnEmail(stInfoMail)
SI SansEspace(sErreur) <> "" ALORS
bufRes ="E" + sErreur
RENVOYER bufRes
FIN
bSMTPCnxOk est un booléen
------------------- -------------- --- ---
sMsg est une chaîne
(bSMTPCnxOk,sMsg)=OuvreSessionEmail(3,stInfoMail.stCompteMail.SMTP.sLogin, stInfoMail.stCompteMail.
SMTP.sMdp, stInfoMail.stCompteMail.SMTP.sAdresseServeur, Val(stInfoMail.stCompteMail.SMTP.
sPortServeur), stInfoMail.stCompteMail.SMTP.nCryptage)
SI PAS bSMTPCnxOk ALORS
// erreur
bufRes ="E" + sMsg
TraceINFO("Erreur dans la connexion SMTP "+sMsg)
RENVOYER bufRes
FIN
// Envoie l'email
SI PAS EmailEnvoieMessage(stInfoMail.stCompteMail.SMTP.sLogin,unEmail) ALORS
sErreur =ErreurInfo(errMessage)
TraceINFO("Erreur dans l'envoi de l'email "+sErreur)
FIN
12/08/2026 Batik_WS_Com_Mob 166
---------- --- ---------------- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code EmailFermeSession(stInfoMail.stCompteMail.SMTP.sLogin) bEnvoye est un booléen = Faux SI SansEspace(sErreur) = "" ALORS bEnvoye = Vrai FIN saRep est une chaîne ANSI = CreationMessageExt(stID,stInfoMail, bEnvoye) SI SansEspace(sErreur) ="" ALORS //Nous ne devons pas générer d'erreur si l'e-mail a été envoyé au risque que l'utilisateur essaie de le renvoyer, mais nous envoyons le message d'erreur pour avertir l'utilisateur. SI saRep <> cRep_OK ALORS sErreur += " Une erreur s'est produite lors de l'enregistrement du message dans le back-office. "+ saRep FIN bufRes ="R" + sErreur SINON bufRes ="E" + sErreur+RC+saRep FIN TraceINFO("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FAIRE //bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale CreationMessageExt PROCÉDURE CreationMessageExt(stID est un ST_MOB_IDENTITE, stInfoMail est un ST_ModeleMailComplet, bEnvoye est un booléen) saRep est une chaîne ANSI QUAND EXCEPTION DANS TraceINFO(" CreationMessageExt ") stMsgExt est un ST_MsgExterneMail stMsgExt.nIdInter = stInfoMail.nIdInter stMsgExt.saSujet = stInfoMail.saSujet stMsgExt.bufCorp = stInfoMail.bufCorpsHTML stMsgExt.saGUID = stInfoMail.saGUID stMsgExt.saAdrExp = stInfoMail.stCompteMail.SMTP.sLogin stMsgExt.sapj = TableauVersChaîne(stInfoMail.tbPJID,";") stMsgExt.saDest = TableauVersChaîne(stInfoMail.tbDest,";") stMsgExt.saDestcc = TableauVersChaîne(stInfoMail.tbDestcc,";") stMsgExt.saDestcci = TableauVersChaîne(stInfoMail.tbDestcci,";") stMsgExt.bEnvoye = bEnvoye stMsgExt.nIdUser = stID.nIdUser saJSON est une chaîne ANSI Sérialise(stMsgExt,saJSON,psdJSON) HRAZ(TOSRV) 12/08/2026 Batik_WS_Com_Mob 167

Partie 4 › Collection de procédures › LIB_Traitements › Code TOSRV.TS_CMD = cCMD_MsgExtEcrit TOSRV.TS_Date = DateHeureSys() TOSRV.TS_JSON = saJSON TOSRV.TS_Buffer = "" SI HAjoute(TOSRV) ALORS saRep = cRep_OK SINON saRep= cErreur +RC+HErreurInfo() FIN TraceINFO("CreationMessageExt "+saRep ) RENVOYER saRep FAIRE saRep = ExceptionInfo(errComplet) TraceERREUR("bufREs : " + saRep) RENVOYER saRep FIN Procédure globale CreationModeleMail PROCÉDURE CreationModeleMail(stData est une ST_MOB_DATA) stInfoRapport est un STJSONInfoRapportMob Désérialise(stInfoRapport,stData.saJSON,psdJSON) bufRes est un Buffer sResRepTemp est une chaîne ANSI sResRepTemp = ComplèteRep(fRepExe())+"TEMP" sResRepTemp = ComplèteRep(fRepWeb())+"TEMP" nPKID_Rapport est un entier sur 8 octets = stInfoRapport.nIdModele CheminImg est une chaîne ANSI = ComplèteRep(sResRepTemp+stInfoRapport.nIdInter) SI nPKID_Rapport <= 0 ALORS RENVOYER "E"+"Modèle introuvable" FIN QUAND EXCEPTION DANS ChronoDébut() TraceINFO(" CreationModeleMail ") stParam est un STJSONInfoModeleMailMob Désérialise(stParam,stData.saJSON,psdJSON) sErreur est une chaîne = ConstruireModeleMailAvecInfoMob(stParam,bufRes) SI sErreur="" ALORS bufRes ="R" + bufRes SINON bufRes ="E" + sErreur FIN TraceINFO("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale CreationRapport 12/08/2026 Batik_WS_Com_Mob 168

Partie 4 › Collection de procédures › LIB_Traitements › Code PROCÉDURE CreationRapport(stID est un ST_MOB_IDENTITE,stData est une ST_MOB_DATA) stInfoRapport est un STJSONInfoRapportMob Désérialise(stInfoRapport,stData.saJSON,psdJSON) bufRes est un Buffer sResRepTemp est une chaîne ANSI sResRepTemp = ComplèteRep(fRepExe())+"TEMP" sResRepTemp = ComplèteRep(fRepWeb())+"TEMP" nPKID_Rapport est un entier sur 8 octets = stInfoRapport.nIdModele CheminImg est une chaîne ANSI = ComplèteRep(sResRepTemp+stInfoRapport.nIdInter) SI nPKID_Rapport <= 0 ALORS bufRes = "E"+"Modèle introuvable" RENVOYER bufRes FIN saRQRp est une chaîne ANSI=[ SELECT * FROM ModeleRapport WHERE MRP_PKID = ] saRQRp += nPKID_Rapport sdRpest une Source de Données HExécuteRequêteSQL(sdRp,gcnxReplica,saRQRp) MonDoc est un Document SI sdRp.MRP_Modele <> "" ALORS MonDoc = sdRp.MRP_Modele FIN tbMotCleSpec est un tableau de STJSONMembreRubRapport // Mot clé ajouté spécifique au mobile , (texte additionnel qui provient pas de données de l'intervention) SI sdRp.MRP_Extra <> "" ALORS Désérialise(tbMotCleSpec,sdRp.MRP_Extra,psdJSON) FIN tabRubMobile est un tableau de STJSONMembreRubRapport stParam est un ST_REQ_LISTE_Chp_Rapport stParam.nIdModele = nPKID_Rapport stParam.nIdInter = stInfoRapport.nIdInter saErreur est une chaîne ANSI = ContruireListeChamps(tabRubMobile,stParam,Vrai) SI saErreur <> "" ALORS TraceERREUR("Erreur dans la création du rapport ") bufRes = "E"+saErreur SINON QUAND EXCEPTION DANS TraiteDocumentRapportMob(tabRubMobile,stInfoRapport.ListeMob,MonDoc,CheminImg) SupprimerToutesRubRapportMob(tabRubMobile,MonDoc) SI PAS fRepCrée(CheminImg) ALORS TraceINFO("Erreur dans la création du repertoire Nom Rep "+CheminImg+RC+ErreurInfo( errComplet)) saErreur = "Erreur dans la création du rapport " bufRes = "E"+saErreur FIN TraceINFO("Avant création doc") saNomDoc est une chaîne ANSI = CheminImg+stInfoRapport.saGuid+".pdf" SI DocVersPDF(MonDoc,saNomDoc) ALORS bufRapportPDF est un Buffer = fChargeBuffer(saNomDoc) SI bufRapportPDF..Taille > 0 ALORS 12/08/2026 Batik_WS_Com_Mob 169

Partie 4 › Collection de procédures › LIB_Traitements › Code TraceINFO("Rapport crée "+ saNomDoc) Sérialise(tabRubMobile,bufRes,psdJSON) bufRes ="R" + bufRes TraceINFO("Liste Rub "+ bufRes) stCmd est un ST_DOC stCmd.saNom = stInfoRapport.saNomRapport+".pdf" stCmd.saDocGUID = stInfoRapport.saGuid stCmd.saDateCreat= DateHeureSys() stCmd.nInterID = stInfoRapport.nIdInter stCmd.saNote = "" stCmd.nIdUser = stID.nIdUser stCmd.saType = "PDF_RP" saJSON est une chaîne ANSI Sérialise(stCmd,saJSON,psdJSON) saRep est une chaîne ANSI HRAZ(TOSRV) TOSRV.TS_CMD = cCMD_DocEcrit TOSRV.TS_Date = DateHeureSys() TOSRV.TS_JSON = saJSON TOSRV.TS_Buffer = bufRapportPDF SI HAjoute(TOSRV) ALORS saRep = cRep_OK SINON saRep= cErreur +RC+HErreurInfo() FIN SI saRep = cRep_OK ALORS bufRes = "R"+bufRapportPDF SINON bufRes = saRep TraceINFO("Réponse envoi de rapport au service : "+RC+bufRes) FIN SINON TraceINFO("Buffer vide procedure CreationRapport"+RC+ErreurInfo(errComplet)) FIN SINON TraceINFO("Erreur dans la création du rapport Nom doc "+saNomDoc+RC+ErreurInfo(errComplet) ) saErreur = "Erreur dans la création du rapport "+RC+ErreurInfo() bufRes = "E"+saErreur FIN FAIRE TraceINFO("Erreur dans la création du rapport Nom doc "+saNomDoc+RC+ErreurInfo(errComplet)) saErreur = "Erreur dans la création du rapport " bufRes = "E"+saErreur FIN FIN RENVOYER bufRes Procédure globale CreationTableauIntDocRapport PROCÉDURE CreationTableauIntDocRapport(unTerme est un STJSONMembreRubRapport,MonDoc est un Document, nIMin est un entier, vInfoVariante est un Variant, CheminImg est une chaîne ANSI,sdRReq est une Source de Données) nNumLignes est un entier saInfoV est une chaîne ANSI imgBuf est un Buffer POUR TOUT stTerme DE unTerme.ListeMembre tabFragments est un tableau de docFragments = DocRecherche(MonDoc,stTerme.Rubrique,MotComplet+ 12/08/2026 Batik_WS_Com_Mob 170

Partie 4 › Collection de procédures › LIB_Traitements › Code SansCasse) SI tabFragments..Occurrence > 0 ALORS nNumLignes += 1 FIN FIN bCree est un booléen = Faux SI nNumLignes > 1 ALORS POUR TOUT stTerme DE unTerme.ListeMembre tabFragments est un tableau de docFragments = DocRecherche(MonDoc,stTerme.Rubrique,MotComplet+ SansCasse) SI tabFragments..Occurrence > 0 ALORS nColonne est un entier = tabFragments[1].Elément[1].Cellule..IndiceColonne nLigne est un entier = tabFragments[1].Elément[1].Cellule..IndiceLigne nIMax est un entier = nIMin soit para <- tabFragments[1]..Paragraphe[1] SI para.Tableau = Null ALORS RENVOYER Faux FIN POUR TOUT UnEle DE vInfoVariante //sIdentifiant = {NomRubId} SI UnEle.bselection ALORS bufRep est un Buffer Sérialise(UnEle,bufRep,psdJSON) cellDoc est un docCellule<- para..Tableau..Cellules[nIMax,nColonne] cellColDoc est un docColonne<- para..Tableau..Colonnes[nColonne] cellColDoc..LargeurMillimètres = (cellColDoc..LargeurMillimètres+10) // Insère un tableau à la position du curseur (PositionDébut) de taille 1 colonnes et x lignes TabDoc est un docFragment = DocInsèreTableau(MonDoc,cellDoc..Contenu ..PositionDébut,1, nNumLignes) soit para2 <- TabDoc..Paragraphe[2] nLigneEnCours est un entier POUR TOUT stTerme2 DE unTerme.ListeMembre tabFragments = DocRecherche(MonDoc,stTerme2.Rubrique,MotComplet+SansCasse) SI tabFragments..Occurrence > 0 ALORS nLigneEnCours += 1 imgBuf = "" saInfoV = "" RechercheInfoDansVariantRapport(unTerme, stTerme2, UnEle,imgBuf,saInfoV, sdRReq,CheminImg) cell est un docCellule <- para2..Tableau..Cellules[nLigneEnCours,1 ] cell.MiseEnPage.Cadre.Couleur = Transparent // rendre transparent les lignes du nouveaux tableau SI stTerme2:TypeMembre = "ChpImage" OU stTerme2:Type = "ChpImage" ALORS SI imgBuf..Taille > 0 ALORS nLargPixCol est un entier = para2..Tableau.. Colonnes[1]..LargeurMillimètres*NBPixelesXMilimetres elt est un docElément <- DonneImgTableauRp(imgBuf, nLargPixCol) cell2 est un docLigne <- para2..Tableau..Lignes [nLigneEnCours] cell2.Hauteur = (elt..Image..Hauteur) cell3 est un docColonne <- para2..Tableau..Colonnes[1] 12/08/2026 Batik_WS_Com_Mob 171

Partie 4 › Collection de procédures › LIB_Traitements › Code cell3..LargeurMillimètres = (elt.Image..Largeur) DocInsère(MonDoc,cell..Contenu..PositionDébut, elt) SINON //para2..Tableau..Cellules[nLigneEnCours,1]..Contenu..Texte = " " FIN para2..Tableau..Cellules[nLigneEnCours,nColonne]..MiseEnPage.. Alignement = chCentre SINON para2..Tableau..Cellules[nLigneEnCours,1].Contenu..Texte = TraitementSelonTypeRubRapportMob(stTerme2,saInfoV) FIN FIN FIN bCree = Vrai nIMax += 1 SI Contient(stTerme:Rubrique,"$UN") ALORS SORTIR FIN FIN FIN FIN SI bCree ALORS SORTIR FIN FIN FIN Procédure globale CreationTbdansModeleEmail PROCÉDURE CreationTbdansModeleEmail(ListeMob est un tableau de STJSONMembreRubRapport, unTerme est un STJSONMembreRubRapport, mondoc est un Document) sADonnes est une chaîne ANSI b est un entier //saRep est une chaîne ANSI sdRReq est une Source de Données //tabTitreCol est un tableau de chaînes ANSI //taCol est un tableau associatif de chaînes ANSI //sTitresCols , sTbHTML, sInfoLigne sont des chaînes ANSI nLigne, nCol sont des entiers vInfoVariante est un Variant TableauTrie(unTerme.ListeMembre,ttMembre+tccRespecteNumérique,"+Ordre") SI unTerme:EnvoiMob ALORS b = TableauCherche(ListeMob,tcLinéaire,"Rubrique;Utilisee",unTerme:Rubrique,Faux) FIN SI b > 0 ALORS sADonnes = ListeMob[b].ListeDonnesMob FIN SI sADonnes <> "" ET unTerme:Type = "Tableau" ALORS vInfoVariante = JSONVersVariant(sADonnes) 12/08/2026 Batik_WS_Com_Mob 172

Partie 4 › Collection de procédures › LIB_Traitements › Code SI unTerme.GroupeApp = cRp_CR ALORS // Requête dans la base de données , le compte rendu ne peuvent pas être modifiées par l'utilisateur // // donc le données ne sont pas récupérer à partir de données envoyés par le mobile RqCompteRenduRemplirRapport(vInfoVariante,sdRReq) FIN nLigne = 1 // entête de table POUR TOUT stTerme, b de unTerme.ListeMembre nCol += 1 FIN POUR TOUT UnEle, c de vInfoVariante SI UnEle.bSelection ALORS nLigne += 1 FIN FIN tabFragments est un tableau de docFragments = DocRecherche(mondoc,unTerme.Rubrique,MotComplet+ SansCasse) SI tabFragments..Occurrence > 0 ALORS SI nLigne > 1 ALORS TabDoc est un docFragment = DocInsèreTableau(mondoc,tabFragments[1].. PositionDébut,nCol, nLigne) soit para2 <- TabDoc..Paragraphe[2] nLigneEnCours est un entier = 1 nColEnCours est un entier = 1 POUR TOUT stTerme, b de unTerme.ListeMembre para2..Tableau..Cellules[1,b].Contenu..Texte = stTerme:nom nLigneEnCours = 1 POUR TOUT UnEle, c de vInfoVariante SI stTerme:EnvoiMob ALORS infoR est une chaîne ANSI SI UnEle.bSelection ALORS nLigneEnCours += 1 imgBuf est un Buffer SI stTerme:TypeMembre <> "ChpImage" OU stTerme:Type <> "ChpImage"ALORS RechercheInfoDansVariantRapport(unTerme, stTerme, UnEle,imgBuf,infoR, sdRReq,"") para2..Tableau..Cellules[nLigneEnCours,b].Contenu..Texte = TraitementSelonTypeRubRapportMob(stTerme,infoR) FIN FIN FIN FIN FIN SINON tabFragments[1].Texte = "" FIN FIN FIN // // // //TableauTrie(unTerme.ListeMembre,ttMembre+tccRespecteNumérique,"+Ordre") 12/08/2026 Batik_WS_Com_Mob 173

Partie 4 › Collection de procédures › LIB_Traitements › Code // // //SI unTerme:EnvoiMob ALORS // b = TableauCherche(ListeMob,tcLinéaire,"Rubrique;Utilisee",unTerme:Rubrique,Faux) //FIN // //SI b > 0 ALORS // sADonnes = ListeMob[b].ListeDonnesMob //FIN // //SI sADonnes <> "" ET unTerme:Type = "Tableau" ALORS // vInfoVariante est un Variant = JSONVersVariant(sADonnes) // SI unTerme.GroupeApp = cRp_CR ALORS // Requête dans la base de données , le compte rendu ne peuvent pas être modifiées par l'utilisateur // // donc le données ne sont pas récupérer à partir de données envoyés par le mobile

"
// RqCompteRenduRemplirRapport(vInfoVariante,sdRReq)
// FIN
//
// SELON unTerme:GroupeApp
// CAS cRp_CtSite,cRp_Client,cRp_CtDonneurs,cRp_Photo,cRp_CR,cRp_RDV
//
// sTB est une chaîne ANSI = [
--- -------------------------------------------- ------------------- --- --- ---
//
// <table cellspacing='0' cellpadding='0' width
='100%' style='table-layout:fixed;border-collapse:collapse;'>
//
--- ------------------------ --- --- --- ---
// ]
//
// POUR TOUT stTerme, b DE unTerme.ListeMembre
--- ------------------------------------------- --- --- --- ---
// TableauAjoute(tabTitreCol,stTerme:Nom)
// POUR TOUT UnEle, c DE vInfoVariante
// SI stTerme:EnvoiMob ALORS
//
// infoR est une chaîne ANSI
--- --- ------------------------- --- --- ---
// SI UnEle.bSelection ALORS
// imgBuf est un buffer
// SI stTerme:TypeMembre <> "ChpImage" OU stTerme:Type <> "ChpImage"ALORS
//
RechercheInfoDansVariantRapport(unTerme, stTerme, UnEle,imgBuf,infoR,sdRReq,"")
// taCol[b+"-"+c] = TraitementSelonTypeRubRapportMob(stTerme,infoR)
// FIN
--- --- --- --- --- ---
// FIN
// FIN
//
// FIN
--- --- --- --- --- ---
// FIN
//
// POUR TOUT sTitre de tabTitreCol
--- ------------------------------- --- --- --- ---
// sInfoLigne+="<th valign='center' align='center' style='border-left:1pt solid
#000000;border-top:1pt solid #000000;border-right:1pt solid #000000;border-bottom:1pt solid
#000000;width:20%;padding:0.0pt 5.4pt 0.0pt 5.4pt'>"
//
sInfoLigne+="

"

+TexteVersHTML(sTitre) + "

"
// FIN
--- --- --- --- --- ---
//
// SI sInfoLigne <> "" ALORS
--- ------------------------- ---------------------------- --- --- ---
// sTitresCols = sTB + sInfoLigne + "
//
// sInfoLigne = ""
--- ---------- ---- --- --- ---
//
//
// POUR TOUT UnEle, c DE vInfoVariante
---------- ----------------------------------- --- ---------------- --- ---
12/08/2026 Batik_WS_Com_Mob 174

Partie 4 › Collection de procédures › LIB_Traitements › Code

<td valign='center' align='left'"" + sTB+""
// sTB = ""
// SI UnEle.bSelection ALORS
// POUR TOUT sTitre,b de tabTitreCol
// SI taCol[b+"-"+c]..Existe ALORS
// sTB+="<td valign='center' align='left' style='border-left:1pt solid
#000000;border-top:1pt solid #000000;border-right:1pt solid #000000;border-bottom:1pt solid
#000000;width:20%;padding:0.0pt 5.4pt 0.0pt 5.4pt'>"
// //sTB+="
style='border-left:1pt solid #000000;border-top:1pt solid #000000;border-right:1pt solid
#000000;border-bottom:1pt solid #000000;width:20%;padding:0.0pt 5.4pt 0.0pt 5.4pt'>"
// sTB+="

"+taCol[b+"-"+c] +"

// FIN
// FIN
--- --- --- ---
//
// SI sTB <> "" ALORS
--- ------------------ --- ---
// sInfoLigne += "
// FIN
------ --- --- ---
// FIN
// FIN
// FIN
//
// SI sInfoLigne <> "" ALORS
// sTbHTML = sTitresCols+sInfoLigne+"
" ---------------------------------------------- --- --- --- // FIN // // // // AUTRE CAS // // sTbHTML = TraitementSelonTypeRubRapportMob(unTerme,sADonnes) // // FIN // // //FIN // //saRep = ChaîneVersUTF8(sTbHTML) //RENVOYER saRep Procédure globale CreationUnEmail PROCÉDURE CreationUnEmail(stInfoMail est un ST_ModeleMailComplet) sErreur est une chaîne ANSI ----------- ------------------- --- --- sResRepTemp est une chaîne ANSI sResRepTemp = ComplèteRep(fRepExe())+"TEMP" ----------- -------------------------------- --- --- sResRepTemp = ComplèteRep(fRepWeb())+"TEMP" ----------- -------------------------------- --- --- nPKID_Inter est un entier sur 8 octets = stInfoMail.nIdInter ----------- -------------------------- --------------------- --- saCheminTemp est une chaîne ANSI = ComplèteRep(sResRepTemp+nPKID_Inter) saCheminDoc est une chaîne ANSI ----------- ------------------- --- --- unEmail est un Email // Initialise les composantes du mail QUAND EXCEPTION DANS monAttache est un emailAttache ------------------------------ --- --- --- // L'expéditeur unEmail..Expediteur = stInfoMail.stCompteMail.SMTP.sLogin 12/08/2026 Batik_WS_Com_Mob 175 ---------- --- ---------------- ---

Partie 4 › Collection de procédures › LIB_Traitements › Code // Le destinataire POUR TOUT saUnDest DE stInfoMail.tbDest Ajoute(unEmail..Destinataire,saUnDest) FIN // Les destinataires CC POUR TOUT saUnDestcc DE stInfoMail.tbDestcc Ajoute(unEmail..Cc,saUnDestcc) FIN // Les destinataires CCi POUR TOUT saUnDestCCI DE stInfoMail.tbDestCCI Ajoute(unEmail..Cci,saUnDestCCI) FIN SI stInfoMail.stCompteMail.SMTP.bEnCopieCachee ALORS Ajoute(unEmail..Cci,stInfoMail.stCompteMail.SMTP.sLogin) stInfoMail.tbDestCCI.Ajoute(stInfoMail.stCompteMail.SMTP.sLogin) FIN // Le sujet unEmail..Sujet = stInfoMail.saSujet // Le corps du message unEmail..HTML = stInfoMail.bufCorpsHTML //Construction de la variable emailAttache saRQDoc est une chaîne ANSI = "SELECT DC_Nom, GUID, DC_PKID FROM Document WHERE Document.GUID IN " sComp est une chaîne ANSI POUR TOUT saGUIDDoc DE stInfoMail.tbPJ sComp += [","]+"'"+saGUIDDoc+"'" FIN SI sComp <> "" ALORS saRQDoc += "("+sComp+")" sdRqDoc est une Source de Données SI PAS HExécuteRequêteSQL(sdRqDoc,gcnxReplica,saRQDoc) ALORS sErreur ="Erreur lors de la récupération des pièces jointes" TraceINFO("Problème avec la req de document "+HErreurInfo(hErrComplet)) RENVOYER (sErreur,unEmail) SINON POUR TOUT sdRqDoc saCheminDoc = saCheminTemp+sdRqDoc.GUID+fExtraitChemin(sdRqDoc.DC_Nom,fExtension) TraceINFO("chemin doc "+saCheminDoc) SI fFichierExiste(saCheminDoc) ALORS monAttache..Nom = sdRqDoc.DC_Nom monAttache..Contenu = fChargeBuffer(saCheminDoc) //Ajout de la pièce jointe Ajoute(unEmail..Attache, monAttache) stInfoMail.tbPJID.Ajoute(sdRqDoc.DC_PKID) // Utilise par le service FIN FIN FIN SINON TraceINFO("Aucune pièce joint") FIN RENVOYER (sErreur,unEmail) FAIRE 12/08/2026 Batik_WS_Com_Mob 176

Partie 4 › Collection de procédures › LIB_Traitements › Code sErreur += "Une erreur s'est produite lors de la création de l'e-mail"+RC+ExceptionInfo(errComplet) TraceINFO("Erreur dans la CreationUnEmail "+sErreur) RENVOYER (sErreur,unEmail) FIN Procédure globale DonneGrouppeAppSelonGroupe PROCÉDURE DonneGrouppeAppSelonGroupe(sGroupe est une chaîne ANSI) sGroupeApp est une chaîne ANSI SELON sGroupe CAS "Dossier" sGroupeApp = cRp_Dossier CAS "Intervention" sGroupeApp = cRp_Inter CAS "Comptes-rendus" sGroupeApp = cRp_CR CAS "Donneurs d'ordres" sGroupeApp = cRp_CtDonneurs CAS "Client" sGroupeApp = cRp_Client CAS "Site" sGroupeApp = cRp_CtSite CAS "Rendez-vous" sGroupeApp = cRp_RDV AUTRE CAS sGroupeApp = "" FIN RENVOYER sGroupeApp Procédure globale DonneImgTableauRp PROCÉDURE DonneImgTableauRp(imgBuf est un Buffer,largPixCol est un entier) elt est un docElément QUAND EXCEPTION DANS img est une Image = imgBuf HauteurImg est un réel = (img..Hauteur*largPixCol)/img..Largeur dRedimensionne(img,largPixCol,HauteurImg,drHomothétiqueCentré) elt..Type = typeDocElémentImage elt..Image..BufferImage = img elt..Image..Habillage= docHabillageAlignéSurLeTexte // La taille de l'image est en pixels dans la variable de type Image. // Cette taille est convertie en mm dans l'élément (unité utilisée dans un document) elt..Image..Largeur = img..Largeur * 25.4 / 96.0 elt..Image..Hauteur = img..Hauteur * 25.4 / 96.0 // Position de l'image elt.Image.X = 0 elt.Image.Y = 0 RENVOYER elt FAIRE TraceERREUR("Erreur dans la création du rapport IMG"+ExceptionInfo()) RENVOYER elt FIN Procédure globale EnvoiRubMob 12/08/2026 Batik_WS_Com_Mob 177

Partie 4 › Collection de procédures › LIB_Traitements › Code PROCÉDURE EnvoiRubMob(ListeMob est un tableau de STJSONMembreRubRapport) n est un entier SI ListeMob..Occurrence <= 0 ALORS RENVOYER Faux FIN POUR TOUT stEle DE ListeMob SI stEle:EnvoiMob ALORS SI stEle.GroupeApp DANS (cRp_Client,cRp_CR,cRp_RDV) ALORS SI stEle.ListeDonnesBD <> "" ALORS n += 1 FIN SINON SI stEle.GroupeApp DANS (cRp_Photo,cRp_CtDonneurs,cRp_CtSite,cRp_Extra) ALORS n += 1 SINON SI stEle.ListeDonnesBD <> "" ALORS n+= 1 FIN FIN FIN SI n > 0 ALORS RENVOYER Vrai SINON RENVOYER Faux FIN Procédure globale InitialiseContexteUtilisateur PROCÉDURE InitialiseContexteUtilisateur(nIdUser est un entier sur 8 octets) TraceINFO(ChaîneConstruit("InitialiseContexteUtilisateur : %1",nIdUser)) QUAND EXCEPTION DANS InitialisationParametres() saRQ est une chaîne ANSI sdRec est une Source de Données saRQ=[ SELECT Collaborateur.GUID, Collaborateur.CO_Nom,Collaborateur.CO_Prenom,Collaborateur.CO_PKID,Collaborateur.CO_Ponderation ,R_PKID,R_Libelle,R_AncienCode, Societe.SO_Nom FROM Collaborateur INNER JOIN Utilisateur ON Collaborateur.CO_PKID= Utilisateur.UT_IDCollaborateur, Collaborateur INNER JOIN Societe_Collaborateur ON Collaborateur.CO_PKID=Societe_Collaborateur.SC_IDCollaborateur, Societe_Collaborateur INNER JOIN Societe ON Societe_Collaborateur.SC_IDCSociete =Societe.SO_PKID, Utilisateur INNER JOIN Role ON Utilisateur.UT_IDRole = Role.R_PKID WHERE Utilisateur.UT_PKID={pUserId} ] saRQ=Remplace(saRQ,"{pUserId}",nIdUser) SI HExécuteRequêteSQL(sdRec,gcnxReplica,saRQ) ALORS gstContexte.stUser.nIdUser =nIdUser gstContexte.stUser.nIdCollab =sdRec.CO_PKID gstContexte.stUser.saGuid =sdRec.GUID 12/08/2026 Batik_WS_Com_Mob 178

Partie 4 › Collection de procédures › LIB_Traitements › Code gstContexte.stUser.saNom =sdRec.CO_Nom gstContexte.stUser.saPrenom =sdRec.CO_Prenom gstContexte.stUser.saSociete =sdRec.SO_Nom gstContexte.stUser.nPond100 =(sdRec.CO_Ponderation=0 ? 100 SINON sdRec.CO_Ponderation * 100) // # A voir a quoi ca sert R_AncienCode avant PA_Valeur gstContexte.stUser.nIdGroupe =sdRec.R_AncienCode gstContexte.stUser.saProfil =sdRec.R_Libelle gstContexte.stUser.nIdProfil =sdRec.R_PKID gstContexte.saNomUser = sdRec.CO_Prenom + " " + sdRec.CO_Nom //Utile pour rendre la trace explicite //Récupération de la liste des ID des Etats d'intervention qui peuvent être transmis au mobile gstContexte.sLstEtatsInter = "'"+cCle_EtatInterSansSuite+"', '"+cCle_EtatInterTraite+"'" SI gstContexte.stUser.nIdProfil > 0 ALORS saReqDroits est une chaîne ANSI = [ SELECT AED_PKID, AED_CleAcces, AED_Acces FROM Role INNER JOIN AccesEtDroit ON AED_IdRole = R_PKID WHERE R_PKID = {p_IdRole} ] saReqDroits = Remplace(saReqDroits,"{p_IdRole}",gstContexte.stUser.nIdProfil) sdDroits est une Source de Données // exécution de la requête SI HExécuteRequêteSQL(sdDroits,gcnxReplica,saReqDroits) ALORS // charge les enregistrements en mémoire POUR TOUT sdDroits gstContexte.tbaDroitsAcces[sdDroits.aed_CleAcces] = sdDroits.aed_acces SI sdDroits.aed_CleAcces DANS (cGestion_DocNull, cGestion_DocPhoto, cGestion_DocAutre, cGestion_DocMsgExt,... cGestion_DocRapport, cGestion_DocBatigest) ET sdDroits.aed_acces ALORS SI gstContexte.sLstDocTypeAcces <> "" ALORS gstContexte.sLstDocTypeAcces += [","] FIN SELON sdDroits.aed_CleAcces CAS cGestion_DocNull gstContexte.sLstDocTypeAcces += "'"+cCle_TypeDocNull+"'" CAS cGestion_DocPhoto gstContexte.sLstDocTypeAcces += "'"+cCle_TypeDocImg+"'" CAS cGestion_DocAutre gstContexte.sLstDocTypeAcces += "'"+cCle_TypeDocAutre+"'" CAS cGestion_DocMsgExt gstContexte.sLstDocTypeAcces += "'"+cCle_TypeDocMsgExt+"'" CAS cGestion_DocRapport gstContexte.sLstDocTypeAcces += "'"+cCle_TypeDocRapport+"'" CAS cGestion_DocBatigest gstContexte.sLstDocTypeAcces += "'"+cCle_TypeDocBatigest+"'" AUTRE CAS FIN FIN FIN FIN SINON gstContexte.sLstDocTypeAcces= "" FIN RENVOYER Vrai SINON TraceDEBUG("InitialiseContexteUtilisateur(" + nIdUser + ") "+ RC + HErreurInfo(hErrComplet)) TraceDEBUG(saRQ) RENVOYER Faux 12/08/2026 Batik_WS_Com_Mob 179

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN FAIRE TraceDEBUG("InitialiseContexteUtilisateur(" + nIdUser + ") "+ RC + ExceptionInfo(errComplet)) RENVOYER Faux FIN Procédure globale ListeRDV PROCÉDURE ListeRDV(stData est une ST_MOB_DATA,tblRDV est un tableau de ST_RDV_INTER,bAvecNonPlanifie est un booléen) sErreur est une chaîne QUAND EXCEPTION DANS ChronoDébut() TraceINFO("ListeRDV ") stParam est un ST_REQ_LISTE_RDV Désérialise(stParam,stData.saJSON,psdJSON) //Construction de la requête de sélection saRQ est une chaîne ANSI saRQ=[ SELECT Planning_RDV.GUID AS PL_GUID, Planning_RDV.PL_PKID AS PL_PKID, Planning_RDV.PL_IDGroupe AS PL_IDGroupe, Planning_RDV.PL_Grouper AS PL_Grouper, Planning_RDV.PL_IDSociete AS PL_IDSociete, Planning_RDV.PL_IDEquipe AS PL_IDEquipe, Planning_RDV.PL_IDCollaborateur AS PL_IDCollaborateur, Planning_RDV.PL_IDDossier AS PL_IDDossier, Planning_RDV.PL_IDIntervention AS PL_IDIntervention, Planning_RDV.PL_IDTypeActivite AS PL_IDTypeActivite, Planning_RDV.PL_IDStatut AS PL_IDStatut, StatutRDV.PA_VALEUR AS saStatutRDV, Planning_RDV.PL_Objet AS PL_Objet, Planning_RDV.PL_Description AS PL_Description, Planning_RDV.PL_DateDebut AS PL_DateDebut, Planning_RDV.PL_DateFin AS PL_DateFin, Planning_RDV.PL_Superposable AS PL_Superposable, Planning_RDV.PL_Prive AS PL_Prive, Dossier.DO_IDClient AS DO_IDClient, Dossier.DO_IDTypeDossier AS DO_IDTypeDossier, Dossier.DO_Titre AS DO_Titre, Dossier.DO_IDStatut AS DO_IDStatut, Dossier.DO_RefInterne AS DO_RefInterne, Dossier.DO_RefExterne AS DO_RefExterne, Client.CL_Nom AS CL_Nom, Client.CL_Tel AS CL_Tel, Client.CL_Fax AS CL_Fax, AdClient.AD_PKID AS AdClient_PKID, AdClient.AD_Etiquette AS AdClient_Etiquette, AdClient.AD_Ligne_1 AS AdClient_Ligne_1, AdClient.AD_Ligne_2 AS AdClient_Ligne_2, AdClient.AD_Ligne_3 AS AdClient_Ligne_3, AdClient.AD_Ligne_4 AS AdClient_Ligne_4, AdClient.AD_Ligne_5 AS AdClient_Ligne_5, AdClient.AD_CodePostal AS AdClient_CodePostal, AdClient.AD_Ville AS AdClient_Ville, Intervention.IN_PKID AS IN_PKID, Intervention.IN_IDTypeIntervention AS IN_IDTypeIntervention, Intervention.IN_IDEtatIntervention AS IN_IDEtatIntervention, Intervention.IN_IDSuiviPar AS IN_IDSuiviPar, 12/08/2026 Batik_WS_Com_Mob 180

Partie 4 › Collection de procédures › LIB_Traitements › Code Intervention.IN_IDDossier AS IN_IDDossier, Intervention.IN_IDDemandeur AS IN_IDDemandeur, Intervention.IN_IDClient AS IN_IDClient, Intervention.IN_IDLieu AS IN_IDLieu, Intervention.IN_Description AS IN_Description, Intervention.IN_AttestationTVAPresente AS IN_AttestationTVAPresente, Intervention.IN_NoteInterne AS IN_NoteInterne, Intervention.IN_Titre AS IN_Titre, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.IN_RefExterne AS IN_RefExterne, Intervention.IN_IDSociete, Intervention.IN_NumDevis, Intervention.IN_DateDevis, Lieu.LI_PKID AS LI_PKID, Lieu.LI_CodeLieu AS LI_CodeLieu, Lieu.LI_IDAdresse AS LI_IDAdresse, Lieu.LI_IDType AS LI_IDType, Lieu.LI_CodeAcces AS LI_CodeAcces, Lieu.LI_Badge AS LI_Badge, Lieu.LI_Interphone AS LI_Interphone, Lieu.LI_Note AS LI_Note, AdLieu.AD_PKID AS AdLieu_PKID, AdLieu.AD_Etiquette AS AdLieu_Etiquette, AdLieu.AD_Ligne_1 AS AdLieu_Ligne_1, AdLieu.AD_Ligne_2 AS AdLieu_Ligne_2, AdLieu.AD_Ligne_3 AS AdLieu_Ligne_3, AdLieu.AD_Ligne_4 AS AdLieu_Ligne_4, AdLieu.AD_Ligne_5 AS AdLieu_Ligne_5, AdLieu.AD_CodePostal AS AdLieu_CodePostal, AdLieu.AD_Ville AS AdLieu_Ville, Planning_RDV.PL_IDLieu AS PL_IDLieu, Societe.SO_Nom, Collaborateur.CO_Nom AS NomSuiviPar, Collaborateur.CO_Prenom AS PrenomSuiviPar, Collaborateur.CO_TelMobile AS TelMobSuiviPar FROM Planning_RDV LEFT OUTER JOIN Intervention ON Planning_RDV.PL_IDIntervention = Intervention.IN_PKID ,Intervention LEFT OUTER JOIN Lieu ON Intervention.IN_IDLieu = Lieu.LI_PKID ,Lieu LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID ,Intervention LEFT OUTER JOIN CompteRendu ON (CompteRendu.CR_IDIntervention=Intervention.IN_PKID) ,Planning_RDV LEFT OUTER JOIN Dossier ON Planning_RDV.PL_IDDossier = Dossier.DO_PKID ,Dossier LEFT OUTER JOIN Client ON Dossier.DO_IDClient = Client.CL_PKID ,Client LEFT OUTER JOIN Adresse AdClient ON Client.CL_IDAdressePrincipale = AdClient.AD_PKID ,Intervention LEFT OUTER JOIN Societe ON Intervention.IN_IDSociete = Societe.SO_PKID ,Planning_RDV LEFT OUTER JOIN ParametreMetier AS StatutRDV ON Planning_RDV.PL_IDSTATUT=StatutRDV.PA_PKID ,Intervention LEFT OUTER JOIN Collaborateur ON Intervention.IN_IDSuiviPar=Collaborateur.CO_PKID WHERE ( Planning_RDV.PL_IDCollaborateur = {pIDCollaborateur} AND ( ( Planning_RDV.PL_IDStatut<>{p_IDNonPlanifie} AND Planning_RDV.PL_DateDebut >= '{pDateDebut}' AND Planning_RDV.PL_DateFin <= '{pDateFin}' ) 12/08/2026 Batik_WS_Com_Mob 181

Partie 4 › Collection de procédures › LIB_Traitements › Code OR ( Planning_RDV.PL_IDStatut={p_IDNonPlanifie} AND 1={p_AvecNonPlanifie} ) ) AND Planning_RDV.Archive=0 AND Planning_RDV.PL_IDTypeActivite={p_IDTypeIntervention} ) ORDER BY IN_PKID ASC ] saRQ= Remplace(saRQ,"{pIDCollaborateur}",stParam.nIdCollaborateur) saRQ= Remplace(saRQ,"{pDateDebut}",stParam.saDateDebut) saRQ= Remplace(saRQ,"{pDateFin}",stParam.saDateFin) saRQ= Remplace(saRQ,"{p_AvecNonPlanifie}",bAvecNonPlanifie ? 1 SINON 0) saRQ= Remplace(saRQ,"{p_IDNonPlanifie}",DonneIdParametre(cCle_RDVAPlanifier)) saRQ= Remplace(saRQ,"{p_IDTypeIntervention}",DonneIdParametre(cCle_RDVInter)) //Construction de la réponse (tableau de ST_RDV_INTER) saRqCR est une chaîne ANSI = [ SELECT CompteRendu.CR_PKID, CompteRendu.GUID AS CR_GUID, CompteRendu.CR_DateHeureDebut, CompteRendu.CR_DateHeureFin, CompteRendu.CR_NoteCollaborateur, CompteRendu.CR_NomSignataire, CompteRendu.CR_NoteSignataire, CompteRendu.CR_DateHeureSignature, CompteRendu.CR_Signature, CompteRendu.CreationUser AS CR_CreationUser, CompteRendu.CR_IDIntervention, CompteRendu.CR_IDRdv, Planning_RDV.PL_IDCollaborateur, Planning_RDV.PL_IDGroupe FROM CompteRendu INNER JOIN Planning_RDV ON PL_PKID = CR_IDRdv WHERE Planning_RDV.Archive=0 AND Planning_RDV.PL_IDTypeActivite={p_IDTypeIntervention} AND PL_IDGroupe=Planning_RDV.PL_IDGroupe AND ( ( Planning_RDV.PL_IDStatut<>{p_IDNonPlanifie} AND Planning_RDV.PL_DateDebut >= '{pDateDebut}' AND Planning_RDV.PL_DateFin <= '{pDateFin}' ) OR ( Planning_RDV.PL_IDStatut={p_IDNonPlanifie} AND 1={p_AvecNonPlanifie} ) ) ] //saRqCR= Remplace(saRqCR,"{pIDCollaborateur}",stParam.nIdCollaborateur) saRqCR = Remplace(saRqCR,"{pDateDebut}",stParam.saDateDebut) saRqCR = Remplace(saRqCR,"{pDateFin}",stParam.saDateFin) saRqCR = Remplace(saRQ,"{p_IDNonPlanifie}",DonneIdParametre(cCle_RDVAPlanifier)) saRqCR = Remplace(saRQ,"{p_IDTypeIntervention}",DonneIdParametre(cCle_RDVInter)) 12/08/2026 Batik_WS_Com_Mob 182

Partie 4 › Collection de procédures › LIB_Traitements › Code saRqCR = Remplace(saRqCR,"{p_AvecNonPlanifie}",bAvecNonPlanifie ? 1 SINON 0) sErreur = ConstruitTableauInterventions(saRQ,saRqCR,Vrai,tblRDV) RENVOYER sErreur FAIRE sErreur ="E" + ExceptionInfo(errComplet) TraceDEBUG("bufREs : " + sErreur) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER sErreur FIN PROCÉDURE INTERNE ExtraitDescription(saDescript est une chaîne ANSI) p est un entier= Position(saDescript,"##########",0,DepuisFin) SI p>0 ALORS RENVOYER saDescriptp+10 À SINON RENVOYER saDescript FIN FIN Procédure globale ListeRDV_V2 PROCÉDURE ListeRDV_V2(stData est une ST_MOB_DATA,tbLRDV est un tableau de ST_RDV_INTER_V2, bAvecNonPlanifie est un booléen) sErreur est une chaîne QUAND EXCEPTION DANS ChronoDébut() TraceINFO("ListeRDV ") saRQ_1 est une chaîne ANSI sdRec est une Source de Données saRQ_1 = "SELECT * FROM ParametreMetier WHERE PA_Categorie='"+cParam_TypeRDV+"' AND PA_Actif=1 " saListeTypeActivite est une chaîne ANSI SI HExécuteRequêteSQL(sdRec,gcnxReplica,saRQ_1) ALORS HLitPremier(sdRec) TANTQUE PAS HEnDehors() ValJson est un ST_JSON_Type_RDV bufBufJson est un Buffer SI sdRec.PA_Parametre <> "" ALORS bufBufJson = sdRec.PA_Parametre Désérialise(ValJson,bufBufJson,psdJSON) SI ValJson.envoi_mobile ALORS SI saListeTypeActivite <> "" ALORS saListeTypeActivite += " , " FIN saListeTypeActivite += "'"+sdRec.PA_CLE+"'" FIN FIN HLitSuivant() FIN TraceERREUR("liste type de activite : " + saListeTypeActivite) SINON sErreur="E"+HErreurInfo(errComplet) TraceERREUR("ConstruitTableauInterventionsAvecCopmteRendu liste type de activite : " + sErreur) RENVOYER sErreur FIN stParam est un ST_REQ_LISTE_RDV Désérialise(stParam,stData.saJSON,psdJSON) 12/08/2026 Batik_WS_Com_Mob 183

Partie 4 › Collection de procédures › LIB_Traitements › Code //Construction de la requête de sélection saRQ est une chaîne ANSI saRQ=[ SELECT RDV_Collaborateur.GUID as GUID_RDV_COLB, RVC_GUID_RDV, RVC_PKID, RV_PKID, RV_Groupe, RV_IdSociete, RVC_GUID_Colb, RV_IdDossier, RV_IdInter, RV_CleType, RV_CleStatut, RV_Objet, RV_Description, RVC_DateDeb, RVC_DateFin, RVC_Superposable, RVC_CR, RV_SAV, RV_IdLieu, RVC_CleStatut, Dossier.DO_IDClient AS DO_IDClient, Dossier.DO_CleType, Dossier.DO_Titre AS DO_Titre, Dossier.DO_CleStatut, Dossier.DO_RefInterne AS DO_RefInterne, Dossier.DO_RefExterne AS DO_RefExterne, Client.CL_Nom AS CL_Nom, Client.CL_Tel AS CL_Tel, Client.CL_Fax AS CL_Fax, Client.CL_Email AS CL_Email, AdClient.AD_PKID AS AdClient_PKID, AdClient.AD_Etiquette AS AdClient_Etiquette, AdClient.AD_Adresse AS AdClient_Adresse, AdClient.AD_CodePostal AS AdClient_CodePostal, AdClient.AD_Ville AS AdClient_Ville, Intervention.IN_PKID AS IN_PKID, Intervention.IN_CleType, Intervention.IN_CleEtat, Intervention.IN_IDSuiviPar AS IN_IDSuiviPar, Intervention.IN_IDDossier AS IN_IDDossier, Intervention.IN_IDDemandeur AS IN_IDDemandeur, Intervention.IN_IDClient AS IN_IDClient, Intervention.IN_IDLieu AS IN_IDLieu, Intervention.IN_Description AS IN_Description, Intervention.IN_AttestationTVAPresente AS IN_AttestationTVAPresente, Intervention.IN_NoteInterne AS IN_NoteInterne, Intervention.IN_Titre AS IN_Titre, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.IN_RefExterne AS IN_RefExterne, Intervention.IN_IDSociete, Intervention.IN_NumDevis, Intervention.IN_DateDevis, Lieu.LI_PKID AS LI_PKID, Lieu.LI_CodeLieu AS LI_CodeLieu, Lieu.LI_IDAdresse AS LI_IDAdresse, Lieu.LI_IDType AS LI_IDType, Lieu.LI_CodeAcces AS LI_CodeAcces, Lieu.LI_Badge AS LI_Badge, Lieu.LI_Interphone AS LI_Interphone, Lieu.LI_Note AS LI_Note, Lieu.LI_CleType, AdLieu.AD_PKID AS AdLieu_PKID, 12/08/2026 Batik_WS_Com_Mob 184

Partie 4 › Collection de procédures › LIB_Traitements › Code AdLieu.AD_Etiquette AS AdLieu_Etiquette, AdLieu.AD_Adresse AS AdLieu_Adresse, AdLieu.AD_CodePostal AS AdLieu_CodePostal, AdLieu.AD_Ville AS AdLieu_Ville, Societe.SO_Nom, Collaborateur.CO_Nom AS NomSuiviPar, Collaborateur.CO_Prenom AS PrenomSuiviPar, Collaborateur.CO_TelMobile AS TelMobSuiviPar, Collaborateur.CO_Email AS SuiviEmail FROM RDV_Collaborateur INNER JOIN RDV_Planning on RDV_Planning.GUID = RDV_Collaborateur.RVC_GUID_RDV LEFT JOIN Intervention ON RDV_Planning.RV_IdInter = Intervention.IN_PKID LEFT OUTER JOIN Lieu ON Intervention.IN_IDLieu = Lieu.LI_PKID LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID LEFT OUTER JOIN Dossier ON RDV_Planning.RV_IdDossier = Dossier.DO_PKID LEFT OUTER JOIN Client ON Dossier.DO_IDClient = Client.CL_PKID LEFT OUTER JOIN Adresse AdClient ON Client.CL_IDAdressePrincipale = AdClient.AD_PKID LEFT OUTER JOIN Societe ON Intervention.IN_IDSociete = Societe.SO_PKID LEFT OUTER JOIN Collaborateur ON Intervention.IN_IDSuiviPar=Collaborateur.CO_PKID WHERE ( RDV_Collaborateur.RVC_GUID_Colb = '{pGUIDCollaborateur}' AND ( ( RDV_Planning.RV_CleStatut<>'{p_CLENonPlanifie}' AND RDV_Collaborateur.RVC_DateDeb >= '{pDateDebut}' AND RDV_Collaborateur.RVC_DateFin <= '{pDateFin}' ) OR ( RDV_Planning.RV_CleStatut='{p_CLENonPlanifie}' AND 1={p_AvecNonPlanifie} ) ) AND RDV_Collaborateur.Archive=0 AND RDV_Planning.Archive = 0 {p_Compl_TypeAct} ) ORDER BY IN_PKID ASC ] saGuidC est une chaîne ANSI = DonneGuidIdColb(stParam.nIdCollaborateur) saRQ= Remplace(saRQ,"{pGUIDCollaborateur}",saGuidC) saRQ= Remplace(saRQ,"{pDateDebut}",stParam.saDateDebut) saRQ= Remplace(saRQ,"{pDateFin}",stParam.saDateFin) saRQ= Remplace(saRQ,"{p_AvecNonPlanifie}",bAvecNonPlanifie ? 1 SINON 0) saRQ= Remplace(saRQ,"{p_CLENonPlanifie}",cCle_RDVAPlanifier) saRQ=Remplace(saRQ,"{p_Compl_TypeAct}","AND RDV_Planning.RV_CleType IN ("+saListeTypeActivite+")") // SI stData.saCMD = cCMD_ListeRDV_V2 ou stData.saCMD = cCMD_ListeRDV_Clb ALORS // saRQ=Remplace(saRQ,"{p_Compl_TypeAct}","AND RDV_Planning.RV_CleType IN ("+saListeTypeActivite+")") // //saRQ=Remplace(saRQ,"{p_ListeIDTypeIntervention}",saListeTypeActivite) // SINON // saRQ=Remplace(saRQ,"{p_Compl_TypeAct}","AND RDV_Planning.RV_CleType = "+cCle_RDVInter) // FIN //Construction de la réponse (tableau de ST_RDV_INTER) TraceERREUR("REQ liste type de activite : " + saRQ) saRqCR est une chaîne ANSI = [ SELECT CompteRendu.CR_PKID, 12/08/2026 Batik_WS_Com_Mob 185

Partie 4 › Collection de procédures › LIB_Traitements › Code CompteRendu.GUID AS CR_GUID, CompteRendu.CR_DateHeureDebut, CompteRendu.CR_DateHeureFin, CompteRendu.CR_NoteCollaborateur, CompteRendu.CR_NomSignataire, CompteRendu.CR_NomSignataireTech, CompteRendu.CR_NoteSignataire, CompteRendu.CR_ReserveCommentaire, CompteRendu.CR_DateHeureSignature, CompteRendu.CR_Signature, CompteRendu.CR_SignatureTech, CompteRendu.CreationUser AS CR_CreationUser, CompteRendu.CR_IDIntervention, CompteRendu.CR_GUID_Rdv, CompteRendu.CR_CleTypeSignataire, CompteRendu.CR_IDCollaborateur, CompteRendu.CR_IDRdv, RDV_Collaborateur.RVC_GUID_Colb, RDV_Collaborateur.RVC_GUID_RDV, Collaborateur.CO_Nom, Collaborateur.CO_Prenom FROM CompteRendu INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_GUID_RDV = CompteRendu.CR_GUID_Rdv INNER JOIN RDV_Planning ON RDV_Planning.GUID = CR_GUID_Rdv INNER JOIN Collaborateur ON CO_PKID = CR_IDCollaborateur WHERE RDV_Planning.Archive=0 AND RDV_Collaborateur.Archive=0 {p_Compl_TypeAct} AND ( ( RDV_Planning.RV_CleStatut<>'{p_CleNonPlanifie}' AND RDV_Collaborateur.RVC_DateDeb >= '{pDateDebut}' AND RDV_Collaborateur.RVC_DateFin <= '{pDateFin}' ) OR ( RDV_Collaborateur.RVC_CleStatut='{p_CleNonPlanifie}' AND 1={p_AvecNonPlanifie} ) ) ] //saRqCR= Remplace(saRqCR,"{pIDCollaborateur}",stParam.nIdCollaborateur) saRqCR = Remplace(saRqCR,"{pDateDebut}",stParam.saDateDebut) saRqCR = Remplace(saRqCR,"{pDateFin}",stParam.saDateFin) saRqCR = Remplace(saRqCR,"{p_CleNonPlanifie}",cCle_RDVAPlanifier) saRqCR = Remplace(saRqCR,"{p_AvecNonPlanifie}",bAvecNonPlanifie ? 1 SINON 0) SI stData.saCMD = cCMD_ListeRDV_V2 ALORS saRqCR=Remplace(saRqCR,"{p_Compl_TypeAct}","AND RDV_Planning.RV_CleType IN ("+ saListeTypeActivite+")") SINON saRqCR=Remplace(saRqCR,"{p_Compl_TypeAct}","AND RDV_Planning.RV_CleType = '"+cCle_RDVInter+"'") FIN sErreur =ConstruitTableauInterventions_V2(saRQ,saRqCR,Vrai,Vrai,tbLRDV) RENVOYER sErreur FAIRE sErreur ="E" + ExceptionInfo(errComplet) TraceDEBUG("bufREs : " + sErreur) TraceDEBUG("Durée (ms) : " + ChronoFin()) 12/08/2026 Batik_WS_Com_Mob 186

Partie 4 › Collection de procédures › LIB_Traitements › Code RENVOYER sErreur FIN PROCÉDURE INTERNE ExtraitDescription(saDescript est une chaîne ANSI) p est un entier= Position(saDescript,"##########",0,DepuisFin) SI p>0 ALORS RENVOYER saDescriptp+10 À SINON RENVOYER saDescript FIN FIN Procédure globale ListeReferenceDOC //Récupère la liste des documents associés à une intervention PROCÉDURE ListeReferenceDOC(stData est une ST_MOB_DATA) stParam est un ST_REQ_LISTE_DOC saRep est une chaîne ANSI tblDoc est un tableau de ST_TABELEM_DOC bufRes est un Buffer Désérialise(stParam,stData.saJSON,psdJSON) SI gstContexte.stUser.nIdProfil <= 0 ALORS bufRes="E"+ " Type de profil inconnu" TraceDEBUG("bufREs : " + bufRes) Sérialise(tblDoc,saRep,psdJSON) TraceINFO("ListeReferenceDOC :"+ saRep) RENVOYER "R"+saRep FIN saRQ est une chaîne ANSI =[ SELECT DISTINCT Document.DC_PKID AS DC_PKID ,Document.DC_IDIntervention AS DC_IDIntervention ,Document.DC_Nom AS DC_Nom ,Document.DC_CleCategorie ,Document.DC_DateFichier AS DC_DateFichier ,Document.GUID AS GUID ,DocumentNote.DN_Note as DN_Note ,DocumentNote.CreationDate AS DN_Date ,DocumentNote.CreationUser AS DN_Auteur ,DocumentNote.DN_PKID AS DN_PKID ,DocumentNote.GUID as DN_GUID ,Utilisateur.UT_IDCollaborateur ,Collaborateur.CO_Nom as UT_Nom ,Collaborateur.CO_Prenom as UT_Prenom FROM Document LEFT OUTER JOIN DocumentNote ON Document.DC_PKID = DocumentNote.DN_IDDocument ,DocumentNote LEFT OUTER JOIN Utilisateur ON DocumentNote.CreationUser= Utilisateur.UT_PKID ,Utilisateur LEFT OUTER JOIN Collaborateur ON Collaborateur.CO_PKID = Utilisateur.UT_IDCollaborateur WHERE Document.DC_IDIntervention = {pIDIntervention} AND Document.DC_Nom <>'' AND Document.GUID <>'' AND DC_CleCategorie IN ({p_CtgDocs}) ] saRQ=Remplace(saRQ,"{pIDIntervention}",NumériqueVersChaîne(stParam.nIdIntervention)) 12/08/2026 Batik_WS_Com_Mob 187

Partie 4 › Collection de procédures › LIB_Traitements › Code saRQ=Remplace(saRQ,"{p_CtgDocs}",gstContexte.sLstDocTypeAcces) saRQ+=" ORDER BY Document.DC_DateFichier, Document.DC_PKID" sdDoc est une Source de Données TraceDEBUG("ListeReferenceDOC - SQL : " + saRQ) //TraceINFO(saRQ) SI PAS HExécuteRequêteSQL(sdDoc,gcnxReplica,hRequêteDéfaut,saRQ) ALORS saRep="E"+ErreurInfo(errComplet) RENVOYER saRep FIN nDocID est un entier sur 8 octets stDoc est une ST_TABELEM_DOC stNt est un ST_TABELEM_NOTEDOC nIndice est un entier POUR TOUT sdDoc SI nDocID<>sdDoc.DC_PKID ALORS nDocID = sdDoc.DC_PKID stDoc.nDC_PKID = sdDoc.DC_PKID stDoc.nDC_IdInter = sdDoc.DC_IDIntervention stDoc.saDC_Nom = sdDoc.DC_Nom stDoc.saLibCat = DonneLibParametre(sdDoc.DC_CleCategorie) stDoc.saDC_DteFic = sdDoc.DC_DateFichier stDoc.saDocGuid = sdDoc.GUID nIndice=tblDoc.Ajoute(stDoc) FIN //Remplissage du tableau des notes SI sdDoc.DN_Note<>"" ALORS stNt.saGUID = sdDoc.DN_GUID stNt.saDN_Note = sdDoc.DN_Note stNt.saDN_Date = sdDoc.DN_Date //stNt.nDN_Auteur = sdDoc.DN_Auteur stNt.nIdUsr = sdDoc.DN_Auteur stNt.saNomAuteur =sdDoc.UT_Prenom + [" "]+ sdDoc.UT_Nom stNt.nDN_DOCPKID = sdDoc.DC_PKID tblDoc[nIndice].tblNotes.Ajoute(stNt) FIN FIN HAnnuleDéclaration(sdDoc) Sérialise(tblDoc,saRep,psdJSON) TraceINFO("ListeReferenceDOC :"+ saRep) RENVOYER "R"+saRep Procédure globale ListeTemps PROCÉDURE ListeTemps(stData est une ST_MOB_DATA) bufRes est un Buffer ChronoDébut() QUAND EXCEPTION DANS //Tableau des Temps passés tbTemps est un tableau de ST_TEMPS //Récupération des paramètres de la requête dans stData.saJSON 12/08/2026 Batik_WS_Com_Mob 188

Partie 4 › Collection de procédures › LIB_Traitements › Code stParam est un ST_REQ_LISTE_TEMPS Désérialise(stParam,stData.saJSON,psdJSON) sdTps est une Source de Données saRQ est une chaîne ANSI=[ SELECT SDT_PKID,GUID,SDT_IDIntervention,SDT_IDCollaborateur,SDT_DateDebut,SDT_DateHeureFin,SDT_Pondera tion,SDT_NbMinutes,SDT_CleType,SDT_Libelle, Intervention.IN_RefInterne FROM SUIVIDESTEMPS LEFT OUTER JOIN Intervention ON SuiviDesTemps.SDT_IDIntervention = Intervention.IN_PKID WHERE (SDT_DateDebut BETWEEN '{pDebut}' AND '{pFin}' ) AND SDT_IDCollaborateur={pIdCollaborateur} ORDER BY SDT_DateDebut DESC ] saRQ=Remplace(saRQ,"{pDebut}",stParam.saDateDebut) saRQ=Remplace(saRQ,"{pFin}",stParam.saDateFin) saRQ=Remplace(saRQ,"{pIdCollaborateur}",stParam.nIdCollaborateur) SI PAS HExécuteRequêteSQL(sdTps,gcnxReplica,hRequêteDéfaut,saRQ) ALORS TraceDEBUG("Erreur lecture des Temps " + HErreurInfo(hErrComplet)) SINON stTps est un ST_TEMPS POUR TOUT sdTps stTps:nIdInter = sdTps.SDT_IDIntervention stTps:nIdTps = sdTps.SDT_PKID stTps:nIdCollab = sdTps.SDT_IDCollaborateur stTps:saNumInter = sdTps.IN_RefInterne stTps:saHeureDebut = sdTps.SDT_DateDebut stTps:nNbMinutes = sdTps.SDT_NbMinutes stTps:saHeureFin = sdTps.SDT_DateHeureFin stTps:nPond100 = sdTps.SDT_Ponderation*100 stTps:nIdTypeTps = DonneIdParametre(sdTps.SDT_CleType) stTps:saLibelle = sdTps.SDT_Libelle stTps:saGuid = sdTps.GUID tbTemps.Ajoute(stTps) FIN Sérialise(tbTemps,bufRes,psdJSON) FIN RENVOYER "R" + bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale ListeTempsPasse PROCÉDURE ListeTempsPasse(stData est une ST_MOB_DATA) bufRes est un Buffer ChronoDébut() QUAND EXCEPTION DANS stRdvTemp est un ST_TEMPS_PASSE_RDV 12/08/2026 Batik_WS_Com_Mob 189

Partie 4 › Collection de procédures › LIB_Traitements › Code //Tableau des Temps passés //tbTemps est un tableau de ST_TEMPS_PASSE //Récupération des paramètres de la requête dans stData.saJSON stParam est un ST_REQ_LISTE_TEMPS_PASSE Désérialise(stParam,stData.saJSON,psdJSON) sdTps est une Source de Données saRQ est une chaîne ANSI=[ SELECT SDT_PKID,GUID,SDT_IDIntervention,SDT_IDCollaborateur,SDT_DateDebut,SDT_DateHeureFin,SDT_NbMinut es,SDT_CleType,SDT_Libelle, Intervention.IN_RefInterne,SDT_IDRdv,SDT_Controle FROM SUIVIDESTEMPS LEFT OUTER JOIN Intervention ON SuiviDesTemps.SDT_IDIntervention = Intervention.IN_PKID //WHERE (SDT_DateDebut BETWEEN '{pDebut}' AND '{pFin}' ) AND SDT_IDCollaborateur={pIdCollaborateur} WHERE SDT_IDRdv={p_IDRdv} AND SDT_IDCollaborateur={pIdCollaborateur} //ORDER BY SDT_DateDebut DESC ] saRQ=Remplace(saRQ,"{p_IDRdv}",stParam.nIdrdv) saRQ=Remplace(saRQ,"{pIdCollaborateur}",stParam.nIdCollaborateur) SI PAS HExécuteRequêteSQL(sdTps,gcnxReplica,hRequêteDéfaut,saRQ) ALORS TraceDEBUG("Erreur lecture des Temps passés" + HErreurInfo(hErrComplet)) SINON stRdvTemp.nIdRDV = sdTps.SDT_IDRdv stTps est un ST_TEMPS_PASSE POUR TOUT sdTps stTps:saGuid = sdTps.GUID stTps:nIdTypeTps = DonneIdParametre(sdTps.SDT_CleType) stTps:nTemps = sdTps.SDT_NbMinutes stTps:saDateHeureDeb = sdTps.SDT_DateDebut stTps:saDateHeureFin = sdTps.SDT_DateHeureFin stTps:bModifiable = sdTps.SDT_Controle ? Faux SINON sdTps.SDT_IDCollaborateur=stParam. nIdCollaborateur stRdvTemp.tblTemps.Ajoute(stTps) FIN Sérialise(stRdvTemp,bufRes,psdJSON) FIN RENVOYER "R" + bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale MotCleModeleEmail_Rub_Rapport PROCÉDURE MotCleModeleEmail_Rub_Rapport(TermeRapportEmail est un STJSONRubriqueRapport,TermeRapport est un STJSONRubriqueRapport) n est un entier 12/08/2026 Batik_WS_Com_Mob 190

Partie 4 › Collection de procédures › LIB_Traitements › Code sGrouppeApp est une chaîne ANSI saRQRub est une chaîne ANSI = [ SELECT * FROM MotClef WHERE MOC_Langue='FR' ] sdRqRub est une Source de Données SI PAS HExécuteRequêteSQL(sdRqRub,gcnxReplica,saRQRub) ALORS // modele introuvable SINON POUR TOUT sdRqRub n = TableauCherche(TermeRapport.ListeTerme,tcLinéaire,"Groupe;MembreEmailMob",sdRqRub. MOC_Groupe,sdRqRub.MOC_Code) SI n <= 0 ALORS sGrouppeApp = DonneGrouppeAppSelonGroupe(sdRqRub.MOC_Groupe) SI sGrouppeApp = cRp_Client OU sGrouppeApp = cRp_Dossier ALORS POUR TOUT stUnTerme, v de TermeRapport.ListeTerme SI Contient(stUnTerme:MembreEmailMob,sdRqRub.MOC_Code,MotComplet+SansCasse) ALORS n = v SORTIR FIN FIN FIN FIN stMC est un STJSONMembreRubRapport SI n > 0 ALORS stMC = TermeRapport.ListeTerme[n] SINON stMC.Nom = sdRqRub.MOC_Lib stMC.MembreMob = sdRqRub.MOC_Code n = TableauCherche(TermeRapport.ListeTerme,tcLinéaire,"Groupe", sdRqRub.MOC_Groupe) SI n > 0 ALORS stMC.GroupeApp = TermeRapport.ListeTerme[n].GroupeApp stMC.Groupe = TermeRapport.ListeTerme[n].Groupe SINON stMC.GroupeApp = DonneGrouppeAppSelonGroupe(sdRqRub.MOC_Groupe) stMC.MembreMob = Remplace(sdRqRub.MOC_Code,".", "_") FIN stMC.EnvoiMob = Faux FIN stMC.Rubrique = sdRqRub.MOC_Mot TermeRapportEmail.ListeTerme.Ajoute(stMC) FIN FIN Procédure globale OuvreConnexionsHF PROCÉDURE OuvreConnexionsHF() RENVOYER Vrai RENVOYER EXE_OuvreConnexionHFSQL() 12/08/2026 Batik_WS_Com_Mob 191

Partie 4 › Collection de procédures › LIB_Traitements › Code QUAND EXCEPTION DANS gcnxBaseSync..Serveur="127.0.0.1:" + gstContexte.saNumPort gcnxBaseSync..BaseDeDonnées = gstContexte.saBaseSync gcnxReplica..Serveur="127.0.0.1:" + gstContexte.saNumPort gcnxReplica..BaseDeDonnées=gstContexte.saBaseData TraceINFO("OuvreConnexionsHF :" + gstContexte.saNumPort) HChangeConnexion("*",gcnxBaseSync) gsaPass = BufferVersHexa(HashChaîne(HA_MD5_128,gcnxReplica..BaseDeDonnées),SansRegroupement) sPassSysteme est une chaîne ANSI= BufferVersHexa(HashChaîne(HA_MD5_128,Mdp3 + gcnxReplica.. BaseDeDonnées),SansRegroupement) SI PAS HOuvreConnexion(gcnxBaseSync) ALORS TraceERREUR("ERREUR OuvreConnexionsHF " + gcnxBaseSync..BaseDeDonnées + RC + gcnxBaseSync.. Serveur +RC+ HErreurInfo(hErrComplet) ) RENVOYER Faux FIN SI PAS HOuvreConnexion(gcnxReplica) ALORS TraceERREUR("ERREUR OuvreConnexionsHF " + gcnxReplica..BaseDeDonnées + RC + gcnxReplica.. Serveur +RC+ HErreurInfo(hErrComplet) ) RENVOYER Faux FIN //Vérification ultime de la présence de la base de données du client sur le serveur saLst est une chaîne ANSI = HListeBaseDeDonnées(gcnxReplica,hLstNormal) SI ChaîneOccurrence(saLst, gstContexte.saBaseData ,SansCasse) =0 ALORS TraceERREUR("ERREUR OuvreConnexionsHF : La base client n'existe pas sur ce serveur HF " + saLst ) RENVOYER Faux FIN //Déclaration Externe de tous les fichiers du répliqua saLst = HListeFichier(gcnxReplica) POUR TOUTE CHAÎNE saFic DE saLst SÉPARÉE PAR RC SI ChaîneOccurrence(saFic,"")=0 ALORS SI saFic="ParametreSysteme.fic" OU saFic="ParametreMetierEntete.fic" OU saFic=" Etats.fic" ALORS SI PAS HPasse(ExtraitChaîne(saFic,1,"."),sPassSysteme) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN SINON SI PAS HPasse(ExtraitChaîne(saFic,1,"."),gsaPass) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN SI PAS HDéclareExterne(saFic,ExtraitChaîne(saFic,1,"."),gcnxReplica) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN FIN //Déclaration Externe de la table paramètres pour pouvoir la manipuler avec des fonction Hxxx HPasse(gsdParamApplication,gsaPass) HDéclareExterne("ParametreApplication.fic",gsdParamApplication,gcnxReplica) TraceINFO("Connexions OK") RENVOYER Vrai FAIRE TraceERREUR("ERREUR OuvreConnexionsHF " + ExceptionInfo(errComplet) ) RENVOYER Faux 12/08/2026 Batik_WS_Com_Mob 192

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN Procédure globale OuvreSessionEmail PROCÉDURE OuvreSessionEmail(LOCAL nMode est un entier, LOCAL sLogin est une chaîne, LOCAL sMdp est une chaîne, LOCAL sAdresseServeur est une chaîne,LOCAL sPortServeur est une chaîne, LOCAL nCryptage est un entier) bResultat est un booléen EmailChangeTimeOut(10) //1=IMAP //2=POP3 //3=SMTP SELON nMode CAS 1 : bResultat = EmailOuvreSessionIMAP(sLogin, sMdp, sAdresseServeur, Val(sPortServeur), nCryptage=1 ? emailOptionDéfaut SINON nCryptage=2 ? emailOptionSécuriséTLS SINON optionSSL) CAS 2 : bResultat = EmailOuvreSessionPOP3(sLogin, sMdp, sAdresseServeur, Val(sPortServeur), nCryptage=1 ? emailOptionDéfaut SINON nCryptage=2 ? emailOptionSécuriséTLS SINON optionSSL) CAS 3 : bResultat = EmailOuvreSessionSMTP(sLogin, sMdp, sAdresseServeur, Val(sPortServeur), Faux, nCryptage=1 ? emailOptionDéfaut SINON nCryptage=2 ? emailOptionSécuriséTLS SINON optionSSL) FIN sMsg est une chaîne SI ErreurDétectée() ALORS sMsg = ErreurInfo(errComplet) bResultat = Faux FIN RENVOYER (bResultat,sMsg) Procédure globale PurgeTOMOB_24h PROCÉDURE PurgeTOMOB_24h() //Supprime tous les enregistrements de plus de 24h rq est une Requête SQL = [ DELETE FROM TOMOB WHERE TM_Date < {pDate} ] dh est une DateHeure = DateHeureSys() dh..Heure -= 24 rq.pDate=dh HExécuteRequête(rq) Procédure globale RechercheDonneesSimpleRapportMob PROCÉDURE RechercheDonneesSimpleRapportMob(ListeMob est un tableau de STJSONMembreRubRapport, unTerme est un STJSONMembreRubRapport) b est un entier sAInfoRemp est une chaîne ANSI SI unTerme:EnvoiMob ALORS b = TableauCherche(ListeMob,tcLinéaire,"Rubrique;Utilisee",unTerme:Rubrique, Faux) FIN TraceINFO("b => "+b+" "+unTerme:Rubrique) 12/08/2026 Batik_WS_Com_Mob 193

Partie 4 › Collection de procédures › LIB_Traitements › Code SI b > 0 ALORS ListeMob[b].Utilisee = Vrai TraceINFO("données b => "+ListeMob[b].ListeDonnesMob) SI ListeMob[b].ListeDonnesmob <> "" ALORS sAInfoRemp = TraitementSelonTypeRubRapportMob(unTerme,ListeMob[b].ListeDonnesMob) SINON sAInfoRemp = TraitementSelonTypeRubRapportMob(unTerme,unTerme:ListeDonnesBD) FIN SINON // Comment ce n'est pas envoyé dans le mobile je cherche directement dans le données (Bqse de données) b = TableauCherche(ListeMob,tcLinéaire,"Rubrique;Utilisee",unTerme:Rubrique , Faux) SI b > 0 ALORS sAInfoRemp = TraitementSelonTypeRubRapportMob(unTerme,ListeMob[b].ListeDonnesBD) ListeMob[b].Utilisee = Vrai SINON sAInfoRemp = TraitementSelonTypeRubRapportMob(unTerme,unTerme:ListeDonnesBD) FIN FIN RENVOYER sAInfoRemp Procédure globale RechercheInfoDansVariantRapport PROCÉDURE RechercheInfoDansVariantRapport(unTerme est un STJSONMembreRubRapport, stTerme est un STJSONListeMembre, UnEle est un Variant,ImgBuf est un Buffer,... saInfoV est une chaîne ANSI, sdRReq est une source de données,CheminImg est une chaîne ANSI) satxt est une chaîne ANSI saIdentifiant est une chaîne ANSI saValeurId est une chaîne ANSI QUAND EXCEPTION DANS SELON unTerme.GroupeApp CAS cRp_CR saIdentifiant = "sdRReq.CR_GUID" saValeurId = Remplace(UnEle.saGuidCR,RC,"") CAS cRp_Photo saIdentifiant = "UnEle.nDC_PKID" saValeurId = Remplace(UnEle.saGUID,RC,"") FIN SI PAS stTerme:BD ALORS satxt = "UnEle."+stTerme:MembreMob saInfoV = {satxt} SI stTerme:TypeMembre = "ChpImage" OU stTerme:Type = "ChpImage"ALORS SI fRepExiste(CheminImg) ALORS sExtension est une chaîne ANSI = fExtraitChemin(UnEle.saNom, fExtension) sNOMiMG est une chaîne ANSI = saValeurId+sExtension SI fFichierExiste(CheminImg+sNOMiMG) ALORS ImgBuf = fChargeBuffer(CheminImg+sNOMiMG) FIN FIN FIN SINON POUR TOUT sdRReq 12/08/2026 Batik_WS_Com_Mob 194

Partie 4 › Collection de procédures › LIB_Traitements › Code SI {saIdentifiant} = saValeurId ALORS satxt = "sdRReq." satxt += stTerme:MembreMob saInfoV = {satxt} SI stTerme:TypeMembre = "ChpImage" OU stTerme:Type = "ChpImage"ALORS ImgBuf = {satxt} FIN FIN FIN FIN FAIRE saInfoV = "" ImgBuf = "" TraceINFO("Info var " + saInfoV) TraceERREUR("Erreur dans la création du rapport IMG"+ExceptionInfo()) FIN Procédure globale RechercheInterventions PROCÉDURE RechercheInterventions(stData est une ST_MOB_DATA) bDroitTout, bDroitUniqRDV, bAccesDossier sont des booléens saRQ,saWhere sont des chaînes ANSI bufRes est un Buffer TraceINFO("RechercheRDV ") // Recherche de droits SI gstContexte:tbaDroitsAcces[cGestion_R_I_SOC_ATCH]..Existe = Vrai ET gstContexte:tbaDroitsAcces [cGestion_R_I_SOC_ATCH] ALORS bDroitTout = Vrai FIN SI gstContexte:tbaDroitsAcces[cGestion_R_I_RDV_EXST]..Existe = Vrai ET gstContexte:tbaDroitsAcces [cGestion_R_I_RDV_EXST] ALORS bDroitUniqRDV = Vrai FIN SI gstContexte:tbaDroitsAcces[cGestion_R_I_RDV_EXST_DS]..Existe = Vrai ET gstContexte: tbaDroitsAcces[cGestion_R_I_RDV_EXST_DS] ALORS bAccesDossier = Vrai FIN // selon configuration du à la mise à jour chez le client SI bDroitTout ET bDroitUniqRDV ET bAccesDossier ALORS // il y a tous les droit on ne modifie rien saRQ = ReqRechercheIntervention(stData,"") saWhere = "" SINON // Création condition where selon les droits // Ne pas modifier l'ordre des conditions SI bDroitTout ET gstContexte.stUser.nIdCollab > 0 ALORS saWhere = WhereRechercheIntDroitSoc(stData,gstContexte.stUser.nIdCollab) SINON SI bAccesDossier ET gstContexte.stUser.saGuid <> "" saWhere = WhereRechercheIntDroitDossier(stData,gstContexte.stUser.saGuid) SINON SI bDroitUniqRDV ET gstContexte.stUser.saGuid <> "" saWhere = WhereRechercheIntDroitRDV(stData,gstContexte.stUser.saGuid) FIN FIN 12/08/2026 Batik_WS_Com_Mob 195

Partie 4 › Collection de procédures › LIB_Traitements › Code // Condition appliquées (selon droit) on construit la req SI saWhere <> "" ALORS saRQ = ReqRechercheIntervention(stData,saWhere) FIN SI bDroitTout ALORS saRQ= ReqRechercheIntervention(stData,"") saWhere = "" FIN // si il y a une requête on construit les interventions sinon on renvoi un tableau vide SI saRQ <> "" ALORS RENVOYER ConstruitResultatRechercheInterventions(saRQ) SINON tblINT est un tableau de ST_INTER Sérialise(tblINT,bufRes,psdJSON) bufRes ="R" + bufRes TraceINFO("bufREs Vide : " + bufRes) RENVOYER bufRes FIN Procédure globale RechercheInterventionsNonPlannifiées PROCÉDURE RechercheInterventionsNonPlannifiées(tblRDV est un tableau de ST_RDV_INTER) sErreur est une chaîne QUAND EXCEPTION DANS TraceINFO("RechercheInterventionsNonPlannifiées pour " + gstContexte.stUser.nIdCollab +" " + gst Contexte.saNomUser) //Construction de la requête de sélection saRQ est une chaîne ANSI saRQ=[ SELECT Dossier.DO_IDClient AS DO_IDClient, Dossier.DO_CleType, Dossier.DO_Titre AS DO_Titre, Dossier.DO_CleStatut, Dossier.DO_RefInterne AS DO_RefInterne, Dossier.DO_RefExterne AS DO_RefExterne, Client.CL_Nom AS CL_Nom, Client.CL_Tel AS CL_Tel, Client.CL_Fax AS CL_Fax, AdClient.AD_PKID AS AdClient_PKID, AdClient.AD_Etiquette AS AdClient_Etiquette, AdClient.AD_Adresse AS AdClient_Adresse, AdClient.AD_CodePostal AS AdClient_CodePostal, AdClient.AD_Ville AS AdClient_Ville, Intervention.IN_PKID AS IN_PKID, Intervention.IN_CleType, Intervention.IN_CleEtat, Intervention.IN_IDSuiviPar AS IN_IDSuiviPar, Intervention.IN_IDDossier AS IN_IDDossier, Intervention.IN_IDDemandeur AS IN_IDDemandeur, Intervention.IN_IDClient AS IN_IDClient, Intervention.IN_IDLieu AS IN_IDLieu, Intervention.IN_Description AS IN_Description, Intervention.IN_AttestationTVAPresente AS IN_AttestationTVAPresente, 12/08/2026 Batik_WS_Com_Mob 196

Partie 4 › Collection de procédures › LIB_Traitements › Code Intervention.IN_NoteInterne AS IN_NoteInterne, Intervention.IN_Titre AS IN_Titre, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.IN_RefExterne AS IN_RefExterne, Intervention.IN_IDSociete, Lieu.LI_PKID AS LI_PKID, Lieu.LI_CodeLieu AS LI_CodeLieu, Lieu.LI_IDAdresse AS LI_IDAdresse, Lieu.LI_CleType, Lieu.LI_CodeAcces AS LI_CodeAcces, Lieu.LI_Badge AS LI_Badge, Lieu.LI_Interphone AS LI_Interphone, Lieu.LI_Note AS LI_Note, AdLieu.AD_PKID AS AdLieu_PKID, AdLieu.AD_Etiquette AS AdLieu_Etiquette, AdLieu.AD_Adresse AS AdLieu_Adresse, AdLieu.AD_CodePostal AS AdLieu_CodePostal, AdLieu.AD_Ville AS AdLieu_Ville, Demandeur.PE_Nom AS PE_Nom, Demandeur.PE_Prenom, Collaborateur.CO_Nom AS NomSuiviPar, Collaborateur.CO_Prenom AS PrenomSuiviPar, Collaborateur.CO_TelMobile AS TelMobSuiviPar, Societe.SO_Nom FROM Intervention INNER JOIN Dossier ON Intervention.IN_IDDossier=Dossier.DO_PKID ,Intervention LEFT OUTER JOIN Lieu ON Intervention.IN_IDLieu = Lieu.LI_PKID ,Intervention LEFT OUTER JOIN Client ON Intervention.IN_IDClient = Client.CL_PKID ,Lieu LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID ,Client LEFT OUTER JOIN Adresse AdClient ON Client.CL_IDAdressePrincipale = AdClient.AD_PKID ,Intervention INNER JOIN Intervention_Collaborateur ON Intervention.IN_PKID = Intervention_Collaborateur.IC_IDIntervention ,Intervention LEFT OUTER JOIN Personne Demandeur ON Intervention.IN_IDDemandeur = Demandeur.PE_PKID ,Intervention LEFT OUTER JOIN Collaborateur ON Intervention.IN_IDSuiviPar=Collaborateur.CO_PKID ,Intervention LEFT OUTER JOIN Societe ON Intervention.IN_IDSociete = Societe.SO_PKID WHERE Intervention.IN_PKID NOT IN (SELECT RDV_Planning.RV_IdInter FROM RDV_Planning WHERE RDV_Planning.Archive=0) ] //Construction de la clause WHERE qui sera ensuite ajoutée dans la requête de recherche //Une Intervention non planifiée à par définition : // pas de RDV associé // Un statut différent de "Terminé" ou "Attente" // Est attribuée à l'utilisateur du mobile qui fait la requête saRQ +="AND Intervention_Collaborateur.IC_IDCollaborateur=" + gstContexte.stUser.nIdCollab saRQ +="AND Intervention.IN_CleEtat IN (" + gstContexte.sLstEtatsInter +")" sErreur = ConstruitTableauInterventions(saRQ,"",Faux,tblRDV) RENVOYER sErreur FAIRE sErreur ="E" + ExceptionInfo(errComplet) TraceDEBUG("ERREUR dans RechercheInterventionsNonPlannifiées : " + sErreur) 12/08/2026 Batik_WS_Com_Mob 197

Partie 4 › Collection de procédures › LIB_Traitements › Code RENVOYER sErreur FIN Procédure globale RechercheListeRubModeleMail PROCÉDURE RechercheListeRubModeleMail(nIdModeleMail est un entier sur 8 octets,CorpEmailDoc est un Document, SujetEmailDoc est un Document,... TermeRapportEmail est un STJSONRubriqueRapport, TermeRapport est un STJSONRubriqueRapport) tbMotCleSpec est un tableau de STJSONMembreRubRapport tabToutesRub est un tableau de STJSONMembreRubRapport saRQModeleMail est une chaîne ANSI = [ SELECT * FROM MailModele WHERE MM_PKID = ] saRQModeleMail += nIdModeleMail sdRqModele est une Source de Données SI PAS HExécuteRequêteSQL(sdRqModele,gcnxReplica,saRQModeleMail) ALORS RENVOYER Faux SINON CorpEmailDoc = sdRqModele.MM_MsgDoc SujetEmailDoc = sdRqModele.MM_Sujet SI sdRqModele.MM_Extra <> "" ALORS Désérialise(tbMotCleSpec,sdRqModele.MM_Extra,psdJSON) POUR TOUT stUnMot DE tbMotCleSpec SI stUnMot:TypeMembre <> "" ALORS stUnMot:Type = stUnMot:TypeMembre //Pour compatibilite dans le mobile FIN FIN FIN FIN TermeRapport.ListeTerme = ChargeListeRubDoc() SI TermeRapport.ListeTerme..Occurrence > 0 ALORS TableauTrie(TermeRapportEmail:ListeTerme,ttMembre,"Groupe;Ordre") ConstructionTbRubBaseRapport(TermeRapport,tabToutesRub,SujetEmailDoc,Vrai) ConstructionTbRubBaseRapport(TermeRapport,tabToutesRub,CorpEmailDoc) FIN TermeRapportEmail.ListeTerme = tabToutesRub ConstructionTbRubEnvoyerMob(TermeRapport,tabToutesRub,TermeRapportEmail.ListeTerme,CorpEmailDoc,Vrai, tbMotCleSpec) RENVOYER Vrai Procédure globale RecupereContexte PROCÉDURE RecupereContexte(stData est une ST_MOB_DATA) bufRes est un Buffer nIdUser est un entier sur 8 octets = stData.saJSON QUAND EXCEPTION DANS stContexte est un ST_CONTEXTE stContexte.stUser <= gstContexte.stUser //Récupération de l'id du statut du rdv qui a pour valeur 99 saRQest une chaîne ANSI sdRec est une Source de Données saRQ= "SELECT * FROM ParametreApplication WHERE PAP_Code='ParamApp' " 12/08/2026 Batik_WS_Com_Mob 198

Partie 4 › Collection de procédures › LIB_Traitements › Code SI HExécuteRequêteSQL(sdRec,gcnxReplica,saRQ) ALORS SI HLitPremier(sdRec) ALORS SI sdRec.PAP_Valeur <> "" ALORS Désérialise(stContexte.stUser.ParamApp,sdRec.PAP_Valeur,psdJSON) FIN FIN FIN SI gstContexte.stUser.nIdProfil > 0 ALORS saRQ2 est une chaîne ANSI = "SELECT AED_CleAcces , AED_Acces FROM AccesEtDroit WHERE AccesEtDroit.AED_IdRole = " saRQ2 += gstContexte.stUser.nIdProfil+" AND AED_CleAcces IN ('"+cGestion_Envoi_Email+"','"+ cGestion_Creation_Rp+"')" sdRec2 est une Source de Données SI HExécuteRequêteSQL(sdRec2,gcnxReplica,saRQ2) ALORS POUR TOUT sdRec2 SI sdRec2.AED_CleAcces = cGestion_Envoi_Email ALORS stContexte.stUser.bDroit_EnvoiEmail = sdRec2.AED_Acces FIN SI sdRec2.AED_CleAcces = cGestion_Creation_Rp ALORS stContexte.stUser.bDroit_CreationRapport = sdRec2.AED_Acces FIN FIN FIN FIN //Par Compabilité à supprimer par la suite stContexte.stUser.bDroit_AnnulationRDV = Faux // a revoir si on modifie l'application de bureau afin de mettre ce paramètre dynamique stContexte.stUser.bDroit_AnnulationRDV = Vrai stContexte.stUser.ParamApp.bDroit_CouleurRDV = Vrai // a revoir si on modifie l'application de bureau afin de mettre ce paramètre dynamique stContexte.stUser.ParamApp.bDroit_HeureDejRDV = Vrai // a revoir si on modifie l'application de bureau afin de mettre ce paramètre dynamique Sérialise(stContexte,bufRes,psdJSON) TraceDEBUG("bufREs : " + bufRes) RENVOYER "R" + bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) RENVOYER bufRes FIN Procédure globale RecupererChampMailModele PROCÉDURE RecupererChampMailModele(stData est une ST_MOB_DATA) QUAND EXCEPTION DANS ChronoDébut() TraceINFO(" RecupererChampMailModele ") stParam est un STJSONInfoModeleMailMob Désérialise(stParam,stData.saJSON,psdJSON) bufRes est un Buffer sErreur est une chaîne = ConstruireListeChampModeleEmail(stParam,bufRes) 12/08/2026 Batik_WS_Com_Mob 199

Partie 4 › Collection de procédures › LIB_Traitements › Code SI sErreur="" ALORS bufRes ="R" + bufRes SINON bufRes ="E" + sErreur FIN TraceINFO("Durée (ms) : " + ChronoFin()) TraceINFO("JSON ---------------------------------") TraceINFO(bufRes) TraceINFO("--------------------------------------") RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RecupererChampRapportInter PROCÉDURE RecupererChampRapportInter(stData est une ST_MOB_DATA) QUAND EXCEPTION DANS ChronoDébut() TraceINFO(" RecupererChampRapportInter ") stParam est un ST_REQ_LISTE_Chp_Rapport Désérialise(stParam,stData.saJSON,psdJSON) //Construction de la réponse (tableau de STJSONMembreRubRapport) tabRubMobile est un tableau de STJSONMembreRubRapport bufRes est un Buffer sErreur est une chaîne = ContruireListeChamps(tabRubMobile,stParam) SI sErreur="" ALORS Sérialise(tabRubMobile,bufRes,psdJSON) bufRes ="R" + bufRes SINON bufRes ="E" + sErreur FIN TraceINFO("Durée (ms) : " + ChronoFin()) TraceINFO("JSON ---------------------------------") TraceINFO(bufRes) TraceINFO("--------------------------------------") RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RecupererIdClbRDVDroitConsultation PROCÉDURE RecupererIdClbRDVDroitConsultation() bufRes est un Buffer bDroitTout, bDroitUniqSoc, bDroitSocS, bDroitEqp sont des booléens nIdCollab est un entier sur 8 octets TraceINFO("Recherche id clb droit de consulter ") 12/08/2026 Batik_WS_Com_Mob 200

Partie 4 › Collection de procédures › LIB_Traitements › Code // Recherche de droits SI gstContexte:tbaDroitsAcces[cGestion_A_PL_SOC_PRCP]..Existe = Vrai ET gstContexte:tbaDroitsAcces[ cGestion_A_PL_SOC_PRCP] ALORS bDroitUniqSoc = Vrai FIN SI gstContexte:tbaDroitsAcces[cGestion_A_PL_SOC]..Existe = Vrai ET gstContexte:tbaDroitsAcces[ cGestion_A_PL_SOC] ALORS bDroitSocS = Vrai FIN SI gstContexte:tbaDroitsAcces[cGestion_A_PL_EQ]..Existe = Vrai ET gstContexte:tbaDroitsAcces[ cGestion_A_PL_EQ] ALORS bDroitEqp = Vrai FIN SI bDroitUniqSoc ET bDroitSocS ET bDroitEqp ALORS bDroitTout = Vrai FIN nIdCollab = gstContexte.stUser.nIdCollab saReqClb est une chaîne ANSI = [ SELECT CO_PKID, CO_nom, CO_Prenom FROM Collaborateur ] saWhere est une chaîne ANSI = [ WHERE CO_Actif = 1 AND CO_AccesMobile = 1 ] saCompl est une chaîne ANSI SI bDroitTout ALORS //rien SINON SI bDroitUniqSoc ALORS saCompl = " INNER JOIN Utilisateur ON Utilisateur.UT_IDCollaborateur = CO_PKID " saWhere += " AND UT_IDSocietePrincipale IN (SELECT UT_IDSocietePrincipale FROM Utilisateur WHERE UT_IDCollaborateur = " +nIdCollab+")" SINON SI bDroitSocS ALORS saCompl = " INNER JOIN Societe_Collaborateur ON SC_IDCollaborateur = CO_PKID " saWhere += " AND SC_IDCSociete IN (SELECT SC_IDCSociete FROM Societe_Collaborateur WHERE SC_IDCollaborateur = " +nIdCollab+")" SINON SI bDroitEqp ALORS saCompl = " INNER JOIN Equipe_Collaborateur ON Equipe_Collaborateur.EC_IDCollaborateur = CO_PKID " saWhere += " AND EC_IDEquipe IN (SELECT EC_IDEquipe FROM Equipe_Collaborateur WHERE EC_IDCollaborateur ="+ nIdCollab+")" SINON SI PAS bDroitTout ALORS saReqClb = "" FIN SI saReqClb <> "" ALORS saReqClb += saCompl + saWhere sdColb est une Source de Données TraceRequete(saReqClb) SI PAS HExécuteRequêteSQL(sdColb,gcnxReplica,hRequêteDéfaut,saReqClb) ALORS bufRes="E"+ErreurInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) RENVOYER bufRes SINON tbIdClb est un tableau de ST_IdRDVClbDroitC POUR TOUT sdColb stClb est un ST_IdRDVClbDroitC stClb.nIdClb = sdColb.CO_PKID stClb.sNomPrenom = sdColb.CO_nom+" "+sdColb.CO_Prenom 12/08/2026 Batik_WS_Com_Mob 201

Partie 4 › Collection de procédures › LIB_Traitements › Code TableauAjoute(tbIdClb,stClb) FIN Sérialise(tbIdClb,bufRes,psdJSON) bufRes ="R" + bufRes TraceINFO("bufREs : " + bufRes) RENVOYER bufRes FIN SINON bufRes ="R" + bufRes TraceINFO("bufREs : " + bufRes) RENVOYER bufRes FIN Procédure globale RecupererImgRp PROCÉDURE RecupererImgRp() //Donne au mobile demandeur l'ID et la description JSON du premier document non lu à récupérer TraceINFO("RecupererImgRp ") QUAND EXCEPTION DANS rqPhoto est une Requête SQL = [ SELECT * FROM TOMOB WHERE TM_CMD = 'DOC_Rp' ] SI HExécuteRequête(rqPhoto) ALORS dhDPurge2 est une DateHeure = DateHeureSys() sResRepTemp est une chaîne ANSI sResRepTemp = ComplèteRep(fRepExe())+"TEMP" sResRepTemp = ComplèteRep(fRepWeb())+"TEMP" TraceINFO("Rep temp : "+sResRepTemp) POUR TOUT rqPhoto saInfoTOMOB est une chaîne ANSI = rqPhoto.TM_JSON vInfoVariant est un Variant = JSONVersVariant(saInfoTOMOB) nIdInter est un entier sur 8 octets = vInfoVariant.nInterID sExtension est une chaîne ANSI = fExtraitChemin(vInfoVariant.saNom, fExtension) sNomPhoto est une chaîne ANSI = ComplèteRep(sResRepTemp+nIdInter)+ vInfoVariant.saDocGUID+sExtension bufImg est un Buffer = rqPhoto.TM_Buffer SI nIdInter > 0 ALORS SI fRepCrée(sResRepTemp+nIdInter) ALORS SI PAS fSauveBuffer(sNomPhoto, bufImg) ALORS TraceINFO("Erreur dans l'enregistrement de la photo : "+ErreurInfo(errMessage )) FIN SINON TraceINFO("Erreur dans l'enregistrement de la photo : "+ErreurInfo(errMessage)) FIN SINON TraceINFO("Document introuvable") FIN 12/08/2026 Batik_WS_Com_Mob 202

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN //Réalise une purge des documents non lu à destination des mobiles rqPurge2 est une Requête SQL = [ DELETE FROM TOMOB WHERE TM_Date < {pDate} AND TM_CMD='DOC_Rp' ] rqPurge2.pDate=dhDPurge2 HExécuteRequête(rqPurge2) FIN FAIRE TraceINFO("Erreur dans la procedure RecupererImgRp") FIN Procédure globale RecupererRDVAutreClb PROCÉDURE RecupererRDVAutreClb(stData est une ST_MOB_DATA) bufRes est un Buffer QUAND EXCEPTION DANS ChronoDébut() TraceINFO("RecupererRDVAutreClb ") tbLRDV est un tableau de ST_RDV_INTER_V2 sErreur est une chaîne sErreur = ListeRDV_V2(stData,tbLRDV,Faux) SI sErreur<>"" ALORS RENVOYER sErreur FIN Sérialise(tbLRDV,bufRes,psdJSON) bufRes="R" + bufRes RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RecupereUneIntervention PROCÉDURE RecupereUneIntervention(stData est une ST_MOB_DATA) QUAND EXCEPTION DANS ChronoDébut() TraceINFO("RecupereUneIntervention ") stParam est un ST_REQ_LISTE_RDV Désérialise(stParam,stData.saJSON,psdJSON) saRQ est une chaîne=[ SELECT Dossier.DO_IDClient AS DO_IDClient, 12/08/2026 Batik_WS_Com_Mob 203

Partie 4 › Collection de procédures › LIB_Traitements › Code Dossier.DO_IDTypeDossier AS DO_IDTypeDossier, Dossier.DO_Titre AS DO_Titre, Dossier.DO_IDStatut AS DO_IDStatut, Dossier.DO_RefInterne AS DO_RefInterne, Dossier.DO_RefExterne AS DO_RefExterne, Client.CL_Nom AS CL_Nom, Client.CL_Tel AS CL_Tel, Client.CL_Fax AS CL_Fax, AdClient.AD_PKID AS AdClient_PKID, AdClient.AD_Etiquette AS AdClient_Etiquette, AdClient.AD_Ligne_1 AS AdClient_Ligne_1, AdClient.AD_Ligne_2 AS AdClient_Ligne_2, AdClient.AD_Ligne_3 AS AdClient_Ligne_3, AdClient.AD_Ligne_4 AS AdClient_Ligne_4, AdClient.AD_Ligne_5 AS AdClient_Ligne_5, AdClient.AD_CodePostal AS AdClient_CodePostal, AdClient.AD_Ville AS AdClient_Ville, Intervention.IN_PKID AS IN_PKID, Intervention.IN_IDTypeIntervention AS IN_IDTypeIntervention, Intervention.IN_IDEtatIntervention AS IN_IDEtatIntervention, Intervention.IN_IDSuiviPar AS IN_IDSuiviPar, Intervention.IN_IDDossier AS IN_IDDossier, Intervention.IN_IDDemandeur AS IN_IDDemandeur, Intervention.IN_IDClient AS IN_IDClient, Intervention.IN_IDLieu AS IN_IDLieu, Intervention.IN_Description AS IN_Description, Intervention.IN_AttestationTVAPresente AS IN_AttestationTVAPresente, Intervention.IN_NoteInterne AS IN_NoteInterne, Intervention.IN_Titre AS IN_Titre, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.IN_RefExterne AS IN_RefExterne, Intervention.IN_IDSociete, Lieu.LI_PKID AS LI_PKID, Lieu.LI_CodeLieu AS LI_CodeLieu, Lieu.LI_IDAdresse AS LI_IDAdresse, Lieu.LI_IDType AS LI_IDType, Lieu.LI_CodeAcces AS LI_CodeAcces, Lieu.LI_Badge AS LI_Badge, Lieu.LI_Interphone AS LI_Interphone, Lieu.LI_Note AS LI_Note, AdLieu.AD_PKID AS AdLieu_PKID, AdLieu.AD_Etiquette AS AdLieu_Etiquette, AdLieu.AD_Ligne_1 AS AdLieu_Ligne_1, AdLieu.AD_Ligne_2 AS AdLieu_Ligne_2, AdLieu.AD_Ligne_3 AS AdLieu_Ligne_3, AdLieu.AD_Ligne_4 AS AdLieu_Ligne_4, AdLieu.AD_Ligne_5 AS AdLieu_Ligne_5, AdLieu.AD_CodePostal AS AdLieu_CodePostal, AdLieu.AD_Ville AS AdLieu_Ville FROM Intervention LEFT OUTER JOIN (Lieu LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID ) ON Intervention.IN_IDLieu = Lieu.LI_PKID, Intervention INNER JOIN (Dossier LEFT OUTER JOIN (Client LEFT OUTER JOIN Adresse AdClient ON Client.CL_IDAdressePrincipale = AdClient.AD_PKID) ON Dossier.DO_IDClient = Client.CL_PKID ) ON Intervention.IN_IDDossier = Dossier.DO_PKID WHERE IN_PKID={pIdInter} ] saRQ=Remplace(saRQ,"{pIdInter}",stParam.nIdInter ) 12/08/2026 Batik_WS_Com_Mob 204

Partie 4 › Collection de procédures › LIB_Traitements › Code //Construction de la réponse (tableau de ST_RDV) tblRDV est un tableau de ST_RDV_INTER bufRes est un Buffer sErreur est une chaîne = ConstruitTableauInterventions(saRQ,"",Faux,tblRDV) SI sErreur="" ALORS Sérialise(tblRDV,bufRes,psdJSON) bufRes ="R" + bufRes SINON bufRes ="E" + sErreur FIN TraceINFO("Durée (ms) : " + ChronoFin()) TraceINFO("JSON ---------------------------------") TraceINFO(bufRes) TraceINFO("--------------------------------------") RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RecupereUneIntervention_V2 PROCÉDURE RecupereUneIntervention_V2(stData est une ST_MOB_DATA) QUAND EXCEPTION DANS ChronoDébut() TraceINFO("RecupereUneIntervention ") stParam est un ST_REQ_LISTE_RDV Désérialise(stParam,stData.saJSON,psdJSON) saRQ est une chaîne=[ SELECT Dossier.DO_IDClient AS DO_IDClient, Dossier.DO_CleType, Dossier.DO_Titre AS DO_Titre, Dossier.DO_CleStatut, Dossier.DO_RefInterne AS DO_RefInterne, Dossier.DO_RefExterne AS DO_RefExterne, Client.CL_Nom AS CL_Nom, Client.CL_Tel AS CL_Tel, Client.CL_Fax AS CL_Fax, Client.CL_Email AS CL_Email, AdClient.AD_PKID AS AdClient_PKID, AdClient.AD_Etiquette AS AdClient_Etiquette, AdClient.AD_Adresse AS AdClient_Adresse, AdClient.AD_CodePostal AS AdClient_CodePostal, AdClient.AD_Ville AS AdClient_Ville, Intervention.IN_PKID AS IN_PKID, Intervention.IN_CleType, Intervention.IN_CleEtat, Intervention.IN_IDSuiviPar AS IN_IDSuiviPar, Intervention.IN_IDDossier AS IN_IDDossier, Intervention.IN_IDDemandeur AS IN_IDDemandeur, Intervention.IN_IDClient AS IN_IDClient, Intervention.IN_IDLieu AS IN_IDLieu, Intervention.IN_Description AS IN_Description, 12/08/2026 Batik_WS_Com_Mob 205

Partie 4 › Collection de procédures › LIB_Traitements › Code Intervention.IN_AttestationTVAPresente AS IN_AttestationTVAPresente, Intervention.IN_NoteInterne AS IN_NoteInterne, Intervention.IN_Titre AS IN_Titre, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.IN_RefExterne AS IN_RefExterne, Intervention.IN_IDSociete, Intervention.IN_NumDevis, Intervention.IN_DateDevis, Lieu.LI_PKID AS LI_PKID, Lieu.LI_CodeLieu AS LI_CodeLieu, Lieu.LI_IDAdresse AS LI_IDAdresse, Lieu.LI_CleType, Lieu.LI_CodeAcces AS LI_CodeAcces, Lieu.LI_Badge AS LI_Badge, Lieu.LI_Interphone AS LI_Interphone, Lieu.LI_Note AS LI_Note, AdLieu.AD_PKID AS AdLieu_PKID, AdLieu.AD_Etiquette AS AdLieu_Etiquette, AdLieu.AD_Adresse AS AdLieu_Adresse, AdLieu.AD_CodePostal AS AdLieu_CodePostal, AdLieu.AD_Ville AS AdLieu_Ville, Collaborateur.CO_Nom AS NomSuiviPar, Collaborateur.CO_Prenom AS PrenomSuiviPar, Collaborateur.CO_TelMobile AS TelMobSuiviPar, Collaborateur.CO_Email AS SuiviEmail, Societe.SO_Nom FROM Intervention LEFT OUTER JOIN (Lieu LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID ) ON Intervention.IN_IDLieu = Lieu.LI_PKID, Intervention INNER JOIN (Dossier LEFT OUTER JOIN (Client LEFT OUTER JOIN Adresse AdClient ON Client.CL_IDAdressePrincipale = AdClient.AD_PKID) ON Dossier.DO_IDClient = Client.CL_PKID ) ON Intervention.IN_IDDossier = Dossier.DO_PKID, Intervention LEFT OUTER JOIN Collaborateur ON Intervention.IN_IDSuiviPar=Collaborateur.CO_PKID, Intervention LEFT OUTER JOIN Societe ON Intervention.IN_IDSociete = Societe.SO_PKID WHERE IN_PKID={pIdInter} ] saRQ=Remplace(saRQ,"{pIdInter}",stParam.nIdInter ) saRqCR est une chaîne ANSI = [ SELECT CompteRendu.CR_PKID, CompteRendu.GUID AS CR_GUID, CompteRendu.CR_DateHeureDebut, CompteRendu.CR_DateHeureFin, CompteRendu.CR_NoteCollaborateur, CompteRendu.CR_NomSignataire, CompteRendu.CR_NomSignataireTech, CompteRendu.CR_NoteSignataire, CompteRendu.CR_ReserveCommentaire, CompteRendu.CR_DateHeureSignature, CompteRendu.CR_Signature, CompteRendu.CR_SignatureTech, CompteRendu.CreationUser AS CR_CreationUser, CompteRendu.CR_IDIntervention, CompteRendu.CR_IDRdv, CompteRendu.CR_CleTypeSignataire, CompteRendu.CR_GUID_Rdv, CompteRendu.CR_IDCollaborateur, RDV_Collaborateur.RVC_GUID_Colb, 12/08/2026 Batik_WS_Com_Mob 206

Partie 4 › Collection de procédures › LIB_Traitements › Code RDV_Planning.RV_Groupe, RDV_Collaborateur.RVC_GUID_RDV, Collaborateur.CO_Nom, Collaborateur.CO_Prenom FROM CompteRendu INNER JOIN Collaborateur ON CO_PKID = CR_IDCollaborateur INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_GUID_Colb = Collaborateur.GUID INNER JOIN RDV_Planning ON RDV_Planning.GUID = RDV_Collaborateur.RVC_GUID_RDV WHERE RDV_Planning.Archive=0 AND RDV_Collaborateur.Archive=0 AND RDV_Collaborateur.RVC_DateDeb = '{pDateDebut}' AND RDV_Collaborateur.RVC_DateFin = '{pDateFin}' AND RDV_Planning.RV_IdInter = {p_IdInter} ] //saRqCR= Remplace(saRqCR,"{pIDCollaborateur}",stParam.nIdCollaborateur) saRqCR = Remplace(saRqCR,"{pDateDebut}",stParam.saDateDebut) saRqCR = Remplace(saRqCR,"{pDateFin}",stParam.saDateFin) saRqCR = Remplace(saRqCR,"{p_IdInter}",stParam.nIdInter) //Construction de la réponse (tableau de ST_RDV) tbLRDV est un tableau de ST_RDV_INTER_V2 bufRes est un Buffer sErreur est une chaîne = ConstruitTableauInterventions_V2(saRQ,saRqCR,Faux,Vrai,tbLRDV) SI sErreur="" ALORS Sérialise(tbLRDV,bufRes,psdJSON) bufRes ="R" + bufRes SINON bufRes ="E" + sErreur FIN TraceINFO("Durée (ms) : " + ChronoFin()) TraceINFO("JSON ---------------------------------") TraceINFO(bufRes) TraceINFO("--------------------------------------") RENVOYER bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RecupListeParamMetiers PROCÉDURE RecupListeParamMetiers() bufRes est un Buffer ChronoDébut() QUAND EXCEPTION DANS saRQ est une chaîne ANSI=[ SELECT * FROM ParametreMetier ] sdParam est une Source de Données stPr est un ST_PARAMETRE_METIER tbParam est un tableau de ST_PARAMETRE_METIER 12/08/2026 Batik_WS_Com_Mob 207

Partie 4 › Collection de procédures › LIB_Traitements › Code HExécuteRequêteSQL(sdParam,gcnxReplica,saRQ) POUR TOUT sdParam stPr.nIdParam =sdParam.PA_PKID stPr.saCode =sdParam.PA_Code stPr.saLib =sdParam.PA_Libelle stPr.saVal =sdParam.PA_Valeur stPr.nOrdre =sdParam.PA_Ordre stPr.bSysteme =sdParam.PA_Systeme stPr.bInvisible =sdParam.PA_Invisible TableauAjoute(tbParam,stPr) FIN Sérialise(tbParam,bufRes,psdJSON) RENVOYER "R" + bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RecupListeParamMetiers_V2 PROCÉDURE RecupListeParamMetiers_V2(nIdUser est un entier sur 8 octets) bufRes est un Buffer ChronoDébut() QUAND EXCEPTION DANS saRQ est une chaîne ANSI=[ SELECT * FROM ParametreMetier ] sdParam est une Source de Données stPrest un ST_PARAMETRE_METIER_V2 tbParam est un tableau de ST_PARAMETRE_METIER_V2 HExécuteRequêteSQL(sdParam,gcnxReplica,saRQ) POUR TOUT sdParam stPr.nIdParam = sdParam.PA_PKID stPr.saCode = sdParam.PA_Code stPr.saLib = sdParam.PA_Libelle stPr.saVal = sdParam.PA_Valeur stPr.nOrdre = sdParam.PA_Ordre stPr.bSysteme = sdParam.PA_Systeme stPr.bInvisible = sdParam.PA_Invisible stPr.saJson = sdParam.PA_Parametre TableauAjoute(tbParam,stPr) FIN saRQParamApp est une chaîne ANSI = "SELECT * FROM ParametreApplication WHERE PAP_Code='URL_TUTO' " sdParamApp est une Source de Données SI HExécuteRequêteSQL(sdParamApp,gcnxReplica,saRQParamApp) ALORS SI HLitPremier(sdParamApp) ALORS stPr.nIdParam = sdParamApp.PAP_PKID stPr.saCode = sdParamApp.PAP_Code stPr.saLib = sdParamApp.PAP_Description stPr.saVal = sdParamApp.PAP_Valeur stPr.nOrdre = 1 12/08/2026 Batik_WS_Com_Mob 208

Partie 4 › Collection de procédures › LIB_Traitements › Code stPr.bSysteme = Vrai stPr.bInvisible = Vrai stPr.saJson = "" TableauAjoute(tbParam,stPr) FIN FIN //Modele de rapport saRQRp est une chaîne ANSI=[ SELECT * FROM ModeleRapport WHERE MRP_EnvoiMob = 1 ] sdListeRp est une Source de Données stRpest un ST_PARAMETRE_METIER_V2 HExécuteRequêteSQL(sdListeRp,gcnxReplica,saRQRp) POUR TOUT sdListeRp stRp.nIdParam = sdListeRp.MRP_PKID stRp.saCode = cParam_ListeRapportMob stRp.saLib = sdListeRp.MRP_Nom TableauAjoute(tbParam,stRp) FIN //Modele de mail saRQME est une chaîne ANSI=[ SELECT MM_PKID, MM_Nom FROM MailModele ] sdListeME est une Source de Données stME est un ST_PARAMETRE_METIER_V2 HExécuteRequêteSQL(sdListeME,gcnxReplica,saRQME) POUR TOUT sdListeME stME.nIdParam = sdListeME.MM_PKID stME.saCode = cParam_ListeMailModele stME.saLib = sdListeME.MM_Nom TableauAjoute(tbParam,stME) FIN // Comptes email saMSG est une chaîne ANSI ParamEmailConfig est un tableau associatif de STParamEnvoiEmailPerso (saMSG,ParamEmailConfig) = DonneListeConfigMail(nIdUser) stConfigMail est un ST_PARAMETRE_METIER_V2 b est un entier SI ParamEmailConfig..Occurrence > 0 ALORS POUR TOUT config, saCle de ParamEmailConfig b += 1 stConfigMail.saCode = "EMAIL_ENVOI" stConfigMail.nIdParam = b Sérialise(config,stConfigMail.saVal,psdJSON) TableauAjoute(tbParam,stConfigMail) FIN FIN Sérialise(tbParam,bufRes,psdJSON) RENVOYER "R" + bufRes FAIRE bufRes ="E" + ExceptionInfo(errComplet) TraceERREUR("bufREs : " + bufRes) TraceDEBUG("Durée (ms) : " + ChronoFin()) RENVOYER bufRes FIN Procédure globale RemplirLigneSansTbModeleMail PROCÉDURE RemplirLigneSansTbModeleMail(ListeMob est un tableau de STJSONMembreRubRapport,unTerme est un 12/08/2026 Batik_WS_Com_Mob 209

Partie 4 › Collection de procédures › LIB_Traitements › Code STJSONMembreRubRapport, MonDoc est un Document) saInfoV est une chaîne ANSI sdRReq est une Source de Données nSel, b sont des entiers sADonnes est une chaîne ANSI vInfoVariante est un Variant CheminImg est une chaîne ANSI TableauTrie(unTerme.ListeMembre,ttMembre+tccRespecteNumérique,"+Ordre") SI unTerme:EnvoiMob ALORS b = TableauCherche(ListeMob,tcLinéaire,"Rubrique;Utilisee",unTerme:Rubrique,Faux) FIN SI b > 0 ALORS sADonnes = ListeMob[b].ListeDonnesMob TraceINFO("Données mob : "+sADonnes) FIN SI sADonnes <> "" ET unTerme:Type = "Tableau" ALORS vInfoVariante = JSONVersVariant(sADonnes) FIN SI unTerme.GroupeApp = cRp_CR ALORS // Requête dans la base de données , le compte rendu ne peuvent pas être modifiées par l'utilisateur // donc le données ne sont pas récupérer à partir de données envoyés par le mobile RqCompteRenduRemplirRapport(vInfoVariante,sdRReq) FIN POUR TOUT stTerme DE unTerme.ListeMembre tabFragments est un tableau de docFragments = DocRecherche(MonDoc,stTerme.Rubrique,MotComplet+ SansCasse) SI tabFragments..Occurrence > 0 ALORS POUR c = 1 À tabFragments.Occurrence POUR TOUT UnEle DE vInfoVariante SI stTerme:EnvoiMob ALORS SI UnEle.bSelection ALORS imgBuf est un Buffer imgBuf = "" saInfoV = "" RechercheInfoDansVariantRapport(unTerme, stTerme, UnEle,imgBuf,saInfoV,sdRReq ,CheminImg) nSel += 1 SI stTerme:TypeMembre = "ChpImage" OU stTerme:Type = "ChpImage"ALORS tabFragments[c].Texte = " " // SI imgBuf..Taille > 0 ALORS // nLargPixCol est un entier = 100*NBPixelesXMilimetres // transformer le milimetres dans pixels (nombre de pixeles par milimetres) // elt est un docElément <- DonneImgTableauRp(imgBuf,nLargPixCol) // DocInsère(MonDoc,tabFragments[c]..PositionDébut, elt) // SINON // //tabFragments[c].Texte = " " // FIN SINON tabFragments[c].Texte = TraitementSelonTypeRubRapportMob(stTerme,saInfoV) FIN SI Contient(stTerme:Rubrique,"UNIQUE") ALORS SORTIR FIN 12/08/2026 Batik_WS_Com_Mob 210

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN FIN FIN FIN FIN FIN SI nSel > 0 ALORS RENVOYER Vrai FIN RENVOYER Faux Procédure globale RemplirLigneSansTbRapport PROCÉDURE RemplirLigneSansTbRapport(unTerme est un STJSONMembreRubRapport, MonDoc est un Document, vInfoVariante est un Variant,CheminImg est une chaîne ANSI) saInfoV est une chaîne ANSI sdRReq est une Source de Données nSel est un entier SI unTerme.GroupeApp = cRp_CR ALORS // Requête dans la base de données , le compte rendu ne peuvent pas être modifiées par l'utilisateur // donc le données ne sont pas récupérer à partir de données envoyés par le mobile RqCompteRenduRemplirRapport(vInfoVariante,sdRReq) FIN POUR TOUT stTerme DE unTerme.ListeMembre tabFragments est un tableau de docFragments = DocRecherche(MonDoc,stTerme.Rubrique,MotComplet+ SansCasse) SI tabFragments..Occurrence > 0 ALORS POUR c = 1 À tabFragments.Occurrence POUR TOUT UnEle DE vInfoVariante SI stTerme:EnvoiMob ALORS SI UnEle.bSelection ALORS imgBuf est un Buffer imgBuf = "" saInfoV = "" RechercheInfoDansVariantRapport(unTerme, stTerme, UnEle,imgBuf,saInfoV,sdRReq ,CheminImg) nSel += 1 SI stTerme:TypeMembre = "ChpImage" OU stTerme:Type = "ChpImage"ALORS SI imgBuf..Taille > 0 ALORS nLargPixCol est un entier = 100*NBPixelesXMilimetres // transformer le milimetres dans pixels (nombre de pixeles par milimetres) elt est un docElément <- DonneImgTableauRp(imgBuf, nLargPixCol) DocInsère(MonDoc,tabFragments[c]..PositionDébut, elt) SINON //tabFragments[c].Texte = " " FIN SINON tabFragments[c].Texte = TraitementSelonTypeRubRapportMob(stTerme,saInfoV) FIN SI Contient(stTerme:Rubrique,"$UN") ALORS SORTIR 12/08/2026 Batik_WS_Com_Mob 211

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN FIN FIN FIN FIN FIN FIN SI nSel > 0 ALORS RENVOYER Vrai FIN RENVOYER Faux Procédure globale RemplirLigneTableauRapportMob PROCÉDURE RemplirLigneTableauRapportMob(unTerme est un STJSONMembreRubRapport, nIMin est un entier, MonDoc est un Document,vInfoVariante est un Variant,CheminImg est une chaîne ANSI) saInfoV est une chaîne ANSI sdRReq est une Source de Données nIndDebutPara est un entier tabListeRubCol_1 est un tableau de entiers tabListeRubCol_2 est un tableau de entiers SI unTerme.GroupeApp = cRp_CR ALORS // Requête dans la base de données , le compte rendu ne peuvent pas être modifiées par l'utilisateur // donc le données ne sont pas récupérer à partir de données envoyés par le mobile RqCompteRenduRemplirRapport(vInfoVariante,sdRReq) FIN POUR TOUT stTerme DE unTerme.ListeMembre tabFragments est un tableau de docFragments = DocRecherche(MonDoc,stTerme.Rubrique,MotComplet+ SansCasse) SI tabFragments..Occurrence > 0 ALORS nColonne est un entier = tabFragments[1].Elément[1].Cellule..IndiceColonne nLigne est un entier = tabFragments[1].Elément[1].Cellule..IndiceLigne nIMax est un entier = nIMin soit para <- tabFragments[1]..Paragraphe[1] SI nIndDebutPara = 0 ALORS // Pour pouvoir savoir si un est toujours dans le même tableau nIndDebutPara = para.Parent.Parent.Paragraphe.PositionDébut FIN SI para.Tableau = Null ALORS RETOUR FIN SI nIndDebutPara = para.Parent.Parent.Paragraphe.PositionDébut ALORS // moulinette faite pour savoir si on a est toujours dans la même colonne SI CelluleAvecPlusiersRub(unTerme,para..Tableau..Cellules[nIMax,nColonne]..Contenu..Texte, tabListeRubCol_2) ALORS SI tabListeRubCol_1..Occurrence <= 0 ALORS tabListeRubCol_1 = tabListeRubCol_2 CreationTableauIntDocRapport(unTerme,MonDoc, nIMin, vInfoVariante, CheminImg, sdRReq) SINON SI PAS TableauCherche(tabListeRubCol_1,tcLinéaire,stTerme:Ordre) ALORS CreationTableauIntDocRapport(unTerme,MonDoc, nIMin, vInfoVariante, CheminImg, sdRReq) tabListeRubCol_1 = tabListeRubCol_2 FIN 12/08/2026 Batik_WS_Com_Mob 212

Partie 4 › Collection de procédures › LIB_Traitements › Code FIN SINON POUR TOUT UnEle DE vInfoVariante SI stTerme:EnvoiMob ALORS SI UnEle.bSelection ALORS imgBuf est un Buffer imgBuf = "" saInfoV = "" RechercheInfoDansVariantRapport(unTerme, stTerme, UnEle,imgBuf,saInfoV, sdRReq,CheminImg) SI stTerme:TypeMembre = "ChpImage" OU stTerme:Type = "ChpImage"ALORS SI imgBuf..Taille > 0 ALORS nLargPixCol est un entier = para..Tableau..Colonnes[nColonne].. LargeurMillimètres*NBPixelesXMilimetres // transformer le milimetres dans pixels (nombre de pixeles par milimetres) elt est un docElément <- DonneImgTableauRp(imgBuf, nLargPixCol) cell est un docCellule <- para..Tableau..Cellules[nIMax, nColonne] SI elt..Image..Hauteur > 0 ET elt.Image..Largeur > 0 ALORS cell2 est un docLigne <- para..Tableau.. Lignes[nIMax] cell2.Hauteur = elt..Image..Hauteur cell3 est un docColonne <- para..Tableau..Colonnes[nColonne] cell3..LargeurMillimètres = elt.Image..Largeur FIN para..Tableau..Cellules[nIMax,nColonne]..MiseEnPage..Alignement = chCentre DocInsère(MonDoc,cell..Contenu..PositionDébut, elt) SINON //para..Tableau..Cellules[nIMax,nColonne]..Contenu..Texte = " " FIN SINON para..Tableau..Cellules[nIMax,nColonne]..Contenu..Texte = TraitementSelonTypeRubRapportMob(stTerme,saInfoV) FIN nIMax += 1 SI Contient(stTerme:Rubrique,"$UN") ALORS SORTIR FIN FIN FIN FIN FIN FIN FIN FIN Procédure globale ReqRechercheIntervention PROCÉDURE ReqRechercheIntervention(stData est une ST_MOB_DATA, saWhere est une chaîne ANSI) stParam est un ST_REQ_LISTE_RDV 12/08/2026 Batik_WS_Com_Mob 213

Partie 4 › Collection de procédures › LIB_Traitements › Code Désérialise(stParam,stData.saJSON,psdJSON) saTxt est une chaîne = stParam.saTxt //Construction de la clause WHERE qui sera ensuite ajoutée dans la requête de recherche SI saWhere = "" ALORS saWhere +=" ( Intervention.IN_RefInterne LIKE '%" + saTxt +"%'" saWhere +=" OR Client.CL_Nom LIKE '%" + saTxt +"%'" saWhere +=" OR Lieu.LI_CodeLieu LIKE '%" + saTxt +"%'" saWhere +=" OR Demandeur.PE_Nom LIKE '%" + saTxt +"%'" saWhere +=" ) " FIN saWhere += "AND Dossier.DO_CleStatut <> '"+cCle_DossierAnnule+"'"// Statut annulé TraceINFO("Clause :" + saWhere) //Construction de la requête de sélection saRQ est une chaîne ANSI saRQ=[ SELECT {TOP} Intervention.IN_PKID AS IN_PKID, Client.CL_Nom AS CL_Nom, Intervention.IN_RefInterne AS IN_RefInterne, Intervention.IN_Description, Intervention.IN_NoteInterne, Intervention.IN_RefExterne, Intervention.IN_CleType, Intervention.IN_CleEtat, Intervention.IN_Titre, Intervention.IN_IDSociete, Lieu.LI_CodeLieu AS LI_CodeLieu, AdLieu.AD_PKID AS AdLieu_PKID, AdLieu.AD_Etiquette AS AdLieu_Etiquette, AdLieu.AD_Adresse, AdLieu.AD_CodePostal AS AdLieu_CodePostal, AdLieu.AD_Ville AS AdLieu_Ville, Demandeur.PE_Nom AS PE_Nom, Demandeur.PE_Prenom FROM ( ( Intervention LEFT OUTER JOIN Client ON Intervention.IN_IDClient = Client.CL_PKID) INNER JOIN Dossier ON Dossier.DO_PKID = Intervention.IN_IDDossier LEFT OUTER JOIN Lieu ON Intervention.IN_IDLieu = Lieu.LI_PKID LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID) LEFT OUTER JOIN Personne Demandeur ON Intervention.IN_IDDemandeur = Demandeur.PE_PKID WHERE ( {Clause} ) ] saRQ=Remplace(saRQ,"{Clause}",saWhere) SI stParam.saTOP<>"" ALORS saRQ=Remplace(saRQ,"{TOP}","TOP " + stParam.saTOP) SINON saRQ=Remplace(saRQ,"{TOP}","") FIN 12/08/2026 Batik_WS_Com_Mob 214

Partie 4 › Collection de procédures › LIB_Traitements › Code RENVOYER saRQ Procédure globale RqCompteRenduRemplirRapport PROCÉDURE RqCompteRenduRemplirRapport(vInfoVariante est un Variant,sdRReqCR est une Source de Données) saGUIDS est une chaîne ANSI POUR TOUT UnEle DE vInfoVariante SI UnEle.bSelection ALORS saGUIDS += [" , "]+"'"+UnEle.saGuidCR +"'" FIN FIN SI saGUIDS = "" ALORS RENVOYER Faux FIN saRqCR est une chaîne ANSI = [ SELECT CompteRendu.CR_PKID, CompteRendu.GUID AS CR_GUID, CompteRendu.CR_DateHeureDebut, CompteRendu.CR_DateHeureFin, CompteRendu.CR_NoteCollaborateur, CompteRendu.CR_NomSignataire, CompteRendu.CR_NomSignataireTech, CompteRendu.CR_NoteSignataire, CompteRendu.CR_DevisConforme, CompteRendu.CR_AvecReserve, CompteRendu.CR_ReserveCommentaire, CompteRendu.CR_DateHeureSignature, CompteRendu.CR_Signature, CompteRendu.CR_SignatureTech, CompteRendu.CR_IDTypeSignataire, ParametreMetier.PA_Libelle AS CR_PA_Type FROM CompteRendu LEFT OUTER JOIN ParametreMetier ON ParametreMetier.PA_CLE = CompteRendu.CR_CleTypeSignataire and CompteRendu.CR_CleTypeSignataire <> '' WHERE CR_GUID IN ({p_GUIDS}) ] saRqCR = Remplace(saRqCR,"{p_GUIDS}",Remplace(saGUIDS, RC,"")) SI PAS HExécuteRequêteSQL(sdRReqCR,hRequêteDéfaut,saRqCR) ALORS FIN Procédure globale SupprimerToutesRubRapportMob PROCÉDURE SupprimerToutesRubRapportMob(tabToutesRub est un tableau de STJSONMembreRubRapport,MonDoc est un Document) tabFragments est tableau de docFragment POUR i = 1 À tabToutesRub..Occurrence stUnTerme est un STJSONMembreRubRapport = tabToutesRub[i] tabFragments = DocRecherche(MonDoc,stUnTerme.Rubrique,MotComplet+SansCasse) 12/08/2026 Batik_WS_Com_Mob 215

Partie 4 › Collection de procédures › LIB_Traitements › Code POUR c = 1 À tabFragments.Occurrence tabFragments[c].Texte= "" FIN POUR TOUT stTermes DE stUnTerme.ListeMembre tabFragments = DocRecherche(MonDoc,stTermes.Rubrique,MotComplet+SansCasse) POUR h = 1 À tabFragments.Occurrence tabFragments[h].Texte= "" FIN FIN FIN Procédure globale TestCnxReplica PROCÉDURE PRIVÉE TestCnxReplica() sd est une Source de Données saRes est une chaîne ANSI // Déclaration dynamique du (ou des) fichier(s) utilisé(s) dans la requête // HPasse("Planning_RDV",gsaPass) //SI HDéclareExterne("Planning_RDV.FIC", "Planning_RDV", gcnxReplica) = Faux ALORS // saRes=ErreurInfo(errComplet) // RENVOYER saRes //FIN SI HExécuteRequêteSQL(sd,gcnxReplica,hRequêteDéfaut,"SELECT COUNT(*) as Nb FROM RDV_Planning") ET HLitPremier(sd) ALORS saRes=sd.NB SINON saRes=ErreurInfo(errComplet) FIN HAnnuleDéclaration(sd) RENVOYER saRes Procédure globale TraiteDocumentRapportMob PROCÉDURE TraiteDocumentRapportMob(tabToutesRubest un tableau de STJSONMembreRubRapport, ListeMob est un tableau de STJSONMembreRubRapport,MonDoc est un Document,saCheminImg est une chaîne ANSI ) c est un entier sAInfoRemp est une chaîne ANSI TableauTrie(tabToutesRub,ttMembre+tccRespecteNumérique,"+Rubrique;+Ordre") sNomRub est une chaîne ANSI tabFragments est tableau de docFragment POUR i = 1 À tabToutesRub..Occurrence unTerme est un STJSONMembreRubRapport = tabToutesRub[i] sAInfoRemp = "" SI sNomRub <> unTerme.Rubrique ALORS // moyen de savoir si la rubrique a été déjà traite, une rubrique peuvent être pressent plusieurs fois dans un modèle , // toutes les rubriques seront traites dans la variable tabfragments SI unTerme:Type = "Tableau" ALORS QUAND EXCEPTION DANS POUR c = 1 À tabToutesRub..Occurrence SI unTerme.Rubrique = tabToutesRub[c].Rubrique ET tabToutesRub[c].ListeMembre.. Occurrence > 0 ALORS tabFragments = DocRecherche(MonDoc,tabToutesRub[c].ListeMembre[1].Rubrique, 12/08/2026 Batik_WS_Com_Mob 216

Partie 4 › Collection de procédures › LIB_Traitements › Code MotComplet+SansCasse) SI tabFragments.Occurrence > 0 ALORS TraiteLigneTableauRapportMob(ListeMob,tabToutesRub[c], MonDoc,saCheminImg ) FIN FIN FIN FAIRE TraceERREUR("Erreur dans la création du rapport "+c+"fragments "+tabFragments. Occurrence+ " Condition unTerme:Type = Tableau"+RC+ExceptionInfo()) FIN SINON QUAND EXCEPTION DANS tabFragments = DocRecherche(MonDoc,unTerme.Rubrique,MotComplet+SansCasse) SI tabFragments..Occurrence > 0 ALORS SI tabFragments.Occurrence > 1 ALORS POUR c = 1 À tabFragments.Occurrence sAInfoRemp = RechercheDonneesSimpleRapportMob(ListeMob, unTerme) tabFragments[c].Texte= sAInfoRemp TraceERREUR(sAInfoRemp) FIN SINON sAInfoRemp = RechercheDonneesSimpleRapportMob(ListeMob,unTerme) tabFragments[1].Texte= sAInfoRemp TraceERREUR(sAInfoRemp) //DocRemplace(MonDoc, unTerme:Rubrique, sAInfoRemp,MotComplet+SansCasse) FIN FIN FAIRE TraceERREUR("Erreur dans la création du rapport "+c+"fragments "+tabFragments. Occurrence+ " sans Condition"+RC+ExceptionInfo()) FIN FIN FIN sNomRub= unTerme.Rubrique FIN Procédure globale TraiteEmailBuffer PROCÉDURE TraiteEmailBuffer(tabRubMobile est un tableau de STJSONMembreRubRapport, ListeMob est un tableau de STJSONMembreRubRapport,MonDoc est un Document) c est un entier sAInfoRemp est une chaîne ANSI TableauTrie(tabRubMobile,ttMembre+tccRespecteNumérique,"+Rubrique;+Ordre") sNomRub est une chaîne ANSI POUR i = 1 À tabRubMobile..Occurrence unTerme est un STJSONMembreRubRapport = tabRubMobile[i] sAInfoRemp = "" SI sNomRub <> unTerme.Rubrique ALORS // moyen de savoir si la rubrique a été déjà traite, une rubrique peuvent être pressent plusieurs fois dans un modèle , // toutes les rubriques seront traites dans la variable tabfragments SI unTerme.Type = "Tableau" ET unTerme.GroupeApp <> cRp_Inter ALORS 12/08/2026 Batik_WS_Com_Mob 217

Partie 4 › Collection de procédures › LIB_Traitements › Code QUAND EXCEPTION DANS tabFragments est tableau de docFragment = DocRecherche(MonDoc,unTerme.Rubrique, MotComplet+SansCasse) c = 1 POUR c = 1 À tabFragments.Occurrence CreationTbdansModeleEmail(ListeMob,tabRubMobile[i],MonDoc) //tabFragments[c].Texte = HTMLVersTexte(sAInfoRemp) //tabFragments[c].Texte = sAInfoRemp FIN SI tabFragments..Occurrence <= 0 ALORS SI unTerme.ListeMembre..Occurrence > 0 ALORS tabFragments = DocRecherche(MonDoc,unTerme.ListeMembre[1].Rubrique,MotComplet +SansCasse) SI tabFragments.Occurrence > 0 ALORS RemplirLigneSansTbModeleMail(ListeMob,unTerme, MonDoc) FIN FIN FIN FAIRE TraceERREUR("Erreur dans la création du modele mail "+ExceptionInfo()) FIN SINON QUAND EXCEPTION DANS tabFragments est tableau de docFragment = DocRecherche(MonDoc,unTerme.Rubrique, MotComplet+SansCasse) SI tabFragments..Occurrence > 0 ALORS c = 1 POUR c = 1 À tabFragments.Occurrence sAInfoRemp = RechercheDonneesSimpleRapportMob(ListeMob,unTerme ) tabFragments[c].Texte= sAInfoRemp FIN FIN FAIRE TraceERREUR("Erreur dans la création du modele email "+ExceptionInfo()) FIN FIN FIN sNomRub= unTerme.Rubrique FIN Procédure globale TraiteLigneTableauRapportMob PROCÉDURE TraiteLigneTableauRapportMob(ListeMob est un tableau de STJSONMembreRubRapport, unTerme est un STJSONMembreRubRapport, MonDoc est un Document,CheminImg est une chaîne ANSI) sADonnes est une chaîne ANSI b est un entier nColonne, nLigne, nIMax, nIMin,nSel sont des entiers bUnAjout est un booléen tabFragments est tableau de docFragment TableauTrie(unTerme.ListeMembre,ttMembre+tccRespecteNumérique,"+Ordre") SI unTerme:EnvoiMob ALORS 12/08/2026 Batik_WS_Com_Mob 218

Partie 4 › Collection de procédures › LIB_Traitements › Code b = TableauCherche(ListeMob,tcLinéaire,"Rubrique;Utilisee",unTerme:Rubrique,Faux) FIN SI b > 0 ALORS sADonnes = ListeMob[b].ListeDonnesMob TraceINFO("Données mob : "+sADonnes) FIN SI sADonnes <> "" ET unTerme:Type = "Tableau" ALORS vInfoVariante est un Variant = JSONVersVariant(sADonnes) ListeMob[b].Utilisee = Vrai // on commence pour ajouter le nombre de ligne dans le tableau SI unTerme.ListeMembre..Occurrence > 0 ALORS tabFragments = DocRecherche(MonDoc,unTerme.ListeMembre[1].Rubrique,MotComplet+SansCasse) SI tabFragments..Occurrence <= 0 ET unTerme.ListeMembre..Occurrence > 1 ALORS tabFragments = DocRecherche(MonDoc,unTerme.ListeMembre[2].Rubrique,MotComplet+SansCasse) FIN SI tabFragments..Occurrence > 0 ALORS soit para <- tabFragments[1]..Paragraphe[1] SI para.Tableau = Null ALORS bUnAjout = Faux SINON bUnAjout = Vrai FIN SI bUnAjout ALORS nColonne = tabFragments[1].Elément[1].Cellule..IndiceColonne nLigne = tabFragments[1].Elément[1].Cellule..IndiceLigne nIMax = nLigne nIMin = nLigne POUR TOUT Ele DE vInfoVariante SI Ele.bselection ALORS nSel += 1 SI nIMax > nLigne ALORS Ajoute(para.Tableau.Lignes) FIN nIMax += 1 SI Contient(unTerme.ListeMembre[1].Rubrique,"$UN") ALORS SORTIR FIN FIN FIN FIN FIN FIN //Âpres l'ajout des toutes les lignes un ajoute l'information SI bUnAjout ALORS RemplirLigneTableauRapportMob(unTerme,nIMin,MonDoc,vInfoVariante,CheminImg) SI nSel > 0 ALORS RENVOYER Vrai SINON RENVOYER Faux FIN SINON RENVOYER RemplirLigneSansTbRapport(unTerme, MonDoc,vInfoVariante,CheminImg) FIN FIN 12/08/2026 Batik_WS_Com_Mob 219

Partie 4 › Collection de procédures › LIB_Traitements › Code RENVOYER Faux Procédure globale TraitementSelonTypeRubRapportMob PROCÉDURE TraitementSelonTypeRubRapportMob(stMembre, sADonnes est une chaîne ANSI) sTexte est une chaîne = " " dhUnDateHeure est une DateHeure bUnBoolean est un booléen sType est une chaîne ANSI = stMembre:TypeMembre SI sType = "" ALORS sType = stMembre:Type FIN SI sADonnes..Taille < 8 ET (stMembre:TypeMembre = "ChpSimpleDate" OU stMembre:TypeMembre = "ChpSimpleDateHeure") ALORS RENVOYER sTexte FIN QUAND EXCEPTION DANS SI stMembre:GroupeApp = cRp_Extra ALORS SELON stMembre:Type CAS typDate dhUnDateHeure = sADonnes sTexte=DateVersChaîne(dhUnDateHeure,"JJ/MM/AAAA") CAS typHeure dhUnDateHeure = sADonnes sTexte=HeureVersChaîne(dhUnDateHeure,"HH:mm") CAS typTexte sTexte=sADonnes CAS typSélect sTexte=bUnBoolean=Vrai ? "Oui" SINON "Non" AUTRE CAS sTexte = sADonnes FIN SINON SELON sType CAS "ChpSimpleDate" : dhUnDateHeure = sADonnes CAS "ChpSimpleDateHeure": dhUnDateHeure = sADonnes CAS "ChpSimpleBooleen" : bUnBoolean = sADonnes FIN SELON sType CAS "ChpSimpleChaine" : sTexte=sADonnes CAS "ChpSimpleRTF" : sTexte=RTFVersTexte(sADonnes) CAS "ChpSimpleDate" : sTexte=DateVersChaîne(dhUnDateHeure,"JJ/MM/AAAA") CAS "ChpSimpleDateHeure": sTexte=DateVersChaîne(dhUnDateHeure,"JJ/MM/AAAA HH:mm") CAS "ChpSimpleReel" : sTexte=sADonnes CAS "ChpSimpleBooleen" : sTexte=bUnBoolean=Vrai ? "Oui" SINON "Non" AUTRE CAS sTexte = sADonnes FIN FIN RENVOYER sTexte FAIRE RENVOYER sTexte FIN Procédure globale WhereRechercheIntDroitDossier PROCÉDURE WhereRechercheIntDroitDossier(stData est une ST_MOB_DATA, saGUIDColb est une chaîne ANSI) 12/08/2026 Batik_WS_Com_Mob 220

Partie 4 › Collection de procédures › LIB_Traitements › Code stParam est un ST_REQ_LISTE_RDV Désérialise(stParam,stData.saJSON,psdJSON) saTxt est une chaîne = stParam.saTxt saLstIdDossier est une chaîne ANSI saWhere est une chaîne ANSI saWhere +=" ( Intervention.IN_RefInterne LIKE '%" + saTxt +"%'" saWhere +=" OR Client.CL_Nom LIKE '%" + saTxt +"%'" saWhere +=" OR Lieu.LI_CodeLieu LIKE '%" + saTxt +"%'" saWhere +=" OR Demandeur.PE_Nom LIKE '%" + saTxt +"%'" saWhere +=" ) " bufRes est un Buffer saReq est une chaîne ANSI = [ select STRING_AGG(RDV_Planning.RV_IdDossier, ',') AS id_list FROM ( ( RDV_Planning INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_GUID_Colb = {pGUIDColb} AND RDV_Collaborateur.Archive = 0 LEFT OUTER JOIN Intervention on Intervention.IN_PKID = RDV_Planning.RV_IdInter LEFT OUTER JOIN Client ON Intervention.IN_IDClient = Client.CL_PKID ) LEFT OUTER JOIN Lieu ON Intervention.IN_IDLieu = Lieu.LI_PKID LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID) LEFT OUTER JOIN Personne Demandeur ON Intervention.IN_IDDemandeur = Demandeur.PE_PKID WHERE ( {Clause} And RDV_Planning.Archive = 0 ) ] saReq=Remplace(saReq,"{Clause}",saWhere) saReq=Remplace(saReq,"{pGUIDColb}",saGUIDColb) sd est une Source de Données // TraceRequete(saRQ) SI PAS HExécuteRequêteSQL(sd,gcnxReplica,hRequêteDéfaut,saReq) ALORS bufRes="E"+ErreurInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) RENVOYER bufRes SINON POUR TOUT sd saLstIdDossier = sd.id_list FIN FIN SI saLstIdDossier <> "" ALORS saWhere+= "AND Intervention.IN_IDDossier IN ("+saLstIdDossier+")" RENVOYER saWhere SINON RENVOYER "" FIN Procédure globale WhereRechercheIntDroitRDV PROCÉDURE WhereRechercheIntDroitRDV(stData est une ST_MOB_DATA, saGUIDColb est une chaîne ANSI) stParam est un ST_REQ_LISTE_RDV Désérialise(stParam,stData.saJSON,psdJSON) saTxt est une chaîne = stParam.saTxt 12/08/2026 Batik_WS_Com_Mob 221

Partie 4 › Collection de procédures › LIB_Traitements › Code

saLstIdInt est une chaîne ANSI
saWhere est une chaîne ANSI
saWhere +=" ( Intervention.IN_RefInterne LIKE '%" + saTxt +"%'"
saWhere +=" OR Client.CL_Nom LIKE '%" + saTxt +"%'"
saWhere +=" OR Lieu.LI_CodeLieu LIKE '%" + saTxt +"%'"
saWhere +=" OR Demandeur.PE_Nom LIKE '%" + saTxt +"%'"
saWhere +=" ) "
bufRes est un Buffer
------ ------------------- --- --- ---
saReq est une chaîne ANSI = [
select STRING_AGG(RDV_Planning.RV_IdDossier, ',') AS id_list
FROM
(
( RDV_Planning
INNER JOIN RDV_Collaborateur ON RDV_Collaborateur.RVC_GUID_Colb = {pGUIDColb} AND
RDV_Collaborateur.Archive = 0
LEFT OUTER JOIN Intervention on Intervention.IN_PKID = Planning_RDV.PL_IDIntervention
LEFT OUTER JOIN Client ON Intervention.IN_IDClient = Client.CL_PKID )
LEFT OUTER JOIN Lieu ON Intervention.IN_IDLieu = Lieu.LI_PKID
LEFT OUTER JOIN Adresse AdLieu ON Lieu.LI_IDAdresse = AdLieu.AD_PKID)
LEFT OUTER JOIN Personne Demandeur ON Intervention.IN_IDDemandeur = Demandeur.PE_PKID
WHERE
(
{Clause} And RDV_Planning.Archive = 0
)
]
saReq = Remplace(saReq,"{Clause}",saWhere)
------------------------------------------------ --- --- --- ---
saReq = Remplace(saReq,"{pGUIDColb}",saGUIDColb)
sd est une Source de Données
// TraceRequete(saRQ)
SI PAS HExécuteRequêteSQL(sd,gcnxReplica,hRequêteDéfaut,saReq) ALORS
bufRes="E"+ErreurInfo(errComplet)
TraceDEBUG("bufREs : " + bufRes)
RENVOYER bufRes
SINON
POUR TOUT sd
saLstIdInt = sd.id_list
FIN
FIN
SI saLstIdInt <> "" ALORS
saWhere+= "AND Intervention.IN_PKID IN ("+saLstIdInt+")"
RENVOYER saWhere
SINON
RENVOYER ""
FIN
Procédure globale WhereRechercheIntDroitSoc
PROCÉDURE WhereRechercheIntDroitSoc(stData est une ST_MOB_DATA, nIdCollab est un entier sur 8 octets)
stParam est un ST_REQ_LISTE_RDV
Désérialise(stParam,stData.saJSON,psdJSON)
saTxt est une chaîne = stParam.saTxt
--------------------------- ------------------- --------------- ---------------- ---
saLstIdSoc est une chaîne ANSI
saWhere est une chaîne ANSI
12/08/2026 Batik_WS_Com_Mob 222

Partie 4 › Collection de procédures › LIB_Traitements › Code bufRes est un Buffer saReq_2 est une chaîne ANSI = [ select SC_IDCSociete from Societe_Collaborateur where SC_IDCollaborateur = ] saReq_2 += nIdCollab sd_2 est une Source de Données // TraceRequete(saRQ) SI PAS HExécuteRequêteSQL(sd_2,gcnxReplica,hRequêteDéfaut,saReq_2) ALORS bufRes="E"+ErreurInfo(errComplet) TraceDEBUG("bufREs : " + bufRes) RENVOYER bufRes SINON POUR TOUT sd_2 saLstIdSoc+= [","] + sd_2.SC_IDCSociete FIN FIN SI saLstIdSoc <> "" ALORS //Construction de la clause WHERE qui sera ensuite ajoutée dans la requête de recherche saWhere +=" ( Intervention.IN_RefInterne LIKE '%" + saTxt +"%'" saWhere +=" OR Client.CL_Nom LIKE '%" + saTxt +"%'" saWhere +=" OR Lieu.LI_CodeLieu LIKE '%" + saTxt +"%'" saWhere +=" OR Demandeur.PE_Nom LIKE '%" + saTxt +"%'" saWhere +=" ) AND Intervention.IN_IDSociete in ("+saLstIdSoc+")" FIN RENVOYER saWhere 12/08/2026 Batik_WS_Com_Mob 223

Partie 4 › Collection de procédures › LIB_ProcéduresGlobales2 › Code LIB_ProcéduresGlobales2 Code Procédure globale DebuteSession PROCÉDURE DebuteSession(Token est une chaîne ANSI) //res est une chaîne ANSI = WebserviceParamètre("Token",paramAvecDécodage) // Utilisez la commande WebserviceParamètre() pour récupérer les paramètres du point d'entrée du Webservice REST associé à cette procédure. // Consultez l'aide de WebserviceParamètre pour plus d'informations. WebserviceEcritCodeHTTP(400,"Super") RENVOYER "Recu :[" +Token + "]" 12/08/2026 Batik_WS_Com_Mob 224

Partie 4 › Collection de procédures › LIB_Structures › Code LIB_Structures Code Déclaration de LIB_Structures CONSTANT cREP_LIC_OK ="E0000" cERR_DATA_VIDE ="E1001" cERR_FORMAT_JSON ="E1002" cERR_CLI_INCONNU ="E2001" cERR_CLI_LIC ="E2002" cERR_CLI_CONFIG ="E2003" //Configuration incomplète cERR_CLI_BADAPI ="E2004" //La clé API n'est pas correcte cERR_LIC_INCONNUE ="E3001" cERR_LIC_INACTIVE="E3002" cERR_LIC_EXPIREE ="E3003" cERR_LIC_ATTRIBUEE ="E3004" cERR_LIC_AUCUNE ="E3005" cERR_CMD_INCONNUE="E4001" cERR_HF_BLOCAGE ="E5001" cERR_SRV ="E6001" //Erreur générique du serveur //Erreur fonctionnelle cERR_RDV_PLANIFIER ="E7001" cERR_EXCEPTION ="E9000" FIN ST_ContexteMobile est une Structure saToken est une chaîne ANSI saIdMobile est une chaîne ANSI saBaseData est une chaîne ANSI saBaseSync est une chaîne ANSI saIdClient est une chaîne ANSI bAuthentifié est un booléen dhAuthentification est une DateHeure saNumPort est une chaîne ANSI nIdGroupe est un entier sur 8 octets nNbConnexions est un entier saNomUser est une chaîne ANSI saFichierLog est une chaîne ANSI stUser est un ST_PROFIL_UTILISATEUR sLstEtatsInter est une chaîne ANSI //Liste des ParametreMetier.PA_pkid des États des Interventions non planifiées que l'on peut transmettre aux mobile sLstDocTypeAcces est une chaîne ANSI //Paramètres Métiers bParamChargés est un booléen 12/08/2026 Batik_WS_Com_Mob 225

Partie 4 › Collection de procédures › LIB_Structures › Code sParamJson est une chaîne ANSI tbaDroitsAcces est un tableau associatif de booléens FIN ST_TAB_PARAM est une Structure TbaRoleContact est un tableau associatif (, "Contact", wlChaîneAnsi) de chaînes TbaRoleCntctLieu est un tableau associatif (, "Contact", wlChaîneAnsi) de chaînes TbaCivilite est un tableau associatif (*, , wlChaîneAnsi) de chaînes TbaTypeDossier est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaStatutDossier est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaTypeLieu est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaDestDemande est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaPriorite est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaTypeInter est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaEtatInter est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaStatutRDV est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaTypAction est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaTypActivite est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaTypAdresse est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaStatutClient est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaTypClient est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaCategorieDoc est un tableau associatif (, , wlChaîneAnsi) de chaînes TbaCategorieDoc2 est un tableau associatif (, , wlChaîneAnsi) d'entiers sur 8 octets TbaCategorieDoc3 est un tableau associatif (, , wlChaîneAnsi) de STParametreCategDoc BDroitProfil est un tableau associatif (, *, wlChaîneAnsi) de STListeDroit FIN ST_PROFIL_UTILISATEUR est une Structure saGuid est une chaîne ANSI nIdUser est un entier sur 8 octets nIdCollab est un entier sur 8 octets saNom est une chaîne ANSI saPrenom est une chaîne ANSI saSociete est une chaîne ANSI nPond100 est un entier nIdGroupe est un entier saProfil est une chaîne ANSI nIdProfil est un entier sur 8 octets bDroit_AnnulationRDV est un booléen bDroit_EnvoiEmail est un booléen bDroit_CreationRapport est un booléen ParamApp est un ST_ParamApp FIN ST_CONTEXTE est une Structure tbParam est un tableau de ST_PARAMETRE_METIER stUser est un ST_PROFIL_UTILISATEUR FIN ST_ParamApp est une Structure bDroit_AnnulationRDV est un booléen bDroit_CouleurRDV est un booléen bDroit_HeureDejRDV est un booléen bNumDevis_RDV est un booléen bRefInt_RDV est un booléen bRefExt_RDV est un booléen FIN //Structures utilisée pour envoyer la liste des Interventions au mobiles ST_ADRESSE est une Structure nID est un entier sur 8 octets saEtiq est une chaîne ANSI saLig est une chaîne ANSI saCP est une chaîne ANSI 12/08/2026 Batik_WS_Com_Mob 226

Partie 4 › Collection de procédures › LIB_Structures › Code saVil est une chaîne ANSI FIN ST_PERSONNE_LIEU est une Structure saNom est une chaîne ANSI saPren est une chaîne ANSI saTFix est une chaîne ANSI saTMob est une chaîne ANSI nID est un entier sur 8 octets saRole est une chaîne ANSI saEtage est une chaîne ANSI saEtiquette est une chaîne ANSI saLot est une chaîne ANSI saNote est une chaîne ANSI saEmail est une chaîne ANSI bDemand est un booléen bDonneurOrdre est un booléen FIN ST_NOTE est une Structure saGuid est une chaîne ANSI nIdInter est un entier sur 8 octets saNote est une chaîne ANSI saAuteur est une chaîne ANSI nIdAuteur est un entier sur 8 octets // saDate est une chaîne ANSI saType est une chaîne ANSI nIdUsr est un entier sur 8 octets FIN ST_COMPTERENDU_V2 est une Structure saGuidCR est une chaîne ANSI saDebut est une chaîne ANSI saFin est une chaîne ANSI saNoteCollab est une chaîne ANSI saNoteClient est une chaîne ANSI saDateSignature est une chaîne ANSI saReserveCommentaire est une chaîne ANSI nIdInter est un entier sur 8 octets saSignataire est une chaîne ANSI saGuidRDV est une chaîne ANSI nIdCollab est un entier sur 8 octets nIdUser est un entier sur 8 octets bImgSignature est un booléen bImgSignatureTechest un booléen saNomCollaborateur est une chaîne ANSI nIDTypeSignataireest un entier sur 8 octets nIdGroupeRDV est un entier bufImgSignature est un Buffer FIN ST_TEMPS est une Structure saGuid est une chaîne ANSI nIdInter est un entier sur 8 octets nIdTps est un entier sur 8 octets nIdCollab est un entier sur 8 octets nIdRDV est un entier sur 8 octets saNumInter est une chaîne ANSI saLibelle est une chaîne ANSI saHeureDebut est une chaîne ANSI saHeureFin est une chaîne ANSI nPond100 est un entier nNbMinutes est un entier nIdTypeTps est un entier sur 8 octets saGuidRdv est une chaîne ANSI FIN ST_TEMPS_PASSE est une Structure 12/08/2026 Batik_WS_Com_Mob 227

Partie 4 › Collection de procédures › LIB_Structures › Code saGuid est une chaîne ANSI nIdTypeTps est un entier sur 8 octets nTemps est un entier saDateHeureDeb est une chaîne ANSI saDateHeureFin est une chaîne ANSI bModifiable est un booléen FIN ST_TEMPS_PASSE_RDV est une Structure nIdRDV est un entier sur 8 octets //nIdInterventionest un entier sur 8 octets //saGuidRdv est une chaîne ANSI //nIdCollab est un entier sur 8 octets tblTemps est un tableau de ST_TEMPS_PASSE FIN ST_PARAMETRE_METIER est une Structure nIdParam est un entier sur 8 octets saCode est une chaîne ANSI saLib est une chaîne ANSI saVal est une chaîne ANSI nOrdre est un entier bSysteme est un booléen bInvisible est un booléen FIN ST_PARAMETRE_METIER_V2 est une Structure nIdParam est un entier sur 8 octets saCode est une chaîne ANSI saLib est une chaîne ANSI saVal est une chaîne ANSI nOrdre est un entier bSysteme est un booléen bInvisible est un booléen saJson est un chaîne ANSI FIN //Toute modif dans cette structure doit être reportée dans la structure ST_RDV_LOC du projet BeMobile ST_COMPTERENDU est une Structure saGuidCR est une chaîne ANSI saDebut est une chaîne ANSI saFin est une chaîne ANSI saNoteCollab est une chaîne ANSI saNoteClient est une chaîne ANSI saDateSignature est une chaîne ANSI nIdInter est un entier sur 8 octets saSignataire est une chaîne ANSI saGuidRDV est une chaîne ANSI nIdCollab est un entier sur 8 octets nIdUser est un entier sur 8 octets bufImgSignature est un Buffer FIN STCompteRenduRqListe_V2 est une Structure saCR_GUID est une chaîne ANSI saDateHeureDebut est une chaîne ANSI saDateHeureFin est une chaîne ANSI saNoteCollaborateur est une chaîne ANSI saNoteSignataire est une chaîne ANSI saReserveCommentaire est une chaîne ANSI saDateHeureSignature est une chaîne ANSI nRDV_PKID est une entier sur 8 octets nIN_PKID est une entier sur 8 octets saNomSignataire est une chaîne saPL_GUID est une chaîne ANSI nPL_IDCollaborateur est un entier sur 8 octets nCR_CreationUser est un entier sur 8 octets 12/08/2026 Batik_WS_Com_Mob 228

Partie 4 › Collection de procédures › LIB_Structures › Code bCR_Signature est un booléen bCR_SignatureTech est un booléen nIdGroupe est un entier saNomCollaborateur est une chaîne nIDTypeSignataire est un entier sur 8 octets bufCR_Signature est un Buffer FIN STCompteRenduRqListe est une Structure saCR_GUID est une chaîne ANSI saDateHeureDebut est une chaîne ANSI saDateHeureFin est une chaîne ANSI saNoteCollaborateur est une chaîne ANSI saNoteSignataire est une chaîne ANSI saDateHeureSignature est une chaîne ANSI nRDV_PKID est une entier sur 8 octets nIN_PKID est une entier sur 8 octets saNomSignataire est une chaîne saPL_GUID est une chaîne ANSI nPL_IDCollaborateur est un entier sur 8 octets nCR_CreationUser est un entier sur 8 octets bufCR_Signature est un Buffer nIdGroupe est un entier sur 8 octets FIN ST_RDV_A_PLANIFIER est une Structure nIdRdv est un entier sur 8 octets saGuidRdv est une chaîne ANSI nIdCollab est un entier sur 8 octets nIdUser est un entier sur 8 octets saDateHeureDeb est une chaîne ANSI saDateHeureFin est une chaîne ANSI nIDStatut est un entier sur 8 octets FIN ST_TELEPHONE est une Structure saTelNum est une chaîne ANSI saTelLib est une chaîne ANSI FIN ST_RDV_CONTACT est une Structure nIdRdvCnt est un entier sur 8 octets //nID est un entier sur 8 octets saCivilite est une chaîne ANSI saNom est une chaîne ANSI saPrenom est une chaîne ANSI saEmail est une chaîne ANSI nIdRole est un entier sur 8 octets saRole est une chaîne ANSI saEtage est une chaîne ANSI saLot est une chaîne ANSI saEtiquette est une chaîne ANSI saNote est une chaîne ANSI bDonneurOrdre est un booléen tbLTEL est un tableau de ST_TELEPHONE FIN // saGuid est une chaîne ANSI // nRDV_PKID est un entier sur 8 octets // nRDV_IDClb est un entier sur 8 octets // nRDV_IDInt est un entier sur 8 octets // nRDV_TypActID est un entier sur 8 octets // nRDV_StatutID est un entier sur 8 octets // saRDV_Obj est une chaîne ANSI // saRDV_Dscrpt est une chaîne ANSI // saRDV_DtDeb est une chaîne ANSI // saRDV_DtFin est une chaîne ANSI 12/08/2026 Batik_WS_Com_Mob 229

Partie 4 › Collection de procédures › LIB_Structures › Code //Toute modif dans cette structure doit être reportée dans la structure ST_INTER_LOC du projet BeMobile ST_INTER est une Structure nDos_IDCli est un entier sur 8 octets saDos_Type est une chaîne ANSI saDos_Tit est une chaîne ANSI saDos_Etat est une chaîne ANSI saDos_RfI est une chaîne ANSI saDos_RfE est une chaîne ANSI saCli_Nom est une chaîne ANSI saCli_Tel est une chaîne ANSI saCli_Fax est une chaîne ANSI saCli_Email est une chaîne ANSI stCli_Ad est un ST_ADRESSE nInt_PKID est un entier sur 8 octets saInt_Typ est une chaîne ANSI saInt_Etat est une chaîne ANSI nInt_IDSuiv est un entier sur 8 octets saNomSuiviPar est une chaîne saPrenomSuiviPar est une chaîne saTelSuiviPar est une chaîne saSuiviEmail est une chaîne ANSI nInt_IDDos est un entier sur 8 octets nInt_IDDem est un entier sur 8 octets nInt_IDCli est un entier sur 8 octets nInt_IDLieu est un entier sur 8 octets nInt_IDSociete est un entier sur 8 octets saInt_Descrip est une chaîne ANSI bInt_AtTVA est un booléen saInt_Note est une chaîne ANSI saInt_Tit est une chaîne ANSI saInt_RfI est une chaîne ANSI saInt_RfE est une chaîne ANSI saInt_NumDevis est une chaîne saInt_DateDevis est une chaîne ANSI saSoc_Nom est une chaîne ANSI nLieu_PKID est un entier sur 8 octets saLieu_CodeLieu est une chaîne ANSI nLieu_IDAdresse est un entier sur 8 octets saLieu_Type est une chaîne ANSI saLieu_CodeAcces est une chaîne ANSI bLieu_Badge est un booléen bLieu_Interphone est un booléen saLieu_Note est une chaîne ANSI nAdLieu_PKID est un entier sur 8 octets stLieu_Ad est un ST_ADRESSE nDmd_PKIDest est un entier sur 8 octets saDmd_Civ est une chaîne ANSI saDmd_Nom est une chaîne ANSI saDmd_Prenom est une chaîne ANSI saDmd_TelFixe est une chaîne ANSI saDmd_TelMobile est une chaîne ANSI saDmd_Email est une chaîne ANSI saDmd_Role est une chaîne ANSI nDmd_IDAdresse est un entier sur 8 octets nDmd_IDClient est un entier sur 8 octets saDmd_Note est une chaîne ANSI saDmd_Fax est une chaîne ANSI tblPerLieu est un tableau de ST_PERSONNE_LIEU 12/08/2026 Batik_WS_Com_Mob 230

Partie 4 › Collection de procédures › LIB_Structures › Code tblNote est un tableau de ST_NOTE // tblTps est un Tableau de ST_TEMPS FIN ST_RDV est une Structure nPKID est un entier sur 8 octets nIDGroupe est un entier sur 8 octets nIDSociete est un entier sur 8 octets nIDEquipe est un entier sur 8 octets nIDCollaborateur est un entier sur 8 octets nIDDossier est un entier sur 8 octets nIDIntervention est un entier sur 8 octets nIDTypeActivite est un entier sur 8 octets nIDStatut est un entier sur 8 octets saStatut est une chaîne ANSI saDescription est une chaîne ANSI saDateDebut est une chaîne ANSI saDateFin est une chaîne ANSI bSuperposable est un booléen bPrive est un booléen bGrouper est un booléen saObjet est une chaîne ANSI nIDLieu est une chaîne saGUID est une chaîne ANSI tblContact est un tableau de ST_RDV_CONTACT stCompteRendu est un ST_COMPTERENDU FIN ST_RDV_V2 est une Structure nPKID est un entier sur 8 octets nIDGroupe est un entier sur 8 octets nIDSociete est un entier sur 8 octets nIDEquipe est un entier sur 8 octets nIDCollaborateur est un entier sur 8 octets nIDDossier est un entier sur 8 octets nIDIntervention est un entier sur 8 octets nIDTypeActivite est un entier sur 8 octets nIDStatut est un entier sur 8 octets saStatut est une chaîne ANSI saDescription est une chaîne ANSI saDateDebut est une chaîne ANSI saDateFin est une chaîne ANSI bSuperposable est un booléen bPrive est un booléen bGrouper est un booléen saObjet est une chaîne ANSI nIDLieu est une chaîne saGUID est une chaîne ANSI saGUID_RDV est une chaîne ANSI bSAV est un booléen bCR est un booléen tblContact est un tableau de ST_RDV_CONTACT stCompteRendu est un ST_COMPTERENDU_V2 saNoteCollab est une chaîne ANSI FIN ST_RDV_INTER est une Structure stRDV est un ST_RDV stINTER est un ST_INTER saRDV_TypAct est une chaîne ANSI saRDV_Statut est une chaîne ANSI saRDV_Civ est une chaîne ANSI saRDV_Nom est une chaîne ANSI saRDV_Pren est une chaîne ANSI saRDV_Tel est une chaîne ANSI saRDV_Role est une chaîne ANSI 12/08/2026 Batik_WS_Com_Mob 231

Partie 4 › Collection de procédures › LIB_Structures › Code nRDV_IdCtact est un entier sur 8 octets saRDV_Lieu est une chaîne ANSI FIN ST_RDV_INTER_V2 est une Structure stRDV est un ST_RDV_V2 stINTER est un ST_INTER saRDV_TypAct est une chaîne ANSI saRDV_Statut est une chaîne ANSI saRDV_Civ est une chaîne ANSI saRDV_Nom est une chaîne ANSI saRDV_Pren est une chaîne ANSI saRDV_Tel est une chaîne ANSI saRDV_Role est une chaîne ANSI nRDV_IdCtact est un entier sur 8 octets saRDV_Lieu est une chaîne ANSI FIN //Toute modif dans cette structure doit être reportée dans la structure ST_TABELEM_DOC du projet BeMobile ST_TABELEM_DOC est une Structure nDC_PKID est un entier sur 8 octets nDC_IdInter est un entier sur 8 octets saDC_Nom est une chaîne ANSI saDC_DteFic est une chaîne ANSI saLibCat est une chaîne ANSI saDocGuid est une chaîne ANSI tblNotes est un tableau de ST_TABELEM_NOTEDOC FIN ST_TABELEM_NOTEDOC est une Structure nDN_PKID est un entier sur 8 octets saDN_Note est une chaîne ANSI saDN_Date est une chaîne ANSI nDN_Auteur est un entier sur 8 octets nDN_DOCPKID est un entier sur 8 octets saNomAuteur est une chaîne ANSI saGUID est une chaîne ANSI nIdUsr est un entier sur 8 octets FIN //Structure lue dans le QRCode d'inscription ST_MOB_INSCRIPTION est une Structure saSrv est une chaîne ANSI saPort est une chaîne ANSI saIdCli est une chaîne ANSI nIdClb est un entier sur 8 octets nIdUsr est un entier sur 8 octets saNom est une chaîne ANSI saPren est une chaîne ANSI FIN ST_REQ_LISTE_RDV est une Structure nIdCollaborateur est un entier sur 8 octets saDateDebut est une chaîne ANSI saDateFin est une chaîne ANSI saTxt est une chaîne ANSI saTOP est une chaîne ANSI bSimple est un booléen nIdInter est un entier sur 8 octets FIN ST_REQ_LISTE_TEMPS est une Structure nIdCollaborateur est un entier sur 8 octets saDateDebut est une chaîne ANSI saDateFin est une chaîne ANSI 12/08/2026 Batik_WS_Com_Mob 232

Partie 4 › Collection de procédures › LIB_Structures › Code saLstIdInter est une chaîne ANSI FIN ST_REQ_LISTE_TEMPS_PASSE est une Structure nIdCollaborateur est un entier sur 8 octets nIdrdv est un entier sur 8 octets FIN ST_REQ_LISTE_DOC est une Structure nIdIntervention est un entier sur 8 octets FIN //Document ST_DOC est une Structure saNom est une chaîne ANSI saType est une chaîne ANSI nInterIDest un entier sur 8 octets saNote est une chaîne ANSI saDateCreat est une chaîne ANSI nIdUser est un entier sur 8 octets nDC_PKIDest un entier sur 8 octets saDocGUID est une chaîne ANSI nStatut est un entier FIN //Rapport STJSONInfoRapportMob est une Structure saGuid est une chaîne ANSI saDate est une chaîne ANSI nIdModele est un entier sur 8 octets nIdInter est un entier sur 8 octets saNomRapport est une chaîne ANSI ListeMob est un tableau de STJSONMembreRubRapport FIN ST_REQ_LISTE_Chp_Rapport est une Structure nIdCollaborateur est un entier sur 8 octets nIdInter est un entier sur 8 octets nIdModele est un entier sur 8 octets FIN STJSONMembreRubRapport est une Structure nIdRub est un entier sur 8 octets Nom est une chaîne Rubrique est une chaîne Description est une chaîne Groupe est une chaîne Type est une chaîne Ordre est un réel // Position dans le document , c'est unique est sert comme identifiant MembreMob est une chaîne ANSI EnvoiMob est un entier BD est un entier MembreEmailMob est une chaîne TypeMembre est une chaîne Utilisee est un booléen // pour savoir si la données envoyés par le mobile a été déjà utilisé dans le document, une donné peuvent être demande plusieurs fois dans le document ( img par exemple) GroupeApp est une chaîne ANSI MasqueSaisie est un booléen Modifiable est un booléen ListeDonnesMob est une chaîne ANSI ListeDonnesBD est une chaîne ANSI ListeMembre est un tableau de STJSONListeMembre FIN 12/08/2026 Batik_WS_Com_Mob 233

Partie 4 › Collection de procédures › LIB_Structures › Code STJSONListeMembre est une Structure Nom est une chaîne Rubrique est une chaîne Membre est une chaîne TypeMembre est une chaîne LargeurCol est un réel MembreMob est une chaîne ANSI EnvoiMob est un entier BD est un entier MembreEmailMob est une chaîne GroupeApp est une chaîne ANSI InvisibleBO est un entier Type est une chaîne Ordre est un réel // Position dans le document , c'est unique est sert comme identifiant Utilisee est un booléen // pour savoir si la données envoyés par le mobile a été déjà utilisé dans le document, une donné peuvent être demande plusieurs fois dans le document ( img par exemple) FIN STJSONRubriqueRapport est une Structure NomParamest une chaîne ListeTerme est un tableau de STJSONMembreRubRapport FIN // Modele Mail ST_ContactInter est une Structure saNom est une chaîne ANSI saRole est une chaîne ANSI saType est une chaîne ANSI saEmail est une chaîne ANSI bDemd est un booléen FIN ST_ModeleMailRub est une Structure saType est une chaîne ANSI saGUID est une chaîne ANSI Listerub est un tableau de STJSONMembreRubRapport FIN ST_ModeleMailComplet est une Structure nIdInter est un entier sur 8 octets nIdModele est un entier sur 8 octets saType est une chaîne ANSI saSujet est une chaîne ANSI bufCorpsHTML est un Buffer saGUID est une chaîne ANSI tbPJ est un tableau de chaînes ANSI tbPJID est un tableau de chaînes ANSI tbDest est un tableau de chaînes ANSI tbDestCC est un tableau de chaînes ANSI tbDestCCI est un tableau de chaînes ANSI stCompteMail est un STParamEnvoiEmailPerso FIN STJSONInfoModeleMailMob est une Structure saGuid est une chaîne ANSI saDate est une chaîne ANSI nIdModele est un entier sur 8 octets nIdInter est un entier sur 8 octets stCompteMail est un STParamEnvoiEmailPerso ListeMob est un tableau de STJSONMembreRubRapport FIN // Email STParamEmail est une Structure 12/08/2026 Batik_WS_Com_Mob 234

Partie 4 › Collection de procédures › LIB_Structures › Code sCompte est une chaîne sEmail est une chaîne FIN STParamEnvoiEmail est une Structure sLogin est une chaîne ANSI sMdp est une chaîne ANSI sAdresseServeur est une chaîne ANSI sPortServeur est une chaîne ANSI nCryptage est un entier bufSignature est un Buffer bEnCopieCachee est un booléen sType est une chaîne ANSI tabCC_CopieEmail est un tableau de chaînes ANSI FIN STParamEnvoiEmailPerso est une Structure Compte est un STParamEmail SMTP est un STParamEnvoiEmail FIN //Message externe communication avec le service ST_MsgExterneMail est une Structure nIdInter est un entier sur 8 octets saSujet est une chaîne ANSI bufCorp est un Buffer saGUID est une chaîne ANSI saAdrExp est une chaîne ANSI saPJ est une chaîne ANSI saDest est une chaîne ANSI saDestCC est une chaîne ANSI saDestCCI est une chaîne ANSI bEnvoye est un booléen nIdUser est un entier sur 8 octets FIN //STructure utilisée pour interroger le serveur de Licences ST_WS_VERIF_LM est une Structure saCodeClient est une chaîne ANSI saLicence est une chaîne ANSI saIdMobile est une chaîne ANSI FIN STParametreCategDoc est une Structure sCodeDroit est une chaîne sNomRepertoire est une chaîne FIN STDefDroitAcces est une Structure bufCle est un Buffer sBureau est une chaîne sMobile est une chaîne FIN STElementDroitAcces est une Structure sFichier est une chaîne sRubrique est une chaîne tabDefDroitAcces est un tableau de STDefDroitAcces FIN STListeDroit est une Structure tabElementDroitAcces est un STElementDroitAcces FIN ST_IdRDVClbDroitC est une Structure nIdClb est un entier sur 8 octets 12/08/2026 Batik_WS_Com_Mob 235

Partie 4 › Collection de procédures › LIB_Structures › Code sNomPrenom est une chaîne ANSI FIN //Rapport Mob ST_RDV_Rp est une Structure saGuid est une chaîne ANSI nIDGroupe est un entier sur 8 octets saDateDebut est une chaîne ANSI saDateFin est une chaîne ANSI saObjet est une chaîne ANSI saNote est une chaîne ANSI saCollaborateurs est une chaîne ANSI saExtra est une chaîne ANSI bSelection est un booléen FIN ST_CONTACT_Rp est une Structure nID est un entier sur 8 octets saNom est une chaîne ANSI saPren est une chaîne ANSI saRole est une chaîne ANSI saTFix est une chaîne ANSI saTMob est une chaîne ANSI saEtage est une chaîne ANSI saExtra est une chaîne ANSI bSelection est un booléen FIN ST_ClientAd est une Structure sAAdresse est une chaîne ANSI sAExtra est une chaîne ANSI bSelection est un booléen FIN ST_CR_Rp est une Structure saGuidCR est une chaîne ANSI saDebut est une chaîne ANSI saFin est une chaîne ANSI saSignataire est une chaîne ANSI saNomCollaborateur est une chaîne ANSI saExtra est une chaîne ANSI bSelection est un booléen FIN ST_Img_Rp est une Structure nDC_PKID est un entier sur 8 octets saNom est une chaîne ANSI saExtra est une chaîne ANSI saNotes est une chaîne ANSI saDate est une chaîne ANSI bSelection est un booléen nPosTable est un entier FIN 12/08/2026 Batik_WS_Com_Mob 236

Partie 4 › Collection de procédures › LIB_EXE › Code LIB_EXE Code Déclaration de LIB_EXE gcnxE_ServeurLicence est une Connexion gcnxE_ServeurWSCom est une Connexion Procédure globale EXE_OuvreConnexionHFSQL PROCÉDURE EXE_OuvreConnexionHFSQL() QUAND EXCEPTION DANS LIB_EXE.gcnxe_ServeurLicence..Provider = hAccèsHFClientServeur LIB_EXE.gcnxe_ServeurLicence..BaseDeDonnées= "BASE_LICENCES" LIB_EXE.gcnxe_ServeurLicence..MotDePasse = "ea0c6460faac5d87db47b4ca0147a34a" LIB_EXE.gcnxe_ServeurLicence..Serveur = "127.0.0.1:4900" LIB_EXE.gcnxe_ServeurLicence..Utilisateur = "Admin" // LIB_EXE.gsaPortWSCOM = "4902" // LIB_EXE.gsaServeurWSCOM = "51.68.44.182" LIB_EXE.gcnxe_ServeurWSCom..Provider = hAccèsHFClientServeur LIB_EXE.gcnxe_ServeurWSCom..BaseDeDonnées = "BATIK.01_BLD" LIB_EXE.gcnxe_ServeurWSCom..MotDePasse = "F911-Q927-K880-N196" LIB_EXE.gcnxe_ServeurWSCom..Serveur = "127.0.0.1:4900" LIB_EXE.gcnxe_ServeurWSCom..Utilisateur = "superuser" gcnxReplica = LIB_EXE.gcnxe_ServeurWSCom sPassSysteme est une chaîne ANSI= BufferVersHexa(HashChaîne(HA_MD5_128,Mdp3 + gcnxReplica.. BaseDeDonnées),SansRegroupement) gsaPass = BufferVersHexa(HashChaîne(HA_MD5_128,gcnxReplica..BaseDeDonnées),SansRegroupement) SI PAS HOuvreConnexion(gcnxReplica) ALORS TraceERREUR("ERREUR OuvreConnexionsHF " + gcnxReplica..BaseDeDonnées + RC + gcnxReplica.. Serveur +RC+ HErreurInfo(hErrComplet) ) RENVOYER Faux FIN // //Vérification ultime de la présence de la base de données du client sur le serveur // saLst est une chaîne ANSI = HListeBaseDeDonnées(gcnxReplica,hLstNormal) // SI ChaîneOccurrence(saLst, gstContexte.saBaseData ,SansCasse) =0 ALORS // TraceERREUR("ERREUR OuvreConnexionsHF : La base client n'existe pas sur ce serveur HF " + saLst ) // RENVOYER Faux // FIN //Déclaration Externe de tous les fichiers du répliqua saLst est une chaîne ANSI = HListeFichier(gcnxReplica) POUR TOUTE CHAÎNE saFic DE saLst SÉPARÉE PAR RC SI ChaîneOccurrence(saFic,"")=0 ALORS SI saFic="ParametreSysteme.fic" OU saFic="ParametreMetierEntete.fic" OU saFic=" Etats.fic" ALORS SI PAS HPasse(ExtraitChaîne(saFic,1,"."),sPassSysteme) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN SINON SI PAS HPasse(ExtraitChaîne(saFic,1,"."),gsaPass) ALORS 12/08/2026 Batik_WS_Com_Mob 237

Partie 4 › Collection de procédures › LIB_EXE › Code TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN SI PAS HDéclareExterne(saFic,ExtraitChaîne(saFic,1,"."),gcnxReplica) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN FIN //Déclaration Externe de la table paramètres pour pouvoir la manipuler avec des fonction Hxxx HPasse(gsdParamApplication,gsaPass) HDéclareExterne("ParametreApplication.fic",gsdParamApplication,gcnxReplica) TraceINFO("Connexions OK") RENVOYER Vrai FAIRE TraceERREUR("ERREUR OuvreConnexionsHF " + ExceptionInfo(errComplet) ) RENVOYER Faux FIN Procédure globale LanceWebService PROCÉDURE LanceWebService() sInFile est une chaîne = LigneCommande(1) sOutFileest une chaîne = LigneCommande(2) SI sInFile = "" OU sOutFile = "" ALORS // Pas d'arguments : on ne peut pas travailler RENVOYER "" FIN // Lire le JSON d’entrée sInJSON est une chaîne = fChargeTexte(sInFile) SI sInJSON = "" ALORS fSauveTexte(sOutFile, "Entrée JSON vide ou fichier introuvable") RENVOYER "" FIN // Parser JSON vIn est un Variant vIn = JSONVersVariant(sInJSON) SI ErreurDétectée ALORS fSauveTexte(sOutFile, "JSON invalide : " + ErreurInfo(errComplet)) RENVOYER "" FIN // Identifier le nom de l’opération sOp est une chaîne = "" SI vIn.procedure <> "" ALORS sOp = vIn.procedure SINON fSauveTexte(sOutFile, "Champ 'procedure' manquant") RENVOYER "" FIN saReponse est une chaîne ANSI // Dispatcher SELON sOp CAS "MOB_CMD": saReponse = MOB_CMD(vIn.stID, vIn.stData, vIn.bufDocument) CAS "MOB_EnvoieDoc": saReponse = MOB_EnvoieDoc(vIn.stID, vIn.saJSON, vIn.bufDocument) 12/08/2026 Batik_WS_Com_Mob 238

Partie 4 › Collection de procédures › LIB_EXE › Code CAS "MOB_RecupDoc": saReponse = MOB_RecupDoc(vIn.stID, vIn.nID_TOMOB) CAS "MOB_RecupDocID": saReponse = MOB_RecupDocID(vIn.stID) CAS "MOB_RecupValide": saReponse = MOB_RecupValide(vIn.stID,vIn.nIdToMob) CAS "Tesla": saReponse = "OUI" AUTRE CAS: saReponse = "Opération inconnue : " + sOp FIN fSauveTexte(sOutFile, saReponse) RENVOYER "" 12/08/2026 Batik_WS_Com_Mob 239

Partie 4 › Collection de procédures › LIB_DEBUG › Code LIB_DEBUG Code Déclaration de LIB_DEBUG gcnxD_ServeurLicence est une Connexion gcnxD_ServeurWSCom est une Connexion gtbaListeUsers est un tableau associatif de ST_MOB_IDENTITE gsaPortWSCOM est une chaîne ANSI gsaServeurWSCOM est une chaîne ANSI gID est un WS_COM_MOBILE.ST_MOB_IDENTITE gdDateDeb est une Date gdDateFin est une Date gnIdCollabChoisi est un entier sur 8 octets gnIdInterChoisi est un entier sur 8 octets gnIdRapportChoisi est un entier sur 8 octets gnIdEmailChoisi est un entier sur 8 octets gbEnvoiWebService est un booléen = Vrai gnIdCollabSID est un entier sur 8 octets Procédure globale D_LanceProcedure PROCÉDURE D_LanceProcedure(saType est une chaîne ANSI) saRep est une chaîne ANSI saBuf est une chaîne ANSI REQ est un WS_COM_MOBILE.ST_MOB_DATA REQ.saCMD=saType SELON saType CAS cCMD_NoteEcrit,cCMD_DocNoteEcrit,cCMD_TempsEcrit,cCMD_TempsSupprime,cCMD_CREcrit, cCMD_CREcrit_V2,cCMD_ListeDocDmd,cCMD_RdvEcrit,cCMD_TempsEcrit_V2,cCMD_RDVValidation, cCMD_RDVAnnulation,cCMD_DocRpRecup CAS cCMD_RdvAPlanifierEcrit CAS cCMD_ListeDOC CAS cCMD_ListeRDV_V2, cCMD_IdClbRdvDroitC,cCMD_ListeRDV_Clb stParam est un ST_REQ_LISTE_RDV stParam.nIdCollaborateur = LIB_DEBUG.gnIdCollabChoisi SI saType = cCMD_ListeRDV_V2 ALORS stParam.nIdCollaborateur= LIB_DEBUG.gnIdCollabSID FIN stParam.saDateDebut = LIB_DEBUG.gdDateDeb stParam.saDateFin = LIB_DEBUG.gdDateFin Sérialise(stParam,saBuf,psdJSON) REQ.saJSON=saBuf saTest est une chaîne ANSI SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,saTest) SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,saTest) 12/08/2026 Batik_WS_Com_Mob 240

Partie 4 › Collection de procédures › LIB_DEBUG › Code FIN saBuf=saRep[2 À] CAS cCMD_LitINTER_V2 stParam est un ST_REQ_LISTE_RDV stParam.nIdInter = LIB_DEBUG.gnIdInterChoisi stParam.bSimple = Vrai stParam.saDateDebut = LIB_DEBUG.gdDateDeb stParam.saDateFin = LIB_DEBUG.gdDateFin saBufJson est une chaîne ANSI Sérialise(stParam,saBufJson,psdJSON) REQ.saJSON=saBufJson SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_RechercheRDV stParam est un ST_REQ_LISTE_RDV stParam.saTxt = FEN_Principal.SAI_Recherche stParam.saTOP = "50" saBufJson est une chaîne ANSI Sérialise(stParam,saBufJson,psdJSON) REQ.saJSON=saBufJson SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_ListeTEMPS stParam est un ST_REQ_LISTE_TEMPS stParam.nIdCollaborateur=LIB_DEBUG.gnIdCollabChoisi dh est une DateHeure = DateHeureSys() stParam.saDateFin = dh dh..Mois-- dh..Jour = 1 dh..Heure = 0 dh..Minute = 0 dh..Seconde = 0 dh..Milliseconde = 0 stParam.saDateDebut = dh saBufJson est une chaîne ANSI Sérialise(stParam,saBufJson,psdJSON) REQ.saJSON=saBufJson SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_LitParam_V2 //Appelé par la fonction RécupContexte du mobile SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_LitContexte 12/08/2026 Batik_WS_Com_Mob 241

Partie 4 › Collection de procédures › LIB_DEBUG › Code REQ.saJSON = NumériqueVersChaîne(LIB_DEBUG.gID.nIdUser) SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_ListeCh_Rapport stParam est un ST_REQ_LISTE_Chp_Rapport stParam.nIdCollaborateur = LIB_DEBUG.gnIdCollabSID stParam.nIdInter = LIB_DEBUG.gnIdInterChoisi stParam.nIdModele = LIB_DEBUG.gnIdRapportChoisi saBufJson est une chaîne ANSI Sérialise(stParam,saBufJson,psdJSON) REQ.saJSON=saBufJson SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_RecupImgRapport CAS cCMD_ListeCh_Mail stParam est un STJSONInfoModeleMailMob stParam.nIdInter = LIB_DEBUG.gnIdInterChoisi stParam.nIdModele = LIB_DEBUG.gnIdEmailChoisi saBufJson est une chaîne ANSI Sérialise(stParam,saBufJson,psdJSON) REQ.saJSON=saBufJson SI gbEnvoiWebService ALORS saRep = WS_COM_MOBILE.MOB_CMD(LIB_DEBUG.gID,REQ,"") SINON saRep = MOB_CMD(LIB_DEBUG.gID,REQ,"") FIN saBuf=saRep[2 À] CAS cCMD_Cr_Structure_Mail AUTRE CAS FIN FEN_Log.SAI_Log = saRep RENVOYER saBuf Procédure globale D_OuvreConnexionHFSQL PROCÉDURE D_OuvreConnexionHFSQL() QUAND EXCEPTION DANS LIB_DEBUG.gcnxD_ServeurLicence..Provider = hAccèsHFClientServeur LIB_DEBUG.gcnxD_ServeurLicence..BaseDeDonnées = "BASE_LICENCES" LIB_DEBUG.gcnxD_ServeurLicence..MotDePasse = "ea0c6460faac5d87db47b4ca0147a34a" LIB_DEBUG.gcnxD_ServeurLicence..Serveur = "51.68.44.182:4943" LIB_DEBUG.gcnxD_ServeurLicence..Utilisateur = "Admin" LIB_DEBUG.gsaPortWSCOM = "4902" LIB_DEBUG.gsaServeurWSCOM = "51.68.44.182" 12/08/2026 Batik_WS_Com_Mob 242

Partie 4 › Collection de procédures › LIB_DEBUG › Code LIB_DEBUG.gcnxD_ServeurWSCom..Provider = hAccèsHFClientServeur LIB_DEBUG.gcnxD_ServeurWSCom..BaseDeDonnées = "BATIK.01_BLD" LIB_DEBUG.gcnxD_ServeurWSCom..MotDePasse = "F911-Q927-K880-N196" LIB_DEBUG.gcnxD_ServeurWSCom..Serveur = "51.68.44.182:4902" LIB_DEBUG.gcnxD_ServeurWSCom..Utilisateur = "superuser" gcnxReplica = LIB_DEBUG.gcnxD_ServeurWSCom uneConexxion est une Connexion uneConexxion..Provider = hAccèsHFClientServeur uneConexxion..BaseDeDonnées = "BATIK.01_BLD" uneConexxion..MotDePasse = "F911-Q927-K880-N196" uneConexxion..Serveur = "51.68.44.182:4902" uneConexxion..Utilisateur = "superuser" gcnxReplica = uneConexxion sPassSysteme est une chaîne ANSI= BufferVersHexa(HashChaîne(HA_MD5_128,Mdp3 + gcnxReplica.. BaseDeDonnées),SansRegroupement) gsaPass = BufferVersHexa(HashChaîne(HA_MD5_128,gcnxReplica..BaseDeDonnées),SansRegroupement) SI PAS HOuvreConnexion(gcnxReplica) ALORS TraceERREUR("ERREUR OuvreConnexionsHF " + gcnxReplica..BaseDeDonnées + RC + gcnxReplica.. Serveur +RC+ HErreurInfo(hErrComplet) ) RENVOYER Faux FIN // //Vérification ultime de la présence de la base de données du client sur le serveur // saLst est une chaîne ANSI = HListeBaseDeDonnées(gcnxReplica,hLstNormal) // SI ChaîneOccurrence(saLst, gstContexte.saBaseData ,SansCasse) =0 ALORS // TraceERREUR("ERREUR OuvreConnexionsHF : La base client n'existe pas sur ce serveur HF " + saLst ) // RENVOYER Faux // FIN //Déclaration Externe de tous les fichiers du répliqua saLst est une chaîne ANSI = HListeFichier(gcnxReplica) POUR TOUTE CHAÎNE saFic DE saLst SÉPARÉE PAR RC SI ChaîneOccurrence(saFic,"")=0 ALORS SI saFic="ParametreSysteme.fic" OU saFic="ParametreMetierEntete.fic" OU saFic=" Etats.fic" ALORS SI PAS HPasse(ExtraitChaîne(saFic,1,"."),sPassSysteme) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN SINON SI PAS HPasse(ExtraitChaîne(saFic,1,"."),gsaPass) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN SI PAS HDéclareExterne(saFic,ExtraitChaîne(saFic,1,"."),gcnxReplica) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN FIN //Déclaration Externe de la table paramètres pour pouvoir la manipuler avec des fonction Hxxx HPasse(gsdParamApplication,gsaPass) HPasse(gsdParamApplication,sPassSysteme) HDéclareExterne("ParametreApplication.fic",gsdParamApplication,uneConexxion) TraceINFO("Connexions OK") RENVOYER Vrai FAIRE TraceERREUR("ERREUR OuvreConnexionsHF " + ExceptionInfo(errComplet) ) RENVOYER Faux FIN Procédure globale D_OuvreConnexionHFSQLLicence 12/08/2026 Batik_WS_Com_Mob 243

Partie 4 › Collection de procédures › LIB_DEBUG › Code PROCÉDURE D_OuvreConnexionHFSQLLicence(saMP est une chaîne ANSI) HChangeConnexion("*",LIB_DEBUG.gcnxD_ServeurLicence) HOuvreConnexion(LIB_DEBUG.gcnxD_ServeurLicence) //Déclaration Externe de tous les fichiers du répliqua saLst est une chaîne ANSI = HListeFichier(LIB_DEBUG.gcnxD_ServeurLicence) POUR TOUTE CHAÎNE saFic DE saLst SÉPARÉE PAR RC SI ChaîneOccurrence(saFic,"")=0 ALORS SI PAS HPasse(ExtraitChaîne(saFic,1,"."),saMP) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN SI PAS HDéclareExterne(saFic,ExtraitChaîne(saFic,1,"."),LIB_DEBUG.gcnxD_ServeurLicence) ALORS TraceERREUR(HErreurInfo(hErrComplet)) FIN FIN FIN Procédure globale D_RecupIdentiteLicence PROCÉDURE D_RecupIdentiteLicence() TableauSupprimeTout(LIB_DEBUG.gtbaListeUsers) pstUnId est un ST_MOB_IDENTITE dynamique saReqLicences est une chaîne ANSI = [ SELECT * FROM Licence INNER JOIN ClientBase ON ClientBase.CL_PKID = Licence.LI_IDClient WHERE LI_Active = 1 AND LI_IDCollaborateur > 0 AND LI_IDUser > 0 ] sdLicences est une Source de Données saCle est une chaîne ANSI SI PAS HExécuteRequêteSQL(sdLicences,LIB_DEBUG.gcnxD_ServeurLicence,hRequêteDéfaut,saReqLicences) ALORS TraceDEBUG("Erreur D_RecupIdentiteLicence " + HErreurInfo(hErrComplet)) SINON POUR TOUT sdLicences pstUnId = allouer un ST_MOB_IDENTITE pstUnId.saLicence = sdLicences.LI_Numero pstUnId.saIdMob = sdLicences.LI_IDMobile pstUnId.nIdColb = sdLicences.LI_IDCollaborateur pstUnId.nIdUser = sdLicences.LI_IDUser pstUnId.saNumPort = LIB_DEBUG.gsaPortWSCOM pstUnId.saBaseData = LIB_DEBUG.gsaServeurWSCOM pstUnId.saBaseSync = LIB_DEBUG.gsaServeurWSCOM pstUnId.saIdClient = sdLicences.LI_IDClient saCle = SansEspace(sdLicences.LI_UserNom,sscExtérieur)+" "+SansEspace(sdLicences.LI_UserPrenom, sscExtérieur)+" "+sdLicences.CL_Nom LIB_DEBUG.gtbaListeUsers[saCle] = pstUnId FIN FIN RENVOYER Vrai 12/08/2026 Batik_WS_Com_Mob 244

Partie 5 › Table des matières Partie 5 Table des matières

12/08/2026 Batik_WS_Com_Mob 245

Partie 5 › Table des matières Projet Batik_WS_Com_Mob Partie 1 Projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Informations générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Liste des éléments du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Erreurs, warnings et informations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Statistiques sur le code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 Partie 2 Analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Graphe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Informations générales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Dictionnaire des rubriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Connexions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Fichiers et rubriques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 MOBILES 16 PARAMETRES 17 TOMOB 18 TOSRV 19 Partie 3 Fenêtre WINDEV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 FEN_Principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Image 21 Informations générales 21 Informations sur les champs 23 Code 61 Code des champs 62 Procédures 76 FEN_Connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 Image 80 Informations générales 80 Informations sur les champs 82 Code 105 Code des champs 105 Procédures 107 FEN_Log . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Image 108 Informations générales 108 Informations sur les champs 110 12/08/2026 Batik_WS_Com_Mob 246

Partie 5 › Table des matières Code 112 Code des champs 112 Partie 4 Collection de procédures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 LIB_GestionTableParamètres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Code 114 LIB_WS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Code 116 LIB_GENERALE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Code 117 LIB_COMMUNE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Code 119 LIB_ProcéduresGlobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Code 122 LIB_WS_MOB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Code 129 LIB_Traitements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Code 135 LIB_ProcéduresGlobales2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 Code 224 LIB_Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Code 225 LIB_EXE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Code 237 LIB_DEBUG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Code 240 12/08/2026 Batik_WS_Com_Mob 247