Ejemplo n.º 1
0
 /**
  * Handle event
  *
  * @param CHL7Acknowledgment $ack        Acknowledgement
  * @param CPatient           $newPatient Person
  * @param array              $data       Nodes data
  *
  * @return null|string
  */
 function handle(CHL7Acknowledgment $ack, CPatient $newPatient, $data)
 {
     // Traitement du message des erreurs
     $comment = $warning = "";
     $exchange_hl7v2 = $this->_ref_exchange_hl7v2;
     $exchange_hl7v2->_ref_sender->loadConfigValues();
     $sender = $exchange_hl7v2->_ref_sender;
     foreach ($data["merge"] as $_data_merge) {
         $data = $_data_merge;
         $mbPatient = new CPatient();
         $mbPatientElimine = new CPatient();
         $patientPI = CValue::read($data['personIdentifiers'], "PI");
         $patientRI = CValue::read($data['personIdentifiers'], "RI");
         $patientEliminePI = CValue::read($data['personElimineIdentifiers'], "PI");
         $patientElimineRI = CValue::read($data['personElimineIdentifiers'], "RI");
         // Acquittement d'erreur : identifiants RI et PI non fournis
         if (!$patientRI && !$patientPI || !$patientElimineRI && !$patientEliminePI) {
             return $exchange_hl7v2->setAckAR($ack, "E100", null, $newPatient);
         }
         $idexPatient = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientPI);
         if ($mbPatient->load($patientRI)) {
             if ($idexPatient->object_id && $mbPatient->_id != $idexPatient->object_id) {
                 $comment = "L'identifiant source fait référence au patient : {$idexPatient->object_id}";
                 $comment .= " et l'identifiant cible au patient : {$mbPatient->_id}.";
                 return $exchange_hl7v2->setAckAR($ack, "E130", $comment, $newPatient);
             }
         }
         if (!$mbPatient->_id) {
             $mbPatient->load($idexPatient->object_id);
         }
         $idexPatientElimine = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientEliminePI);
         if ($mbPatientElimine->load($patientElimineRI)) {
             if ($idexPatientElimine->object_id && $mbPatientElimine->_id != $idexPatientElimine->object_id) {
                 $comment = "L'identifiant source fait référence au patient : {$idexPatientElimine->object_id}";
                 $comment .= "et l'identifiant cible au patient : {$mbPatientElimine->_id}.";
                 return $exchange_hl7v2->setAckAR($ack, "E131", $comment, $newPatient);
             }
         }
         if (!$mbPatientElimine->_id) {
             $mbPatientElimine->load($idexPatientElimine->object_id);
         }
         if (!$mbPatient->_id || !$mbPatientElimine->_id) {
             $comment = !$mbPatient->_id ? "Le patient {$mbPatient->_id} est inconnu dans Mediboard." : "Le patient {$mbPatientElimine->_id} est inconnu dans Mediboard.";
             return $exchange_hl7v2->setAckAR($ack, "E120", $comment, $newPatient);
         }
         // Passage en trash de l'IPP du patient a éliminer
         $newPatient->trashIPP($idexPatientElimine);
         if ($mbPatient->_id == $mbPatientElimine->_id) {
             return $exchange_hl7v2->setAckAA($ack, "I104", null, $newPatient);
         }
         $patientsElimine_array = array($mbPatientElimine);
         $first_patient_id = $mbPatient->_id;
         $checkMerge = $mbPatient->checkMerge($patientsElimine_array);
         // Erreur sur le check du merge
         if ($checkMerge) {
             $comment = "La fusion de ces deux patients n'est pas possible à cause des problèmes suivants : {$checkMerge}";
             return $exchange_hl7v2->setAckAR($ack, "E121", $comment, $newPatient);
         }
         $mbPatientElimine_id = $mbPatientElimine->_id;
         /** @todo mergePlainFields resets the _id */
         $mbPatient->_id = $first_patient_id;
         // Notifier les autres destinataires
         $mbPatient->_eai_sender_guid = $sender->_guid;
         $mbPatient->_merging = CMbArray::pluck($patientsElimine_array, "_id");
         if ($msg = $mbPatient->merge($patientsElimine_array)) {
             return $exchange_hl7v2->setAckAR($ack, "E103", $msg, $mbPatient);
         }
         $mbPatient->_mbPatientElimine_id = $mbPatientElimine_id;
         $comment = CEAIPatient::getComment($mbPatient, $mbPatientElimine);
     }
     return $exchange_hl7v2->setAckAA($ack, "I103", $comment, $mbPatient);
 }
 /**
  * Handle all ITI-30 events
  *
  * @param CHL7Acknowledgment $ack        Acknowledgement
  * @param CPatient           $newPatient Person
  * @param array              $data       Nodes data
  *
  * @return null|string
  */
 function handleAll(CHL7Acknowledgment $ack, CPatient $newPatient, $data)
 {
     // Traitement du message des erreurs
     $_modif_patient = false;
     $exchange_hl7v2 = $this->_ref_exchange_hl7v2;
     $sender = $this->_ref_sender;
     $patientRI = CValue::read($data['personIdentifiers'], "RI");
     $patientRISender = CValue::read($data['personIdentifiers'], "RI_Sender");
     $patientPI = CValue::read($data['personIdentifiers'], "PI");
     $IPP = new CIdSante400();
     if ($patientPI) {
         $IPP = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientPI);
     }
     // PI non connu (non fourni ou non retrouvé)
     if (!$patientPI || !$IPP->_id) {
         // RI fourni
         if ($patientRI) {
             // Recherche du patient par son RI
             if ($newPatient->load($patientRI)) {
                 $recoveredPatient = clone $newPatient;
                 // Mapping primaire du patient
                 $this->primaryMappingPatient($data, $newPatient);
                 // Le patient retrouvé est-il différent que celui du message ?
                 if (!$this->checkSimilarPatient($recoveredPatient, $newPatient)) {
                     $commentaire = "Le nom ({$newPatient->nom} / {$recoveredPatient->nom}) " . "et/ou le prénom ({$newPatient->prenom} / {$recoveredPatient->prenom}) sont très différents.";
                     return $exchange_hl7v2->setAckAR($ack, "E123", $commentaire, $newPatient);
                 }
                 // On store le patient
                 if ($msgPatient = CEAIPatient::storePatient($newPatient, $sender)) {
                     return $exchange_hl7v2->setAckAR($ack, "E101", $msgPatient, $newPatient);
                 }
                 $code_IPP = "I121";
                 $_modif_patient = true;
             } else {
                 $code_IPP = "I120";
             }
         } else {
             // Aucun IPP fourni
             if (!$patientPI) {
                 $code_IPP = "I125";
             } else {
                 $code_IPP = "I122";
             }
         }
         if (!$newPatient->_id) {
             // Mapping primaire du patient
             $this->primaryMappingPatient($data, $newPatient);
             // Patient retrouvé
             if ($newPatient->loadMatchingPatient()) {
                 // Mapping primaire du patient
                 $this->primaryMappingPatient($data, $newPatient);
                 $code_IPP = "A121";
                 $_modif_patient = true;
             }
             // On store le patient
             $newPatient->_IPP = $IPP->id400;
             if ($msgPatient = CEAIPatient::storePatient($newPatient, $sender)) {
                 return $exchange_hl7v2->setAckAR($ack, "E101", $msgPatient, $newPatient);
             }
         }
         $newPatient->_generate_IPP = false;
         // Mapping secondaire (correspondants, médecins) du patient
         if ($msgPatient = $this->secondaryMappingPatient($data, $newPatient)) {
             return $exchange_hl7v2->setAckAR($ack, "E101", $msgPatient, $newPatient);
         }
         if ($msgIPP = CEAIPatient::storeIPP($IPP, $newPatient, $sender)) {
             return $exchange_hl7v2->setAckAR($ack, "E102", $msgIPP, $newPatient);
         }
         $codes = array($_modif_patient ? "I102" : "I101", $code_IPP);
         $comment = CEAIPatient::getComment($newPatient);
         $comment .= CEAIPatient::getComment($IPP);
     } else {
         $newPatient->load($IPP->object_id);
         $recoveredPatient = clone $newPatient;
         // Mapping primaire du patient
         $this->primaryMappingPatient($data, $newPatient);
         // Le patient retrouvé est-il différent que celui du message ?
         if (!$this->checkSimilarPatient($recoveredPatient, $newPatient)) {
             $commentaire = "Le nom ({$newPatient->nom} / {$recoveredPatient->nom}) " . "et/ou le prénom ({$newPatient->prenom} / {$recoveredPatient->prenom}) sont très différents.";
             return $exchange_hl7v2->setAckAR($ack, "E124", $commentaire, $newPatient);
         }
         // RI non fourni
         if (!$patientRI) {
             $code_IPP = "I123";
         } else {
             $tmpPatient = new CPatient();
             // RI connu
             if ($tmpPatient->load($patientRI)) {
                 if ($tmpPatient->_id != $IPP->object_id) {
                     $comment = "L'identifiant source fait référence au patient : {$IPP->object_id}" . "et l'identifiant cible au patient : {$tmpPatient->_id}.";
                     return $exchange_hl7v2->setAckAR($ack, "E101", $comment, $newPatient);
                 }
                 $code_IPP = "I124";
             } else {
                 $code_IPP = "A120";
             }
         }
         // On store le patient
         if ($msgPatient = CEAIPatient::storePatient($newPatient, $sender)) {
             return $exchange_hl7v2->setAckAR($ack, "E101", $msgPatient, $newPatient);
         }
         // Mapping secondaire (correspondants, médecins) du patient
         if ($msgPatient = $this->secondaryMappingPatient($data, $newPatient)) {
             return $exchange_hl7v2->setAckAR($ack, "E101", $msgPatient, $newPatient);
         }
         $codes = array("I102", $code_IPP);
         $comment = CEAIPatient::getComment($newPatient);
     }
     if ($patientRISender) {
         CEAIPatient::storeRISender($patientRISender, $newPatient, $sender);
     }
     if ($sender->_configs["ins_integrated"]) {
         $this->getINS($data["PID"], $newPatient);
     }
     return $exchange_hl7v2->setAckAA($ack, $codes, $comment, $newPatient);
 }
 /**
  * Gestion des débiteurs d'une venue de patient
  *
  * @param CHPrimXMLAcquittementsPatients $dom_acq    Acquittement
  * @param CPatient                       $newPatient Patient
  * @param array                          $data       Datas
  *
  * @return CHPrimXMLAcquittementsPatients $msgAcq 
  **/
 function debiteursVenue($dom_acq, $newPatient, $data)
 {
     $echg_hprim = $this->_ref_echange_hprim;
     $sender = $echg_hprim->_ref_sender;
     $sender->loadConfigValues();
     $this->_ref_sender = $sender;
     // Traitement du patient
     $domEnregistrementPatient = new CHPrimXMLEnregistrementPatient();
     $domEnregistrementPatient->_ref_echange_hprim = $echg_hprim;
     $msgAcq = $domEnregistrementPatient->enregistrementPatient($dom_acq, $newPatient, $data);
     if ($echg_hprim->statut_acquittement != "OK") {
         return $msgAcq;
     }
     $dom_acq = new CHPrimXMLAcquittementsPatients();
     $dom_acq->_identifiant_acquitte = $data['identifiantMessage'];
     $dom_acq->_sous_type_evt = $this->sous_type;
     $dom_acq->_ref_echange_hprim = $echg_hprim;
     $codes = array();
     $avertissement = $commentaire = null;
     // Si CIP
     if (!CAppUI::conf('sip server')) {
         $sender = $echg_hprim->_ref_sender;
         // Mapping des mouvements
         $newPatient = $this->mappingDebiteurs($data['debiteurs'], $newPatient);
         $newPatient->repair();
         $msgPatient = CEAIPatient::storePatient($newPatient, $sender);
         $commentaire = CEAIPatient::getComment($newPatient);
         $codes = array($msgPatient ? "A003" : "I002");
         if ($msgPatient) {
             $avertissement = $msgPatient . " ";
         }
     }
     return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newPatient);
 }
 /**
  * Fusion and recording a patient with an IPP in the system
  *
  * @param CHPrimXMLAcquittementsPatients $dom_acq    Acquittement
  * @param CPatient                       $newPatient Patient
  * @param array                          $data       Datas
  *
  * @return string acquittement 
  **/
 function fusionPatient(CHPrimXMLAcquittementsPatients $dom_acq, CPatient $newPatient, $data)
 {
     $echg_hprim = $this->_ref_echange_hprim;
     $commentaire = $avertissement = "";
     $codes = array();
     $sender = $echg_hprim->_ref_sender;
     $sender->loadConfigValues();
     $this->_ref_sender = $sender;
     // Si CIP
     if (!CAppUI::conf('sip server')) {
         $mbPatientElimine = new CPatient();
         $mbPatient = new CPatient();
         $sender = $echg_hprim->_ref_sender;
         // Acquittement d'erreur : identifiants source et cible non fournis pour le patient / patientElimine
         if (!$data['idSourcePatient'] && !$data['idCiblePatient'] && !$data['idSourcePatientElimine'] && !$data['idCiblePatientElimine']) {
             return $echg_hprim->setAckError($dom_acq, "E005", $commentaire, $newPatient);
         }
         $idexPatient = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $data['idSourcePatient']);
         if ($mbPatient->load($data['idCiblePatient'])) {
             if ($mbPatient->_id != $idexPatient->object_id) {
                 $commentaire = "L'identifiant source fait référence au patient : {$idexPatient->object_id} et l'identifiant cible";
                 $commentaire .= "au patient : {$mbPatient->_id}.";
                 return $echg_hprim->setAckError($dom_acq, "E004", $commentaire, $newPatient);
             }
         }
         if (!$mbPatient->_id) {
             $mbPatient->load($idexPatient->object_id);
         }
         $idexPatientElimine = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $data['idSourcePatientElimine']);
         if ($mbPatientElimine->load($data['idCiblePatientElimine'])) {
             if ($mbPatientElimine->_id != $idexPatientElimine->object_id) {
                 $commentaire = "L'identifiant source fait référence au patient : {$idexPatientElimine->object_id} et l'identifiant cible";
                 $commentaire .= "au patient : {$mbPatientElimine->_id}.";
                 return $echg_hprim->setAckError($dom_acq, "E041", $commentaire, $newPatient);
             }
         }
         if (!$mbPatientElimine->_id) {
             $mbPatientElimine->load($idexPatientElimine->object_id);
         }
         if (!$mbPatient->_id || !$mbPatientElimine->_id) {
             $commentaire = !$mbPatient->_id ? "Le patient {$mbPatient->_id} est inconnu dans Mediboard." : "Le patient {$mbPatientElimine->_id} est inconnu dans Mediboard.";
             return $echg_hprim->setAckError($dom_acq, "E012", $commentaire, $newPatient);
         }
         // Passage en trash de l'IPP du patient a éliminer
         $idexPatientElimine->tag = CAppUI::conf('dPpatients CPatient tag_ipp_trash') . $sender->_tag_patient;
         $idexPatientElimine->store();
         $avertissement = null;
         $patientsElimine_array = array($mbPatientElimine);
         $first_patient_id = $mbPatient->_id;
         $checkMerge = $mbPatient->checkMerge($patientsElimine_array);
         // Erreur sur le check du merge
         if ($checkMerge) {
             $commentaire = "La fusion de ces deux patients n'est pas possible à cause des problèmes suivants : {$checkMerge}";
             return $echg_hprim->setAckError($dom_acq, "E010", $commentaire, $newPatient);
         }
         $mbPatientElimine->_id;
         /** @todo mergePlainFields resets the _id */
         $mbPatient->_id = $first_patient_id;
         // Notifier les autres destinataires
         $mbPatient->_eai_sender_guid = $sender->_guid;
         $mbPatient->_merging = CMbArray::pluck($patientsElimine_array, "_id");
         $msg = $mbPatient->merge($patientsElimine_array);
         $commentaire = CEAIPatient::getComment($newPatient, $mbPatientElimine);
         $codes = array($msg ? "A010" : "I010");
         if ($msg) {
             $avertissement = $msg . " ";
         }
     }
     return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newPatient);
 }
 /**
  * Recording a patient with an IPP in the system
  *
  * @param CHPrimXMLAcquittementsPatients $dom_acq     Acquittement
  * @param CPatient                       &$newPatient Patient
  * @param array                          $data        Datas
  *
  * @return CHPrimXMLAcquittementsPatients $msgAcq 
  **/
 function enregistrementPatient($dom_acq, &$newPatient, $data)
 {
     // Traitement du message des erreurs
     $codes = array();
     $commentaire = $avertissement = $msgID400 = $msgIPP = "";
     $_modif_patient = false;
     $echg_hprim = $this->_ref_echange_hprim;
     $sender = $echg_hprim->_ref_sender;
     $sender->loadConfigValues();
     $this->_ref_sender = $sender;
     if ($msg = $this->check($dom_acq, $newPatient, $data)) {
         return $msg;
     }
     $idSourcePatient = $data['idSourcePatient'];
     $idCiblePatient = $data['idCiblePatient'];
     // Si CIP
     if (!CAppUI::conf('sip server')) {
         $IPP = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $idSourcePatient);
         // idSource non connu
         if (!$IPP->_id) {
             // idCible fourni
             if ($idCiblePatient) {
                 if ($newPatient->load($idCiblePatient)) {
                     // Le patient trouvé est-il différent ?
                     if ($commentaire = $this->checkSimilarPatient($newPatient, $data['patient'])) {
                         return $echg_hprim->setAckError($dom_acq, "E016", $commentaire, $newPatient);
                     }
                     // Mapping du patient
                     $newPatient = $this->mappingPatient($data['patient'], $newPatient);
                     // On store le patient
                     $msgPatient = CEAIPatient::storePatient($newPatient, $sender);
                     $commentaire = CEAIPatient::getComment($newPatient);
                     $_code_IPP = "I021";
                     $_modif_patient = true;
                 } else {
                     $_code_IPP = "I020";
                 }
             } else {
                 $_code_IPP = "I022";
             }
             // Mapping du patient
             $newPatient = $this->mappingPatient($data['patient'], $newPatient);
             if (!$newPatient->_id) {
                 // Patient retrouvé
                 if ($newPatient->loadMatchingPatient()) {
                     // Mapping du patient
                     $newPatient = $this->mappingPatient($data['patient'], $newPatient);
                     // On store le patient
                     $msgPatient = CEAIPatient::storePatient($newPatient, $sender);
                     $commentaire = CEAIPatient::getComment($newPatient);
                     $_code_IPP = "A021";
                     $_modif_patient = true;
                 } else {
                     // On store le patient
                     $msgPatient = CEAIPatient::storePatient($newPatient, $sender);
                     $commentaire = CEAIPatient::getComment($newPatient);
                 }
             }
             $msgIPP = CEAIPatient::storeIPP($IPP, $newPatient, $sender);
             $codes = array($msgPatient ? $_modif_patient ? "A003" : "A002" : ($_modif_patient ? "I002" : "I001"), $msgIPP ? "A005" : $_code_IPP);
             if ($msgPatient || $msgIPP) {
                 $avertissement = $msgPatient . " " . $msgIPP;
             } else {
                 $commentaire .= "IPP créé : {$IPP->id400}.";
             }
         } else {
             $newPatient->load($IPP->object_id);
             if ($commentaire = $this->checkSimilarPatient($newPatient, $data['patient'])) {
                 return $echg_hprim->setAckError($dom_acq, "E016", $commentaire, $newPatient);
             }
             // Mapping du patient
             $newPatient = $this->mappingPatient($data['patient'], $newPatient);
             // idCible non fourni
             if (!$idCiblePatient) {
                 $_code_IPP = "I023";
             } else {
                 $tmpPatient = new CPatient();
                 // idCible connu
                 if ($tmpPatient->load($idCiblePatient)) {
                     if ($tmpPatient->_id != $IPP->object_id) {
                         $commentaire = "L'identifiant source fait référence au patient : {$IPP->object_id} ";
                         $commentaire .= "et l'identifiant cible au patient : {$tmpPatient->_id}.";
                         return $echg_hprim->setAckError($dom_acq, "E004", $commentaire, $newPatient);
                     }
                     $_code_IPP = "I024";
                 } else {
                     $_code_IPP = "A020";
                 }
             }
             // On store le patient
             $msgPatient = CEAIPatient::storePatient($newPatient, $sender);
             $commentaire = CEAIPatient::getComment($newPatient);
             if ($newPatient->_id && $sender->_configs["insc_integrated"]) {
                 $this->storeINSC($newPatient, $data["numeroSante"]);
             }
             $codes = array($msgPatient ? "A003" : "I002", $_code_IPP);
             if ($msgPatient) {
                 $avertissement = $msgPatient . " ";
             }
         }
     }
     return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newPatient);
 }