[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.
marsante
Messages : 54
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 »

oui en lisant le code, les parties objets_data sont utilisées dans du code qui fonctionne, un suspect en moins :)

Concernant le retour de rdvClic :

Code : Tout sélectionner

a:0:{}

et c'est pas moi qui est trop anonymisé :lol:

j'ai fait un var_dump sur la variable res en dessous de :

Code : Tout sélectionner

 if (($res=$this->_sendCurl('GET', 'vevents', $this->_groupID, $searchString)) === false) {
                msSQL::sqlInsert('system', array('name'=>'clicRDV', 'groupe'=>'lock', 'value'=>'false'));
                return "Erreur de réception des données depuis clicRDV";
            }
            $res=json_decode($res, true);

Qui me donne :

Code : Tout sélectionner

array(7) {
  'recordsReturned' =>
  int(0)
  'totalRecords' =>
  int(0)
  'startIndex' =>
  int(0)
  'sort' =>
  NULL
  'dir' =>
  NULL
  'pageSize' =>
  int(0)
  'records' =>
  array(0) {
  }
}

Encore pas besoin d'anonymiser :D

du coup j'imagine que je dois réfléchir sur la méthode sendCurl ?

marsante
Messages : 54
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 »

edit: j'ai écris par dessus mon précédent post. Je disais qu'en fait la variable ne donne rien une fois la synchronisation effectuée, mais que si on fait toutes les opérations et qu'on lance là on obtient un retour que voici :

