Développements sur mesure, Services numériques innovants

[Tutoriel] Créer une passerelle entre l’API Eudonet et mon application web (1e partie)

10 mars 2020

La CRM Eudonet est un des leaders du marché des logiciels de gestion des relations clients. Une CRM permet à une organisation (société, association, syndicat, etc) d’administrer les informations liées à ses membres. Dans ce tutoriel, nous allons montrer comment utiliser l’api Eudonet  destinée à récupérer et mettre à jours les informations associées aux inscrits dans la CRM Eudonet afin de créer un connecteur PHP entre la CRM Eudonet et une application web (extension CMS wordpress, joomla, application mobile ou autres application web).

L’api Eudonet utilise le format de données JSON pour interagir avec elle. Il existe une interface SWAGER UI pour tester les opérations disponibles. Dans cette première partie, nous aborderons la récupération des informations clients d’Eudonet dans le but de les utiliser dans l’application web. Dans une deuxième partie, nous verrons comment créer des utilisateurs dans la CRM Eudonet à partir d’informations de l’application web. Enfin, dans une troisième partie, nous présenterons la technique permettant de mettre à jour les catalogues Eudonet (listes déroulantes, cases à cocher, boutons radio, etc) dans l’application web.

 Première partie

Pour comprendre certaines parties du code présentées dans ce tutoriel, il est à noter que l’api Eudonet possède un quota d’appel par méthode (ou opération) et par IP sous peine de produire une erreur http 300 et un blacklistage de votre IP pendant un certain temps. Voici ci-dessous le détail des restrictions.

Vous avez droit à :

  • 1000 appels par méthode (le nombre d’appels restant apparaît dans le header de réponse : X-CALL-REMAIN, le nombre total autorisé dans le header X-CALL-MAX)

Pour les appels d’authentification, pour des raisons de sécurité, ce quota est ramené à 50 et à 5 uniquement en cas de mauvais mot de passe.

  • 10.000 appels pour une même IP ( X-CALL-BYIP-REMAIN).

Toutes les 1 secondes, vous récupérez 1 appel sur ces deux compteurs.

Si vous dépassez ces quotas, votre IP est bannie pour 15 secondes. Ce décompte est repris à 0 si les appels continuent pendant le ban.

Si vous ne faites aucun appel pendant 60 secondes, votre stock d’appel est entièrement récupéré.

1. Récupération d’un jeton (token) d’authentification

Toutes les opérations de récupération et de mises à jour avec l’api Eudonet nécessite un jeton d’authentification.  Le code de la fonction de récupération du token est présenté ci-dessous avec des commentaires en vert. Les informations en rouge sont fournies par Eudonet lors de la validation de l’abonnement au service api par Eudonet.

 Nous utilisons pour l’authentification l’opération POST /Authenticate/Token 

 de l’api Eudonet 

 

function getEudoToken(){

    // TEST pour récupérer la variable de session contenant le token

    if(isset($_SESSION['eudonet_token'])){

        return $_SESSION['eudonet_token'];  

    // sinon récupération du token et affectation du token à la variable de session

    }else{  

           // création d’un tableau PHP avec les informations de connexion à la base de données de votre CRM Eudonet

        $data = array(

        "SubscriberLogin" => "MonIdentifiantAbonne"

        "SubscriberPassword" => "MonMotDePasseAbonne",

        "BaseName" => "NomDeMaBaseDeDonnees",

        "UserLogin" => "MonIdentifiantUtilisateur",

        "UserPassword"=> "MonMotDePasseUtilisateur",

        "UserLang"=> "LANG_00",

        "ProductName"=> "EUDO_API"

        );

// transformation du tableau PHP avec les informations de connexion à la base de données de votre CRM Eudonet au format JSON                                                                    

        $dataString = json_encode($data);                                                                                   

                                                                                     // initialisation de la méthode PHP CURL avec l’url de la méthode pour récupérer le token les données JSON pour la connexion à la base de données de la CRM et la récupération du header http dans la réponse du CURL

                                  

        $ch = curl_init('https://UrlEudonet/EudoAPI/Authenticate/Token');     

 

        $headers = [];

        

        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     

        curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);                                                                  

        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      

        curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          

            'Content-Type: application/json',                                                                                

            'Content-Length: ' . strlen($dataString))                                                                       

        );

      // fonction pour récupération du header http dans la réponse du CURL  

