예제 #1
0
 * @version    $Revision: 28128 $
 */
CCanDo::checkRead();
$rpu_id = CValue::getOrSession("rpu_id");
$sejour_id = CValue::get("sejour_id");
$rpu = new CRPU();
if ($rpu_id && !$rpu->load($rpu_id)) {
    global $m, $tab;
    CAppUI::setMsg("Ce RPU n'est pas ou plus disponible", UI_MSG_WARNING);
    CAppUI::redirect("m={$m}&tab={$tab}&rpu_id=0");
}
// Création d'un RPU pour un séjour existant
if ($sejour_id) {
    $rpu = new CRPU();
    $rpu->sejour_id = $sejour_id;
    $rpu->loadMatchingObject();
    $rpu->updateFormFields();
}
if ($rpu->_id || $rpu->sejour_id) {
    // Mise en session de l'id de la consultation, si elle existe.
    $rpu->loadRefConsult();
    if ($rpu->_ref_consult->_id) {
        CValue::setSession("selConsult", $rpu->_ref_consult->_id);
    }
    $sejour = $rpu->_ref_sejour;
    $sejour->loadNDA();
    $sejour->loadRefPraticien(1);
    $sejour->loadRefsNotes();
} else {
    $rpu->_entree = CMbDT::dateTime();
    $sejour = new CSejour();
 /**
  * Trigger after event store
  *
  * @param CMbObject $mbObject Object
  *
  * @return void
  */
 function onAfterStore(CMbObject $mbObject)
 {
     if (!$this->isHandled($mbObject)) {
         return false;
     }
     /** @var CInteropReceiver $receiver */
     $receiver = $mbObject->_receiver;
     $receiver->getInternationalizationCode($this->transaction);
     // Traitement Sejour
     if ($mbObject instanceof CSejour) {
         $sejour = $mbObject;
         $sejour->loadRefPatient();
         // Si on ne souhaite explicitement pas de synchro
         if ($sejour->_no_synchro) {
             return;
         }
         // Si on est en train de créer un séjour et qu'il s'agit d'une naissance
         $current_log = $sejour->loadLastLog();
         if ($current_log->type == "create" && $sejour->_naissance) {
             return;
         }
         // Si Serveur
         if (CAppUI::conf('smp server')) {
             return;
         }
         // Si le group_id du séjour est différent de celui du destinataire
         if ($sejour->group_id != $receiver->group_id) {
             return;
         }
         // Destinataire gère seulement les non facturables
         if ($receiver->_configs["send_no_facturable"] == "0" && $sejour->facturable) {
             return;
         }
         // Destinataire gère seulement les facturables
         if ($receiver->_configs["send_no_facturable"] == "2" && !$sejour->facturable) {
             return;
         }
         // Passage du séjour d'urgence en hospit, pas de génération de A06
         if ($sejour->_en_mutation) {
             return;
         }
         // Si on ne gère les séjours du bébé on ne transmet pas séjour si c'est un séjour enfant
         if (!$receiver->_configs["send_child_admit"]) {
             $naissance = new CNaissance();
             $naissance->sejour_enfant_id = $sejour->_id;
             $naissance->loadMatchingObject();
             if ($naissance->_id) {
                 return;
             }
         }
         // Recherche si on est sur un séjour de mutation
         $rpu = new CRPU();
         $rpu->mutation_sejour_id = $sejour->_id;
         $rpu->loadMatchingObject();
         if ($rpu->_id) {
             $sejour_rpu = $rpu->loadRefSejour();
             if (!$sejour->_cancel_hospitalization && $sejour_rpu->mode_sortie != "mutation") {
                 return;
             }
         }
         $current_affectation = null;
         $code = null;
         // Cas où :
         // * on est sur un séjour d'urgences qui n'est pas le relicat
         // * on est en train de réaliser la mutation
         /** @var CRPU $rpu */
         $rpu = $sejour->loadRefRPU();
         if ($rpu && $rpu->_id && $rpu->sejour_id != $rpu->mutation_sejour_id && $sejour->fieldModified("mode_sortie", "mutation") && !$sejour->UHCD) {
             $sejour = $rpu->loadRefSejourMutation();
             $sejour->loadRefPatient();
             $sejour->loadLastLog();
             $sejour->_receiver = $receiver;
             $code = "A06";
             // On récupère l'affectation courante qui n'a pas été transmise (affectation suite à la mutation)
             $current_affectation = $sejour->getCurrAffectation();
             $sejour->_ref_hl7_affectation = $current_affectation;
         } elseif ($sejour->fieldModified("type", "urg") && $sejour->_cancel_hospitalization) {
             $sejour->loadRefPatient();
             $sejour->loadLastLog();
             $sejour->_receiver = $receiver;
             $code = "A07";
             // On récupère l'affectation courante qui n'a pas été transmise (affectation suite à la mutation)
             $current_affectation = $sejour->getCurrAffectation();
             $sejour->_ref_hl7_affectation = $current_affectation;
         } elseif ($rpu && $rpu->mutation_sejour_id && $rpu->sejour_id != $rpu->mutation_sejour_id) {
             return;
         }
         $code = $code ? $code : $this->getCodeSejour($sejour);
         // Dans le cas d'une création et que l'on renseigne entrée réelle et sortie réelle,
         // il est nécessaire de créer deux flux (A01 et A03)
         if ($sejour->_ref_last_log->type == "create" && $sejour->entree_reelle && $sejour->sortie_reelle) {
             $code = "A01";
             // Cas où :très souvent
             // * on est l'initiateur du message
             // * le destinataire ne supporte pas le message
             if (!$this->isMessageSupported($this->transaction, $this->message, $code, $receiver)) {
                 return;
             }
             if (!$sejour->_NDA) {
                 // Génération du NDA dans le cas de la création, ce dernier n'était pas créé
                 if ($msg = $sejour->generateNDA()) {
                     CAppUI::setMsg($msg, UI_MSG_ERROR);
                 }
                 $NDA = new CIdSante400();
                 $NDA->loadLatestFor($sejour, $receiver->_tag_sejour);
                 $sejour->_NDA = $NDA->id400;
             }
             $patient = $sejour->_ref_patient;
             $patient->loadIPP($receiver->group_id);
             if (!$patient->_IPP) {
                 if ($msg = $patient->generateIPP()) {
                     CAppUI::setMsg($msg, UI_MSG_ERROR);
                 }
             }
             // Cas où lors de l'entrée réelle j'ai une affectation qui n'a pas été envoyée
             if ($sejour->fieldModified("entree_reelle") && !$sejour->_old->entree_reelle) {
                 $current_affectation = $sejour->getCurrAffectation();
             }
             $this->createMovement($code, $sejour, $current_affectation);
             // Envoi de l'événement
             $this->sendITI($this->profil, $this->transaction, $this->message, $code, $sejour);
             $code = "A03";
         }
         if (!$code) {
             return;
         }
         // Cas où :
         // * on est l'initiateur du message
         // * le destinataire ne supporte pas le message
         if (!$this->isMessageSupported($this->transaction, $this->message, $code, $receiver)) {
             return;
         }
         if (!$sejour->_NDA) {
             // Génération du NDA dans le cas de la création, ce dernier n'était pas créé
             if ($msg = $sejour->generateNDA()) {
                 CAppUI::setMsg($msg, UI_MSG_ERROR);
             }
             $NDA = new CIdSante400();
             $NDA->loadLatestFor($sejour, $receiver->_tag_sejour);
             $sejour->_NDA = $NDA->id400;
         }
         $patient = $sejour->_ref_patient;
         $patient->loadIPP($receiver->group_id);
         if (!$patient->_IPP) {
             if ($msg = $patient->generateIPP()) {
                 CAppUI::setMsg($msg, UI_MSG_ERROR);
             }
         }
         // Cas où lors de l'entrée réelle j'ai une affectation qui n'a pas été envoyée
         if ($sejour->fieldModified("entree_reelle") && !$sejour->_old->entree_reelle) {
             $current_affectation = $sejour->getCurrAffectation();
         }
         $this->createMovement($code, $sejour, $current_affectation);
         // Envoi de l'événement
         $this->sendITI($this->profil, $this->transaction, $this->message, $code, $sejour);
     }
     // Traitement Affectation
     if ($mbObject instanceof CAffectation) {
         $affectation = $mbObject;
         $current_log = $affectation->_ref_current_log;
         if (!$current_log || $affectation->_no_synchro || !in_array($current_log->type, array("create", "store"))) {
             return;
         }
         // Affectation non liée à un séjour
         $sejour = $affectation->loadRefSejour();
         if (!$sejour->_id) {
             return;
         }
         // Destinataire gère seulement les non facturables
         if ($receiver->_configs["send_no_facturable"] == "0" && $sejour->facturable) {
             return;
         }
         // Destinataire gère seulement les facturables
         if ($receiver->_configs["send_no_facturable"] == "2" && !$sejour->facturable) {
             return;
         }
         // Première affectation des urgences on ne la transmet pas, seulement pour l'évènement de bascule
         // Sauf si nous sommes dans un séjour d'UHCD
         if ($affectation->_mutation_urg && !$sejour->UHCD) {
             return;
         }
         // Si on ne gère les séjours du bébé on ne transmet pas l'affectation si c'est un séjour enfant
         if (!$receiver->_configs["send_child_admit"]) {
             $naissance = new CNaissance();
             $naissance->sejour_enfant_id = $sejour->_id;
             $naissance->loadMatchingObject();
             if ($naissance->_id) {
                 return;
             }
         }
         // Pas d'envoie d'affectation si la patient n'est pas sortie des urgences
         $rpu = new CRPU();
         $rpu->mutation_sejour_id = $sejour->_id;
         $rpu->loadMatchingObject();
         if ($rpu->_id) {
             $sejour_rpu = $rpu->loadRefSejour();
             if (!$affectation->_mutation_urg && $sejour_rpu->mode_sortie != "mutation") {
                 return;
             }
         }
         // Pas d'envoie d'affectation pour les séjours reliquats
         // Sauf si le séjour est en UHCD
         $rpu = $sejour->loadRefRPU();
         if ($rpu && $rpu->mutation_sejour_id && $rpu->sejour_id != $rpu->mutation_sejour_id && !$sejour->UHCD) {
             return;
         }
         // Si le group_id du séjour est différent de celui du destinataire
         if ($sejour->group_id != $receiver->group_id) {
             return;
         }
         // On envoie pas les affectations prévisionnelles
         if (!$receiver->_configs["send_provisional_affectation"] && $sejour->_etat == "preadmission") {
             return;
         }
         $first_affectation = $sejour->loadRefFirstAffectation();
         $code = $this->getCodeAffectation($affectation, $first_affectation);
         // Cas où :
         // * on est l'initiateur du message
         // * le destinataire ne supporte pas le message
         if (!$this->isMessageSupported($this->transaction, $this->message, $code, $receiver)) {
             return;
         }
         $sejour->loadRefPatient();
         $sejour->_receiver = $receiver;
         $patient = $sejour->_ref_patient;
         $patient->loadIPP($receiver->group_id);
         if (!$patient->_IPP) {
             if ($msg = $patient->generateIPP()) {
                 CAppUI::setMsg($msg, UI_MSG_ERROR);
             }
         }
         $this->createMovement($code, $sejour, $affectation);
         $service = $affectation->loadRefService();
         $curr_affectation = $sejour->loadRefCurrAffectation();
         // On envoie pas de mouvement antérieur à la dernière affectation
         if (($service->uhcd || $service->radiologie || $service->urgence) && $affectation->sortie < $curr_affectation->sortie) {
             return;
         }
         // Ne pas envoyer la sortie si le séjour a une entrée réelle et si on modifie ou créé un affectation
         if (!$receiver->_configs["send_expected_discharge_with_affectation"] && $sejour->entree_reelle) {
             $sejour->sortie_prevue = null;
         }
         // Envoi de l'événement
         $this->sendITI($this->profil, $this->transaction, $this->message, $code, $mbObject);
     }
     // Traitement Naissance
     if ($mbObject instanceof CNaissance) {
         $current_log = $mbObject->loadLastLog();
         if ($current_log->type != "create") {
             return;
         }
         $naissance = $mbObject;
         if (!$this->isMessageSupported($this->transaction, $this->message, "A28", $receiver)) {
             return;
         }
         $sejour_enfant = $naissance->loadRefSejourEnfant();
         // Création du bébé
         $enfant = $sejour_enfant->_ref_patient;
         $enfant->loadIPP($receiver->group_id);
         $enfant->_receiver = $receiver;
         $enfant->_naissance_id = $naissance->_id;
         if (!$enfant->_IPP) {
             if ($msg = $enfant->generateIPP()) {
                 CAppUI::setMsg($msg, UI_MSG_ERROR);
             }
         }
         // Envoi pas les patients qui n'ont pas d'IPP
         if (!$receiver->_configs["send_all_patients"] && !$enfant->_IPP) {
             return;
         }
         // Envoi du A28 pour la création du bébé
         $this->sendITI($this->profil, $this->transaction, $this->message, "A28", $enfant);
         $enfant->_IPP = null;
         // Si on gère les séjours du bébé on transmet le séjour !
         if ($receiver->_configs["send_child_admit"]) {
             $sejour_enfant->_receiver = $receiver;
             // Si le group_id du séjour est différent de celui du destinataire
             if ($sejour_enfant->group_id != $receiver->group_id) {
                 return;
             }
             $code = $this->getCodeBirth($sejour_enfant);
             // Cas où :
             // * on est l'initiateur du message
             // * le destinataire ne supporte pas le message
             if (!$this->isMessageSupported($this->transaction, $this->message, $code, $receiver)) {
                 return;
             }
             if (!$sejour_enfant->_NDA) {
                 // Génération du NDA dans le cas de la création, ce dernier n'était pas créé
                 if ($msg = $sejour_enfant->generateNDA()) {
                     CAppUI::setMsg($msg, UI_MSG_ERROR);
                 }
                 $NDA = new CIdSante400();
                 $NDA->loadLatestFor($sejour_enfant, $receiver->_tag_sejour);
                 $sejour_enfant->_NDA = $NDA->id400;
             }
             $current_affectation = null;
             // Cas où lors de l'entrée réelle j'ai une affectation qui n'a pas été envoyée
             if ($sejour_enfant->fieldModified("entree_reelle") && !$sejour_enfant->_old->entree_reelle) {
                 $current_affectation = $sejour_enfant->getCurrAffectation();
             }
             $this->createMovement($code, $sejour_enfant, $current_affectation);
             // Envoi de l'événement
             $this->sendITI($this->profil, $this->transaction, $this->message, $code, $sejour_enfant);
         }
     }
 }