le patient de clicrdv vers msehr est Test Test, le patient de msehr vers clicrdv est admin micha
Le retour à l'air semblable c'est peut être plus après que ça pause problème. Infos supplémentaires que le patient ne soit pas dans la base msehr ou déjà dans la base msehr (c'est le cas de Test Test) ça ne se synchronise pas dans le sens clicrdv => msehr

pour admin micha je me suis amusé à déplacer le rdv ce qui explique les lignes supplémentaires

Code : Tout sélectionner

array(4) {
  [0] =>
  array(26) {
    'availableInterventions' =>
    string(0) ""
    'calendar_id' =>
    int(000000)
    'capacity' =>
    int(1)
    'colorref' =>
    string(0) ""
    'comments' =>
    string(0) ""
    'created_at' =>
    string(19) "2021-07-23 11:47:13"
    'deleted' =>
    bool(false)
    'end' =>
    string(19) "2021-07-24 11:30:00"
    'fiche_id' =>
    int(000000000)
    'from_web' =>
    bool(false)
    'id' =>
    int(000000000)
    'intervention_id' =>
    int(000000000)
    'key' =>
    string(20) "X00xxxX00xx0XXxxXxXX"
    'note' =>
    bool(false)
    'repeat_exceptions' =>
    NULL
    'repeat_until' =>
    NULL
    'resource_id' =>
    int(0)
    'rrule' =>
    string(0) ""
    'smsreminder' =>
    bool(true)
    'start' =>
    string(19) "2021-07-24 10:00:00"
    'state' =>
    int(0)
    'taker' =>
    string(11) "ClicRDV User "
    'text' =>
    string(9) "TEST Test"
    'type' =>
    string(0) ""
    'updated_at' =>
    string(19) "2021-07-23 11:47:13"
    'websource' =>
    string(0) ""
  }
  [1] =>
  array(26) {
    'availableInterventions' =>
    NULL
    'calendar_id' =>
    int(000000)
    'capacity' =>
    int(1)
    'colorref' =>
    string(7) "#dddddd"
    'comments' =>
    string(0) ""
    'created_at' =>
    string(19) "2021-07-23 11:49:08"
    'deleted' =>
    bool(true)
    'end' =>
    string(19) "2021-07-24 11:30:00"
    'fiche_id' =>
    int(000000000)
    'from_web' =>
    bool(false)
    'id' =>
    int(000000000)
    'intervention_id' =>
    int(000000000)
    'key' =>
    string(20) "xXxxXx0xxxxxxxxxxxxxX"
    'note' =>
    bool(false)
    'repeat_exceptions' =>
    NULL
    'repeat_until' =>
    NULL
    'resource_id' =>
    int(0)
    'rrule' =>
    string(0) ""
    'smsreminder' =>
    bool(false)
    'start' =>
    string(19) "2021-07-24 10:00:00"
    'state' =>
    int(0)
    'taker' =>
    string(11) "MedShakeEHR"
    'text' =>
    string(13) "ADMIN Micha"
    'type' =>
    string(0) ""
    'updated_at' =>
    string(19) "2021-07-23 11:49:25"
    'websource' =>
    string(0) ""
  }
  [2] =>
  array(26) {
    'availableInterventions' =>
    NULL
    'calendar_id' =>
    int(000000)
    'capacity' =>
    int(1)
    'colorref' =>
    string(7) "#dddddd"
    'comments' =>
    string(0) ""
    'created_at' =>
    string(19) "2021-07-23 11:49:09"
    'deleted' =>
    bool(true)
    'end' =>
    string(19) "2021-07-24 11:30:00"
    'fiche_id' =>
    int(000000000)
    'from_web' =>
    bool(false)
    'id' =>
    int(000000000)
    'intervention_id' =>
    int(000000000)
    'key' =>
    string(20) "xXxxXx0xXXxxxxxxxxxxX"
    'note' =>
    bool(false)
    'repeat_exceptions' =>
    NULL
    'repeat_until' =>
    NULL
    'resource_id' =>
    int(0)
    'rrule' =>
    string(0) ""
    'smsreminder' =>
    bool(false)
    'start' =>
    string(19) "2021-07-24 10:00:00"
    'state' =>
    int(0)
    'taker' =>
    string(11) "MedShakeEHR"
    'text' =>
    string(13) "ADMIN Micha"
    'type' =>
    string(0) ""
    'updated_at' =>
    string(19) "2021-07-23 11:49:49"
    'websource' =>
    string(0) ""
  }
  [3] =>
  array(26) {
    'availableInterventions' =>
    NULL
    'calendar_id' =>
    int(000000)
    'capacity' =>
    int(1)
    'colorref' =>
    string(7) "#dddddd"
    'comments' =>
    string(0) ""
    'created_at' =>
    string(19) "2021-07-23 11:50:06"
    'deleted' =>
    bool(false)
    'end' =>
    string(19) "2021-07-24 12:00:00"
    'fiche_id' =>
    int(000000000)
    'from_web' =>
    bool(false)
    'id' =>
    int(000000000)
    'intervention_id' =>
    int(000000000)
    'key' =>
    string(20) "X0XXXxxxXxX0XXxx0Xx"
    'note' =>
    bool(false)
    'repeat_exceptions' =>
    NULL
    'repeat_until' =>
    NULL
    'resource_id' =>
    int(0)
    'rrule' =>
    string(0) ""
    'smsreminder' =>
    bool(false)
    'start' =>
    string(19) "2021-07-24 10:30:00"
    'state' =>
    int(0)
    'taker' =>
    string(11) "MedShakeEHR"
    'text' =>
    string(13) "ADMIN Micha"
    'type' =>
    string(0) ""
    'updated_at' =>
    string(19) "2021-07-23 11:50:06"
    'websource' =>
    string(0) ""
  }
}

marsante
Messages : 54
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 ajouté deux var_dump. Un pour $fiche

Juste après

Code : Tout sélectionner

//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)){            

qui donne :

Code : Tout sélectionner

array(20) {
  'birthdate' =>
  NULL
  'comments' =>
  string(0) ""
  'created_at' =>
  string(19) "2021-07-22 15:40:23"
  'deleted' =>
  bool(false)
  'email' =>
  string(0) ""
  'externid' =>
  int(0000000000)
  'firstname' =>
  string(7) "Patient"
  'firstphone' =>
  string(0) ""
  'from_web' =>
  bool(false)
  'group_id' =>
  int(000000)
  'id' =>
  int(000000000)
  'lastname' =>
  string(4) "TEST"
  'locale' =>
  string(2) "fr"
  'marketing_sms' =>
  bool(false)
  'rappel_email' =>
  bool(true)
  'rappel_sms' =>
  bool(true)
  'secondphone' =>
  string(0) ""
  'updated_at' =>
  string(19) "2021-07-23 11:20:07"
  'marketing_optin' =>
  bool(false)
  'vevents-ref' =>
  array(2) {
    'href' =>
    string(7) "vevents"
    'api-ref' =>
    string(32) "/api/v1/fiches/000000000/vevents"
  }
}

Donc à priori jusqu'à là ça fonctionne toujours.

Puis j'ai testé $patients juste après

Code : Tout sélectionner

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']);
                        }