curl_setopt($ch, CURLOPT_HEADERFUNCTION,

          function($curl, $header) use (&$headers)

          {

            $len = strlen($header);

            $header = explode(':', $header, 2);

            if (count($header) < 2) // ignore les headers invalides

              return $len;

 

            $headers[strtolower(trim($header[0]))][] = trim($header[1]);

 

            return $len;

          }

        );

        // exécution de la commande CURL

        $result = curl_exec($ch);

        // transformation en PHP des données JSON de la réponse du CURL contenant le token

        $arrayResult = json_decode($result,true);

        // inscription dans un fichier de log .txt du nombre d’appels restant à l’api (cf quota d’appels) contenu dans le header de réponse de la commande CURL (paramètre « x-call-remain »)  

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "APPELS API EUDONET RESTANT : ".$headers["x-call-remain"][0]; 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content); 

        fclose($monfichier);

 

           // mise en sommeil du script durant plus de 60 secondes si le nombre d’appels restant est inférieur à 20 (paramètre « x-call-remain » de l’opération Eudonet contenu dans le header http de la réponse CURL)

        if(intval($headers["x-call-remain"][0])<=20){

            sleep(65);

        }   

    

        // affectation du token dans la variable de session et renvoi du token

        $eudonet_token = $arrayResult["ResultData"]["Token"];

       

        $_SESSION['eudonet_token']=$eudonet_token;  

        return $_SESSION['eudonet_token'];

 

    }   

    

}

 

2. Récupération des informations de la table Eudonet « Contact »

 Dans cette sous-partie, nous allons aborder la récupération des informations de chaque contact dans Eudonet. Ces informations sont listées dans la fonction ci-dessous (ce sont les numéros ci-dessous dans la variable tableau correspondant aux DescId des champs de la table contact Eudonet) qui fait la relation avec des champs personnalisés (en toutes lettres, dans la fonction ci-dessous) des utilisateurs dans le CMS Joomla (cela pourrait être WordPress ou toutes autres applications web).  

/* Correspondance des champs pour la mise à jours Joomla à partir d'Eudonet */

function getRelationEudoJoomlaContactFields(){  

    $relationEudonetJoomla = [205=>"civilite" ,201=>"lastname", 202=>"firstname", 207=> "num_adherent", 214=>"date_de_naissance" ,218=>"statut", 220=>"registerDate" ,246=>"ccn", 227=>"usn", 228=>"syndicat"];

    return $relationEudonetJoomla

}

Les deux fonctions de récupération des informations de chaque contact Eudonet sont présentées ci-dessous.

function getContactEudoFields(){

    

    // Récupération du tableau faisant la relation entre les champs de la table contact d’Eudonet et les champs des utilisateurs dans Joomla

    $relationEudonetJoomla = getRelationEudoJoomlaContactFields();

   // Récupération de la première page de la liste avec les  informations pour chaque contact de cette page dans la table contact eudonet

    $responseGetContactEudoFieldsByPage = getContactEudoFieldsByPage(1, $relationEudonetJoomla);

    // Récupération des données de chaque contact de la première page avec leus informations         

    $responseData = $responseGetContactEudoFieldsByPage[0];

    // Récupération du nombre total de pages de contacts

    $responseTotalPage = $responseGetContactEudoFieldsByPage[1];    

    // Boucle récursive pour appeler les autres pages de la liste avec les informations pour chaque contact de ces pages  

    for($i=2; $i<=$responseTotalPage; $i++){

        // on appelle la fonction de récupération des informations pour chaque contact de la page passée en paramètre. On récupère les informations dans une variable

        $responseGetContactEudoFieldsByPage = getContactEudoFieldsByPage($i, $relationEudonetJoomla);

        // Concaténations des données de chaque page

        $responseData = $responseData + $responseGetContactEudoFieldsByPage[0]; 

    }

    // retour de l’ensemble des données de la table contact

    return $responseData;

}

Dans la deuxième fonction, nous rentrons au cœur de l’api Eudonet. Nous utilisons la méthode

