/**
  * Recherche du séjour par différents identifiants possibles
  *
  * @param CSejour $newVenue Admit
  * @param array   $data     Datas
  *
  * @return bool
  */
 function admitFound(CSejour $newVenue, $data)
 {
     $sender = $this->_ref_sender;
     $venueRI = CValue::read($data['admitIdentifiers'], "RI");
     //$venueRISender = CValue::read($data['admitIdentifiers'], "RI_Sender");
     $venueVN = CValue::read($data['admitIdentifiers'], "VN");
     //$venueNPA      = CValue::read($data['admitIdentifiers'], "NPA");
     $venueAN = $this->getVenueAN($sender, $data);
     $NDA = new CIdSante400();
     if ($venueAN) {
         $NDA = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $venueAN);
     }
     if ($NDA->_id) {
         $newVenue->load($NDA->object_id);
         return true;
     }
     if ($newVenue->load($venueRI)) {
         // Si on retrouve le séjour par notre identifiant mais qu'on reçoit un NDA
         CEAISejour::storeNDA($NDA, $newVenue, $sender);
         return true;
     }
     if ($venueVN) {
         return $this->getSejourByVisitNumber($newVenue, $data);
     }
     return false;
 }
 /**
  * Record admit
  *
  * @param CHPrimXMLAcquittementsPatients $dom_acq    Acquittement
  * @param CPatient                       $newPatient Patient
  * @param array                          $data       Data
  * @param CSejour                        &$newVenue  Admit
  *
  * @return CHPrimXMLAcquittementsPatients $msgAcq 
  **/
 function venuePatient(CHPrimXMLAcquittementsPatients $dom_acq, CPatient $newPatient, $data, &$newVenue = null)
 {
     $echg_hprim = $this->_ref_echange_hprim;
     // Cas 1 : 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;
     }
     // Cas 2 : Traitement de la venue
     $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;
     // Traitement du message des erreurs
     $avertissement = $msgID400 = $msgVenue = $msgNDA = "";
     $_code_Venue = $_code_NumDos = $_num_dos_create = $_modif_venue = false;
     $sender = $echg_hprim->_ref_sender;
     $sender->loadConfigValues();
     $this->_ref_sender = $sender;
     $idSourceVenue = $data['idSourceVenue'];
     $idCibleVenue = $data['idCibleVenue'];
     if (!$newVenue) {
         $newVenue = new CSejour();
     }
     // Cas d'une annulation
     $cancel = false;
     if ($data['action'] == "suppression") {
         $cancel = true;
     }
     // Affectation du patient
     $newVenue->patient_id = $newPatient->_id;
     // Affectation de l'établissement
     $newVenue->group_id = $sender->group_id;
     $commentaire = "";
     $codes = array();
     // Si CIP
     if (!CAppUI::conf('smp server')) {
         // Acquittement d'erreur : identifiants source et cible non fournis pour le patient / venue
         if (!$idSourceVenue && !$idCibleVenue) {
             return $echg_hprim->setAckError($dom_acq, "E100", $commentaire, $newVenue);
         }
         $nda = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, $idSourceVenue);
         // idSource non connu
         if (!$nda->_id) {
             // idCible fourni
             if ($idCibleVenue) {
                 if ($newVenue->load($idCibleVenue)) {
                     // Dans le cas d'une annulation de la venue
                     if ($cancel) {
                         if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) {
                             return $msgAcq;
                         }
                     }
                     // Recherche d'un num dossier déjà existant pour cette venue
                     // Mise en trash du numéro de dossier reçu
                     $newVenue->loadNDA();
                     if ($this->trashNDA($newVenue, $sender)) {
                         $nda->_trash = true;
                     } else {
                         // Mapping du séjour si pas de numéro de dossier
                         $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel);
                         $msgVenue = CEAISejour::storeSejour($newVenue, $sender);
                         $commentaire = CEAISejour::getComment($newVenue);
                         $_code_NumDos = "I121";
                         $_code_Venue = true;
                     }
                 } else {
                     $_code_NumDos = "I120";
                 }
             } else {
                 $_code_NumDos = "I122";
             }
             if (!$newVenue->_id) {
                 // Mapping du séjour
                 $newVenue->_NDA = $nda->id400;
                 $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel);
                 // Séjour retrouvé
                 if (CAppUI::conf("hprimxml strictSejourMatch")) {
                     if ($newVenue->loadMatchingSejour(null, true, $sender->_configs["use_sortie_matching"])) {
                         // Dans le cas d'une annulation de la venue
                         if ($cancel) {
                             if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) {
                                 return $msgAcq;
                             }
                         }
                         // Recherche d'un num dossier déjà existant pour cette venue
                         // Mise en trash du numéro de dossier reçu
                         $newVenue->loadNDA();
                         if ($this->trashNDA($newVenue, $sender)) {
                             $nda->_trash = true;
                         } else {
                             // Mapping du séjour
                             $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel);
                             $msgVenue = CEAISejour::storeSejour($newVenue, $sender);
                             $commentaire = CEAISejour::getComment($newVenue);
                             $_code_NumDos = "A121";
                             $_code_Venue = true;
                         }
                     }
                 } else {
                     $collision = $newVenue->getCollisions();
                     if (count($collision) == 1) {
                         $newVenue = reset($collision);
                         // Dans le cas d'une annulation de la venue
                         if ($cancel) {
                             if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) {
                                 return $msgAcq;
                             }
                         }
                         // Recherche d'un num dossier déjà existant pour cette venue
                         // Mise en trash du numéro de dossier reçu
                         $newVenue->loadNDA();
                         if ($this->trashNDA($newVenue, $sender)) {
                             $nda->_trash = true;
                         } else {
                             // Mapping du séjour
                             $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel);
                             $msgVenue = CEAISejour::storeSejour($newVenue, $sender);
                             $commentaire = CEAISejour::getComment($newVenue);
                             $_code_NumDos = "A122";
                             $_code_Venue = true;
                         }
                     }
                 }
                 if (!$newVenue->_id && !isset($nda->_trash)) {
                     // Mapping du séjour
                     $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel);
                     $msgVenue = CEAISejour::storeSejour($newVenue, $sender);
                     $commentaire = CEAISejour::getComment($newVenue);
                 }
             }
             if (isset($nda->_trash)) {
                 $nda->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $sender->_tag_sejour;
                 $nda->loadMatchingObject();
                 $codes = array("I125");
                 $commentaire = "Sejour non récupéré. Impossible d'associer le numéro de dossier.";
             }
             if ($cancel) {
                 $codes[] = "A130";
                 $nda->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $sender->_tag_sejour;
             }
             $msgNDA = CEAISejour::storeNDA($nda, $newVenue, $sender);
             if (!isset($nda->_trash)) {
                 $codes = array($msgVenue ? $_code_Venue ? "A103" : "A102" : ($_code_Venue ? "I102" : "I101"), $msgNDA ? "A105" : $_code_NumDos);
             }
             if ($msgVenue || $msgNDA) {
                 $avertissement = $msgVenue . " " . $msgNDA;
             } else {
                 if (!isset($nda->_trash)) {
                     $commentaire .= "Numéro dossier créé : {$nda->id400}.";
                 }
             }
         } else {
             $newVenue->_NDA = $nda->id400;
             $newVenue->load($nda->object_id);
             // Dans le cas d'une annulation de la venue
             if ($cancel) {
                 if ($msgAcq = $this->doNotCancelVenue($newVenue, $dom_acq, $echg_hprim)) {
                     return $msgAcq;
                 }
             }
             // Mapping du séjour
             $newVenue = $this->mappingVenue($data['venue'], $newVenue, $cancel);
             // idCible non fourni
             if (!$idCibleVenue) {
                 $_code_NumDos = "I123";
             } else {
                 $tmpVenue = new CSejour();
                 // idCible connu
                 if ($tmpVenue->load($idCibleVenue)) {
                     if ($tmpVenue->_id != $nda->object_id) {
                         $commentaire = "L'identifiant source fait référence au séjour : {$nda->object_id}";
                         $commentaire .= "et l'identifiant cible au séjour : {$tmpVenue->_id}.";
                         return $dom_acq->generateAcquittementsError("E104", $commentaire, $newVenue);
                     }
                     $_code_NumDos = "I124";
                 } else {
                     $_code_NumDos = "A120";
                 }
             }
             $msgVenue = CEAISejour::storeSejour($newVenue, $sender);
             $codes = array($msgVenue ? "A103" : "I102", $_code_NumDos);
             if ($cancel) {
                 $codes[] = "A130";
                 $nda->tag = CAppUI::conf('dPplanningOp CSejour tag_dossier_trash') . $sender->_tag_sejour;
                 $nda->last_update = CMbDT::dateTime();
                 $msgNDA = $nda->store();
             }
             if ($msgVenue || $msgNDA) {
                 $avertissement = $msgVenue . " " . $msgNDA;
             }
             $commentaire = CEAISejour::getComment($newVenue);
         }
         return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newVenue);
     }
 }