qui donne

Code : Tout sélectionner

class msPeople#8 (8) {
  protected $_toID =>
  int(5)
  protected $_fromID =>
  string(1) "1"
  private $_type =>
  string(7) "externe"
  private $_creationDate =>
  NULL
  private $_birthdate =>
  NULL
  private $_administrativesDatas =>
  NULL
  private $_ageFormats =>
  NULL
  private $_deathAgeFormats =>
  NULL
}

est ce que la creationDate ne devrait pas avoir une valeur autre que NULL ?

marsante
Messages : 54
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 »

Autre fait intéressant, en regardant les logs de la bdd, le patient "Patient Test" qui n'était pas crée dans la bdd de medshake a été rajouté sans apparaître dans le listing patient ou pro

Code : Tout sélectionner

#15 	2021-07-23 18:46:57 			#1 	#5 	#0 	#80 Email personnelle 				
#14 	2021-07-23 18:46:57 			#1 	#5 	#0 	#119 Nom de naissance 		TEST 		
#13 	2021-07-23 18:46:57 			#1 	#5 	#0 	#121 Prénom 		Patient 		
#12 	2021-07-23 18:46:57 			#1 	#5 	#0 	#74 ID patient 		0000000000
Avatar de l’utilisateur
Indelog
Administrateur
Messages : 44
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 »

Mouarf... je me remet dessus... et je suis un peut perdus.

Pour résumer ce que j'ai compris :

  • Syncro MedShake -> clicRDV : Fonctionne
  • Syncro clickRDV -> MedShake : Ne fonctionne pas

Pour que la syncro clickRDV -> medShake fonctionne if faut que le curl qui renseigne la variable $rdvClic renvoie un résultat :

Code : Tout sélectionner

            $startdate=date("Y-m-d H:i:s");
            $enddate=(date("Y-m-d H:i:s", strtotime("+2 year")));
            $searchString='&results=all&calendar_id='.$this->_calID.
              '&conditions[0][field]=type&conditions[0][op]=%21%3D&conditions[0][value]=VfreebusyEvent'.
              '&conditions[1][field]=taker&conditions[1][op]=%21%3D&conditions[1][value]=clicRDV'.
              '&conditions[2][field]=start&conditions[2][op]=%3E%3D&conditions[2][value]='.str_replace(' ', '%20', $startdate).
              '&conditions[3][field]=end&conditions[3][op]=%3C%3D&conditions[3][value]='.str_replace(' ', '%20', $enddate);
            if ($lastupdate) {
                $searchString.='&conditions[4][field]=updated_at&conditions[4][op]=%3E%3D&conditions[4][value]='.str_replace(' ', '%20', $lastupdate);
            }
            if (($res=$this->_sendCurl('GET', 'vevents', $this->_groupID, $searchString)) === false) {
                msSQL::sqlInsert('system', array('name'=>'clicRDV', 'groupe'=>'lock', 'value'=>'false'));
                return "Erreur de réception des données depuis clicRDV";
            }
            $res=json_decode($res, true);
            $rdvClic=array();
            if (is_array($res) and array_key_exists('records', $res)) {
                $rdvClic=$res['records'];
            }

Et ceux car au niveau de la section //sens clicRDV => local le foreach itère sur cette variable, donc si elle est vide il ce passe rien (ce qui semble être le cas chez toi). Donc la première étape est de faire en sorte d’obtenir un contenus ici.

