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