POST /Search/{tabId} des opérations « Search »  de recherche sur les fiches Eudonet ( cf : http://demo.eudonet.com/eudoapi/eudoapidoc/swaggerui/#!/Search/post_Search_tabId ).

Dans les données JSON, pour déterminer les critères de recherche détaillés ci-dessous, il est important de prendre connaissance des notions opérateurs et d’interopérateurs. Pour cela, consulter la rubrique « critères de recherche », « Opérateur logique pour un champ » et « Opérateur logique entre critères » de la documentation Eudonet https://xrm.eudonet.com/EudoAPI/eudoapidoc/lexique.html#link

Nous reprenons le contenu de la documentation pour plus de clarté.

Opérateurs logiques pour un champ :

Type Description
0 Egal1
1 Inférieur
2 Inférieur ou égal
3 Supérieur
4 Supérieur ou égal
5 Différent1
6 Débute par
7 Finit par
8 Est dans la liste1*
9 Contient
10 Est vide
11 Vrai (case à cocher)
12 Faux (case à cocher)
13 Ne débute pas par
14 Ne finit pas par
15 N’est pas dans la liste1*
16 Ne contient pas
17 N’est pas vide
18 Soundex**

Opérateurs logiques entre critères :

Il s’agit de l’opérateur logique entre deux critères (ou bloc de critères). Il est placé entre l’opérateur sur lequel il est déclaré et le précédent. Il n’est donc pas pris en compte pour le 1er critère d’une liste.

Type Description
0 Aucun. Utilisé lorsqu’il n’y a qu’un critère dans un filtre
1 ET
2 OU
3 SAUF

 

function getContactEudoFieldsByPage($NumPage, $relationEudonetJoomla){

    // création d’un tableau PHP avec les informations permettant la récupération des informations de la table contact eudonet

    $data = array(

        // on demande à ce que les métadonnées soient renvoyées en retour

        "ShowMetadata" => true,

        // on demande à la récupération du nombre maximum de ligne (de contact) par page soit 50   

        "RowsPerPage" => 50,

        // on demande à la récupération de la page reçue en argument

        "NumPage" => $NumPage,

           // on définit la liste des champs que l’on désire récupérer avec leur DescId (les numéros)

        "ListCols" => array_keys($relationEudonetJoomla),

        "FilterId"=> 0,

           // on définit les critères de recherche

        "WhereCustom"=> array(

            "WhereCustoms" => [

                // Pour le premier critère on détermine que le champ avec le DescId 208 doit être égal à 0 (valeur nulle)

                array(    

                    "WhereCustoms" => null

                    "Criteria" => array(

                        "Field" => "208",

                        "Operator" => 0,

                        "Value" => "0"

                    ),

         // on définit le premier inter-opérateur à 0 (aucun) pour le premier critère (il ne doit pas être pris en compte)

                    "InterOperator" => 0

                ),

                // Pour le deuxième critère on détermine que le champ avec le DescId 216 doit être égal à 1350 (contact actif dans cette CRM eudonet)

 

                array(    

                    "WhereCustoms" => null

                    "Criteria" => array(

                        "Field" => "216",

                        "Operator" => 0,

                        "Value" => "1350"

                    ),

            // on définit le deuxième interopérateur à 1 (et) pour le deuxième critère

 

                    "InterOperator" => 1

                )

                

                

            ],

            "Criteria" => null,                   

            "InterOperator" => 0

        ),

        "OrderBy" => [

            array(

                "DescId" => 0,

                "Order" => 0  

            )

        ]

    );        

 

    // on convertit les données au format JSON avant de les renvoyer

    $dataString = json_encode($data);                                                                                   

    

          // on initialise en PHP la commande CURL avec l’url pour la recherche sur la fiche Eudonet contact (DescId 200), les données au format JSON et la récupération du header http dans la réponse du CURL

 

    $ch = curl_init('https://xrm.eudonet.com/EudoAPI/Search/200');

    

    

    $headers = [];

    

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     

    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);                                                                

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          

        'X-auth: 'getEudoToken(),    

        'Content-Type: application/json',                                                                                

        'Content-Length: ' . strlen($dataString))                    

    );

 

 

 

       // fonction pour récupération du header http dans la réponse du CURL 

     curl_setopt($ch, CURLOPT_HEADERFUNCTION,

      function($curl, $header) use (&$headers)

      {

        $len = strlen($header);

        $header = explode(':', $header, 2);

        if (count($header) < 2) // ignore les headers invalides

 

          return $len;

 

        $headers[strtolower(trim($header[0]))][] = trim($header[1]);

 

        return $len;

      }

    );

    

    // exécution de la commande CURL

    $result = curl_exec($ch);

    

         // inscription dans un fichier de log .txt de l’éventuelle erreur CURL

    if($result === false)

    {

 

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "Erreur curl pour récupération CONTACT : ".curl_error($ch); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content); 

        fclose($monfichier);  

 

    }

    else

    {

        

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "Erreur : "."L\'opération s\'est terminée sans aucune erreur pour récupération CONTACT"

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier);  

 

    }

 

    

 

