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