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
.
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 :
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](https://c-medshakeehr.fr/forum/download/file.php?mode=view&id=12)
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.