Comme je suis un peut con j'ai pas pensé à aller voire le doc de l'API clic rdv en premier (ce qui j'aurai du faire). Ici la requette va chercher les vevents pour le calendrier de l'utilisateur. Plusieurs filtres sont appliqué dans $searchString. Peut être voire à faire des test en modifiant, supprimant et consolant certain des filtres comme le taker du vevent ou start et end.

Sinon, si $searchSting contient des truc. Pour le cas du patient TEST et le fait qu'on ne le trouve pas das la BD patient. msClicRDV si le patient n'existe pas vas créer un patient de type externe. Normalement tu peut constater leur création en base avec :

Code : Tout sélectionner

select * from people where type = 'externe';

Or il ne vont par apparaître sur la page patients tout simplement car au niveau du contrôleur ajax pour la recherche de patient le cas ne semble pas pris en compte. Il faudrait modifier controlers/rechercher/actions/inc-ajax-patientsListByCrit.php au niveau des lignes 121 à 125 :

Code : Tout sélectionner

    } elseif (array_key_exists('PraticienPeutEtrePatient', $p['config']) and $p['config']['PraticienPeutEtrePatient'] == 'true'){
        $mss->setPeopleType(['pro','patient']);
    } else {
        $mss->setPeopleType(['patient']);
    }

Pour ajouter le cas du patient externe :

Code : Tout sélectionner

    } elseif (array_key_exists('PraticienPeutEtrePatient', $p['config']) and $p['config']['PraticienPeutEtrePatient'] == 'true'){
        $mss->setPeopleType(['pro','patient','externe']);
    } else {
        $mss->setPeopleType(['patient','externe']);
    }

Et voire ce que cela donne.

Au cas ou ça fonctinnne toujours pas, j'ai vu que clickRDV possède une api de test : http://developers.clicrdv.com/fr/rest-api.html, peut être que je pourait l'utiliser pour essayer voire ce qui déconne (car comme ça juste en lisant le code c'est pas évident...). Par contre je n'aurai pas le temps de le faire dans la semaine prochaine.

DEMAREST Maxime (Indelog)
marsante
Messages : 54
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 »

Merci beaucoup pour les réponses.

Code : Tout sélectionner

Pour ajouter le cas du patient externe :

C'est bien ça, ça marche, merci beaucoup. Pour être sur que je n'ai pas merdé il faut bien remplacer les anciennes lignes par les nouvelles ? Les dossiers des patients externes ne sont pas éditable mais il y a moyen que cela soit lié aussi à la base de donnée.

Pour clicrdv externe avec un nouveau patient TTEST j'ai logué tout ça :

Code : Tout sélectionner

var_dump($searchString);
string(487) "&results=all&calendar_id=000000&conditions[0][field]=type&conditions[0][op]=%21%3D&conditions[0][value]=VfreebusyEvent&conditions[1][field]=taker&conditions[1][op]=%21%3D&conditions[1][value]=clicRDV&conditions[2][field]=start&conditions[2][op]=%3E%3D&conditions[2][value]=2021-08-12%2023:05:15&conditions[3][field]=end&conditions[3][op]=%3C%3D&conditions[3][value]=2023-08-12%2023:05:15&conditions[4][field]=updated_at&conditions[4][op]=%3E%3D&conditions[4][value]=2021-08-12%2023:05:09"

var_dump($rdvClic);
array(2) {
  [0] =>
  array(26) {
    'availableInterventions' =>
    string(0) ""
    'calendar_id' =>
    int(000000)
    'capacity' =>
    int(1)
    'colorref' =>
    string(0) ""
    'comments' =>
    string(0) ""
    'created_at' =>
    string(19) "2021-08-12 22:54:44"
    'deleted' =>
    bool(true)
    'end' =>
    string(19) "2021-09-01 12:00:00"
    'fiche_id' =>
    int(000000000)
    'from_web' =>
    bool(false)
    'id' =>
    int(000000000)
    'intervention_id' =>
    int(0000000)
    'key' =>
    string(20) "000000000000000aaaA"
    'note' =>
    bool(false)
    'repeat_exceptions' =>
    NULL
    'repeat_until' =>
    NULL
    'resource_id' =>
    int(0)
    'rrule' =>
    string(0) ""
    'smsreminder' =>
    bool(true)
    'start' =>
    string(19) "2021-09-01 11:00:00"
    'state' =>
    int(0)
    'taker' =>
    string(11) "Micha"
    'text' =>
    string(13) "TESTTEST Test"
    'type' =>
    string(0) ""
    'updated_at' =>
    string(19) "2021-08-12 23:05:09"
    'websource' =>
    string(0) ""
  }
  [1] =>
  array(26) {
    'availableInterventions' =>
    string(0) ""
    'calendar_id' =>
    int(000000)
    'capacity' =>
    int(1)
    'colorref' =>
    string(0) ""
    'comments' =>
    string(0) ""
    'created_at' =>
    string(19) "2021-08-12 23:05:10"
    'deleted' =>
    bool(false)
    'end' =>
    string(19) "2021-09-01 12:00:00"
    'fiche_id' =>
    int(000000000)
    'from_web' =>
    bool(false)
    'id' =>
    int(000000000)
    'intervention_id' =>
    int(0000000)
    'key' =>
    string(20) "AAaa0AaAaaAAaAAaaaa0"
    'note' =>
    bool(false)
    'repeat_exceptions' =>
    NULL
    'repeat_until' =>
    NULL
    'resource_id' =>
    int(0)
    'rrule' =>
    string(0) ""
    'smsreminder' =>
    bool(true)
    'start' =>
    string(19) "2021-09-01 11:00:00"
    'state' =>
    int(0)
    'taker' =>
    string(11) "Micha"
    'text' =>
    string(10) "TTEST Test"
    'type' =>
    string(0) ""
    'updated_at' =>
    string(19) "2021-08-12 23:05:10"
    'websource' =>
    string(0) ""
  }
}
var_dump($fiche);
array(20) {
  'birthdate' =>
  NULL
  'comments' =>
  string(0) ""
  'created_at' =>
  string(19) "2021-08-12 23:05:09"
  'deleted' =>
  bool(false)
  'email' =>
  string(0) ""
  'externid' =>
  int(0)
  'firstname' =>
  string(4) "Test"
  'firstphone' =>
  string(0) ""
  'from_web' =>
  bool(false)
  'group_id' =>
  int(165412)
  'id' =>
  int(000000000)
  'lastname' =>
  string(5) "TTEST"
  'locale' =>
  string(2) "fr"
  'marketing_sms' =>
  bool(false)
  'rappel_email' =>
  bool(true)
  'rappel_sms' =>
  bool(true)
  'secondphone' =>
  string(0) ""
  'updated_at' =>
  string(19) "2021-08-12 23:05:09"
  'marketing_optin' =>
  bool(false)
  'vevents-ref' =>
  array(2) {
    'href' =>
    string(7) "vevents"
    'api-ref' =>
    string(32) "/api/v1/fiches/000000000/vevents"
  }
}
var_dump($obj);
class msObjet#5 (6) {
  public $_ID =>
  NULL
  public $_toID =>
  int(7)
  private $_fromID =>
  string(1) "1"
  private $_byID =>
  NULL
  private $_creationDate =>
  NULL
  private $_registerDate =>
  NULL
}