// transformation en PHP des données JSON de la réponse du CURl contenant les informations de la liste des contacts de la page

 

    $arrayResult = json_decode($result,true);

 

         // inscription dans un fichier de log .txt du nombre d’appels restant à l’api (cf quota d’appels) contenu dans le header de réponse de la commande CURL (paramètre « x-call-remain »)  

    $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

    $content = "APPELS API EUDONET RESTANT : ".$headers["x-call-remain"][0]; 

    $content .= "\n";

    $content .= "\n";

    fputs($monfichier, $content); 

    fclose($monfichier);  

    

      // mise en sommeil du script durant plus de 60 secondes si le nombre d’appels restant est inférieur ou égal à 100 afin de récupérer le quota d’appel

    if(intval($headers["x-call-remain"][0])<=100){

        sleep(65);

    }   

 

         // initialisation d’une variable tableau qui va contenir les informations de la page de la liste de contacts mises en relation avec les champs personnalisés du CMS joomla

    $arrayUsersEudonet = array(); 

  

// On boucle sur les lignes de la liste de la page d’informations de la table contact eudonet

    foreach($arrayResult["ResultData"]["Rows"] as $key => $value){

         // On boucle sur les champs de chaque ligne de la liste de la page d’informations de la table contact eudonet

        foreach($arrayResult["ResultData"]["Rows"][$key]["Fields"] as $skey => $svalue){

              // Pour certains champs de type date on opère une transformation du format de la date et on affecte cette valeur à notre variable tableau avec pour clé la valeur du champ personnalisé Joomla correspondant au DescId du champ de la ligne de la liste de la page d’informations de la table Eudonet

            if($svalue['DescId'] == 214){

                $dateString = $svalue["DbValue"];

                $newDateString = date('Y-m-d', strtotime($dateString));

 

                $arrayUsersEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $newDateString;

            

            

            } else if($svalue['DescId'] == 220){

                    $dateString = $svalue["DbValue"];

                    $newDateString = date('Y-m-d h:i:s', strtotime($dateString));

 

                    $arrayUsersEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $newDateString;

            

         // Sinon on affecte directement la valeur du champ de la ligne de la liste de la page d’informations de la table Eudonet à notre variable tableau avec pour clé la valeur du champ personnalisé Joomla correspondant au DescId du champ de la ligne de la liste de la page d’informations de la table Eudonet

         } else {

                    

                $arrayUsersEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $svalue["DbValue"];

            }   

            

            

        }

            }

 

    // On retourne notre variable tableau avec les informations exploitables pour notre CMS Joomla

    return array($arrayUsersEudonet, $arrayResult["ResultMetaData"]["TotalPages"]);

    

}

3. Récupération des informations de la table Eudonet « Adresse » concernant les personnes physiques

Il est important de bien comprendre la notion Eudonet de DescId. Le DescId peut être une référence à une table, (exemple 200 pour la table contact) et aussi une référence à un champ qui correspond à une colonne dans la table (exemple 201 pour le nom du contact dans la table contact). Le  FileId est le numéro de la ligne dans la table. Dans la table Adresse, le champ avec le DescId 201 (référence colonne à la table contact) est associé à un FileId (numéro de la ligne dans la table contact).

Dans ce tutoriel, nous allons récupérer les informations de la table « Adresse » pour les lier à chaque contact déjà en mémoire. En effet l’api Eudonet ne permet pas d’effectuer des jointures de tables. Nous avons donc deux possibilités. Nous pouvons, soit, pour chaque contact stocké dans notre variable de type tableau, faire un appel avec l’api Eudonet via la recherche multicritère en précisant le FileId du contact associé au DescId 201 et ajouter par la suite les informations de la table adresse de chaque contact aux informations du contact dans notre variable de type tableau en mémoire avec toutes les informations des contacts. Ou alors, nous pouvons récupérer toutes les informations de la table « Adresse » liées aux personnes physiques et ensuite assembler les informations de la table contact avec les informations des personnes physiques de la table adresse grâce au descId/FileId du contact aussi présent dans les informations récupérées dans la table « Adresse ». La première solution nous oblige à effectuer de nombreux appels à la base de données de la crm Eudonet via l’api. Cette solution, pour une base de données avec de nombreux contact n’est pas viable. En effet, du fait du nombre restreint d’appel et donc de la mise en sommeil du script pour récupérer son quota d’appels, le temps d’exécution de notre programme s’élèverait à plusieurs dizaines de minutes, voir quelques heures. Nous devons donc utiliser la deuxième solution qui est détaillée dans la suite de ce tutoriel.

