/**
  * Mapping de la venue
  *
  * @param DOMNode $node   Node
  * @param CSejour $sejour Séjour
  *
  * @return array
  */
 function mappingVenue(DOMNode $node, CSejour $sejour)
 {
     // On ne récupère que l'entrée et la sortie
     $sejour = CHPrimXMLEvenementsPatients::getEntree($node, $sejour);
     $sejour = CHPrimXMLEvenementsPatients::getSortie($node, $sejour);
     // On ne check pas la cohérence des dates des consults/intervs
     $sejour->_skip_date_consistencies = true;
     return $sejour;
 }
 /**
  * Get event
  *
  * @param string $messagePatient Message
  *
  * @return CHPrimXMLEvenementsPatients|void
  */
 static function getHPrimXMLEvenements($messagePatient)
 {
     $hprimxmldoc = new CHPrimXMLDocument("patient", CHPrimXMLEvenementsPatients::getVersionEvenementsPatients());
     // Récupération des informations du message XML
     $hprimxmldoc->loadXML($messagePatient);
     $type = $hprimxmldoc->getTypeEvenementPatient();
     $dom_evt = new CHPrimXMLEvenementsPatients();
     if ($type) {
         $dom_evt = new CHPrimXMLEventPatient::$evenements[$type]();
     }
     $dom_evt->loadXML($messagePatient);
     return $dom_evt;
 }
 /**
  * Send event patient
  *
  * @param CHPrimXMLEvenementsPatients $dom_evt    Event
  * @param CMbObject                   $mbObject   Object
  * @param bool                        $referent   Referent
  * @param bool                        $initiateur Initiateur
  *
  * @throws CMbException
  *
  * @return void
  */
 function sendEvenementPatient(CHPrimXMLEvenementsPatients $dom_evt, CMbObject $mbObject, $referent = null, $initiateur = null)
 {
     if (!($msg = $dom_evt->generateTypeEvenement($mbObject, $referent, $initiateur))) {
         return;
     }
     $exchange = $dom_evt->_ref_echange_hprim;
     if (!$exchange->message_valide) {
         return null;
     }
     if (!$this->synchronous) {
         return null;
     }
     $source = CExchangeSource::get("{$this->_guid}-evenementPatient");
     if (!$source->_id || !$source->active) {
         return;
     }
     $source->setData($msg, false, $exchange);
     try {
         $source->send();
     } catch (Exception $e) {
         throw new CMbException("CExchangeSource-no-response");
     }
     $exchange->date_echange = CMbDT::dateTime();
     $acq = $source->getACQ();
     if (!$acq) {
         $exchange->store();
         return;
     }
     $dom_acq = new CHPrimXMLAcquittementsPatients();
     $dom_acq->loadXML($acq);
     $dom_acq->_ref_echange_hprim = $exchange;
     $doc_valid = $dom_acq->schemaValidate(null, false, $this->display_errors);
     $exchange->statut_acquittement = $dom_acq->getStatutAcquittementPatient();
     $exchange->acquittement_valide = $doc_valid ? 1 : 0;
     $exchange->_acquittement = $acq;
     $exchange->store();
 }
 /**
  * @see parent::__construct()
  */
 function __construct()
 {
     $this->sous_type = "venuePatient";
     parent::__construct();
 }
 /**
  * Construct
  *
  * @return CHPrimXMLMouvementPatient
  */
 function __construct()
 {
     $this->sous_type = "mouvementPatient";
     parent::__construct();
 }
 /**
  * @see parent::__construct
  */
 function __construct()
 {
     $this->sous_type = "debiteursVenue";
     parent::__construct();
 }
 /**
  * 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);
 }
 /**
  * @see parent::__construct()
  */
 function __construct()
 {
     $this->sous_type = "enregistrementPatient";
     parent::__construct();
 }
 /**
  * The message contains a collection of administrative notifications of events occurring to patients in a healthcare 
  * facility.
  *
  * @param CHPrimXMLEvenementsPatients    $dom_evt    DOM event PMSI
  * @param CHPrimXMLAcquittementsPatients $dom_acq    DOM acquittement PMSI
  * @param CEchangeHprim                  $echg_hprim Exchange H'XML
  * @param array                          &$data      Data
  * 
  * @return string Acquittement
  **/
 static function eventPatient(CHPrimXMLEvenementsPatients $dom_evt, CHPrimXMLAcquittementsPatients $dom_acq, CEchangeHprim $echg_hprim, &$data = array())
 {
     $newPatient = new CPatient();
     $newPatient->_eai_exchange_initiator_id = $echg_hprim->_id;
     $data = array_merge($data, $dom_evt->getContentsXML());
     if ($msgAcq = $dom_evt->isActionValide($data['action'], $dom_acq, $echg_hprim)) {
         return $msgAcq;
     }
     // Un événement concernant un patient appartient à l'une des six catégories suivantes :
     switch (get_class($dom_evt)) {
         // Enregistrement d'un patient avec son identifiant (ipp) dans le système
         case "CHPrimXMLEnregistrementPatient":
             /** @var CHPrimXMLEnregistrementPatient $dom_evt */
             $echg_hprim->id_permanent = $data['idSourcePatient'];
             return $dom_evt->enregistrementPatient($dom_acq, $newPatient, $data);
             // Fusion de deux ipp
         // Fusion de deux ipp
         case "CHPrimXMLFusionPatient":
             /** @var CHPrimXMLFusionPatient $dom_evt */
             $echg_hprim->id_permanent = $data['idSourcePatient'];
             return $dom_evt->fusionPatient($dom_acq, $newPatient, $data);
             // Venue d'un patient dans l'établissement avec son numéro de venue
         // Venue d'un patient dans l'établissement avec son numéro de venue
         case "CHPrimXMLVenuePatient":
             /** @var CHPrimXMLVenuePatient $dom_evt */
             $echg_hprim->id_permanent = $data['idSourceVenue'];
             return $dom_evt->venuePatient($dom_acq, $newPatient, $data);
             // Fusion de deux venues
         // Fusion de deux venues
         case "CHPrimXMLFusionVenue":
             /** @var CHPrimXMLFusionVenue $dom_evt */
             $echg_hprim->id_permanent = $data['idSourceVenue'];
             return $dom_evt->fusionVenue($dom_acq, $newPatient, $data);
             // Mouvement du patient dans une unité fonctionnelle ou médicale
         // Mouvement du patient dans une unité fonctionnelle ou médicale
         case "CHPrimXMLMouvementPatient":
             /** @var CHPrimXMLMouvementPatient $dom_evt */
             $echg_hprim->id_permanent = $data['idSourceVenue'];
             return $dom_evt->mouvementPatient($dom_acq, $newPatient, $data);
             // Gestion des débiteurs d'une venue de patient
         // Gestion des débiteurs d'une venue de patient
         case "CHPrimXMLDebiteursVenue":
             /** @var CHPrimXMLDebiteursVenue $dom_evt */
             $echg_hprim->id_permanent = $data['idSourcePatient'];
             return $dom_evt->debiteursVenue($dom_acq, $newPatient, $data);
         default:
             return $dom_acq->generateAcquittements("erreur", "E007");
     }
 }