log bdd msehr : 
#23 	2021-08-12 23:05:17 			#1 	#7 	#0 	#80 Email personnelle 				
#22 	2021-08-12 23:05:17 			#1 	#7 	#0 	#119 Nom de naissance 		TTEST 		
#21 	2021-08-12 23:05:17 			#1 	#7 	#0 	#121 Prénom 		Test 		
#20 	2021-08-12 23:05:17 			#1 	#7 	#0 	#74 ID patient 		000000000


select * from people where type = 'externe';
| id | name | type    | rank | module | pass | secret2fa | registerDate        | fromID | lastLogIP | lastLogDate | lastLogFingerprint | lastLostPassDate | lastLostPassRandStr |
...
|  7 | NULL | externe | NULL | base   |      | NULL      | 2021-08-12 23:05:17 |      1 | NULL      | NULL        | NULL               | NULL             | NULL                |
Avatar de l’utilisateur
Indelog
Administrateur
Messages : 44
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 : 12 août 2021, 23:42

Pour être sur que je n'ai pas merdé il faut bien remplacer les anciennes lignes par les nouvelles ?

Oui.

Indelog a écrit : 31 juil. 2021, 11:32

Les dossiers des patients externes ne sont pas éditable mais il y a moyen que cela soit lié aussi à la base de donnée.

Je ne sait pas comment fonctionne les patient externe, faudra voire pourquoi ce n'est pas éditable et si il existe un moyen de convertir un dossier patient externe en patient normal.

