/**
  * Gestion des débiteurs d'une venue de patient
  *
  * @param CHPrimXMLAcquittementsPatients $dom_acq    Acquittement
  * @param CPatient                       $newPatient Patient
  * @param array                          $data       Datas
  *
  * @return CHPrimXMLAcquittementsPatients $msgAcq 
  **/
 function debiteursVenue($dom_acq, $newPatient, $data)
 {
     $echg_hprim = $this->_ref_echange_hprim;
     $sender = $echg_hprim->_ref_sender;
     $sender->loadConfigValues();
     $this->_ref_sender = $sender;
     // 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;
     }
     $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;
     $codes = array();
     $avertissement = $commentaire = null;
     // Si CIP
     if (!CAppUI::conf('sip server')) {
         $sender = $echg_hprim->_ref_sender;
         // Mapping des mouvements
         $newPatient = $this->mappingDebiteurs($data['debiteurs'], $newPatient);
         $newPatient->repair();
         $msgPatient = CEAIPatient::storePatient($newPatient, $sender);
         $commentaire = CEAIPatient::getComment($newPatient);
         $codes = array($msgPatient ? "A003" : "I002");
         if ($msgPatient) {
             $avertissement = $msgPatient . " ";
         }
     }
     return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newPatient);
 }
 /**
  * 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);
     }
 }
 /**
  * Fusion and recording a stay with an num_dos in the system
  * 
  * @param CHPrimXMLAcquittementsPatients $dom_acq    Acquittement
  * @param CPatient                       $newPatient Patient
  * @param array                          $data       Datas
  *
  * @return string acquittement 
  **/
 function fusionVenue(CHPrimXMLAcquittementsPatients $dom_acq, CPatient $newPatient, $data)
 {
     $echg_hprim = $this->_ref_echange_hprim;
     $sender = $echg_hprim->_ref_sender;
     $sender->loadConfigValues();
     $this->_ref_sender = $sender;
     // 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;
     }
     $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;
     $commentaire = $avertissement = "";
     $codes = array();
     $mbVenue = new CSejour();
     $mbVenueEliminee = new CSejour();
     $newVenue = new CSejour();
     // Si CIP
     if (!CAppUI::conf('smp server')) {
         // Acquittement d'erreur : identifiants source et cible non fournis pour le venue / venueEliminee
         if (!$data['idSourceVenue'] && !$data['idCibleVenue'] && !$data['idSourceVenueEliminee'] && !$data['idCibleVenueEliminee']) {
             return $dom_acq->generateAcquittementsError("E100", $commentaire, $newVenue);
         }
         $etatVenue = CHPrimXMLEvenementsPatients::getEtatVenue($data['venue']);
         $etatVenueEliminee = CHPrimXMLEvenementsPatients::getEtatVenue($data['venueEliminee']);
         $tag = $etatVenue == "préadmission" ? CAppUI::conf('dPplanningOp CSejour tag_dossier_pa') . $sender->_tag_sejour : $sender->_tag_sejour;
         $idexVenue = CIdSante400::getMatch("CSejour", $tag, $data['idSourceVenue']);
         if ($mbVenue->load($data['idCibleVenue'])) {
             // Pas de test dans le cas ou la fusion correspond à un changement de numéro de dossier
             if ($etatVenue == "préadmission" || $etatVenueEliminee != "préadmission") {
                 if ($idexVenue->object_id && $mbVenue->_id != $idexVenue->object_id) {
                     $commentaire = "L'identifiant source fait référence au séjour : {$idexVenue->object_id} ";
                     $commentaire .= "et l'identifiant cible au séjour : {$mbVenue->_id}.";
                     return $dom_acq->generateAcquittementsError("E104", $commentaire, $newVenue);
                 }
             }
         }
         if (!$mbVenue->_id) {
             $mbVenue->_id = $idexVenue->object_id;
         }
         $tag = $etatVenue == "préadmission" ? CAppUI::conf('dPplanningOp CSejour tag_dossier_pa') . $sender->_tag_sejour : $sender->_tag_sejour;
         $idexVenueEliminee = CIdSante400::getMatch("CSejour", $tag, $data['idSourceVenueEliminee']);
         if ($mbVenueEliminee->load($data['idCibleVenueEliminee'])) {
             if ($idexVenueEliminee->object_id && $mbVenueEliminee->_id != $idexVenueEliminee->object_id) {
                 $commentaire = "L'identifiant source fait référence au séjour : {$idexVenueEliminee->object_id} ";
                 $commentaire .= "et l'identifiant cible au séjour : {$mbVenueEliminee->_id}.";
                 return $dom_acq->generateAcquittementsError("E141", $commentaire, $mbVenueEliminee);
             }
         }
         if (!$mbVenueEliminee->_id) {
             $mbVenueEliminee->_id = $idexVenueEliminee->object_id;
         }
         $messages = array();
         $avertissement = null;
         // Cas 0 : Aucun séjour
         if (!$mbVenue->_id && !$mbVenueEliminee->_id) {
             $newVenue->patient_id = $newPatient->_id;
             $newVenue->group_id = CGroups::loadCurrent()->_id;
             $messages = $this->mapAndStoreVenue($newVenue, $data, $etatVenueEliminee, $idexVenue, $idexVenueEliminee);
         } else {
             if ($mbVenue->_id || $mbVenueEliminee->_id) {
                 // Suppression de l'identifiant du séjour trouvé
                 if ($mbVenue->_id) {
                     $newVenue->load($mbVenue->_id);
                     $messages['msgNumDosVenue'] = $idexVenue->delete();
                 } else {
                     if ($mbVenueEliminee->_id) {
                         $newVenue->load($mbVenueEliminee->_id);
                         $messages['msgNumDosVenueEliminee'] = $idexVenueEliminee->delete();
                     }
                 }
                 // Cas 0
                 $messages = $this->mapAndStoreVenue($newVenue, $data, $etatVenueEliminee, $idexVenue, $idexVenueEliminee);
                 $commentaire = "Séjour modifié : {$newVenue->_id}.";
             } else {
                 if ($mbVenue->_id && $mbVenueEliminee->_id) {
                     // Suppression des identifiants des séjours trouvés
                     $messages['msgNumDosVenue'] = $idexVenue->delete();
                     $messages['msgNumDosVenueEliminee'] = $idexVenueEliminee->delete();
                     // Transfert des backsref
                     $mbVenueEliminee->transferBackRefsFrom($mbVenue);
                     // Suppression de la venue a éliminer
                     $mbVenueEliminee->delete();
                     // Cas 0
                     $newVenue->load($mbVenue->_id);
                     $messages = $this->mapAndStoreVenue($newVenue, $data, $etatVenueEliminee, $idexVenue, $idexVenueEliminee);
                 }
             }
         }
         $codes = array($messages['msgVenue'] ? $messages['_code_Venue'] == "store" ? "A103" : "A102" : ($messages['_code_Venue'] == "store" ? "I102" : "I101"), $messages['msgNumDosVenue'] ? "A105" : $messages['_code_NumDos']);
         if ($messages['msgVenue']) {
             $avertissement = $messages['msgVenue'];
         }
         $commentaire = CEAISejour::getComment($newVenue, $mbVenueEliminee);
     }
     return $echg_hprim->setAck($dom_acq, $codes, $avertissement, $commentaire, $newVenue);
 }