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