DEMAREST Maxime (Indelog)
marsante
Messages : 54
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 visiblement le logiciel converti les patients externes en patients internes

Code : Tout sélectionner

controlers/people/actions/inc-ajax-setExternAsNewPatient.php

Code : Tout sélectionner

if($_POST['externID']<1 or !is_numeric($_POST['externID'])) die;

msSQL::sqlQuery("UPDATE `people` SET `type`='patient' WHERE `id`='".$_POST['externID']."'");

echo json_encode(array('ok'));

Il y a des références à ce fichier dans

Code : Tout sélectionner

controlers/people/actions/peopleAjax.php

et dans

Code : Tout sélectionner

public_html/js/rechercher.js

Il existe aussi

Code : Tout sélectionner

controlers/people/actions/inc-ajax-setExternAsPatient.php

Code : Tout sélectionner

if($_POST['externID']<1) die;
if($_POST['patientID']<1) die;

$obj=new msObjet();
$obj->setToID($_POST['externID']);
$obj->setFromID($p['user']['id']);
$obj->createNewObjetByTypeName('relationExternePatient', $_POST['patientID']);

echo json_encode(array('ok'));

pour associer un patient externe à un patient interne déjà existant

Avatar de l’utilisateur
Indelog
Administrateur
Messages : 44
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 »

EDIT : J'ai fait un PR qui normalement fixe la liaison patients externe -> interne. Tu peut essayer de l’intégrer si tu veux : https://github.com/MedShake/MedShakeEHR-base/pull/99

Bon... j'ai pus avancé non sans mal. Je voulait faire des simulation avec clickRDV en demandant une clé API pour tester mais visiblement on peut plus : http://developers.clicrdv.com/fr/api-token-request.html :mrgreen: .

Du coup je me suis débrouillé pour simuler la création d'un patient avec clicRDV pour pouvoir comprendre en peut mieux comment fonctionne le système avec les patients externes crée depuis clicRDV.

Premier constat : les fonctionnalités vues pour la conversion de patient "externe" -> "interne" me semble être un reliquat d'un ancien mode de fonctionnement (je n'ai pas trouvé de trace de leur fonctionnement dans les vue actuel). A la place ce qui semble se faire actuellement est une liaison patient "externe" -> "interne" à l'aide d'une relation spécial via un objet data nommé relationExternePatient. Tout ce passe dans le contrôleur controlers/patient/patient.php.

Quand on cherche à ouvrir la fiche d'un patient externe créer via clickRDV (avec le lien du dossier patient dans l'agenda), EHR va détecter qu'il s'agit d'un patient externe et rechercher si il n’existe pas dans les patients interne existant, un patient avec un adresse email ou un numéro de téléphone qui correspond (dans controlers/patient/patient.php la section ligne 75 sur la v7.1 if ($externe and !$internePatient)). Si il le trouve, il va marquer la relation entre le patient externe et le patient trouvé :

Code : Tout sélectionner

$obj=new msObjet();
$obj->setToID($p['page']['patient']['id']);
$obj->setFromID($p['user']['id']);
$obj->createNewObjetByTypeName('relationExternePatient', $internePatient);

et redirigé vers la page du patient interne :

Code : Tout sélectionner

msTools::redirection('/patient/'.$internePatient.'/');

Si il ne le trouve pas, je suppose il est censé afficher le listing les patient externe et proposé de lier le patient externe au patient interne. Sauf que cette parti ne fonctionne pas. Déjà car le contrôler appelé n'est plus le bon (Il appel controlers/rechercher/patients.php alors que sur les version plus récentes de EHR c'est controlers/rechercher/peopleSearch.php et de toutes manière le comportement de peopleSearch.php ne semble plus adapté). Du coup à la place il ouvre une fiche patient avec des infos vide :

Image

La solution

Pour le moment je propose cette solution pour lier un patient externe à un nouveau patient qui n’existe pas encore dans EHR :

Simplement créer un nouveau patient avec dans sa ficher le numéro de téléphone ou l'adresse email du patient externe (on peut les voire sur l'agenda, sur la partie de droite en sélectionnant le patient externe), la prochaine fois que l'on chercha à ouvrir le dossier du patient externe via l'agenda, il sera lié au dossier du nouveau patient (via les infos tél ou e-mail correspondantes) et ce sera alors le dossier du nouveau patient qui s'affichera.

