[non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Cette catégorie regroupe les demandes d'aide à l'utilisation du logiciel MedshakeEHR.
Avatar de l’utilisateur
Indelog
Administrateur
Messages : 71
Inscription : 10 juil. 2020, 10:06

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par Indelog »

Il dit quoi dans le /var/log/apache2/error.log ?

DEMAREST Maxime (Indelog)
marsante
Messages : 175
Inscription : 25 juil. 2020, 18:42

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par marsante »

j'ai trouvé, il manquait un s à la fonction file_put_contents. Donc maintenant ça s"exécute sans erreur. Le fichier n'est pas créé, mais j'ai une jolie stack trace dans les logs apaches en rapport avec le clic sur la synchro. Je vais essayer de l'extraire

J'ai oublié de répondre à la question sur l'exécution de clicrdv, j'ai déjà essayé qu'en user, qu'en global et en user et global, là je suis sur les deux normalement. Les fonctions qui fonctionnent marchent pareils et les fonctions qui dysfonctionnent également quelque soit le choix.

marsante
Messages : 175
Inscription : 25 juil. 2020, 18:42

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par marsante »

Code : Tout sélectionner

[Tue Jul 20 21:05:55.374077 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP Notice:  Undefined variable: p in /opt/ehr/class/msClicRDV.php on line 305, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374178 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP Stack trace:, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374196 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   1. {main}() /opt/ehr/public_html/index.php:0, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374207 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   2. include() /opt/ehr/public_html/index.php:140, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374218 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   3. include() /opt/ehr/controlers/agenda/actions/agendaAjax.php:50, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374227 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   4. include() /opt/ehr/controlers/agenda/actions/inc-ajax-synchronizeEvents.php:34, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374238 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   5. msClicRDV->syncEvents() /opt/ehr/controlers/services/clicRDV/inc-ajax-synchronizeEvents.php:32, referer: https://msehr.local/agenda/3/

la première erreur à l'air d'être liée au dump. Je vais retenter sans les dumps.

Edit la deuxième se produit bien sans les dumps

Code : Tout sélectionner

[Tue Jul 20 21:05:55.374608 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP Warning:  array_key_exists() expects parameter 2 to be array, bool given in /opt/ehr/class/msClicRDV.php on line 306, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374632 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP Stack trace:, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374644 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   1. {main}() /opt/ehr/public_html/index.php:0, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374669 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   2. include() /opt/ehr/public_html/index.php:140, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374678 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   3. include() /opt/ehr/controlers/agenda/actions/agendaAjax.php:50, referer: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374686 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   4. include() /opt/ehr/controlers/agenda/actions/inc-ajax-synchronizeEvents.php:34, referer: https://msehr
.local/agenda/3/
[Tue Jul 20 21:05:55.374695 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   5. msClicRDV->syncEvents() /opt/ehr/controlers/services/clicRDV/inc-ajax-synchronizeEvents.php:32, refere
r: https://msehr.local/agenda/3/
[Tue Jul 20 21:05:55.374702 2021] [php7:notice] [pid 552] [client 55.55.55.1:34354] PHP   6. array_key_exists() /opt/ehr/class/msClicRDV.php:306, referer: https://msehr.local/agenda/3/

ça doit être un problème de formulation comme le clicRdvUserId est utilisé dans d'autres fonctions qui marchent. Je regarderai demain

Avatar de l’utilisateur
Indelog
Administrateur
Messages : 71
Inscription : 10 juil. 2020, 10:06

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par Indelog »

Il semble que le $this->_getUserParams(); à la ligne 306 ne retourne pas un array comme attendus d'ou le fait que le array_key_exists au dessous fasse chouiner php.

Il me semble que pour clique rdv il va checher les paramètre pour l'utilisateur et non les paramètres globaux (https://msehr.local/configuration/user-param/3/ puis Nouveau paramètre).

Pour le dump de valeur il trouve pas $p, de pense que c'est car le script est exécuté en ligne de commande. On va lui fixer le chemain vers le quel il doit écrire sans variable comme ça on sera tanquille :

Code : Tout sélectionner

file_put_content('/tmp/'.mydump', serialize($params));

La il va écrire le dump dans '/tmp/mydump`.

DEMAREST Maxime (Indelog)
marsante
Messages : 175
Inscription : 25 juil. 2020, 18:42

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par marsante »

ça n'écris pas non plus le fichier. Peut-être que j'ai mal configuré mon php ini. Je suis en E_all pour error reporting et on pour display_error. html_error est à on. Pour xdebug xdebug.show_local_vars=1 xdebug.mode = debug. Et en début de fichier error_reporting (E_ALL); ini_set ('display_errors', 'on'); Est ce que je dois ajouter quelque chose ? Le dossier tmp dispose des bons droits

marsante
Messages : 175
Inscription : 25 juil. 2020, 18:42

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par marsante »

La stack trace était liée au fait que je n'avais pas corrigé ce bloque dans ma nouvelle machine virtuelle en remplaçant user par admin.

Code : Tout sélectionner

 private function _getUserParams() {
        return msSQL::sql2tabKey("SELECT dt.name,od.value
        FROM data_types AS dt left join objets_data AS od
        ON od.typeID=dt.id AND od.toID='".$this->_userID."' AND od.outdated='' AND od.deleted=''
        WHERE dt.groupe='user'", 'name', 'value');
    }
marsante
Messages : 175
Inscription : 25 juil. 2020, 18:42

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par marsante »

Alors ça devait quand même être un problème de droit :? . Dans le dossier ehr j'obtiens pour $params ceci. Les paramètres utilisateurs standards sont bien transmis par contre les paramètres clicrdv sont absent.

Code : Tout sélectionner

a:60:{s:3:"job";N;s:5:"sport";N;s:4:"city";N;s:7:"country";N;s:15:"postalCodePerso";N;s:6:"street";N;s:12:"streetNumber";N;s:13:"codePostalPro";N;s:23:"etablissementAdressePro";N;s:13:"numAdressePro";N;s:14:"paysAdressePro";N;s:13:"rueAdressePro";N;s:17:"serviceAdressePro";N;s:15:"villeAdressePro";N;s:9:"groupname";N;s:25:"registryAuthorisationDate";N;s:28:"registryAuthorisationEndDate";N;s:18:"registryPrefixTech";N;s:13:"registryState";N;s:12:"registryname";N;s:32:"administratifMarqueurDestruction";N;s:27:"administratifMarqueurPasRdv";N;s:32:"administratifMarqueurSuppression";N;s:14:"peopleExportID";N;s:12:"clicRdvCalId";N;s:16:"clicRdvConsultId";N;s:14:"clicRdvGroupId";N;s:15:"clicRdvPassword";N;s:13:"clicRdvUserId";N;s:16:"clicRdvPatientId";N;s:13:"emailApicrypt";N;s:6:"faxPro";N;s:9:"homePhone";N;s:11:"mobilePhone";N;s:14:"mobilePhonePro";N;s:13:"personalEmail";N;s:12:"pgpPublicKey";N;s:17:"profesionnalEmail";N;s:6:"telPro";N;s:7:"telPro2";N;s:5:"notes";N;s:8:"notesPro";N;s:24:"administrativeGenderCode";N;s:9:"birthdate";N;s:9:"birthname";s:5:"ADMIN";s:9:"deathdate";N;s:9:"firstname";s:7:"Michael";s:8:"lastname";N;s:15:"othersfirstname";N;s:5:"titre";N;s:14:"twitterAccount";N;s:7:"website";N;s:12:"PSCodeProSpe";N;s:23:"PSCodeStructureExercice";N;s:7:"PSIdNat";N;s:5:"adeli";N;s:7:"nReseau";N;s:3:"nss";N;s:3:"nmu";N;s:4:"rpps";N;}

Pour obtenir params c'est cette méthode

Code : Tout sélectionner

private function _getUserParams() {
        return msSQL::sql2tabKey("SELECT dt.name,od.value
        FROM data_types AS dt left join objets_data AS od
        ON od.typeID=dt.id AND od.toID='".$this->_userID."' AND od.outdated='' AND od.deleted=''
        WHERE dt.groupe='admin'", 'name', 'value');

qui utilise dans la class msSQL

Code : Tout sélectionner

public static function sql2tab($sql)
  {
      $query=self::sqlQuery($sql);
      if ($query and mysqli_num_rows($query)>0) {
          while ($row=$query->fetch_array(MYSQLI_ASSOC)) {
              if ($row) {
                  $result[]=$row;
              }
          };
          return $result;
      } else {
          return null;
      }
  }

la variable res ne sort rien mais probablement à cause du problème du dessus

edit : les valeurs de mdp etc sont bien présentes dans la base de données dans la table configuration

Avatar de l’utilisateur
Indelog
Administrateur
Messages : 71
Inscription : 10 juil. 2020, 10:06

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par Indelog »

Ok je crois que je le tien !

En fait l'utilisation de msClicRDV::_getUserParams() ne va pas du tout. Cette méthode va chercher à récupérer les valeur de configuration dans les objets de données pour l'utilisateur (dans dans la tables objets_data), c'est peut être dans cette table qu'était stockés les données de configuration dans les ancienne version de MedShake mais désormais il faut utiliser la table configuration. On peut retrouvé les données de cette table avec les méthodes de la class msConfiguration.

Il faudrait essayer cette solution : remplacer toutes les fois ou la valeur de $param est obtenus avec $this->_getUserParams()

Code : Tout sélectionner

$params=$this->_getUserParams();

par :

Code : Tout sélectionner

$params = msConfiguration::getCatParametersForUser('clicRDV', array('id'=>$this->_userID,'module'=>''));

dans les méthode sendEvent, modEvent, delEvent, et syncEvent.

Peut tu tester cela ?

Fait notable msClicRDV::setUserPwd() va chercher ses valeurs avec msConfiguration::getParameterValue()

DEMAREST Maxime (Indelog)
marsante
Messages : 175
Inscription : 25 juil. 2020, 18:42

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par marsante »

Super merci.

Alors en remplaçant par ta solution, l'envoi de rdv patient de msehr vers clicrdv fonctionne. La suppression de patient sur msehr vers clicrdv fonctionne. Le déplacement d'un créneau sur msehr vers clicrdv fonctionne. Dans le sens inverse ça ne fonctionne pas. C'est déjà une énorme avancée merci beaucoup

En terme de suspect :

Code : Tout sélectionner

//liste des patients qui ont un id clic connu
    private function _getLocalPatients() {
        $ret=array();
        //ret[0]=array(idMedShake=>idClicRDV)
        $ret[0]=msSQL::sql2tabKey("SELECT od.toID, od.value
              FROM objets_data AS od left join data_types AS dt
              ON od.typeID=dt.id AND od.outdated='' AND od.deleted=''
              WHERE dt.name='clicRdvPatientId'", 'toID', 'value');
        //ret[1]=array(idClicRDV=>idMedShake)
        if (!is_array($ret[0])) {
            return(array(array(), array()));
        }
        $ret[1]=array_flip($ret[0]);
        return $ret;
    }

// liste des patients qui sont sous un id externe et un interne
// survient quand créés dans MedShake puis ont pris rdv sur clic
private function _getRelatedPatients() {
    $ret=array();
    // array(idPatientExterne=>idPatientInterne)
    $ret[0]=msSQL::sql2tabKey("SELECT od.toID, od.value
          FROM objets_data AS od left join data_types AS dt
          ON od.typeID=dt.id AND od.outdated='' AND od.deleted=''
          WHERE dt.name='relationExternePatient'", 'toID', 'value');
    if (!is_array($ret[0])) {
        return(array(array(), array()));
    }
    $ret[1]=array_flip($ret[0]);
    return $ret;
}

qui fait également référence à objets_data

Ou la fonction directement :

Code : Tout sélectionner

//sens clicRDV => local
            foreach($rdvClic as $vclic) {
                //événement inconnu en local, et non supprimé sur clic
                if (!$vclic['deleted'] and !array_key_exists($vclic['id'], $knownEvents)) {
                    //patient 0 (fermetures)
                    if (!$vclic['fiche_id']) {
                        $patientID=0;
                    //patient connu
                    } elseif (array_key_exists($vclic['fiche_id'], $patients[1])) {
                        $patientID=$patients[1][$vclic['fiche_id']];
                        //si le patient est de type externe et lié à un patient interne, l'événement est assigné à l'interne
                        if (array_key_exists($patientID, $relatedPatients[1])) {
                            $patientID=$relatedPatients[1][$patientID];
                        }
                    //sinon on le crée
                    } elseif ($fiche=json_decode($this->_sendCurl('GET', 'fiches/'.$vclic['fiche_id'], $this->_groupID), true) and array_key_exists('id', $fiche)){
                        $patient=new msPeople(); // pour supprimer le toID dans la class
                        $patient->setFromID($clicRDVservice);
                        $patient->setType('externe');
                        $patientID=$patient->createNew();
                        $patients[1][$fiche['id']]=$patientID;
                        $obj->setToID($patientID);
                        $obj->setFromID($clicRDVservice);
                        $obj->createNewObjetByTypeName('clicRdvPatientId', $fiche['id']);
                        $obj->createNewObjetByTypeName('firstname', $fiche['firstname']);
                        $obj->createNewObjetByTypeName('birthname', $fiche['lastname']);
                        $obj->createNewObjetByTypeName('personalEmail', $fiche['email']);
                        if ($fiche['birthdate']) {
                            $obj->createNewObjetByTypeName('birthdate', $fiche['birthdate']);
                        }
                        if ($fiche['firstphone'] and (!strpos('06', $fiche['firstphone']) or !strpos('07', $fiche['firstphone']))) {
                            $obj->createNewObjetByTypeName('mobilePhone', $fiche['firstphone']);
                        } elseif ($fiche['secondphone'] and (!strpos('06', $fiche['secondphone']) or !strpos('07', $fiche['secondphone']))) {
                            $obj->createNewObjetByTypeName('mobilePhone', $fiche['secondphone']);
                        } elseif ($fiche['firstphone']) {
                            $obj->createNewObjetByTypeName('homePhone', $fiche['firstphone']);
                        }
                    } else {
                        msSQL::sqlInsert('system', array('name'=>'clicRDV', 'groupe'=>'lock', 'value'=>'false'));
                        return "Erreur lors de la récupération d'une fiche";
                    }
                    //on crée l'événement
                    $agenda->set_eventID(null);
                    $agenda->set_patientID($patientID);
                    $agenda->set_externID($vclic['id']);
                    $agenda->setStartDate($vclic['start']);
                    $agenda->setEndDate($vclic['end']);
                    $agenda->set_type($vclic['intervention_id']?$interventions[1][$vclic['intervention_id']][0]:'[off]');
                    $agenda->set_motif($vclic['comments']);
                    $agenda->addOrUpdateRdv();
                // si l'événement est connu, on traîte les éventuelles changements intervenus d'un côté ou de l'autre
                } elseif (array_key_exists($vclic['id'], $knownEvents)) {
                    $evt=$events[$knownEvents[$vclic['id']]];
                    //cas où l'événement local a été modifié en dernier
                    if ($evt['lastModified']>$vclic['updated_at']) {
                        //cas de la suppression
                        if ($evt['statut']=='deleted' and !$vclic['deleted']) {
                            $this->_sendCurl('DELETE', 'vevents/'.$vclic['id'], $this->_groupID);
                        } elseif ($vclic['start'] != $evt['start'] or $vclic['end'] != $evt['end']) {
                            $evtc=array();
                            $evtc['vevent']=array(
                                'calendar_id'=>$this->_calID,
                                'start'=>$evt['start'],
                                'end'=>$evt['end']
                            );
                            $this->_sendCurl('PUT', 'vevents/'.$vclic['id'], $this->_groupID, '', json_encode($evtc));
                        }
                    //cas où l'événement clic a été modifié en dernier
                    } else {
                        $agenda->set_eventID($evt['id']);
                        //cas où l'evénement a été enlevé ou remis depuis clic
                        if ($evt['statut']=='deleted' and !$vclic['deleted']) {
                            $agenda->undelEvent();
                        } elseif ($evt['statut']!='deleted' and $vclic['deleted']) {
                            $agenda->delEvent();
                        }
                        //cas où l'evénement a été modifié sur clic
                        if ($vclic['start'] != $evt['start'] or $vclic['end'] != $evt['end']) {
                            $agenda->setStartDate($vclic['start']);
                            $agenda->setEndDate($vclic['end']);
                            $agenda->moveEvent();
                        }
                    }
                }
            }

je vais lire tout ça.

Avatar de l’utilisateur
Indelog
Administrateur
Messages : 71
Inscription : 10 juil. 2020, 10:06

Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv

Message non lu par Indelog »

marsante a écrit : 22 juil. 2021, 16:09

Dans le sens inverse ça ne fonctionne pas.

Aurait tu un moyen de me fournir un dump de la variable $rdvClic juste avant //sens clicRDV => local dans msClicRDV::syncEvents() en anonymisant les donnée retourné.

marsante a écrit : 22 juil. 2021, 16:09

En terme de suspect :

Code : Tout sélectionner

//liste des patients qui ont un id clic connu
    private function _getLocalPatients() {
        $ret=array();
        //ret[0]=array(idMedShake=>idClicRDV)
        $ret[0]=msSQL::sql2tabKey("SELECT od.toID, od.value
              FROM objets_data AS od left join data_types AS dt
              ON od.typeID=dt.id AND od.outdated='' AND od.deleted=''
              WHERE dt.name='clicRdvPatientId'", 'toID', 'value');
        //ret[1]=array(idClicRDV=>idMedShake)
        if (!is_array($ret[0])) {
            return(array(array(), array()));
        }
        $ret[1]=array_flip($ret[0]);
        return $ret;
    }

// liste des patients qui sont sous un id externe et un interne
// survient quand créés dans MedShake puis ont pris rdv sur clic
private function _getRelatedPatients() {
    $ret=array();
    // array(idPatientExterne=>idPatientInterne)
    $ret[0]=msSQL::sql2tabKey("SELECT od.toID, od.value
          FROM objets_data AS od left join data_types AS dt
          ON od.typeID=dt.id AND od.outdated='' AND od.deleted=''
          WHERE dt.name='relationExternePatient'", 'toID', 'value');
    if (!is_array($ret[0])) {
        return(array(array(), array()));
    }
    $ret[1]=array_flip($ret[0]);
    return $ret;
}

qui fait également référence à objets_data

Ici sa me semble normal car il semble bien que ce soit une donnée liée à un patient et non un paramètre de configuration.

DEMAREST Maxime (Indelog)
Répondre