/** * 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); }