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