/** * Recording NDA * * @param CIdSante400 $NDA Object id400 * @param CSejour $sejour Admit * @param CInteropSender $sender Sender * * @return null|string null if successful otherwise returns and error message */ static function storeNDA(CIdSante400 $NDA, CSejour $sejour, CInteropSender $sender) { /* Gestion du numéroteur */ $group = new CGroups(); $group->load($sender->group_id); $group->loadConfigValues(); // Purge du NDA existant sur le séjour et on le remplace par le nouveau if ($sender->_configs["purge_idex_movements"]) { // On charge le NDA courant du séjour $sejour->loadNDA($sender->group_id); $ref_NDA = $sejour->_ref_NDA; if ($ref_NDA) { // Si le NDA actuel est identique à celui qu'on reçoit on ne fait rien if ($ref_NDA->id400 == $NDA->id400) { return; } // On passe le NDA courant en trash $ref_NDA->tag = CAppUI::conf("dPplanningOp CSejour tag_dossier_trash") . $ref_NDA->tag; $ref_NDA->_eai_sender_guid = $sender->_guid; $ref_NDA->store(); } // On sauvegarde le nouveau $NDA->tag = $sender->_tag_sejour; $NDA->object_class = "CSejour"; $NDA->object_id = $sejour->_id; $NDA->last_update = CMbDT::dateTime(); $NDA->_eai_sender_guid = $sender->_guid; return $NDA->store(); } // Génération du NDA ? // Non if (!$group->_configs["smp_idex_generator"]) { if (!$NDA->id400) { return null; } if ($sejour) { $NDA->object_id = $sejour->_id; } $NDA->last_update = CMbDT::dateTime(); $NDA->_eai_sender_guid = $sender->_guid; return $NDA->store(); } else { $NDA_temp = CIdSante400::getMatch("CSejour", $sender->_tag_sejour, null, $sejour->_id); if ($NDA_temp->_id) { return; } // Pas de NDA passé if (!$NDA->id400) { if (!CIncrementer::generateIdex($sejour, $sender->_tag_sejour, $sender->group_id)) { return CAppUI::tr("CEAISejour-error-generate-idex"); } return null; } else { $incrementer = $sender->loadRefGroup()->loadDomainSupplier("CSejour"); if ($incrementer && $NDA->id400 < $incrementer->range_min || $NDA->id400 > $incrementer->range_max) { return CAppUI::tr("CEAISejour-idex-not-in-the-range"); } $NDA->object_id = $sejour->_id; $NDA->last_update = CMbDT::dateTime(); $NDA->_eai_sender_guid = $sender->_guid; return $NDA->store(); } } }
/** * Trigger after event store * * @param CMbObject $mbObject Object * * @throws CMbException * * @return bool */ function onAfterStore(CMbObject $mbObject) { if (!$this->isHandled($mbObject)) { return false; } $receiver = $mbObject->_receiver; // Traitement Sejour if ($mbObject instanceof CSejour) { $sejour = $mbObject; $sejour->loadRefPraticien(); $sejour->loadNDA(); $sejour->loadLastLog(); $sejour->loadRefPatient(); $sejour->loadRefAdresseParPraticien(); // Si Serveur if (CAppUI::conf('smp server')) { $echange_hprim = new CEchangeHprim(); if (isset($sejour->_eai_exchange_initiator_id)) { $echange_hprim->load($sejour->_eai_exchange_initiator_id); } $initiateur = $receiver->_id == $echange_hprim->sender_id ? $echange_hprim->_id : null; $group = new CGroups(); $group->load($receiver->group_id); $group->loadConfigValues(); $mbObject->_id400 = null; $idexPatient = new CIdSante400(); $idexPatient->loadLatestFor($sejour, $receiver->_tag_sejour); $mbObject->_id400 = $idexPatient->id400; $this->generateTypeEvenement("CHPrimXMLVenuePatient", $sejour, true, $initiateur); } else { if (!$receiver->isMessageSupported("CHPrimXMLVenuePatient")) { return false; } if (CGroups::loadCurrent()->_id != $receiver->group_id) { return false; } 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; } if (!$sejour->_ref_patient->_IPP) { $IPP = new CIdSante400(); //Paramétrage de l'id 400 $IPP->loadLatestFor($sejour->_ref_patient, $receiver->_tag_patient); $sejour->_ref_patient->_IPP = $IPP->id400; } $this->sendEvenementPatient("CHPrimXMLVenuePatient", $sejour); if ($receiver->isMessageSupported("CHPrimXMLDebiteursVenue") && $sejour->_ref_patient->code_regime) { $this->sendEvenementPatient("CHPrimXMLDebiteursVenue", $sejour); } if ($receiver->isMessageSupported("CHPrimXMLMouvementPatient") && $sejour->_ref_last_log->type == "create") { $affectation = $sejour->loadRefFirstAffectation(); // $this->sendEvenementPatient("CHPrimXMLMouvementPatient", $affectation); } $sejour->_NDA = null; } return true; } elseif ($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 false; } // Cas où : // * on est l'initiateur du message // * le destinataire ne supporte pas le message if (!$receiver->isMessageSupported("CHPrimXMLMouvementPatient")) { return false; } // Affectation non liée à un séjour $sejour = $affectation->loadRefSejour(); if (!$sejour->_id) { return false; } $sejour->loadRefPatient(); $sejour->_receiver = $receiver; // Envoi de l'événement $this->sendEvenementPatient("CHPrimXMLMouvementPatient", $affectation); } return true; }
/** * Trigger after event store * * @param CMbObject $mbObject Object * * @throws CMbException * * @return bool */ function onAfterStore(CMbObject $mbObject) { if (!$this->isHandled($mbObject)) { return false; } $receiver = $mbObject->_receiver; if ($mbObject instanceof CCorrespondantPatient) { $patient = $mbObject->loadRefPatient(); $patient->_receiver = $receiver; } else { $patient = $mbObject; } // Si Serveur if (CAppUI::conf('sip server')) { $echange_hprim = new CEchangeHprim(); if (isset($patient->_eai_exchange_initiator_id)) { $echange_hprim->load($patient->_eai_exchange_initiator_id); } $initiateur = $receiver->_id == $echange_hprim->sender_id ? $echange_hprim->_id : null; $group = new CGroups(); $group->load($receiver->group_id); $group->loadConfigValues(); if (!$initiateur && !$group->_configs["sip_notify_all_actors"]) { return false; } $patient->_id400 = null; $idexPatient = new CIdSante400(); $idexPatient->loadLatestFor($patient, $receiver->_tag_patient); $patient->_id400 = $idexPatient->id400; $this->generateTypeEvenement("CHPrimXMLEnregistrementPatient", $patient, true, $initiateur); } else { if (!$receiver->isMessageSupported("CHPrimXMLEnregistrementPatient")) { return false; } if (!$patient->_IPP) { // Génération de l'IPP dans le cas de la création, ce dernier n'était pas créé if ($msg = $patient->generateIPP()) { CAppUI::setMsg($msg, UI_MSG_ERROR); } $IPP = new CIdSante400(); $IPP->loadLatestFor($patient, $receiver->_tag_patient); $patient->_IPP = $IPP->id400; } // Envoi pas les patients qui n'ont pas d'IPP if (!$receiver->_configs["send_all_patients"] && !$patient->_IPP) { return false; } $this->sendEvenementPatient("CHPrimXMLEnregistrementPatient", $patient); if ($receiver->_configs["send_insured_without_admit"]) { if (!$receiver->isMessageSupported("CHPrimXMLDebiteursVenue")) { return false; } $sejour = new CSejour(); $where = array(); $where["patient_id"] = "= '{$patient->_id}'"; $where["group_id"] = "= '{$receiver->group_id}'"; $datetime = CMbDT::dateTime(); $where["sortie"] = ">= '{$datetime}'"; /** @var CSejour[] $sejours */ $sejours = $sejour->loadList($where); // On va transmettre les informations sur le débiteur pour le séjour en cours, et ceux à venir foreach ($sejours as $_sejour) { if (!$patient->code_regime) { continue; } $_sejour->_receiver = $receiver; $_sejour->loadLastLog(); $_sejour->loadRefPatient(); 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; } if ($receiver->isMessageSupported("CHPrimXMLDebiteursVenue")) { $this->sendEvenementPatient("CHPrimXMLDebiteursVenue", $_sejour); } } } $patient->_IPP = null; } return true; }
/** * Recording IPP * * @param CIdSante400 $IPP Object id400 * @param CPatient $patient Patient * @param CInteropSender $sender Sender * * @return null|string null if successful otherwise returns and error message */ static function storeIPP(CIdSante400 $IPP, CPatient $patient, CInteropSender $sender) { /* Gestion du numéroteur */ $group = new CGroups(); $group->load($sender->group_id); $group->loadConfigValues(); // Purge de l'IPP existant sur le patient et on le remplace par le nouveau if ($sender->_configs && $sender->_configs["purge_idex_movements"]) { // On charge l'IPP courant du patient $patient->loadIPP($sender->group_id); $ref_IPP = $patient->_ref_IPP; if ($ref_IPP) { // Si l'IPP actuel est identique à celui qu'on reçoit on ne fait rien if ($ref_IPP->id400 == $IPP->id400) { return; } // On passe l'IPP courant en trash $ref_IPP->tag = CAppUI::conf("dPpatients CPatient tag_ipp_trash") . $ref_IPP->tag; $ref_IPP->_eai_sender_guid = $sender->_guid; $ref_IPP->store(); $patient->trashIPP($ref_IPP); } // On sauvegarde le nouveau $IPP->tag = $sender->_tag_patient; $IPP->object_class = "CPatient"; $IPP->object_id = $patient->_id; $IPP->last_update = CMbDT::dateTime(); $IPP->_eai_sender_guid = $sender->_guid; return $IPP->store(); } // Génération de l'IPP ? /* @todo sip_idex_generator doit être remplacé par isIPPSupplier */ if ($sender->_configs && !$group->_configs["sip_idex_generator"]) { if (!$IPP->id400) { return null; } if ($patient) { $IPP->object_id = $patient->_id; } $IPP->last_update = CMbDT::dateTime(); $IPP->_eai_sender_guid = $sender->_guid; return $IPP->store(); } else { $IPP_temp = CIdSante400::getMatch("CPatient", $sender->_tag_patient, null, $patient->_id); // Pas d'IPP passé if (!$IPP->id400) { if ($IPP_temp->_id) { return null; } if (!CIncrementer::generateIdex($patient, $sender->_tag_patient, $sender->group_id)) { return CAppUI::tr("CEAIPatient-error-generate-idex"); } return null; } else { // Si j'ai déjà un identifiant if ($IPP_temp->_id) { // On passe l'IPP courant en trash $IPP_temp->tag = CAppUI::conf("dPpatients CPatient tag_ipp_trash") . $IPP_temp->tag; $IPP_temp->_eai_sender_guid = $sender->_guid; $IPP_temp->store(); } $incrementer = $sender->loadRefGroup()->loadDomainSupplier("CPatient"); if ($incrementer && $IPP->id400 < $incrementer->range_min || $IPP->id400 > $incrementer->range_max) { return CAppUI::tr("CEAIPatient-idex-not-in-the-range"); } $IPP->object_id = $patient->_id; $IPP->last_update = CMbDT::dateTime(); $IPP->_eai_sender_guid = $sender->_guid; return $IPP->store(); } } }