Dans cette sous-partie, nous allons aborder la récupération des informations de chaque adresse de personnes physiques dans eudonet. Ces informations sont listées dans la fonction ci-dessous (ce sont les numéros ci-dessous dans la variable tableau correspondant aux DescId des champs de la table adresse Eudonet) qui fait la relation avec des champs personnalisés (en toutes lettres, dans la fonction ci-dessous) des utilisateurs dans le CMS Joomla (cela pourrait être WordPress ou toutes autres applications web).  

 

/* Correspondance des champs pour la mise à jours Joomla à partir d'Eudonet */

function getRelationEudoJoomlaMainAddressFields(){

    $relationEudonetJoomla = [201=>"contactFileId", 408=>"email", 414=>"telephone_personnel", 402=>"adresse_personnelle" ,410=>"ville", 409=>"code_postal", 412=>"adresse_principale"];

    return $relationEudonetJoomla

}

 

Les deux fonctions de récupération des informations de chaque adresse de personnes physiques Eudonet sont présentées ci-dessous.

function getAdresseEudoFields(){

    // Récupération du tableau faisant la relation entre les champs de la table adresse d’Eudonet et les champs des utilisateurs dans Joomla

    $relationEudonetJoomla = getRelationEudoJoomlaMainAddressFields();

    // Récupération de la première page de la liste avec les  informations pour chaque adresse de cette page dans la table adresse eudonet

    $responseGetAdresseEudoFieldsByPage = getAdresseEudoFieldsByPage(1, $relationEudonetJoomla);

    // Récupération des données de chaque adresse de la première page avec leurs informations                    

    $responseData = $responseGetAdresseEudoFieldsByPage[0];

    // Récupération du nombre total de pages d’adresses

    $responseTotalPage = $responseGetAdresseEudoFieldsByPage[1];

    // Boucle récursive pour appeler les autres pages de la liste avec les informations pour chaque adresse de ces pages  

    for($i=2; $i<=$responseTotalPage; $i++){

           // on appelle la fonction de récupération des informations pour chaque adresse de la page passée en paramètre. On récupère les informations dans une variable         

        $responseGetAdresseEudoFieldsByPage = getAdresseEudoFieldsByPage($i, $relationEudonetJoomla);

           // Concaténations des données de chaque page       

        $responseData = $responseData + $responseGetAdresseEudoFieldsByPage[0]; 

    }

    // retour de l’ensemble des données de la table adresse

    return $responseData;

}

 

 

 

 

