/** * Handle event A45 - move visit information - visit number * * @param CHL7Acknowledgment $ack Acknowledgment * @param CPatient $newPatient Person * @param array $data Datas * * @return string */ function handleA45(CHL7Acknowledgment $ack, CPatient $newPatient, $data) { $exchange_hl7v2 = $this->_ref_exchange_hl7v2; $sender = $exchange_hl7v2->_ref_sender; // On considère que l'on a qu'un changement à faire if (count($data["merge"]) > 1) { return $exchange_hl7v2->setAckAR($ack, "E701", null, $newPatient); } $merge = CValue::read($data["merge"], 0); $keep_patient = new CPatient(); $patientPI = CValue::read($data['personIdentifiers'], "PI"); // Acquittement d'erreur : identifiants RI et PI non fournis if (!$patientPI) { return $exchange_hl7v2->setAckAR($ack, "E100", null, $newPatient); } // Chargement du patient $idexPatient = CIdSante400::getMatch("CPatient", $sender->_tag_patient, $patientPI); $keep_patient->load($idexPatient->object_id); if (!$keep_patient->_id) { return $exchange_hl7v2->setAckAR($ack, "E702", null, $keep_patient); } // MRG-1 Ancien numéro du patient // Chargement du séjour pour ce patient $MRG_1 = $this->queryTextNode("MRG.1/CX.1", $merge["MRG"]); $idex = new CIdSante400(); $idex->object_class = "CPatient"; $idex->id400 = $MRG_1; $idex->tag = $sender->_tag_patient; /** @var CPatient $patient_removing */ $patient_removing = $idex->getMbObject(); if (!$patient_removing || !$patient_removing->_id) { return $exchange_hl7v2->setAckAR($ack, "E703", null, $newPatient); } // MRG-5 Numéro de dossier // Chargement du dossier par le numéro de séjour $MRG_5 = $this->queryTextNode("MRG.5/CX.1", $merge["MRG"]); $idex = new CIdSante400(); $idex->object_class = "CSejour"; $idex->id400 = $MRG_5; $idex->tag = $sender->_tag_sejour; /** @var CSejour $venue */ $venue = $idex->getMbObject(); if (!$venue || !$venue->_id) { return $exchange_hl7v2->setAckAR($ack, "E704", null, $newPatient); } // Si le patient du séjour retrouvé est différent de celui que l'on doit "supprimer" if ($venue->patient_id != $patient_removing->_id) { return $exchange_hl7v2->setAckAR($ack, "E705", null, $venue); } // Réattribution du patient_id sur le séjour // Impossibilité dans Mediboard de modifier le patient d'un séjour ayant une entrée réelle if (CAppUI::conf("dPplanningOp CSejour patient_id") == 2 && $venue->entree_reelle) { return $exchange_hl7v2->setAckAR($ack, "E706", null, $venue); } $venue->patient_id = $keep_patient->_id; // Notifier les autres destinataires autre que le sender $venue->_eai_sender_guid = $sender->_guid; if ($msg = $venue->store()) { return $exchange_hl7v2->setAckAR($ack, "E707", $msg, $venue); } $comment = CEAISejour::getComment($venue); return $exchange_hl7v2->setAckAA($ack, "I700", $comment, $venue); }