Il dit quoi dans le /var/log/apache2/error.log
?
[non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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.
https://www.brunoy-osteopathe.fr
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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
https://www.brunoy-osteopathe.fr
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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`.
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
ç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
https://www.brunoy-osteopathe.fr
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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');
}
https://www.brunoy-osteopathe.fr
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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
https://www.brunoy-osteopathe.fr
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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()
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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.
https://www.brunoy-osteopathe.fr
Re: [non vraiment ;-) Résolu] Problème paramètre utilisateur lors de l'activation de clicrdv
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:09En 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.