function getAdresseEudoFieldsByPage($NumPage, $relationEudonetJoomla){

    

    // création d’un tableau PHP avec les informations permettant la récupération des informations de la table adresse Eudonet

    $data = array(

        "ShowMetadata" => true

         // on demande à la récupération du nombre maximum de ligne (de contact) par page soit 50   

        "RowsPerPage" => 50,

           // on demande à la récupération de la page reçue en argument

        "NumPage" => $NumPage,

            // on définit la liste des champs que l’on désire récupérer avec leur DescId (les numéros)                          

        "ListCols" => array_keys($relationEudonetJoomla),

        "FilterId"=> 0,

  // on définit les critères de recherche

        "WhereCustom"=> array(

            "WhereCustoms" => [

                // Pour le premier critère on détermine que le champ avec le DescId 411 doit être égal à 1 (On cherche à savoir si l’adresse est active)

                array(    

                    "WhereCustoms" => null

                    "Criteria" => array(

                        "Field" => "411",

                        "Operator" => 0,

                        "Value" => "1"

                    ),

            // on définit le premier inter-opérateur à 0 (aucun) pour le premier critère (il ne doit pas être pris en compte)

                    "InterOperator" => 0

                ),

                // Pour le deuxième critère on détermine que le champ avec le DescId 412 doit être égal à 1 (l’adresse doit être l’adresse principale)

             array(    

                    "WhereCustoms" => null

                    "Criteria" => array(

                        "Field" => "412",

                        "Operator" => 0,

                        "Value" => "1"

                    ),

            // on définit le deuxième interopérateur à 1 (et) pour le deuxième critère

                    "InterOperator" => 1

                )

               

            ],

            "Criteria" => null,                   

            "InterOperator" => 0

        ),

        "OrderBy" => [

            array(

                "DescId" => 0,

                "Order" => 0  

            )

        ]

    );       

    // on convertit les données au format JSON avant de les renvoyer                                                            

    $dataString = json_encode($data);                                                                                   

    

// on initialise en PHP la commande CURL avec l’url pour la recherche sur la fiche Eudonet adresse (DescId 400), les données au format JSON et la récupération du header http dans la réponse du CURL

    $ch = curl_init('https://xrm.eudonet.com/EudoAPI/Search/400');

    

 

    $headers = [];

    

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     

    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);                                                                

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          

        'X-auth: 'getEudoToken(),    

        'Content-Type: application/json',                                                                                

        'Content-Length: ' . strlen($dataString))                    

    );

       // fonction pour récupération du header http dans la réponse du CURL 

     curl_setopt($ch, CURLOPT_HEADERFUNCTION,

      function($curl, $header) use (&$headers)

      {

        $len = strlen($header);

        $header = explode(':', $header, 2);

        if (count($header) < 2) // ignore les headers invalides          

  return $len;

        $headers[strtolower(trim($header[0]))][] = trim($header[1]);

        return $len;

      }

    );

    

    // exécution de la commande CURL

    $result = curl_exec($ch);

    

    // inscription dans un fichier de log .txt de l’éventuelle erreur CURL

    if($result === false)

    {

 

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "Erreur curl pour récupération ADRESSE : ".curl_error($ch); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content); 

        fclose($monfichier);  

 

    }

    else

    {

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "Erreur : "."L\'opération s\'est terminée sans aucune erreur pour récupération ADRESSE"

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier);  

 

    }

    // transformation en PHP des données JSON de la réponse du CURl contenant les informations de la liste des adresses de la page

    $arrayResult = json_decode($result,true);

    // inscription dans un fichier de log .txt du nombre d’appels restant à l’api (cf quota d’appels) contenu dans le header de réponse de la commande CURL (paramètre « x-call-remain »)  

    $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

    $content = "APPELS API EUDONET RESTANT : ".$headers["x-call-remain"][0]; 

    $content .= "\n";

    $content .= "\n";

    fputs($monfichier, $content); 

    fclose($monfichier);  

    // mise en sommeil du script durant plus de 60 secondes si le nombre d’appels restant est inférieur ou égal à 100 afin de récupérer le quota d’appel

    if(intval($headers["x-call-remain"][0])<=100){

        sleep(65);

    }   

    // initialisation d’une variable tableau qui va contenir les informations de la page de la liste d’adresses mises en relation avec les champs personnalisés du CMS joomla

    $arrayAdresseEudonet = array(); 

         // On boucle sur les lignes de la liste de la page d’informations de la table adresse eudonet

         // On boucle sur les champs de chaque ligne de la liste de la page d’informations de la table adresse eudonet

    foreach($arrayResult["ResultData"]["Rows"] as $key => $value){

           // On boucle sur les champs de chaque ligne de la liste de la page d’informations de la table adresse eudonet

        foreach($arrayResult["ResultData"]["Rows"][$key]["Fields"] as $skey => $svalue){

                  // TEST pour récupérer le DescID du contact dans les données de la table adresse

            if($svalue['DescId'] == 201 && isset($svalue["FileId"])){

                     // récupération du FileID associé au DescID 201 du contact dans les données de la table adresse et affectation dans notre variable tableau

                $contactFileId = $svalue["FileId"]; 

                $arrayAdresseEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $contactFileId;

         // Sinon récupération des données de la table adresse et affectation dans notre variable tableau  

            } else if($svalue['DescId'] != 201){

                $arrayAdresseEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $svalue["DbValue"];

            }     

        }  

    }

    // On retourne notre variable tableau avec les informations exploitables pour notre CMS Joomla

    return array($arrayAdresseEudonet, $arrayResult["ResultMetaData"]["TotalPages"]);

    

}

4. Récupération des informations de la table Eudonet « Mandats » concernant les personnes physiques

Dans notre exemple, il existe une table personnalisée « mandats » dans notre CRM Eudonet. Comme pour la table « Adresse » précédemment détaillée avec les trois fonctions, la table « mandats » reprend les mêmes fonctions que nous n’allons pas commenter. Il suffit de se référer aux explications relatives à la sous partie « Récupération des informations de la table Eudonet Adresse concernant le personnes physiques »

 

