/**
  * Crée la dossier d'anesthésie associée à la consultation
  *
  * @return null|string Store-like message
  */
 function createConsultAnesth()
 {
     $this->loadRefPlageConsult();
     if (!$this->_is_anesth || !$this->patient_id || !$this->_id || $this->type == "entree") {
         return null;
     }
     // Création de la consultation d'anesthésie
     $this->_count["consult_anesth"] = null;
     $consultAnesth = $this->loadRefConsultAnesth();
     $operation = new COperation();
     if (!$consultAnesth->_id || $this->_operation_id) {
         if (!$consultAnesth->_id) {
             $consultAnesth->consultation_id = $this->_id;
         }
         if ($this->_operation_id) {
             // Association à l'intervention
             $consultAnesth->operation_id = $this->_operation_id;
             $operation = $consultAnesth->loadRefOperation();
         }
         if ($msg = $consultAnesth->store()) {
             return $msg;
         }
     }
     // Remplissage du motif de pré-anesthésie si creation et champ motif vide
     if ($operation->_id) {
         $format_motif = CAppUI::conf('cabinet CConsultAnesth format_auto_motif');
         $format_rques = CAppUI::conf('cabinet CConsultAnesth format_auto_rques');
         if ($format_motif && !$this->motif || $format_rques && !$this->rques) {
             $operation = $consultAnesth->_ref_operation;
             $operation->loadRefPlageOp();
             $sejour = $operation->loadRefSejour();
             $chir = $operation->loadRefChir();
             $chir->updateFormFields();
             $items = array('%N' => $chir->_user_last_name, '%P' => $chir->_user_first_name, '%S' => $chir->_shortview, '%L' => $operation->libelle, '%i' => CMbDT::format($operation->_datetime_best, CAppUI::conf('time')), '%I' => CMbDT::format($operation->_datetime_best, CAppUI::conf('date')), '%E' => CMbDT::format($sejour->entree_prevue, CAppUI::conf('date')), '%e' => CMbDT::format($sejour->entree_prevue, CAppUI::conf('time')), '%T' => strtoupper(substr($sejour->type, 0, 1)));
             if ($format_motif && !$this->motif) {
                 $this->motif = str_replace(array_keys($items), $items, $format_motif);
             }
             if ($format_rques && !$this->rques) {
                 $this->rques = str_replace(array_keys($items), $items, $format_rques);
             }
             if ($msg = parent::store()) {
                 return $msg;
             }
         }
     }
     return null;
 }