/!\ Bug dans controlers/rechercher/patients.php

**Attention il y a un problème avec les SQL qui permet de sélectionner le candidat pour la liaison patient "externe" -> "interne" : le SQL doit exclure les patient externe le la liste (pour ne pas faire la liaison sur un autres dossier de patient externe) mais il ne le fait pas bien. Il faut remplacer les lignes 88 et 93 :

Code : Tout sélectionner

    $candidats['phone']=msSQL::sql2tabSimple("SELECT od.toID FROM objets_data AS od left join people AS p
               ON od.toID=p.id AND p.type!='externe' AND od.outdated='' AND od.deleted=''
               WHERE (od.typeID IN ('".$name2typeID['mobilePhone']."', '".$name2typeID['homePhone']."', '".$name2typeID['telPro']."') AND od.value LIKE '".$data['mobilePhone']['value']."')
               OR (od.typeID IN ('".$name2typeID['mobilePhone']."', '".$name2typeID['homePhone']."', '".$name2typeID['telPro']."') AND od.value LIKE '".$data['homePhone']['value']."')");

    $candidats['email']=msSQL::sql2tabSimple("SELECT od.toID FROM objets_data AS od left join people AS p
               ON od.toID=p.id AND p.type!='externe' AND od.outdated='' AND od.deleted=''
               WHERE typeID IN('".$name2typeID['personalEmail']."', '".$name2typeID['profesionnalEmail']."') and value = '".$data['personalEmail']['value']."'");

par celles-ci :

Code : Tout sélectionner

	$candidats['phone']=msSQL::sql2tabSimple("SELECT od.toID FROM objets_data AS od left join people AS p
			   ON od.toID=p.id  AND od.outdated='' AND od.deleted=''
			   WHERE
					(
						(od.typeID IN ('".$name2typeID['mobilePhone']."', '".$name2typeID['homePhone']."', '".$name2typeID['telPro']."') AND od.value LIKE '".$data['mobilePhone']['value']."')
						OR
						(od.typeID IN ('".$name2typeID['mobilePhone']."', '".$name2typeID['homePhone']."', '".$name2typeID['telPro']."') AND od.value LIKE '".$data['homePhone']['value']."')
					)
				AND p.type!='externe'");
	$candidats['email']=msSQL::sql2tabSimple("SELECT od.toID FROM objets_data AS od left join people AS p
			   ON od.toID=p.id AND od.outdated='' AND od.deleted=''
			   WHERE typeID IN('".$name2typeID['personalEmail']."', '".$name2typeID['profesionnalEmail']."') and value = '".$data['personalEmail']['value']."' AND p.type!='externe'");

pour corriger le problème.

Je vais faire une PR pour proposer une correction.

Pièces jointes
medshake_fiche_patient_vide.png
DEMAREST Maxime (Indelog)
marsante
Messages : 54
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 »

Merci beaucoup . J'ai testé en remplaçant les fichiers par ceux du commit.

Concernant la partie agenda : les créneaux des patients externes ne sont pas synchro à l'agenda, je n'ai pas pu tester l'association de patient.

Concernant la partie patient : quand on clique sur un patient externe une première fois, on est bien renvoyé sur une vue pour sélectionner l'association. Sur cette vue il y a aussi bien des patients externes qu'interne (j'ai bien le nouveau fichier patient.php). En associant un patient externe à un interne, ils fusionnent bien. Quand on clique sur un autre patient externe on est renvoyé sur la fiche du patient interne synchro avec le premier patient externe, sans proposition de synchro. J'ai testé avec des numéros de téléphone différents des fois que, mais pareil. Juste pour le test j'ai commencé par synchro un patient externe avec lui-même ce qui provoque une erreur de redirection :lol: mais bon personne ne fera ça. Mais dans ce cas de figure ça ne doit pas aller au bout de la fusion, en cliquant sur un patient externe on obtient l'interface de fusion.

J'avais pris le trombone pour un bug d'icône et je n'avais pas testé avant la mise en place du commit, mais peut être que ça déclenchait une action ou peut être que ça renvoyait le même message d'erreur que maintenant.

Répondre