/** * @see parent::loadRefsFwd() */ function loadRefsFwd() { // fonction (cabinet) $this->_ref_function = new CFunctions(); $this->_ref_function->load($this->function_id); // rubrique $this->_ref_rubrique = new CRubrique(); $this->_ref_rubrique->load($this->rubrique_id); // mode de paiement $this->_ref_mode_paiement = new CModePaiement(); $this->_ref_mode_paiement->load($this->mode_paiement_id); }
function loadRefFunction() { if (!$this->_ref_function) { $this->_ref_function = new CFunctions(); $this->_ref_function->load($this->function_id); } }
/** * @see parent::loadRefsFwd() */ function loadRefsFwd() { $this->_ref_function = new CFunctions(); $this->_ref_function->load($this->function_id); }
* @version $Revision$ * @link http://www.mediboard.org */ global $date, $chir_id, $print; $print = 1; $function_id = CValue::get("function_id"); $date = CValue::get("date"); $start = CMbDT::date("this monday", $date); if ($start > $date) { $start = CMbDT::date("last monday", $date); } $end = CMbDT::date("next sunday", $start); $muser = new CMediusers(); $musers = $muser->loadProfessionnelDeSanteByPref(PERM_READ, $function_id); $function = new CFunctions(); $function->load($function_id); echo "<h1>" . $function->_view . " (" . CMbDT::format($start, CAppUI::conf('longdate')) . " - " . CMbDT::format($end, CAppUI::conf('longdate')) . ")</h1>"; $pconsult = new CPlageconsult(); $ds = $pconsult->getDS(); $where = array(); $where[] = "chir_id " . $ds->prepareIn(array_keys($musers)) . " OR remplacant_id " . $ds->prepareIn(array_keys($musers)); $where["date"] = " BETWEEN '{$start}' AND '{$end}' "; /** @var CPlageconsult[] $pconsults */ $pconsults = $pconsult->loadList($where, "date", null, "chir_id"); $pconsults_by_date_and_prat = array(); if (!count($pconsults)) { echo "<div class='small-info'>Les praticiens de ce cabinet n'ont pas de plages de consultations sur cette période</div>"; CApp::rip(); } foreach ($pconsults as $_pc) { $chir_id = CValue::get("chir_id", $_pc->chir_id);
} // Chargement des affectation $_sejour->loadRefsAffectations(); if ($maternite_active && $_sejour->grossesse_id) { $_sejour->_sejours_enfants_ids = CMbArray::pluck($_sejour->loadRefsNaissances(), "sejour_enfant_id"); } // Chargement des modes de sortie $_sejour->loadRefEtablissementTransfert(); $_sejour->loadRefServiceMutation(); // Chargement des appels $_sejour->loadRefsAppel('sortie'); } // Si la fonction selectionnée n'est pas dans la liste des fonction, on la rajoute if ($filterFunction && !array_key_exists($filterFunction, $functions)) { $_function = new CFunctions(); $_function->load($filterFunction); $functions[$filterFunction] = $_function; } $list_mode_sortie = array(); if (CAppUI::conf("dPplanningOp CSejour use_custom_mode_sortie")) { $mode_sortie = new CModeSortieSejour(); $where = array("actif" => "= '1'"); $list_mode_sortie = $mode_sortie->loadGroupList($where); } // Création du template $smarty = new CSmartyDP(); $smarty->assign("hier", $hier); $smarty->assign("demain", $demain); $smarty->assign("date_min", $date_min); $smarty->assign("date_max", $date_max); $smarty->assign("date_demain", $date_demain);
// Filtre sur les praticiens ou les spécialités $function = new CFunctions(); $functions = array(); $praticiens = array(); // Aucun filtre de séléctionné : tous les éléments auxquels on a le droit if (!$filter->_specialite && !$filter->_prat_id) { if (!$user->isFromType(array("Anesthésiste")) && !$praticien->isFromType(array("Anesthésiste"))) { $functions = $function->loadListWithPerms(PERM_READ); $praticiens = $user->loadPraticiens(); } else { $functions = $function->loadList(); $praticiens = $praticien->loadList(); } } elseif ($filter->_specialite) { // Filtre sur la specialité : la spec et ses chirs primaires et secondaires $function->load($filter->_specialite); $function->loadBackRefs("users"); $function->loadBackRefs("secondary_functions"); $functions[$function->_id] = $function; $praticiens = $function->_back["users"]; /** @var CSecondaryFunction $sec_func */ foreach ($function->_back["secondary_functions"] as $sec_func) { if (!isset($praticiens[$sec_func->user_id])) { $sec_func->loadRefUser(); $praticiens[$sec_func->user_id] = $sec_func->_ref_user; } } } elseif ($filter->_prat_id) { // Filtre sur le chir : le chir et ses specs primaires et secondaires $praticien->loadRefFunction(); $praticien->loadBackRefs("secondary_functions");
/** * @see parent::loadRefsFwd() */ function loadRefsFwd() { // fonction (cabinet) $this->_ref_function = new CFunctions(); $this->_ref_function->load($this->function_id); }
/** * @see parent::store() * @todo Refactoring complet de la fonction store de la consultation * * ANALYSE DU CODE * 1. Gestion du désistement * 2. Premier if : creation d'une consultation à laquelle on doit attacher * un séjour (conf active): comportement DEPART / ARRIVEE * 3. Mise en cache du forfait FSE et facturable : uniquement dans le cas d'un séjour * 4. On load le séjour de la consultation * 5. On initialise le _adjust_sejour à false * 6. Dans le cas ou on a un séjour * 6.1. S'il est de type consultation, on ajuste le séjour en fonction du comportement DEPART / ARRIVEE * 6.2. Si la plage de consultation a été modifiée, adjust_sejour passe à true et on ajuste le séjour * en fonction du comportement DEPART / ARRIVEE (en passant par l'adjustSejour() ) * 6.3. Si on a un id (à virer) et que le chrono est modifié en PATIENT_ARRIVE, * si on gère les admissions auto (conf) on met une entrée réelle au séjour * 7. Si le patient est modifié, qu'on est pas en train de merger et qu'on a un séjour, * on empeche le store * 8. On appelle le parent::store() * 9. On passe le forfait SE et facturable au séjour * 10. On propage la modification du patient de la consultation au séjour * 11. Si on a ajusté le séjour et qu'on est dans un séjour de type conclut et que le séjour * n'a plus de consultations, on essaie de le supprimer, sinon on l'annule * 12. Gestion du tarif et précodage des actes (bindTarif) * 13. Bind FSE * ACTIONS * - Faire une fonction comportement_DEPART_ARRIVEE() * - Merger le 2, le 6.1 et le 6.2 (et le passer en 2 si possible) * - Faire une fonction pour le 6.3, le 7, le 10, le 11 * - Améliorer les fonctions 12 et 13 en incluant le test du behaviour fields * * COMPORTEMENT DEPART ARRIVEE * modif de la date d'une consultation ayant un séjour sur le modèle DEPART / ARRIVEE: * 1. Pour le DEPART : * -> on décroche la consultation de son ancien séjour * -> on ne touche pas à l'ancien séjour si : * - il est de type autre que consultation * - il a une entrée réelle * - il a d'autres consultations * -> sinon on l'annule * * 2. Pour l'ARRIVEE * -> si on a un séjour qui englobe : on la colle dedans * -> sinon on crée un séjour de consultation * * TESTS A EFFECTUER * 0. Création d'un pause * 0.1. Déplacement d'une pause * 1. Création d'une consultation simple C1 (Séjour S1) * 2. Création d'une deuxième consultation le même jour / même patient C2 (Séjour S1) * 3. Création d'une troisième consultation le même jour / même patient C3 (Séjour S1) * 4. Déplacement de la consultation C1 un autre jour (Séjour S2) * 5. Changement du nom du patient C2 (pas de modification car une autre consultation) * 6. Déplacement de C3 au même jour (Toujours séjour S1) * 7. Annulation de C1 (Suppression ou annulation de S1) * 8. Déplacement de C2 et C3 à un autre jour (séjour S3 créé, séjour S1 supprimé ou annulé) * 9. Arrivée du patient pour C2 (S3 a une entrée réelle) * 10. Déplacement de C3 dans un autre jour (S4) * 11. Déplacement de C2 dans un autre jour (S5 et S3 reste tel quel) */ function store() { $this->completeField('sejour_id', 'heure', 'plageconsult_id', 'si_desistement', 'annule'); if ($this->si_desistement === null) { $this->si_desistement = 0; } $this->annule = $this->annule === null || $this->annule === '' ? 0 : $this->annule; $uf_soins_id = $this->_uf_soins_id; // Consultation dans un séjour $sejour = new CSejour(); if (!$this->_id && !$this->sejour_id && CAppUI::conf("dPcabinet CConsultation attach_consult_sejour") && $this->patient_id || $this->_force_create_sejour) { // Recherche séjour englobant $facturable = $this->_facturable; if ($facturable === null) { $facturable = 1; } $this->loadRefPlageConsult(); $function = new CFunctions(); if ($this->_function_secondary_id) { $function->load($this->_function_secondary_id); } else { $user = new CMediusers(); $user->load($this->_ref_chir->_id); $function->load($user->function_id); } $datetime = $this->_datetime; $minutes_before_consult_sejour = CAppUI::conf("dPcabinet CConsultation minutes_before_consult_sejour"); $where = array(); $where['annule'] = " = '0'"; $where['type'] = " != 'seances'"; $where['patient_id'] = " = '{$this->patient_id}'"; if (!CAppUI::conf("dPcabinet CConsultation search_sejour_all_groups")) { $where['group_id'] = " = '{$function->group_id}'"; } $where['facturable'] = " = '{$facturable}'"; $datetime_before = CMbDT::dateTime("+{$minutes_before_consult_sejour} minute", "{$this->_date} {$this->heure}"); $where[] = "`sejour`.`entree` <= '{$datetime_before}' AND `sejour`.`sortie` >= '{$datetime}'"; if (!$this->_force_create_sejour) { $sejour->loadObject($where); } else { $sejour->_id = ""; } // Si pas de séjour et config alors le créer en type consultation if (!$sejour->_id && CAppUI::conf("dPcabinet CConsultation create_consult_sejour")) { $sejour->patient_id = $this->patient_id; $sejour->praticien_id = $this->_ref_chir->_id; $sejour->group_id = $function->group_id; $sejour->type = "consult"; $sejour->facturable = $facturable; $sejour->uf_soins_id = $uf_soins_id; $datetime = $this->_date && $this->heure ? "{$this->_date} {$this->heure}" : null; if ($this->chrono == self::PLANIFIE) { $sejour->entree_prevue = $datetime; } else { $sejour->entree_reelle = $datetime; } $sejour->sortie_prevue = "{$this->_date} 23:59:59"; if ($msg = $sejour->store()) { return $msg; } } $this->sejour_id = $sejour->_id; } // must be BEFORE loadRefSejour() $facturable = $this->_facturable; $forfait_se = $this->_forfait_se; $forfait_sd = $this->_forfait_sd; $this->_adjust_sejour = false; $this->loadRefSejour(); if ($this->sejour_id) { $this->loadRefPlageConsult(); // Si le séjour est de type consult if ($this->_ref_sejour->type == 'consult') { $this->_ref_sejour->loadRefsConsultations(); $this->_ref_sejour->_hour_entree_prevue = null; $this->_ref_sejour->_min_entree_prevue = null; $this->_ref_sejour->_hour_sortie_prevue = null; $this->_ref_sejour->_min_sortie_prevue = null; $date_consult = CMbDT::date($this->_datetime); // On déplace l'entrée et la sortie du séjour $entree = $this->_datetime; $sortie = $date_consult . " 23:59:59"; // Si on a une entrée réelle et que la date de la consultation est avant l'entrée réelle, on sort du store if ($this->_ref_sejour->entree_reelle && $date_consult < CMbDT::date($this->_ref_sejour->entree_reelle)) { return CAppUI::tr("CConsultation-denyDayChange"); } // Si on a une sortie réelle et que la date de la consultation est après la sortie réelle, on sort du store if ($this->_ref_sejour->sortie_reelle && $date_consult > CMbDT::date($this->_ref_sejour->sortie_reelle)) { return CAppUI::tr("CConsultation-denyDayChange-exit"); } // S'il n'y a qu'une seule consultation dans le séjour, et que le praticien de la consultation est modifié // (changement de plage), alors on modifie également le praticien du séjour if ($this->_id && $this->fieldModified("plageconsult_id") && count($this->_ref_sejour->_ref_consultations) == 1 && !$this->_ref_sejour->entree_reelle) { $this->_ref_sejour->praticien_id = $this->_ref_plageconsult->chir_id; } // S'il y a d'autres consultations dans le séjour, on étire l'entrée et la sortie // en parcourant la liste des consultations foreach ($this->_ref_sejour->_ref_consultations as $_consultation) { if ($_consultation->_id != $this->_id) { $_consultation->loadRefPlageConsult(); if ($_consultation->_datetime < $entree) { $entree = $_consultation->_datetime; } if ($_consultation->_datetime > $sortie) { $sortie = CMbDT::date($_consultation->_datetime) . " 23:59:59"; } } } $this->_ref_sejour->entree_prevue = $entree; $this->_ref_sejour->sortie_prevue = $sortie; $this->_ref_sejour->updateFormFields(); $this->_ref_sejour->_check_bounds = 0; $this->_ref_sejour->store(); } // Changement de journée pour la consult if ($this->fieldModified("plageconsult_id")) { $this->_adjust_sejour = true; // Pas le permettre si admission est déjà faite $max_hours = CAppUI::conf("dPcabinet CConsultation hours_after_changing_prat"); if ($this->_ref_sejour->entree_reelle && CMbDT::dateTime("+ {$max_hours} HOUR", $this->_ref_sejour->entree_reelle) < CMbDT::dateTime()) { return CAppUI::tr("CConsultation-denyPratChange", $max_hours); } $this->loadRefPlageConsult(); $dateTimePlage = $this->_datetime; $where = array(); $where['patient_id'] = " = '{$this->patient_id}'"; $where[] = "`sejour`.`entree` <= '{$dateTimePlage}' AND `sejour`.`sortie` >= '{$dateTimePlage}'"; $sejour = new CSejour(); $sejour->loadObject($where); $this->adjustSejour($sejour, $dateTimePlage); } if ($this->_id && $this->fieldModified("chrono", self::PATIENT_ARRIVE)) { $this->completeField("plageconsult_id"); $this->loadRefPlageConsult(); $this->_ref_chir->loadRefFunction(); $function = $this->_ref_chir->_ref_function; if ($function->admission_auto) { $sejour = new CSejour(); $sejour->load($this->sejour_id); $sejour->entree_reelle = $this->arrivee; if ($msg = $sejour->store()) { return $msg; } } } } $patient_modified = $this->fieldModified("patient_id"); // Si le patient est modifié et qu'il y a plus d'une consult dans le sejour, on empeche le store if (!$this->_forwardRefMerging && $this->sejour_id && $patient_modified && !$this->_skip_count && !$this->_sync_consults_from_sejour) { $this->loadRefSejour(); $consultations = $this->_ref_sejour->countBackRefs("consultations"); if ($consultations > 1) { return "Vous ne pouvez changer le patient d'une consultation si celle ci est contenue dans un séjour. Dissociez la consultation ou modifier le patient du séjour."; } } // Synchronisation AT $this->getType(); if ($this->_type === "urg" && $this->fieldModified("date_at")) { $rpu = $this->_ref_sejour->_ref_rpu; if (!$rpu->_date_at) { $rpu->_date_at = true; $rpu->date_at = $this->date_at; if ($msg = $rpu->store()) { return $msg; } } } // Update de reprise at // Par défaut, j+1 par rapport à fin at if ($this->fieldModified("fin_at") && $this->fin_at) { $this->reprise_at = CMbDT::dateTime("+1 DAY", $this->fin_at); } //Lors de la validation de la consultation // Enregistrement de la facture if ($this->fieldModified("valide", "1")) { //Si le DH est modifié, ceui ci se répercute sur le premier acte coté if ($this->fieldModified("secteur2") && (count($this->_tokens_ngap) || count($this->_tokens_ccam)) && count($this->loadRefsActes())) { $acte = reset($this->_ref_actes); $acte->montant_depassement += $this->secteur2 - $this->_old->secteur2; if ($msg = $acte->store()) { return $msg; } } $facture = $this->sejour_id ? new CFactureEtablissement() : new CFactureCabinet(); $facture->group_id = CGroups::loadCurrent()->_id; $facture->_consult_id = $this->_id; $facture->du_patient = $this->du_patient; $facture->du_tiers = $this->du_tiers; $facture->du_tva = $this->du_tva; $facture->taux_tva = $this->taux_tva; if (!count($this->loadRefsFraisDivers(1)) && count($this->loadRefsFraisDivers(2)) && $this->du_tva) { $facture->du_patient = $this->du_patient - $this->du_tva - $this->secteur3; $facture->du_tva = 0; $facture->taux_tva = $this->taux_tva; } if ($msg = $facture->store()) { echo $msg; } } //Lors de dévalidation de la consultation if ($this->fieldModified("valide", "0")) { $this->loadRefFacture(); foreach ($this->_ref_factures as $_facture) { $_facture->_consult_id = $this->_id; $_facture->cancelConsult(); } } if ($this->fieldModified("annule", "1")) { $this->loadRefConsultAnesth(); foreach ($this->_refs_dossiers_anesth as $_dossier_anesth) { if ($_dossier_anesth->operation_id) { $_dossier_anesth->operation_id = ''; if ($msg = $_dossier_anesth->store()) { return $msg; } } } } if ($this->fieldModified("annule", "0") || $this->annule == 0 && $this->motif_annulation) { $this->motif_annulation = ""; } // Standard store if ($msg = parent::store()) { return $msg; } if (CAppUI::pref("create_dossier_anesth")) { $this->createConsultAnesth(); } $this->completeField("_line_element_id"); // Création d'une tâche si la prise de rdv est issue du plan de soin if ($this->_line_element_id) { $task = new CSejourTask(); $task->consult_id = $this->_id; $task->sejour_id = $this->sejour_id; $task->prescription_line_element_id = $this->_line_element_id; $task->description = "Consultation prévue le " . $this->_ref_plageconsult->getFormattedValue("date"); $line_element = new CPrescriptionLineElement(); $line_element->load($this->_line_element_id); $this->motif = ($this->motif ? "{$this->motif}\n" : "") . $line_element->_view; $this->rques = ($this->rques ? "{$this->rques}\n" : "") . "Prescription d'hospitalisation, prescrit par le Dr " . $line_element->_ref_praticien->_view; // Planification manuelle à l'heure de la consultation $administration = new CAdministration(); $administration->administrateur_id = CAppUI::$user->_id; $administration->dateTime = $this->_datetime; $administration->quantite = $administration->planification = 1; $administration->unite_prise = "aucune_prise"; $administration->setObject($line_element); $this->element_prescription_id = $line_element->element_prescription_id; if ($msg = $administration->store()) { return $msg; } if ($msg = $task->store()) { return $msg; } if ($msg = parent::store()) { return $msg; } } // On note le résultat de la tâche si la consultation est terminée if ($this->chrono == CConsultation::TERMINE) { /** @var $task CSejourTask */ $task = $this->loadRefTask(); if ($task->_id) { $task->resultat = "Consultation terminée"; $task->realise = 1; if ($msg = $task->store()) { return $msg; } } } // Forfait SE et facturable. A laisser apres le store() if ($this->sejour_id && CAppUI::conf("dPcabinet CConsultation attach_consult_sejour")) { if ($forfait_se !== null || $facturable !== null || $forfait_sd !== null) { $this->_ref_sejour->forfait_se = $forfait_se; $this->_ref_sejour->forfait_sd = $forfait_sd; $this->_ref_sejour->facturable = $facturable; $this->_ref_sejour->uf_soins_id = $uf_soins_id; if ($msg = $this->_ref_sejour->store()) { return $msg; } $this->_forfait_se = null; $this->_forfait_sd = null; $this->_facturable = null; $this->_uf_soins_id = null; } } if ($this->_adjust_sejour && $this->_ref_sejour->type === "consult" && $sejour->_id) { $consultations = $this->_ref_sejour->countBackRefs("consultations"); if ($consultations < 1) { if ($msg = $this->_ref_sejour->delete()) { $this->_ref_sejour->annule = 1; if ($msg = $this->_ref_sejour->store()) { return $msg; } } } } // Gestion du tarif et precodage des actes if ($this->_bind_tarif && $this->_id) { if ($msg = $this->bindTarif()) { return $msg; } } // Bind FSE if ($this->_bind_fse && $this->_id) { if (CModule::getActive("fse")) { $fse = CFseFactory::createFSE(); if ($fse) { $fse->bindFSE($this); } } } return null; }
/** * Charge les listes d'un utilisateur * * @param int $user_id User ID * @param int $function_id Function ID * * @return self[] */ static function loadAllFor($user_id, $function_id) { $user = CMediusers::get($user_id); $function = new CFunctions(); $function->load($function_id); // Accès aux listes de choix de la fonction et de l'établissement $module = CModule::getActive("dPcompteRendu"); $is_admin = $module && $module->canAdmin(); $access_function = $is_admin || CAppUI::conf("compteRendu CListeChoix access_function"); $access_group = $is_admin || CAppUI::conf("compteRendu CListeChoix access_group"); $listes = array(); if ($user->_id && !$function_id) { $listes["prat"] = array(); } if ($access_function) { $listes["func"] = array(); } if ($access_group) { $listes["etab"] = array(); } if ($user->_id && !$function_id) { foreach ($user->getOwners() as $type => $owner) { if (isset($listes[$type])) { $listes[$type] = $owner->loadBackRefs("listes_choix", "nom"); } } } else { foreach ($function->getOwners() as $type => $owner) { if (isset($listes[$type])) { $listes[$type] = $owner->loadBackRefs("listes_choix", "nom"); } } } return $listes; }
/** * Ajout de la permission sur son établissement à un utilisateur * * @return void */ function insGroupPermission() { $function = new CFunctions(); $function->load($this->function_id); $where = array(); $where["user_id"] = "= '{$this->user_id}'"; $where["object_class"] = "= 'CGroups'"; $where["object_id"] = "= '{$function->group_id}'"; $perm = new CPermObject(); if (!$perm->loadObject($where)) { $perm = new CPermObject(); $perm->user_id = $this->user_id; $perm->object_class = "CGroups"; $perm->object_id = $function->group_id; $perm->permission = PERM_EDIT; $perm->store(); } }
/** * Charge tous les modèles pour une classe d'objets associés à un utilisateur * * @param integer $id Identifiant du propriétaire * @param string $owner Type de propriétaire du modèle: prat, func ou etab * @param string $object_class Nom de la classe d'objet, optionnel. Doit être un CMbObject * @param string $type Type de composant, optionnel * @param bool $fast_edit Inclue les modèles en édition rapide * @param string $order Ordre de tri de la liste * * @return CCompteRendu[][] Par propriétaire: prat => CCompteRendu[], func => CCompteRendu[], etab => CCompteRendu[] */ static function loadAllModelesFor($id, $owner = 'prat', $object_class = null, $type = null, $fast_edit = true, $order = "") { // Accès aux modèles de la fonction et de l'établissement $module = CModule::getActive("dPcompteRendu"); $is_admin = $module && $module->canAdmin(); $access_function = $is_admin || CAppUI::conf("compteRendu CCompteRendu access_function"); $access_group = $is_admin || CAppUI::conf("compteRendu CCompteRendu access_group"); $modeles = array(); $modeles["prat"] = array(); if ($access_function) { $modeles["func"] = array(); } if ($access_group) { $modeles["etab"] = array(); } if (!$id) { return $modeles; } // Clauses de recherche $modele = new CCompteRendu(); $where = array(); $where["object_id"] = "IS NULL"; if ($object_class) { $where["object_class"] = "= '{$object_class}'"; } if ($type) { $where["type"] = "= '{$type}'"; } if (!$fast_edit) { $where["fast_edit"] = " = '0'"; $where["fast_edit_pdf"] = " = '0'"; } if (!$order) { $order = "object_class, type, nom"; } switch ($owner) { case 'prat': // Modèle du praticien $prat = new CMediusers(); if (!$prat->load($id)) { return $modeles; } $prat->loadRefFunction(); $where["user_id"] = "= '{$prat->_id}'"; $where["function_id"] = "IS NULL"; $where["group_id"] = "IS NULL"; $modeles["prat"] = $modele->loadListWithPerms(PERM_READ, $where, $order); $sec_func = $prat->loadRefsSecondaryFunctions(); foreach ($sec_func as $_func) { $where["user_id"] = "IS NULL"; $where["function_id"] = "= '{$_func->_id}'"; $where["group_id"] = "IS NULL"; $modeles["func" . $_func->_id] = $modele->loadListWithPerms(PERM_READ, $where, $order); } case 'func': // Modèle de la fonction if (isset($modeles["func"])) { if (isset($prat)) { $func_id = $prat->function_id; } else { $func = new CFunctions(); if (!$func->load($id)) { return $modeles; } $func_id = $func->_id; } $where["user_id"] = "IS NULL"; $where["function_id"] = "= '{$func_id}'"; $where["group_id"] = "IS NULL"; $modeles["func"] = $modele->loadListWithPerms(PERM_READ, $where, $order); } case 'etab': // Modèle de l'établissement if (isset($modeles["etab"])) { $etab_id = CGroups::loadCurrent()->_id; if ($owner == 'etab') { $etab = new CGroups(); if (!$etab->load($id)) { return $modeles; } $etab_id = $etab->_id; } elseif (isset($func)) { $etab_id = $func->group_id; } elseif (isset($func_id)) { $func = new CFunctions(); $func->load($func_id); $etab_id = $func->group_id; } $where["user_id"] = "IS NULL"; $where["function_id"] = "IS NULL"; $where["group_id"] = " = '{$etab_id}'"; $modeles["etab"] = $modele->loadListWithPerms(PERM_READ, $where, $order); } break; default: trigger_error("Wrong type '{$owner}'", E_WARNING); } return $modeles; }
$boardItem = CValue::get("boardItem", 1); $consult = new CConsultation(); $nb_anesth = 0; $cabinets = CMediusers::loadFonctions(PERM_EDIT, null, "cabinet"); if ($mode_urgence) { $group = CGroups::loadCurrent(); $cabinet_id = $group->service_urgences_id; } // Récupération de la liste des praticiens $praticiens = array(); $cabinet = new CFunctions(); if ($mode_maternite) { $praticiens = $mediuser->loadListFromType(array("Sage Femme")); } elseif ($cabinet_id) { $praticiens = CConsultation::loadPraticiens(PERM_EDIT, $cabinet_id, null, true); $cabinet->load($cabinet_id); } // Praticiens disponibles ? $all_prats = $praticiens; if ($consult->_id) { $date = $consult->_ref_plageconsult->date; CValue::setSession("date", $date); } // Récupération des plages de consultation du jour et chargement des références $listPlages = array(); $heure_limit_matin = CAppUI::conf("dPcabinet CPlageconsult hour_limit_matin"); foreach ($praticiens as $prat) { if ($prat->_user_type == 4) { $nb_anesth++; } $listPlage = new CPlageconsult();
$order = "type {$order_way}, object_class, nom"; break; case "file_category_id": $order = "file_category_id {$order_way}, object_class, nom"; } // Praticien $user = CMediusers::get($filtre->user_id); $filtre->user_id = $user->_id; $owner = "prat"; $owner_id = $filtre->user_id; $owners = $user->getOwners(); if ($filtre->function_id) { $owner = "func"; $owner_id = $filtre->function_id; $func = new CFunctions(); $func->load($owner_id); $owners = array("func" => $func, "etab" => $func->loadRefGroup()); } else { $sec_func = $user->loadRefsSecondaryFunctions(); foreach ($sec_func as $_func) { $owners["func" . $_func->_id] = $_func; } } $modeles = CCompteRendu::loadAllModelesFor($owner_id, $owner, $filtre->object_class, $filtre->type, 1, $order); if ($filtre->function_id) { unset($modeles["prat"]); } foreach ($modeles as $key => &$_modeles) { /** @var $_modeles CStoredObject[] */ CStoredObject::massCountBackRefs($_modeles, "documents_generated"); /** @var $_modele CCompteRendu */
/** * Charge les packs pour un propriétaire donné * * @param int $id identifiant du propriétaire * @param string $owner [optional] * @param string $object_class [optional] * * @todo: refactor this to be in a super class * * @return array */ static function loadAllPacksFor($id, $owner = 'user', $object_class = null) { // Accès aux packs de modèles de la fonction et de l'établissement $module = CModule::getActive("dPcompteRendu"); $is_admin = $module && $module->canAdmin(); $access_function = $is_admin || CAppUI::conf("compteRendu CCompteRendu access_function"); $access_group = $is_admin || CAppUI::conf("compteRendu CCompteRendu access_group"); $packs = array(); $packs["prat"] = array(); if ($access_function) { $packs["func"] = array(); } if ($access_group) { $packs["etab"] = array(); } // Clauses de recherche $pack = new CPack(); $where = array(); if ($object_class) { $where["object_class"] = "= '{$object_class}'"; } $order = "object_class, nom"; switch ($owner) { case 'prat': // Modèle du praticien $user = new CMediusers(); if (!$user->load($id)) { return $packs; } $user->loadRefFunction(); $where["user_id"] = "= '{$user->_id}'"; $where["function_id"] = "IS NULL"; $where["group_id"] = "IS NULL"; $packs["prat"] = $pack->loadlist($where, $order); case 'func': // Modèle de la fonction if (isset($packs["func"])) { if (isset($user)) { $func_id = $user->function_id; } else { $func = new CFunctions(); if (!$func->load($id)) { return $packs; } $func_id = $func->_id; } $where["user_id"] = "IS NULL"; $where["function_id"] = "= '{$func_id}'"; $where["group_id"] = "IS NULL"; $packs["func"] = $pack->loadlist($where, $order); } case 'etab': // Modèle de l'établissement if (isset($packs["etab"])) { $etab_id = CGroups::loadCurrent()->_id; if ($owner == 'etab') { $etab = new CGroups(); if (!$etab->load($id)) { return $packs; } $etab_id = $etab->_id; } else { if (isset($func)) { $etab_id = $func->group_id; } else { if (isset($func_id)) { $func = new CFunctions(); $func->load($func_id); $etab_id = $func->group_id; } } } $where["user_id"] = "IS NULL"; $where["function_id"] = "IS NULL"; $where["group_id"] = " = '{$etab_id}'"; $packs["etab"] = $pack->loadlist($where, $order); } break; default: trigger_error("Wrong type '{$owner}'", E_WARNING); } return $packs; }
/** * Récuparation du graphique du nombre d'interventions annulées le jour même * * @param string $date_min Date de début * @param string $date_max Date de fin * @param int $prat_id Filtre du praticien * @param int $salle_id Filtre de la salle * @param int $bloc_id Filtre du bloc * @param int $func_id Filtre sur un cabinet * @param int $discipline_id Filtre sur une discipline * @param string $code_ccam Code CCAM * @param string $type_sejour Type de séjour * @param bool $hors_plage Prise en charge des hors plage * * @return array */ function graphWorkflowOperation($date_min = null, $date_max = null, $prat_id = null, $salle_id = null, $bloc_id = null, $func_id = null, $discipline_id = null, $code_ccam = null, $type_sejour = null, $hors_plage = false) { $miner = new COperationWorkflow(); $miner->warnUsage(); if (!$date_min) { $date_min = CMbDT::date("-1 YEAR"); } if (!$date_max) { $date_max = CMbDT::date(); } $date_min = CMbDT::format($date_min, "%Y-%m-01"); $date_max = CMbDT::transform("+1 MONTH", $date_max, "%Y-%m-01"); // Series declarations $labels = array("op_count" => utf8_encode("Nombre d'interventions"), "creation" => utf8_encode("Planification intervention"), "consult_chir" => utf8_encode("Consultation chirurgicale"), "consult_anesth" => utf8_encode("Consultation anesthésiste"), "visite_anesth" => utf8_encode("Visite anesthésiste"), "creation_consult_chir" => utf8_encode("RDV de consultation chirurgicale"), "creation_consult_anesth" => utf8_encode("RDV de consultation anesthésiste")); $salles = CSalle::getSallesStats($salle_id, $bloc_id); $query = new CRequest(); $query->addColumn("DATE_FORMAT(date_operation, '%Y-%m')", "mois"); $query->addColumn("COUNT(operations.operation_id)", "op_count"); // Prévention des données négatives aberrantes $tolerance_in_days = 0; $columns = array("creation", "consult_chir", "consult_anesth", "visite_anesth", "creation_consult_chir", "creation_consult_anesth"); foreach ($columns as $_column) { $field = "date_{$_column}"; $diff = "DATEDIFF(ow.date_operation, ow.{$field})"; $query->addColumn("AVG (IF({$diff} > {$tolerance_in_days}, {$diff}, NULL))", $_column); $query->addColumn("COUNT(IF({$diff} > {$tolerance_in_days}, {$diff}, NULL))", "count_{$_column}"); } $query->addTable("operations"); $query->addLJoin("operation_workflow AS ow ON ow.operation_id = operations.operation_id"); $query->addWhereClause("date_operation", "BETWEEN '{$date_min}' AND '{$date_max}'"); $query->addWhereClause("salle_id", CSQLDataSource::prepareIn(array_keys($salles))); $query->addGroup("mois"); $query->addOrder("mois"); $subtitle = ""; // Filtre sur hors plage if (!$hors_plage) { $query->addWhereClause("plageop_id", "IS NOT NULL"); $subtitle .= " - sans hors plage"; } // Filtre sur le salle (pas besoin de clause supplémentaire) if ($salle_id) { $salle = reset($salles); $subtitle .= " - {$salle->_view}"; } // Filtre sur le praticien if ($prat_id) { $query->addWhereClause("operations.chir_id", "= '{$prat_id}'"); $prat = new CMediusers(); $prat->load($prat_id); $subtitle .= " - Dr {$prat->_view}"; } // Filtre sur le cabinet if ($func_id) { $query->addLJoinClause("users_mediboard", "operations.chir_id = users_mediboard.user_id"); $query->addWhereClause("users_mediboard.function_id", "= '{$func_id}'"); $func = new CFunctions(); $func->load($func_id); $subtitle .= " - {$func->_view}"; } // Filtre sur la discipline if ($discipline_id) { $discipline = new CDiscipline(); $discipline->load($discipline_id); $query->addLJoinClause("users_mediboard", "operations.chir_id = users_mediboard.user_id"); $query->addWhereClause("users_mediboard.discipline_id", "= '{$discipline_id}'"); $subtitle .= " - {$discipline->_view}"; } // Filtre sur les codes CCAM if ($code_ccam) { $query->addWhereClause("operations.codes_ccam", "LIKE '%{$code_ccam}%'"); $subtitle .= " - CCAM: {$code_ccam}"; } // Filtre sur le type d'hospitalisation if ($type_sejour) { $query->addLJoinClause("sejour", "sejour.sejour_id = operations.sejour_id"); $query->addWhereClause("sejour.type", "= '{$type_sejour}'"); $subtitle .= " - " . CAppUI::tr("CSejour.type.{$type_sejour}"); } // Query result $ds = CSQLDataSource::get("std"); $all_values = $ds->loadHashAssoc($query->makeSelect()); // Build horizontal ticks $months = array(); $ticks = array(); for ($_date = $date_min; $_date < $date_max; $_date = CMbDT::date("+1 MONTH", $_date)) { $count_ticks = count($ticks); $ticks[] = array($count_ticks, CMbDT::format($_date, "%m/%Y")); $months[CMbDT::format($_date, "%Y-%m")] = $count_ticks; } // Series building $series = array(); foreach ($labels as $_label_name => $_label_title) { $series[$_label_name] = array("label" => $_label_title, "data" => array(), "yaxis" => 2); } $series["op_count"]["markers"]["show"] = true; $series["op_count"]["yaxis"] = 1; $series["op_count"]["lines"]["show"] = false; $series["op_count"]["points"]["show"] = false; $series["op_count"]["bars"]["show"] = true; $series["op_count"]["bars"]["fillColor"] = "#ccc"; $series["op_count"]["color"] = "#888"; $total = 0; $counts = array(); foreach ($months as $_month => $_tick) { $values = isset($all_values[$_month]) ? $all_values[$_month] : array_fill_keys(array_keys($labels), null); unset($values["mois"]); $_counts = array(); foreach ($values as $_name => $_value) { $parts = explode("_", $_name, 2); if ($parts[0] == "count") { $_counts[$labels[$parts[1]]] = $_value; continue; } $series[$_name]["data"][] = array($_tick, $_value); } $total += $values["op_count"]; $counts[] = $_counts; } // Set up the title for the graph $title = "Anticipation de la programmation des interventions"; $subtitle = "{$total} interventions" . $subtitle; $options = array('title' => utf8_encode($title), 'subtitle' => utf8_encode($subtitle), 'xaxis' => array('labelsAngle' => 45, 'ticks' => $ticks), 'yaxis' => array('autoscaleMargin' => 1, "title" => utf8_encode("Quantité d'interventions"), "titleAngle" => 90), 'y2axis' => array('autoscaleMargin' => 1, "title" => utf8_encode("Anticipation moyenne en jours vs la date d'intervention"), "titleAngle" => 90), "points" => array("show" => true, "radius" => 2, "lineWidth" => 1), "lines" => array("show" => true, "lineWidth" => 1), 'bars' => array('show' => false, 'stacked' => false, 'barWidth' => 0.8), 'HtmlText' => false, 'legend' => array('show' => true, 'position' => 'nw'), 'grid' => array('verticalLines' => false), 'mouse' => array("track" => true, "position" => "ne", "relative" => true, "sensibility" => 2, "trackDecimals" => 3, "trackFormatter" => utf8_encode("(\r\n function(obj) {\r\n var label = obj.series.label;\r\n var total = obj.nearest.allSeries[0].data[obj.index][1];\r\n var date = graph.options.xaxis.ticks[obj.index][1];\r\n\r\n // Barre des nombres d'interventions\r\n if (obj.series.bars.show) {\r\n var format = '%s <br />%s en %s';\r\n return printf(format, label, total, date);\r\n }\r\n\r\n // Courbes d'anticipation\r\n var count = graph.options.counts[obj.index][label];\r\n var value = obj.series.data[obj.index][1];\r\n var percent = Math.round(100*count/total) + '%';\r\n var format = '%s <br />%d jours en %s<br />%s des interventions concernées (%s/%s)';\r\n return printf(format, label, value, date, percent, count, total);\r\n }\r\n )")), 'counts' => $counts, 'spreadsheet' => array('show' => true, 'csvFileSeparator' => ';', 'decimalSeparator' => ',', 'tabGraphLabel' => utf8_encode('Graphique'), 'tabDataLabel' => utf8_encode('Données'), 'toolbarDownload' => utf8_encode('Fichier CSV'), 'toolbarSelectAll' => utf8_encode('Sélectionner tout le tableau'))); return array('series' => array_values($series), 'options' => $options); }