Example #2
0
 /**
  * @see parent::store()
  */
 function store()
 {
     $this->completeField("entree_reelle", "entree", "patient_id", "type_pec", "grossesse_id", "mode_sortie");
     /** @var CSejour $old */
     $old = $this->loadOldObject();
     // Vérification de la validité des codes CIM
     if ($this->DP != null) {
         $dp = CCodeCIM10::get($this->DP);
         if (!$dp->exist) {
             CAppUI::setMsg("Le code CIM saisi n'est pas valide", UI_MSG_WARNING);
             $this->DP = "";
         }
     }
     if ($this->DR != null) {
         $dr = CCodeCIM10::get($this->DR);
         if (!$dr->exist) {
             CAppUI::setMsg("Le code CIM saisi n'est pas valide", UI_MSG_WARNING);
             $this->DR = "";
         }
     }
     // Mode de sortie normal par défaut si l'autorisation de sortie est réalisée
     if ($this->conf("specified_output_mode") && !$this->mode_sortie && $this->fieldModified("confirme")) {
         $this->mode_sortie = "normal";
     }
     // Annulation de l'établissement de transfert si le mode de sortie n'est pas transfert
     if (null !== $this->mode_sortie) {
         if ("transfert" != $this->mode_sortie) {
             $this->etablissement_sortie_id = "";
         }
         if ("mutation" != $this->mode_sortie) {
             $this->service_sortie_id = "";
         }
     }
     // Mise à jour du type PEC si vide
     if (!$this->_id && !$this->type_pec) {
         $this->type_pec = $this->grossesse_id ? "O" : "M";
     }
     // Annulation de la sortie réelle si on annule le mode de sortie
     if ($this->mode_sortie === "") {
         $this->sortie_reelle = "";
     }
     // Annulation de l'établissement de provenance si le mode d'entrée n'est pas transfert
     if ($this->fieldModified("mode_entree")) {
         if ("7" != $this->mode_entree) {
             $this->etablissement_entree_id = "";
         }
         if ("6" != $this->mode_entree) {
             $this->service_entree_id = "";
         }
     }
     // Passage au mode transfert si on value un établissement de provenance
     if ($this->fieldModified("etablissement_entree_id")) {
         if ($this->etablissement_entree_id != null) {
             $this->mode_entree = 7;
         }
     }
     // Passage au mode mutation si on value un service de provenance
     if ($this->fieldModified("service_entree_id")) {
         if ($this->service_entree_id != null) {
             $this->mode_entree = 6;
         }
     }
     $patient_modified = $this->fieldModified("patient_id");
     // Si le patient est modifié et qu'il y a des consultations, on cascade les consultations
     if (!$this->_forwardRefMerging && $this->sejour_id && $patient_modified) {
         /** @var CConsultation[] $consultations */
         $consultations = $this->loadBackRefs("consultations");
         foreach ($consultations as $_consult) {
             $_consult->_sync_consults_from_sejour = true;
             $_consult->patient_id = $this->patient_id;
             if ($msg = $_consult->store()) {
                 return $msg;
             }
         }
     }
     // Pour un séjour non annulé, mise à jour de la date de décès du patient
     // suivant le mode de sortie
     if (!$this->annule) {
         $patient = new CPatient();
         $patient->load($this->patient_id);
         if ($this->fieldModified("mode_sortie")) {
             if ("deces" == $this->mode_sortie) {
                 $patient->deces = $this->_date_deces;
             } else {
                 if ($this->_old->mode_sortie == "deces") {
                     $patient->deces = "";
                 }
             }
         }
         // On verifie que le champ a été modifié pour faire le store (sinon probleme lors de la fusion de patients)
         if ($patient->fieldModified("deces")) {
             // Ne pas faire de return $msg ici, car ce n'est pas "bloquant"
             $patient->store();
         }
     }
     // Si annulation possible que par le chef de bloc
     if (CAppUI::conf("dPplanningOp COperation cancel_only_for_resp_bloc") && $this->fieldModified("annule", 1) && $this->entree_reelle && !CModule::getCanDo("dPbloc")->edit) {
         foreach ($this->loadRefsOperations() as $_operation) {
             if ($_operation->rank) {
                 CAppUI::setMsg("Impossible de sauvegarder : une des interventions du séjour est validée.\nContactez le responsable de bloc", UI_MSG_ERROR);
                 return null;
             }
         }
     }
     // On fixe la récusation si pas définie pour un nouveau séjour
     if (!$this->_id && ($this->recuse === "" || $this->recuse === null)) {
         $this->recuse = CAppUI::conf("dPplanningOp CSejour use_recuse") ? -1 : 0;
     }
     // no matter of config, if sejour is "urgence" type: recusation 0
     if ($this->type == "urg") {
         $this->recuse = 0;
     }
     // Si gestion en mode expert de l'isolement
     if (CAppUI::conf("dPplanningOp CSejour systeme_isolement") == "expert") {
         $this->isolement_date = $this->_isolement_date !== $this->entree && $this->isolement ? $this->_isolement_date : "";
         if (!$this->isolement) {
             $this->isolement_fin = "";
         }
     }
     $facture = null;
     if (CModule::getActive("dPfacturation") && CAppUI::conf("dPplanningOp CFactureEtablissement use_facture_etab")) {
         // Création de la facture de sejour
         $this->loadRefsFactureEtablissement();
         $facture = $this->_ref_last_facture;
         if (!$facture->_id) {
             $facture->ouverture = CMbDT::date();
         }
         if (CAppUI::conf("dPfacturation CFactureEtablissement use_temporary_bill")) {
             $facture->temporaire = 1;
         }
         $facture->group_id = $this->group_id;
         $facture->patient_id = $this->patient_id;
         $facture->praticien_id = $this->praticien_id;
         $facture->type_facture = $this->_type_sejour;
         $facture->dialyse = $this->_dialyse;
         $facture->cession_creance = $this->_cession_creance;
         $facture->statut_pro = $this->_statut_pro;
         $facture->assurance_maladie = $this->_assurance_maladie;
         $facture->assurance_accident = $this->_assurance_accident;
         $facture->rques_assurance_accident = $this->_rques_assurance_accident;
         $facture->rques_assurance_maladie = $this->_rques_assurance_maladie;
         //Store de la facture
         if ($msg = $facture->store()) {
             return $msg;
         }
     }
     $this->completeField("mode_entree_id");
     if ($this->mode_entree_id) {
         /** @var CModeEntreeSejour $mode */
         $mode = $this->loadFwdRef("mode_entree_id");
         $this->mode_entree = $mode->mode;
     }
     $this->completeField("mode_sortie_id");
     if ($this->mode_sortie_id) {
         /** @var CModeSortieSejour $mode */
         $mode = $this->loadFwdRef("mode_sortie_id");
         $this->mode_sortie = $mode->mode;
     }
     // Gestion du tarif et precodage des actes
     if ($this->_bind_tarif && $this->_id) {
         $this->getActeExecution();
         if ($msg = $this->bindTarif()) {
             return $msg;
         }
     }
     // Si on change la grossesse d'un séjour, il faut remapper les naissances éventuelles
     $change_grossesse = $this->fieldModified("grossesse_id");
     /** @var CNaissance[] $naissances */
     $naissances = array();
     if ($change_grossesse) {
         $naissances = $old->loadRefGrossesse()->loadRefsNaissances();
     }
     // Sectorisation Rules
     $this->getServiceFromSectorisationRules();
     if ($this->fieldModified("completion_sortie") && $this->completion_sortie && !$this->reception_sortie) {
         $this->reception_sortie = $this->completion_sortie;
     }
     if ($this->fieldModified("reception_sortie", "") && !$this->completion_sortie) {
         $this->completion_sortie = "";
     }
     $this->getUFs();
     $eai_sender_guid = $this->_eai_sender_guid;
     // On fait le store du séjour
     if ($msg = parent::store()) {
         return $msg;
     }
     $this->_eai_sender_guid = $eai_sender_guid;
     if ($change_grossesse) {
         foreach ($naissances as $_naissance) {
             $_naissance->grossesse_id = $this->grossesse_id;
             if ($msg = $_naissance->store()) {
                 return $msg;
             }
         }
     }
     // Changement des liaisons de prestations si besoin
     // Seulement par rapport à l'entrée
     if (CAppUI::conf("dPhospi prestations systeme_prestations", CGroups::loadCurrent()) == "expert") {
         $decalage = CMbDT::daysRelative($old->entree, $this->entree);
         if ($decalage != 0) {
             $liaisons = $this->loadBackRefs("items_liaisons");
             foreach ($liaisons as $_liaison) {
                 $_liaison->date = CMbDT::date("{$decalage} days", $_liaison->date);
                 if ($msg = $_liaison->store()) {
                     return $msg;
                 }
             }
         }
     }
     if (CModule::getActive("dPfacturation") && CAppUI::conf("dPplanningOp CFactureEtablissement use_facture_etab")) {
         if (count($this->_ref_factures) == 0) {
             $liaison = new CFactureLiaison();
             $liaison->object_id = $this->_id;
             $liaison->object_class = $this->_class;
             $liaison->facture_id = $facture->_id;
             $liaison->facture_class = "CFactureEtablissement";
             //Store de la table de liaison entre facture et séjour
             if ($msg = $liaison->store()) {
                 return $msg;
             }
         }
     }
     if ($patient_modified) {
         $list_backrefs = array("contextes_constante", "deliveries", "consultations");
         foreach ($list_backrefs as $_backname) {
             /** @var CConstantesMedicales[]|CProductDelivery[]|CConsultation[] $backobjects */
             $backobjects = $this->loadBackRefs($_backname);
             if (!$backobjects) {
                 continue;
             }
             foreach ($backobjects as $_object) {
                 if ($_object->patient_id == $this->patient_id) {
                     continue;
                 }
                 $_object->patient_id = $this->patient_id;
                 if ($_object instanceof CConsultation) {
                     $_object->_skip_count = true;
                 }
                 if ($msg = $_object->store()) {
                     CAppUI::setMsg($msg, UI_MSG_WARNING);
                 }
             }
         }
     }
     // Cas d'une annulation de séjour
     if ($this->annule) {
         // Suppression des affectations
         if ($msg = $this->delAffectations()) {
             return $msg;
         }
         // Suppression des opérations
         if ($msg = $this->cancelOperations()) {
             return $msg;
         }
         // Annulation des mouvements
         if ($msg = $this->cancelMovements()) {
             return $msg;
         }
     }
     // Synchronisation des affectations
     if (!$this->_no_synchro && !($this->type == "seances")) {
         $this->loadRefsAffectations();
         $firstAff =& $this->_ref_first_affectation;
         $lastAff =& $this->_ref_last_affectation;
         // Cas où on a une premiere affectation différente de l'heure d'admission
         if ($firstAff->_id && $firstAff->entree != $this->_entree) {
             $firstAff->entree = $this->_entree;
             $firstAff->_no_synchro = 1;
             $firstAff->store();
         }
         // Cas où on a une dernière affectation différente de l'heure de sortie
         if ($lastAff->_id && $lastAff->sortie != $this->_sortie) {
             $lastAff->sortie = $this->_sortie;
             $lastAff->_no_synchro = 1;
             $lastAff->store();
         }
         //si le sejour a une sortie ==> compléter le champ effectue de la derniere affectation
         if ($lastAff->_id) {
             $this->_ref_last_affectation->effectue = $this->sortie_reelle ? 1 : 0;
             $this->_ref_last_affectation->store();
         }
     }
     // try to assign an affectation
     $this->createAffectationLitUnique();
     $this->createAffectationService();
     // Génération du NDA ?
     if ($this->_generate_NDA) {
         // On ne synchronise pas un séjour d'urgences qui est un reliquat
         $rpu = $this->loadRefRPU();
         if ($rpu && $rpu->mutation_sejour_id && $rpu->sejour_id != $rpu->mutation_sejour_id) {
             return null;
         }
         if ($msg = $this->generateNDA()) {
             return $msg;
         }
     }
     return null;
 }