function getRelationEudoJoomlaMandatsFields(){

    $relationEudonetJoomla = [201=>"contactFileId", 1905=>"mandats", 1994=>"autres_mandats_precisez"];

    return $relationEudonetJoomla

}

 

 

function getMandatEudoFields(){

   

    $relationEudonetJoomla = getRelationEudoJoomlaMandatsFields();

    $responseGetMandatEudoFieldsByPage = getMandatEudoFieldsByPage(1, $relationEudonetJoomla);

    $responseData = $responseGetMandatEudoFieldsByPage[0];

    $responseTotalPage = $responseGetMandatEudoFieldsByPage[1];

    

    for($i=2; $i<=$responseTotalPage; $i++){

        $responseGetMandatEudoFieldsByPage = getMandatEudoFieldsByPage($i, $relationEudonetJoomla);

        $responseData = $responseData + $responseGetMandatEudoFieldsByPage[0];

    }

    return $responseData

}

 

 

 

 

 

 

 

 

function getMandatEudoFieldsByPage($NumPage, $relationEudonetJoomla){

 

    $data = array(

        "ShowMetadata" => true

        "RowsPerPage" => 50,

        "NumPage" => $NumPage,

        "ListCols" => array_keys($relationEudonetJoomla),

        "FilterId"=> 0,

        "WhereCustom"=> array(

            "WhereCustoms" => [

                // On détermine que le champ avec le DescId 1904 doit être égal à 1 (On cherche à savoir si le mandat est actif)

                array(    

                    "WhereCustoms" => null

                    "Criteria" => array(

                        "Field" => "1904",

                        "Operator" => 0,

                        "Value" => "1"

                    ),

                    "InterOperator" => 0

                    

                )

                                

                  

            ],

            "Criteria" => null,                   

            "InterOperator" => 0

        ),

        "OrderBy" => [

            array(

                "DescId" => 0,

                "Order" => 0  

            )

        ]

    );                                                                    

    $dataString = json_encode($data);                                                                                   

    $ch = curl_init('https://xrm.eudonet.com/EudoAPI/Search/1900');

    

    $headers = [];

    

    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     

    curl_setopt($ch, CURLOPT_POSTFIELDS, $dataString);                                                                

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      

    curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          

        'X-auth: 'getEudoToken(),    

        'Content-Type: application/json',                                                                                

        'Content-Length: ' . strlen($dataString))                    

    );

        

     curl_setopt($ch, CURLOPT_HEADERFUNCTION,

      function($curl, $header) use (&$headers)

      {

        $len = strlen($header);

        $header = explode(':', $header, 2);

        if (count($header) < 2) // ignore les headers invalides

          return $len;

 

        $headers[strtolower(trim($header[0]))][] = trim($header[1]);

 

        return $len;

      }

    );

    

    

    $result = curl_exec($ch);

    

    

    if($result === false)

    {

 

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "Erreur curl pour récupération MANDAT : ".curl_error($ch); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content); 

        fclose($monfichier);  

 

    }

    else

    {

        

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "Erreur : "."L\'opération s\'est terminée sans aucune erreur pour récupération MANDAT"

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier);  

 

    }

 

    $arrayResult = json_decode($result,true);

   

    $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

    $content = "APPELS API EUDONET RESTANT : ".$headers["x-call-remain"][0]; 

    $content .= "\n";

    $content .= "\n";

    fputs($monfichier, $content); 

    fclose($monfichier);  

    

    if(intval($headers["x-call-remain"][0])<=100){

        sleep(65);

    }     

    $arrayAdresseEudonet = array(); 

 

    foreach($arrayResult["ResultData"]["Rows"] as $key => $value){

    

        foreach($arrayResult["ResultData"]["Rows"][$key]["Fields"] as $skey => $svalue){

            

           if($svalue['DescId'] == 201 && isset($svalue["FileId"])){

                

                $contactFileId = $svalue["FileId"]; 

                $arrayAdresseEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $contactFileId;

            

            } else if($svalue['DescId'] != 201){

                $arrayAdresseEudonet[$arrayResult["ResultData"]["Rows"][$key]["FileId"]][$relationEudonetJoomla[$svalue['DescId']]] = $svalue["DbValue"];

            }   

            

        }

    } 

    return array($arrayAdresseEudonet, $arrayResult["ResultMetaData"]["TotalPages"]);

 

}

 

 Appel des différentes fonctions et assemblage des données 

Dans cette dernière sous partie, nous détaillerons la fonction qui est appelée en premier dans notre script. Cette fonction est chargée d’appeler les fonctions de récupération des données des contacts, des adresses et des mandats et de les assembler.

 

function getDataFromEudonet(){

    // Test pour savoir si notre variable de session contenant toutes les données de contact, adresse et mandat existe.

    if(isset($_SESSION['eudonet_users_list'])){

         // Si oui on renvoie la variable avec les données

        return $_SESSION['eudonet_users_list'];

    // Sinon on récupère les données et on les assemble

    } else {

       

           // Début inscription dans un fichier de log       

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "DEBUT getEudonetData: ";

        $content .= "\n";

        $content .= "\n";   

       

        fputs($monfichier, $content);

        fclose($monfichier);  

 

           // Récupération des informations de contact et affectation à une variable

        $eudonetContactList = getContactEudoFields();

        

           // Inscription des données de contact dans un fichier de log 

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "CONTACT LIST : ";

        $content .= "\n";

        $content .= "\n";   

        $content .= print_r($eudonetContactList, true); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier); 

            

        // Récupération des informations d’adresses et affectation à une variable

        $eudonetAdresseList = getAdresseEudoFields();

 

        // Inscription des données d’adresses dans un fichier de log      

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "ADRESSE LIST : ";

        $content .= "\n";

        $content .= "\n";   

        $content .= print_r($eudonetAdresseList, true); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier);

        // Récupération des informations de mandats et affectation à une variable

        $eudonetMandatList = getMandatEudoFields();   

        // Inscription des données de mandats dans un fichier de log

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "MANDAT LIST : ";

        $content .= "\n";

        $content .= "\n";   

        $content .= print_r($eudonetMandatList, true); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier);

        

        // Début de l’assemblage des données

           $eudonetList = $eudonetContactList;   

        $ii=1;

 

  // On boucle dans le tableau des données de contact

        foreach($eudonetContactList as $key => $value) {

        

         // Inscription du rang du contact dans notre liste de contact dans le fichier de logs

            $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

            $content = "Adhérent numéro : ".$ii;

            $content .= "\n";

            $content .= "\n";   

            fputs($monfichier, $content);

            fclose($monfichier);

         // On boucle dans le tableau des données d’adresses

            foreach($eudonetAdresseList as $sKey => $sValue) {

              // Pour la valeur de contact et d’adresse en cours, test pour savoir si le FileId du contact dans les données de contact est le même que le FileId du contact dans les données d’adresses

                if( isset($sValue["contactFileId"]) && ($key == $sValue["contactFileId"]) ) {  

            // Pour le même FileId concaténation des données de contact et des données d’adresse

                    $eudonetList[$key] =  $eudonetList[$key] + $sValue;    

                    unset($eudonetList[$key]["contactFileId"]);

                }  

            }

         // On boucle dans le tableau des données de mandats

            foreach($eudonetMandatList as $sKey => $sValue) {

                     // Pour la valeur de contact et de mandats en cours, test pour savoir si le FileId du contact dans les données de contact est le même que le FileId de mandat dans les données de mandats

                if( isset($sValue["contactFileId"]) && ($key == $sValue["contactFileId"]) ) {  

                     // Pour le même FileId concaténation des données de contact et des données de mandats




                    $eudonetList[$key] =  $eudonetList[$key] + $sValue;

                    unset($eudonetList[$key]["contactFileId"]);    

                }  

            }

            $ii++;

        }

        

       // Inscription de toutes les données concaténées dans un fichier log

        $monfichier = fopen(JPATH_ROOT.'/log/eudonetData.txt', 'a+');

        $content = "EUDONET LIST : ";

        $content .= "\n";

        $content .= "\n";   

        $content .= print_r($eudonetList, true); 

        $content .= "\n";

        $content .= "\n";

        fputs($monfichier, $content);

        fclose($monfichier);    

 

       // Affectation de toutes les données concaténées dans notre variable de    session

        $_SESSION['eudonet_users_list'] = $eudonetList;

       

// Renvoi de toutes les données concaténées 

       return $eudonetList;

 

  }    

 

}

Voilà, nous avons au final grâce à la dernière fonction détaillée ci-dessus toutes les données Eudonet associées aux références de nos champs dans notre application web (ici Joomla). Dans cette partie du tutoriel, nous avons détaillé le code de récupération des informations clients d’Eudonet afin de les exploiter dans une application web. Dans le tutoriel suivant, nous expliquerons comment créer des utilisateurs dans la CRM Eudonet à partir d’informations de l’application web.

À bientôt !