예제 #1
0
 /**
  * @see parent::getPerm()
  */
 function getPerm($permType)
 {
     if (!$this->_id) {
         return parent::getPerm($permType);
     }
     if (!$this->_ref_salle) {
         $this->loadRefSalle();
     }
     if ($this->chir_id && !$this->_ref_chir) {
         $this->loadRefChir();
     }
     if ($this->spec_id && !$this->_ref_spec) {
         $this->loadRefSpec();
     }
     $pratPerm = false;
     // Test de Permission
     if ($this->chir_id) {
         $pratPerm = $this->_ref_chir->getPerm($permType);
     } elseif ($this->spec_id) {
         $pratPerm = $this->_ref_spec->getPerm($permType);
     }
     return $this->_ref_salle->getPerm($permType) && $pratPerm;
 }
예제 #2
0
/**
 * Récupération des statistiques du nombre d'interventions par mois
 * selon plusieurs filtres
 *
 * @param string $debut         Date de début
 * @param string $fin           Date de fin
 * @param int    $prat_id       Identifiant du praticien
 * @param int    $salle_id      Identifiant de la sall
 * @param int    $bloc_id       Identifiant du bloc
 * @param int    $discipline_id Identifiant de la discipline
 * @param string $codes_ccam    Code CCAM
 * @param string $type_hospi    Type d'hospitalisation
 * @param bool   $hors_plage    Prise en compte des hors plage
 *
 * @return array
 */
function graphActivite($debut = null, $fin = null, $prat_id = 0, $salle_id = 0, $bloc_id = 0, $func_id = 0, $discipline_id = 0, $codes_ccam = "", $type_hospi = "", $hors_plage = true)
{
    if (!$debut) {
        $debut = CMbDT::date("-1 YEAR");
    }
    if (!$fin) {
        $fin = CMbDT::date();
    }
    $prat = new CMediusers();
    $prat->load($prat_id);
    $discipline = new CDiscipline();
    $discipline->load($discipline_id);
    $salle = new CSalle();
    $salle->load($salle_id);
    $ticks = array();
    $serie_total = array('label' => 'Total', 'data' => array(), 'markers' => array('show' => true), 'bars' => array('show' => false));
    for ($i = $debut; $i <= $fin; $i = CMbDT::date("+1 MONTH", $i)) {
        $ticks[] = array(count($ticks), CMbDT::transform("+0 DAY", $i, "%m/%Y"));
        $serie_total['data'][] = array(count($serie_total['data']), 0);
    }
    $salles = CSalle::getSallesStats($salle_id, $bloc_id);
    $ds = $salle->_spec->ds;
    // Gestion du hors plage
    $where_hors_plage = !$hors_plage ? "AND operations.plageop_id IS NOT NULL" : "";
    $total = 0;
    $series = array();
    foreach ($salles as $salle) {
        $serie = array('label' => utf8_encode($bloc_id ? $salle->nom : $salle->_view), 'data' => array());
        $query = "SELECT COUNT(operations.operation_id) AS total,\r\n      DATE_FORMAT(operations.date, '%m/%Y') AS mois,\r\n      DATE_FORMAT(operations.date, '%Y%m') AS orderitem,\r\n      sallesbloc.nom AS nom\r\n      FROM operations\r\n      LEFT JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n      LEFT JOIN sallesbloc ON operations.salle_id = sallesbloc.salle_id\r\n      LEFT JOIN plagesop ON operations.plageop_id = plagesop.plageop_id\r\n      LEFT JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n      WHERE operations.annulee = '0'\r\n      AND operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n      {$where_hors_plage}\r\n      AND sejour.group_id = '" . CGroups::loadCurrent()->_id . "'";
        if ($type_hospi) {
            $query .= "\nAND sejour.type = '{$type_hospi}'";
        }
        if ($prat_id && !$prat->isFromType(array("Anesthésiste"))) {
            $query .= "\nAND operations.chir_id = '{$prat_id}'";
        }
        if ($prat_id && $prat->isFromType(array("Anesthésiste"))) {
            $query .= "\nAND (operations.anesth_id = '{$prat_id}' OR\r\n                       (plagesop.anesth_id = '{$prat_id}' AND (operations.anesth_id = '0' OR operations.anesth_id IS NULL)))";
        }
        if ($discipline_id) {
            $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
        }
        if ($codes_ccam) {
            $query .= "\nAND operations.codes_ccam LIKE '%{$codes_ccam}%'";
        }
        $query .= "\nAND sallesbloc.salle_id = '{$salle->_id}'";
        $query .= "\nGROUP BY mois ORDER BY orderitem";
        $result = $ds->loadlist($query);
        foreach ($ticks as $i => $tick) {
            $f = true;
            foreach ($result as $r) {
                if ($tick[1] == $r["mois"]) {
                    $serie["data"][] = array($i, $r["total"]);
                    $serie_total["data"][$i][1] += $r["total"];
                    $total += $r["total"];
                    $f = false;
                    break;
                }
            }
            if ($f) {
                $serie["data"][] = array(count($serie["data"]), 0);
            }
        }
        $series[] = $serie;
    }
    $series[] = $serie_total;
    // Set up the title for the graph
    if ($prat_id && $prat->isFromType(array("Anesthésiste"))) {
        $title = "Nombre d'anesthésie par salle";
        $subtitle = "{$total} anesthésies";
    } else {
        $title = "Nombre d'interventions par salle";
        $subtitle = "{$total} interventions";
    }
    if ($prat_id) {
        $subtitle .= " - Dr {$prat->_view}";
    }
    if ($discipline_id) {
        $subtitle .= " - {$discipline->_view}";
    }
    if ($codes_ccam) {
        $subtitle .= " - CCAM : {$codes_ccam}";
    }
    if ($type_hospi) {
        $subtitle .= " - " . CAppUI::tr("CSejour.type.{$type_hospi}");
    }
    $options = array('title' => utf8_encode($title), 'subtitle' => utf8_encode($subtitle), 'xaxis' => array('labelsAngle' => 45, 'ticks' => $ticks), 'yaxis' => array('autoscaleMargin' => 1), 'bars' => array('show' => true, 'stacked' => true, 'barWidth' => 0.8), 'HtmlText' => false, 'legend' => array('show' => true, 'position' => 'nw'), 'grid' => array('verticalLines' => false), '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' => $series, 'options' => $options);
}
예제 #3
0
/**
 * 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     Identifiant du praticien
 * @param int    $salle_id    Identifiant de la salle
 * @param int    $bloc_id     Identifiant du bloc
 * @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 graphOpAnnulees($date_min = null, $date_max = null, $prat_id = null, $salle_id = null, $bloc_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");
    $prat = new CMediusers();
    $prat->load($prat_id);
    $serie_total = array('label' => 'Total', 'data' => array(), 'markers' => array('show' => true), 'bars' => array('show' => false));
    $salles = CSalle::getSallesStats($salle_id, $bloc_id);
    $query = new CRequest();
    $query->addColumn("salle_id");
    $query->addColumn("DATE_FORMAT(date_operation, '%Y-%m')", "mois");
    $query->addColumn("COUNT(DISTINCT(operations.operation_id))", "total");
    $query->addTable("operations");
    $query->addLJoinClause("operation_workflow", "operation_workflow.operation_id = operations.operation_id");
    $query->addWhere("DATE(date_cancellation) = DATE(date_operation)");
    $query->addWhereClause("date_operation", "BETWEEN '{$date_min}' AND '{$date_max}'");
    $query->addWhereClause("salle_id", CSQLDataSource::prepareIn(array_keys($salles)));
    $query->addGroup("mois, salle_id");
    $query->addOrder("mois, salle_id");
    // Filtre sur hors plage
    if (!$hors_plage) {
        $query->addWhereClause("plageop_id", "IS NOT NULL");
    }
    // Filtre sur le praticien
    if ($prat_id) {
        $query->addWhereClause("operations.chir_id", "= '{$prat_id}'");
    }
    // Filtre sur les codes CCAM
    if ($code_ccam) {
        $query->addWhereClause("operations.codes_ccam", "LIKE '%{$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}'");
    }
    // Query result
    $ds = CSQLDataSource::get("std");
    $tree = $ds->loadTree($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;
        $serie_total['data'][] = array(count($serie_total['data']), 0);
    }
    // Build series
    $series = array();
    $total = 0;
    foreach ($salles as $_salle) {
        $_serie = array("label" => utf8_encode($bloc_id ? $_salle->nom : $_salle->_view));
        $data = array();
        foreach ($months as $_month => $_tick) {
            $value = isset($tree[$_salle->_id][$_month]) ? $tree[$_salle->_id][$_month] : 0;
            $data[] = array($_tick, $value);
            $serie_total["data"][$_tick][1] += $value;
            $total += $value;
        }
        $_serie["data"] = $data;
        $series[] = $_serie;
    }
    $series[] = $serie_total;
    // Set up the title for the graph
    $title = "Interventions annulées le jour même";
    $subtitle = "{$total} interventions";
    if ($prat_id) {
        $subtitle .= " - Dr {$prat->_view}";
    }
    if ($salle_id) {
        $salle = reset($salles);
        $subtitle .= " - {$salle->_view}";
    }
    if ($code_ccam) {
        $subtitle .= " - CCAM : {$code_ccam}";
    }
    if ($type_sejour) {
        $subtitle .= " - " . CAppUI::tr("CSejour.type.{$type_sejour}");
    }
    $options = array('title' => utf8_encode($title), 'subtitle' => utf8_encode($subtitle), 'xaxis' => array('labelsAngle' => 45, 'ticks' => $ticks), 'yaxis' => array('autoscaleMargin' => 1), 'bars' => array('show' => true, 'stacked' => true, 'barWidth' => 0.8), 'HtmlText' => false, 'legend' => array('show' => true, 'position' => 'nw'), 'grid' => array('verticalLines' => false), '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' => $series, 'options' => $options);
}
예제 #4
0
 * @package    Mediboard
 * @subpackage PlanningOp
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision$
 */
global $can, $m, $tab;
CCanDo::checkRead();
$hors_plage = new CIntervHorsPlage();
if (!$hors_plage->canRead()) {
    $can->redirect();
}
// Toutes les salles des blocs
$listBlocs = CGroups::loadCurrent()->loadBlocs(PERM_READ);
// Les salles autorisées
$salle = new CSalle();
$listSalles = $salle->loadListWithPerms(PERM_READ);
// Liste des Etablissements selon Permissions
$etablissements = CMediusers::loadEtablissements(PERM_READ);
// Chargement des prestations
$prestations = CPrestation::loadCurrentList();
$operation_id = CValue::getOrSession("operation_id");
$chir_id = CAppUI::conf("dPplanningOp COperation use_session_praticien") ? CValue::getOrSession("chir_id") : CValue::get("chir_id");
$sejour_id = CValue::get("sejour_id");
$hour_urgence = CValue::get("hour_urgence");
$min_urgence = CValue::get("min_urgence");
$date_urgence = CValue::get("date_urgence");
$salle_id = CValue::get("salle_id");
$patient_id = CValue::get("pat_id");
$grossesse_id = CValue::get("grossesse_id");
$consult_related_id = CValue::get("consult_related_id");
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision$
 */
// Récupération des paramètres
$date = CValue::getOrSession("date", CMbDT::date());
$salle_id = CValue::getOrSession("salle_id");
$bloc_id = CValue::getOrSession("bloc_id");
$type = CValue::getOrSession("type", "ouverture_salle");
// Récupération de l'utilisateur courant
$user = CUser::get();
$currUser = new CMediusers();
$currUser->load($user->_id);
$currUser->isAnesth();
$currUser->isPraticien();
$salle = new CSalle();
$salle->load($salle_id);
$bloc = new CBlocOperatoire();
$bloc->load($bloc_id);
// Vérification de la check list journalière
$daily_check_lists = array();
$daily_check_list_types = array();
$require_check_list = CAppUI::conf("dPsalleOp CDailyCheckList active", CGroups::loadCurrent()) && $date >= CMbDT::date() && !$currUser->_is_praticien;
if ($require_check_list) {
    if ($bloc->_id) {
        list($check_list_not_validated, $daily_check_list_types, $daily_check_lists) = CDailyCheckList::getCheckLists($bloc, $date, $type);
    } else {
        list($check_list_not_validated, $daily_check_list_types, $daily_check_lists) = CDailyCheckList::getCheckLists($salle, $date, $type);
    }
    if ($check_list_not_validated == 0) {
        $require_check_list = false;
$where['object_class'] = "= 'COperation'";
$where["group_id"] = " = '" . CGroups::loadCurrent()->_id . "'";
$nb_modeles_etiquettes_operation = $modele_etiquette->countList($where);
$where['object_class'] = "= 'CSejour'";
$nb_modeles_etiquettes_sejour = $modele_etiquette->countList($where);
$nb_printers = 0;
if (CModule::getActive("printing")) {
    // Chargement des imprimantes pour l'impression d'étiquettes
    $user_printers = CMediusers::get();
    $function = $user_printers->loadRefFunction();
    $nb_printers = $function->countBackRefs("printers");
}
$compte_rendu = new CCompteRendu();
$salles = array();
if (!empty($list_urgences)) {
    $salle = new CSalle();
    $salles = $salle->loadGroupList();
}
// Création du template
$smarty = new CSmartyDP();
$smarty->assign("praticien", $praticien);
$smarty->assign("boardItem", $boardItem);
$smarty->assign("date", $date);
$smarty->assign("canceled", $canceled);
$smarty->assign("listUrgences", $list_urgences);
$smarty->assign("listDay", $list_plages);
$smarty->assign("nb_canceled", $nb_canceled);
$smarty->assign("board", $board);
$smarty->assign("nb_printers", $nb_printers);
$smarty->assign("can_create_docs", $compte_rendu->canClass()->edit);
$smarty->assign("nb_modeles_etiquettes_sejour", $nb_modeles_etiquettes_sejour);
예제 #7
0
/**
 * Récupération des statistiques du nombre d'interventions par jour
 * selon plusieurs filtres
 *
 * @param string $date          Date de début
 * @param int    $prat_id       Identifiant du praticien
 * @param int    $salle_id      Identifiant de la sall
 * @param int    $bloc_id       Identifiant du bloc
 * @param int    $discipline_id Identifiant de la discipline
 * @param string $codes_ccam    Code CCAM
 * @param string $type_hospi    Type d'hospitalisation
 * @param bool   $hors_plage    Prise en compte des hors plage
 *
 * @return array
 */
function graphActiviteZoom($date, $prat_id = 0, $salle_id = 0, $bloc_id = 0, $func_id = 0, $discipline_id = 0, $codes_ccam = '', $type_hospi = "", $hors_plage = true)
{
    if (!$date) {
        $date = CMbDT::transform("+0 DAY", CMbDT::date(), "%m/%Y");
    }
    $prat = new CMediusers();
    $prat->load($prat_id);
    $salle = new CSalle();
    $salle->load($salle_id);
    $discipline = new CDiscipline();
    $discipline->load($discipline_id);
    // Gestion de la date
    $debut = substr($date, 3, 7) . "-" . substr($date, 0, 2) . "-01";
    $fin = CMbDT::date("+1 MONTH", $debut);
    $fin = CMbDT::date("-1 DAY", $fin);
    $step = "+1 DAY";
    // Tableaux des jours
    $ticks = array();
    $ticks2 = array();
    $serie_total = array('label' => 'Total', 'data' => array(), 'markers' => array('show' => true), 'bars' => array('show' => false));
    for ($i = $debut; $i <= $fin; $i = CMbDT::date($step, $i)) {
        $ticks[] = array(count($ticks), CMbDT::format($i, "%a %d"));
        $ticks2[] = array(count($ticks), CMbDT::format($i, "%d"));
        $serie_total['data'][] = array(count($serie_total['data']), 0);
    }
    $salles = CSalle::getSallesStats($salle_id, $bloc_id);
    $series = array();
    $total = 0;
    foreach ($salles as $salle) {
        $serie = array('data' => array(), 'label' => utf8_encode($salle->nom));
        $query = "SELECT COUNT(operations.operation_id) AS total,\r\n      DATE_FORMAT(operations.date, '%d') AS jour,\r\n      sallesbloc.nom AS nom\r\n      FROM operations\r\n      INNER JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n      INNER JOIN sallesbloc ON operations.salle_id = sallesbloc.salle_id\r\n      INNER JOIN plagesop ON operations.plageop_id = plagesop.plageop_id\r\n      INNER JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n      WHERE operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n      AND operations.plageop_id IS NOT NULL\r\n      AND operations.annulee = '0'\r\n      AND sallesbloc.salle_id = '{$salle->_id}'";
        if ($prat_id && !$prat->isFromType(array("Anesthésiste"))) {
            $query .= "\nAND operations.chir_id = '{$prat_id}'";
        }
        if ($prat_id && $prat->isFromType(array("Anesthésiste"))) {
            $query .= "\nAND (operations.anesth_id = '{$prat_id}' OR \r\n                       (plagesop.anesth_id = '{$prat_id}' AND (operations.anesth_id = '0' OR operations.anesth_id IS NULL)))";
        }
        if ($discipline_id) {
            $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
        }
        if ($codes_ccam) {
            $query .= "\nAND operations.codes_ccam LIKE '%{$codes_ccam}%'";
        }
        if ($type_hospi) {
            $query .= "\nAND sejour.type = '{$type_hospi}'";
        }
        $query .= "\nGROUP BY jour ORDER BY jour";
        $result = $salle->_spec->ds->loadlist($query);
        $result_hors_plage = array();
        if ($hors_plage) {
            $query_hors_plage = "SELECT COUNT(operations.operation_id) AS total,\r\n        DATE_FORMAT(operations.date, '%d') AS jour,\r\n        sallesbloc.nom AS nom\r\n      FROM operations\r\n      INNER JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n      INNER JOIN sallesbloc ON operations.salle_id = sallesbloc.salle_id\r\n      INNER JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n      WHERE operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n      AND operations.plageop_id IS NULL\r\n      AND operations.annulee = '0'\r\n      AND sallesbloc.salle_id = '{$salle->_id}'";
            if ($prat_id && !$prat->isFromType(array("Anesthésiste"))) {
                $query_hors_plage .= "\nAND operations.chir_id = '{$prat_id}'";
            }
            if ($prat_id && $prat->isFromType(array("Anesthésiste"))) {
                $query_hors_plage .= "\nAND operations.anesth_id = '{$prat_id}'";
            }
            if ($discipline_id) {
                $query_hors_plage .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
            }
            if ($codes_ccam) {
                $query_hors_plage .= "\nAND operations.codes_ccam LIKE '%{$codes_ccam}%'";
            }
            if ($type_hospi) {
                $query_hors_plage .= "\nAND sejour.type = '{$type_hospi}'";
            }
            $query_hors_plage .= "\nGROUP BY jour ORDER BY jour";
            $result_hors_plage = $salle->_spec->ds->loadlist($query_hors_plage);
        }
        foreach ($ticks2 as $i => $tick) {
            $f = true;
            foreach ($result as $r) {
                if ($tick[1] == $r["jour"]) {
                    if ($hors_plage) {
                        foreach ($result_hors_plage as &$_r_h) {
                            if ($tick[1] == $_r_h["jour"]) {
                                $r["total"] += $_r_h["total"];
                                unset($_r_h);
                                break;
                            }
                        }
                    }
                    $serie["data"][] = array($i, $r["total"]);
                    $serie_total["data"][$i][1] += $r["total"];
                    $total += $r["total"];
                    $f = false;
                }
            }
            if ($f) {
                $serie["data"][] = array(count($serie["data"]), 0);
            }
        }
        $series[] = $serie;
    }
    $series[] = $serie_total;
    // Set up the title for the graph
    if ($prat_id && $prat->isFromType(array("Anesthésiste"))) {
        $title = "Nombre d'anesthésie par salle - " . CMbDT::format($debut, "%m/%Y");
        $subtitle = "{$total} anesthésies";
    } else {
        $title = "Nombre d'interventions par salle - " . CMbDT::format($debut, "%m/%Y");
        $subtitle = "{$total} interventions";
    }
    if ($prat_id) {
        $subtitle .= " - Dr {$prat->_view}";
    }
    if ($discipline_id) {
        $subtitle .= " - {$discipline->_view}";
    }
    if ($codes_ccam) {
        $subtitle .= " - CCAM : {$codes_ccam}";
    }
    if ($type_hospi) {
        $subtitle .= " - " . CAppUI::tr("CSejour.type.{$type_hospi}");
    }
    $options = CFlotrGraph::merge("bars", array('title' => utf8_encode($title), 'subtitle' => utf8_encode($subtitle), 'xaxis' => array('ticks' => $ticks), 'bars' => array('stacked' => true, 'barWidth' => 0.8)));
    return array('series' => $series, 'options' => $options);
}
예제 #8
0
$nbAlertesInterv = 0;
$debut = $fin = $date_planning;
$bloc = new CBlocOperatoire();
$where = array();
if ($bloc_id) {
    $where["bloc_operatoire_id"] = " = '{$bloc_id}'";
}
$where["group_id"] = " = '{$group->_id}' ";
/** @var CBlocOperatoire[] $blocs */
$blocs = $bloc->loadList($where);
CStoredObject::filterByPerm($blocs, PERM_READ);
if (count($blocs) == 1) {
    $current_bloc = reset($blocs);
}
// optimisation du chargement des salles (one shot) + alertes
$salle = new CSalle();
$ds = $salle->getDS();
$where = array();
$where["bloc_id"] = $ds->prepareIn(array_keys($blocs));
$ljoin["bloc_operatoire"] = "bloc_operatoire.bloc_operatoire_id = sallesbloc.bloc_id";
$order = "bloc_operatoire.nom, sallesbloc.nom";
$salles = $salle->loadList($where, $order, null, null, $ljoin);
$salles_ids = array_keys($salles);
$nbAlertesInterv = CBlocOperatoire::countAlertesIntervsForSalles(array_keys($salles));
foreach ($blocs as $_bloc) {
    $_bloc->canDo();
}
// Récupération des opérations
$operation = new COperation();
$where = array();
$ljoin = array();
예제 #9
0
 * Liste des accouchements à placer en salle de naissance
 *
 * @category Maternite
 * @package  Mediboard
 * @author   SARL OpenXtrem <*****@*****.**>
 * @license  GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version  $Revision:$
 * @link     http://www.mediboard.org
 */
CCanDo::checkRead();
$ds = CSQLDataSource::get("std");
$date = CValue::getOrSession("date", CMbDT::date());
// Toutes les salles des blocs
$listBlocs = CGroups::loadCurrent()->loadBlocs(PERM_READ, true, "nom", array("type" => "= 'obst'"));
// Les salles autorisées
$salle = new CSalle();
$ljoin = array("bloc_operatoire" => "sallesbloc.bloc_id = bloc_operatoire.bloc_operatoire_id");
$where = array("bloc_operatoire.type" => "= 'obst'");
/** @var CSalle[] $listSalles */
$listSalles = $salle->loadListWithPerms(PERM_READ, $where, null, null, null, $ljoin);
// Chargement des Chirurgiens
$chir = new CMediusers();
$listChirs = $chir->loadPraticiens(PERM_READ);
// Listes des interventions hors plage
$operation = new COperation();
$ljoin = array();
$ljoin["sejour"] = "operations.sejour_id = sejour.sejour_id";
$ljoin["grossesse"] = "sejour.grossesse_id = grossesse.grossesse_id";
$where = array();
// Interv ou travail qui commence le jour choisi et n'a pas terminé d'accoucher
$where[] = "operations.date = '{$date}' OR (\n  grossesse.datetime_debut_travail IS NOT NULL AND\n  DATE(grossesse.datetime_debut_travail) < '{$date}' AND\n  grossesse.datetime_accouchement IS NULL\n)";
/**
 * Récupération du graphique de l'occupation de salle de bloc
 *
 * @param string $debut         Date de début
 * @param string $fin           Date de fin
 * @param int    $prat_id       Identifiant du praticien
 * @param int    $salle_id      Identifiant de la salle
 * @param int    $bloc_id       Identifiant du bloc
 * @param int    $discipline_id Identifiant de la discipline
 * @param string $codeCCAM      Code CCAM
 * @param string $type_hospi    Type d'hospitalisation
 * @param bool   $hors_plage    Pris en compte du hors plage
 * @param string $type_duree    Type de durée (jours / mois)
 *
 * @return array
 */
function graphOccupationSalle($debut = null, $fin = null, $prat_id = 0, $salle_id = 0, $bloc_id = 0, $func_id = 0, $discipline_id = null, $codeCCAM = "", $type_hospi = "", $hors_plage = true, $type_duree = "MONTH")
{
    $ds = CSQLDataSource::get("std");
    if ($type_duree == "MONTH") {
        $type_duree_fr = "mois";
        $date_format = "%m/%Y";
        $order_key = "%Y%m";
    } else {
        $type_duree_fr = "jour";
        $date_format = "%d/%m/%Y";
        $order_key = "%Y%m%d";
    }
    if (!$debut) {
        $debut = CMbDT::date("-1 YEAR");
    }
    if (!$fin) {
        $fin = CMbDT::date();
    }
    $prat = new CMediusers();
    $prat->load($prat_id);
    $salle = new CSalle();
    $salle->load($salle_id);
    $bloc = new CBlocOperatoire();
    $bloc->load($bloc_id);
    $discipline = new CDiscipline();
    $discipline->load($discipline_id);
    $ticks = array();
    for ($i = $debut; $i <= $fin; $i = CMbDT::date("+1 {$type_duree}", $i)) {
        $ticks[] = array(count($ticks), CMbDT::transform("+0 DAY", $i, $date_format));
    }
    $salles = CSalle::getSallesStats($salle_id, $bloc_id);
    $user = new CMediusers();
    // Chargement des praticiens
    $where = array();
    $where["users_mediboard.actif"] = "= '1'";
    if ($discipline->_id) {
        $where["users_mediboard.discipline_id"] = "= '{$discipline->_id}'";
    }
    // Filter on user type
    $utypes_flip = array_flip(CUser::$types);
    $user_types = array("Chirurgien", "Anesthésiste", "Médecin", "Dentiste");
    foreach ($user_types as &$_type) {
        $_type = $utypes_flip[$_type];
    }
    $where["users.user_type"] = CSQLDataSource::prepareIn($user_types);
    $ljoin = array("users" => "users.user_id = users_mediboard.user_id");
    $order = "users_mediboard.function_id, users_mediboard.discipline_id, users.user_last_name, users.user_first_name";
    $listPrats = $user->loadList($where, $order, null, null, $ljoin);
    $seriesMoy = array();
    $seriesTot = array();
    $totalMoy = 0;
    $totalTot = 0;
    // Gestion du hors plage
    $where_hors_plage = !$hors_plage ? "AND operations.plageop_id IS NOT NULL" : "";
    // First serie : Interv
    $serieMoy = $serieTot = array('data' => array(), 'label' => utf8_encode("Intervention"));
    $query = "SELECT COUNT(*) AS nbInterv,\r\n    SUM(TIME_TO_SEC(operations.fin_op)-TIME_TO_SEC(operations.debut_op)) AS duree_total,\r\n    DATE_FORMAT(operations.date, '{$date_format}') AS {$type_duree_fr},\r\n    DATE_FORMAT(operations.date, '{$order_key}') AS orderitem\r\n    FROM operations\r\n    LEFT JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n    LEFT JOIN plagesop ON operations.plageop_id = plagesop.plageop_id\r\n    LEFT JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n    LEFT JOIN users ON operations.chir_id = users.user_id\r\n    WHERE operations.annulee = '0'\r\n    AND operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n    {$where_hors_plage}\r\n    AND operations.debut_op IS NOT NULL\r\n    AND operations.fin_op IS NOT NULL\r\n    AND operations.debut_op < operations.fin_op\r\n    AND sejour.group_id = '" . CGroups::loadCurrent()->_id . "'\r\n    AND operations.salle_id " . CSQLDataSource::prepareIn(array_keys($salles)) . "\r\n    AND users.user_id " . CSQLDataSource::prepareIn(array_keys($listPrats), $prat_id);
    if ($type_hospi) {
        $query .= "\nAND sejour.type = '{$type_hospi}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    $query .= "\nGROUP BY {$type_duree_fr} ORDER BY orderitem";
    $result = $ds->loadList($query);
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($result as $j => $r) {
            if ($tick[1] == $r["{$type_duree_fr}"]) {
                $nb_interv = $r["nbInterv"];
                $serieMoy['data'][] = array($i, $r["duree_total"] / (60 * $nb_interv));
                $totalMoy += $r["duree_total"] / (60 * $nb_interv);
                $serieTot['data'][] = array($i, $r["duree_total"] / (60 * 60));
                $totalTot += $r["duree_total"] / (60 * 60);
                $f = false;
            }
        }
        if ($f) {
            $serieMoy["data"][] = array(count($serieMoy["data"]), 0);
            $serieTot["data"][] = array(count($serieTot["data"]), 0);
        }
    }
    $seriesMoy[] = $serieMoy;
    $seriesTot[] = $serieTot;
    // Second serie : Occupation
    $serieMoy = $serieTot = array('data' => array(), 'label' => utf8_encode("Occupation de salle"));
    $query = "SELECT COUNT(*) AS nbInterv,\r\n    SUM(TIME_TO_SEC(operations.sortie_salle)-TIME_TO_SEC(operations.entree_salle)) AS duree_total,\r\n    DATE_FORMAT(operations.date, '{$date_format}') AS {$type_duree_fr},\r\n    DATE_FORMAT(operations.date, '{$order_key}') AS orderitem\r\n    FROM operations\r\n    LEFT JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n    LEFT JOIN plagesop ON operations.plageop_id = plagesop.plageop_id\r\n    LEFT JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n    LEFT JOIN users ON operations.chir_id = users.user_id\r\n    WHERE operations.annulee = '0'\r\n    AND operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n    {$where_hors_plage}\r\n    AND operations.entree_salle IS NOT NULL\r\n    AND operations.sortie_salle IS NOT NULL\r\n    AND operations.entree_salle < operations.sortie_salle\r\n    AND sejour.group_id = '" . CGroups::loadCurrent()->_id . "'\r\n    AND operations.salle_id " . CSQLDataSource::prepareIn(array_keys($salles)) . "\r\n    AND users.user_id " . CSQLDataSource::prepareIn(array_keys($listPrats), $prat_id);
    if ($type_hospi) {
        $query .= "\nAND sejour.type = '{$type_hospi}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    $query .= "\nGROUP BY {$type_duree_fr} ORDER BY orderitem";
    $result = $ds->loadList($query);
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($result as $j => $r) {
            if ($tick[1] == $r["{$type_duree_fr}"]) {
                $nb_interv = $r["nbInterv"];
                $serieMoy['data'][] = array($i, $r["duree_total"] / (60 * $nb_interv));
                $totalMoy += $r["duree_total"] / (60 * $nb_interv);
                $serieTot['data'][] = array($i, $r["duree_total"] / (60 * 60));
                $totalTot += $r["duree_total"] / (60 * 60);
                $f = false;
            }
        }
        if ($f) {
            $serieMoy["data"][] = array(count($serieMoy["data"]), 0);
            $serieTot["data"][] = array(count($serieTot["data"]), 0);
        }
    }
    $seriesMoy[] = $serieMoy;
    $seriesTot[] = $serieTot;
    // Third serie : SSPI
    $serieMoy = $serieTot = array('data' => array(), 'label' => utf8_encode("Salle de reveil"));
    $query = "SELECT COUNT(*) AS nbInterv,\r\n    SUM(TIME_TO_SEC(operations.sortie_reveil_possible)-TIME_TO_SEC(operations.entree_reveil)) AS duree_total,\r\n    DATE_FORMAT(operations.date, '{$date_format}') AS {$type_duree_fr},\r\n    DATE_FORMAT(operations.date, '{$order_key}') AS orderitem\r\n    FROM operations\r\n    LEFT JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n    LEFT JOIN plagesop ON operations.plageop_id = plagesop.plageop_id\r\n    LEFT JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n    LEFT JOIN users ON operations.chir_id = users.user_id\r\n    WHERE operations.annulee = '0'\r\n    AND operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n    {$where_hors_plage}\r\n    AND operations.entree_reveil IS NOT NULL\r\n    AND operations.sortie_reveil_possible IS NOT NULL\r\n    AND operations.entree_reveil < operations.sortie_reveil_possible\r\n    AND sejour.group_id = '" . CGroups::loadCurrent()->_id . "'\r\n    AND operations.salle_id " . CSQLDataSource::prepareIn(array_keys($salles)) . "\r\n    AND users.user_id " . CSQLDataSource::prepareIn(array_keys($listPrats), $prat_id);
    if ($type_hospi) {
        $query .= "\nAND sejour.type = '{$type_hospi}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    $query .= "\nGROUP BY {$type_duree_fr} ORDER BY orderitem";
    $result = $ds->loadList($query);
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($result as $j => $r) {
            if ($tick[1] == $r[$type_duree_fr]) {
                $nb_interv = $r["nbInterv"];
                $serieMoy['data'][] = array($i, $r["duree_total"] / (60 * $nb_interv));
                $totalMoy += $r["duree_total"] / (60 * $nb_interv);
                $serieTot['data'][] = array($i, $r["duree_total"] / (60 * 60));
                $totalTot += $r["duree_total"] / (60 * 60);
                $f = false;
            }
        }
        if ($f) {
            $serieMoy["data"][] = array(count($serieMoy["data"]), 0);
            $serieTot["data"][] = array(count($serieTot["data"]), 0);
        }
    }
    $seriesMoy[] = $serieMoy;
    $seriesTot[] = $serieTot;
    // Set up the title for the graph
    $subtitle = "";
    if ($prat_id) {
        $subtitle .= " - Dr {$prat->_view}";
    }
    if ($discipline_id) {
        $subtitle .= " - {$discipline->_view}";
    }
    if ($salle_id) {
        $subtitle .= " - {$salle->nom}";
    }
    if ($bloc_id) {
        $subtitle .= " - {$bloc->nom}";
    }
    if ($codeCCAM) {
        $subtitle .= " - CCAM : {$codeCCAM}";
    }
    if ($type_hospi) {
        $subtitle .= " - " . CAppUI::tr("CSejour.type.{$type_hospi}");
    }
    $optionsMoy = CFlotrGraph::merge("lines", array('title' => utf8_encode("Durées moyennes d'occupation du bloc (en minutes)"), 'subtitle' => utf8_encode("par intervention {$subtitle}"), 'xaxis' => array('ticks' => $ticks), 'grid' => array('verticalLines' => true)));
    if ($totalMoy == 0) {
        $optionsMoy['yaxis']['max'] = 1;
    }
    $optionsTot = CFlotrGraph::merge("lines", array('title' => utf8_encode("Durées totales d'occupation du bloc (en heures)"), 'subtitle' => utf8_encode("total estimé {$subtitle}"), 'xaxis' => array('ticks' => $ticks), 'grid' => array('verticalLines' => true)));
    if ($totalTot == 0) {
        $optionsTot['yaxis']['max'] = 1;
    }
    if ($type_duree == "MONTH") {
        return array("moyenne" => array('series' => $seriesMoy, 'options' => $optionsMoy), "total" => array('series' => $seriesTot, 'options' => $optionsTot));
    } else {
        return array('series' => $seriesTot, 'options' => $optionsTot);
    }
}
예제 #11
0
/**
 * Récupération du graphique d'occupation des ressources au bloc opératoire
 * (personnel, vacations attribuées, ouverture de salle)
 *
 * @param string $debut         Date de début
 * @param string $fin           Date de fin
 * @param int    $prat_id       Identifiant du praticien
 * @param int    $salle_id      Identifiant de la salle
 * @param int    $bloc_id       Identifiant du bloc
 * @param null   $discipline_id Identifiant de la discipline
 * @param string $codeCCAM      Code CCAM
 * @param string $type_hospi    Type d'hospitalisation
 * @param bool   $hors_plage    Pris en compte des hors plage
 * @param string $type_duree    Type de durée analysée (jours / mois)
 *
 * @return array
 */
function graphTempsSalle($debut = null, $fin = null, $prat_id = 0, $salle_id = 0, $bloc_id = 0, $func_id = 0, $discipline_id = null, $codeCCAM = "", $type_hospi = "", $hors_plage = true, $type_duree = "MONTH")
{
    $ds = CSQLDataSource::get("std");
    if ($type_duree == "MONTH") {
        $type_duree_fr = "mois";
        $date_format = "%m/%Y";
        $order_key = "%Y%m";
    } else {
        $type_duree_fr = "jour";
        $date_format = "%d/%m/%Y";
        $order_key = "%Y%m%d";
    }
    if (!$debut) {
        $debut = CMbDT::date("-1 YEAR");
    }
    if (!$fin) {
        $fin = CMbDT::date();
    }
    $prat = new CMediusers();
    $prat->load($prat_id);
    $salle = new CSalle();
    $salle->load($salle_id);
    $bloc = new CBlocOperatoire();
    $bloc->load($bloc_id);
    $discipline = new CDiscipline();
    $discipline->load($discipline_id);
    $ticks = array();
    for ($i = $debut; $i <= $fin; $i = CMbDT::date("+1 {$type_duree}", $i)) {
        $ticks[] = array(count($ticks), CMbDT::transform("+0 DAY", $i, $date_format));
    }
    $salles = CSalle::getSallesStats($salle_id, $bloc_id);
    $seriesTot = array();
    $totalTot = 0;
    // First serie : occupation du personnel
    $serieTot = array('data' => array(), 'label' => utf8_encode("Occupation du personnel"));
    $query = "SELECT SUM(TIME_TO_SEC(affectation_personnel.fin) - TIME_TO_SEC(affectation_personnel.debut)) as total,\n    DATE_FORMAT(plagesop.date, '{$date_format}') AS {$type_duree_fr},\n    DATE_FORMAT(plagesop.date, '{$order_key}') AS orderitem\n    FROM plagesop\n    LEFT JOIN operations ON plagesop.plageop_id = operations.plageop_id\n    LEFT JOIN users_mediboard ON plagesop.chir_id = users_mediboard.user_id\n    LEFT JOIN affectation_personnel ON operations.operation_id = affectation_personnel.object_id ";
    if ($type_hospi) {
        $query .= "LEFT JOIN sejour ON sejour.sejour_id = operations.sejour_id ";
    }
    $query .= "WHERE affectation_personnel.debut < affectation_personnel.fin\n    AND affectation_personnel.debut IS NOT NULL\n    AND affectation_personnel.fin IS NOT NULL\n    AND affectation_personnel.object_class = 'COperation'\n    AND plagesop.salle_id " . CSQLDataSource::prepareIn(array_keys($salles));
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    if ($type_hospi) {
        $query .= "\nAND sejour.type = '{$type_hospi}'";
    }
    if ($prat_id) {
        $query .= "\nAND plagesop.chir_id = '{$prat_id}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    $query .= "\nAND plagesop.date BETWEEN '{$debut}' AND '{$fin}'\n    GROUP BY operations.plageop_id HAVING total > 0 ORDER BY orderitem";
    $result = $ds->loadlist($query);
    $result_hors_plage = array();
    if ($hors_plage) {
        $query_hors_plage = "SELECT SUM(TIME_TO_SEC(affectation_personnel.fin) - TIME_TO_SEC(affectation_personnel.debut)) as total,\n      DATE_FORMAT(operations.date, '{$date_format}') AS {$type_duree_fr},\n      DATE_FORMAT(operations.date, '{$order_key}') AS orderitem\n      FROM operations\n      LEFT JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\n      LEFT JOIN affectation_personnel ON operations.operation_id = affectation_personnel.object_id ";
        if ($type_hospi) {
            $query_hors_plage .= "LEFT JOIN sejour ON sejour.sejour_id = operations.sejour_id ";
        }
        $query_hors_plage .= "WHERE affectation_personnel.debut < affectation_personnel.fin\n      AND operations.date IS NOT NULL\n      AND operations.plageop_id IS NULL\n      AND affectation_personnel.debut IS NOT NULL\n      AND affectation_personnel.fin IS NOT NULL\n      AND affectation_personnel.object_class = 'COperation'\n      AND operations.salle_id " . CSQLDataSource::prepareIn(array_keys($salles));
        if ($type_hospi) {
            $query_hors_plage .= "\nAND sejour.type = '{$type_hospi}'";
        }
        if ($prat_id) {
            $query_hors_plage .= "\nAND operations.chir_id = '{$prat_id}'";
        }
        if ($discipline_id) {
            $query_hors_plage .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
        }
        if ($codeCCAM) {
            $query_hors_plage .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
        }
        $query_hors_plage .= "\nAND operations.date BETWEEN '{$debut}' AND '{$fin}'\n      GROUP BY {$type_duree_fr} HAVING total > 0 ORDER BY orderitem";
        $result_hors_plage = $ds->loadlist($query_hors_plage);
    }
    $calcul_temp = array();
    foreach ($result as $r) {
        if (!isset($calcul_temp[$r[$type_duree_fr]])) {
            $calcul_temp[$r[$type_duree_fr]] = 0;
        }
        $calcul_temp[$r[$type_duree_fr]] += $r['total'];
    }
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($calcul_temp as $key => $r) {
            if ($tick[1] == $key) {
                if ($hors_plage) {
                    foreach ($result_hors_plage as &$_r_h) {
                        if ($tick[1] == $_r_h[$type_duree_fr]) {
                            $r += $_r_h["total"];
                            unset($_r_h);
                            break;
                        }
                    }
                }
                $serieTot['data'][] = array($i, $r / (60 * 60));
                $totalTot += $r / (60 * 60);
                $f = false;
            }
        }
        if ($f) {
            $serieTot["data"][] = array(count($serieTot["data"]), 0);
        }
    }
    $seriesTot[] = $serieTot;
    // Second serie : Ouverture de salle
    $serieTot = array('data' => array(), 'label' => utf8_encode("Ouverture de salle"));
    $query = "SELECT MAX(TIME_TO_SEC(operations.sortie_salle)) - MIN(TIME_TO_SEC(operations.entree_salle)) as total,\n    DATE_FORMAT(plagesop.date, '{$date_format}') AS {$type_duree_fr},\n    DATE_FORMAT(plagesop.date, '{$order_key}') AS orderitem\n    FROM plagesop\n    LEFT JOIN operations ON plagesop.plageop_id = operations.plageop_id\n    LEFT JOIN users_mediboard ON plagesop.chir_id = users_mediboard.user_id ";
    if ($type_hospi) {
        $query .= "LEFT JOIN sejour ON sejour.sejour_id = operations.sejour_id ";
    }
    $query .= "WHERE operations.entree_salle < operations.sortie_salle\n  AND plagesop.salle_id " . CSQLDataSource::prepareIn(array_keys($salles));
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    if ($type_hospi) {
        $query .= "\nAND sejour.type = '{$type_hospi}'";
    }
    if ($prat_id) {
        $query .= "\nAND plagesop.chir_id = '{$prat_id}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    $query .= "\nAND plagesop.date BETWEEN '{$debut}' AND '{$fin}'\n    GROUP BY operations.plageop_id ORDER BY orderitem";
    $result = $ds->loadlist($query);
    $calcul_temp = array();
    foreach ($result as $r) {
        if (!isset($calcul_temp[$r[$type_duree_fr]])) {
            $calcul_temp[$r[$type_duree_fr]] = 0;
        }
        $calcul_temp[$r[$type_duree_fr]] += $r['total'];
    }
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($calcul_temp as $key => $r) {
            if ($tick[1] == $key) {
                $serieTot['data'][] = array($i, $r / (60 * 60));
                $totalTot += $r / (60 * 60);
                $f = false;
            }
        }
        if ($f) {
            $serieTot["data"][] = array(count($serieTot["data"]), 0);
        }
    }
    $seriesTot[] = $serieTot;
    // Third serie : reservé
    $serieTot = array('data' => array(), 'label' => utf8_encode("Vacations attribuées"));
    $query = "SELECT SUM(TIME_TO_SEC(plagesop.fin) - TIME_TO_SEC(plagesop.debut)) AS total,\n    DATE_FORMAT(plagesop.date, '{$date_format}') AS {$type_duree_fr},\n    DATE_FORMAT(plagesop.date, '{$order_key}') AS orderitem\n    FROM plagesop\n    LEFT JOIN users_mediboard ON plagesop.chir_id = users_mediboard.user_id ";
    if ($type_hospi || $codeCCAM) {
        $query .= "LEFT JOIN operations ON operations.plageop_id = plagesop.plageop_id\n      LEFT JOIN sejour ON sejour.sejour_id = operations.sejour_id ";
    }
    $query .= "WHERE plagesop.salle_id " . CSQLDataSource::prepareIn(array_keys($salles));
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    if ($type_hospi) {
        $query .= "\nAND sejour.type = '{$type_hospi}'";
    }
    if ($prat_id) {
        $query .= "\nAND plagesop.chir_id = '{$prat_id}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    $query .= "\nAND plagesop.date BETWEEN '{$debut}' AND '{$fin}'\n    GROUP BY {$type_duree_fr} ORDER BY orderitem";
    $result = $ds->loadList($query);
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($result as $r) {
            if ($tick[1] == $r[$type_duree_fr]) {
                $serieTot['data'][] = array($i, $r["total"] / (60 * 60));
                $totalTot += $r["total"] / (60 * 60);
                $f = false;
            }
        }
        if ($f) {
            $serieTot["data"][] = array(count($serieTot["data"]), 0);
        }
    }
    $seriesTot[] = $serieTot;
    // Set up the title for the graph
    $subtitle = "";
    if ($prat_id) {
        $subtitle .= " - Dr {$prat->_view}";
    }
    if ($discipline_id) {
        $subtitle .= " - {$discipline->_view}";
    }
    if ($salle_id) {
        $subtitle .= " - {$salle->nom}";
    }
    if ($bloc_id) {
        $subtitle .= " - {$bloc->nom}";
    }
    if ($codeCCAM) {
        $subtitle .= " - CCAM : {$codeCCAM}";
    }
    if ($type_hospi) {
        $subtitle .= " - " . CAppUI::tr("CSejour.type.{$type_hospi}");
    }
    $optionsTot = CFlotrGraph::merge("lines", array('title' => utf8_encode("Utilisation des ressources"), 'subtitle' => utf8_encode("total estimé {$subtitle}"), 'xaxis' => array('ticks' => $ticks), 'grid' => array('verticalLines' => true)));
    if ($totalTot == 0) {
        $optionsTot['yaxis']['max'] = 1;
    }
    return array('series' => $seriesTot, 'options' => $optionsTot);
}
예제 #12
0
     $results["count_erreur"]++;
     continue;
 } elseif ($count > 1) {
     $mediusers = $mediuser->loadList($where, null, null, null, $ljoin);
     $list_view = implode(", ", CMbArray::pluck($mediusers, "_view"));
     CAppUI::stepAjax("Plusieurs utilisateurs correspondent à cette recherche (ADELI = {$ADELI}): %s", UI_MSG_WARNING, $list_view);
     $results["count_erreur"]++;
     continue;
 }
 $mediuser->loadObject($where, null, null, $ljoin);
 // Traitement de la date/heure début, et durée de l'opération
 $date_op = CMbDT::date($date_debut);
 $time_op = CMbDT::time($date_debut);
 $temps_op = CMbDT::subTime(CMbDT::time($date_debut), CMbDT::time($date_fin));
 // Recherche de la salle
 $salle = new CSalle();
 $where = array("nom" => "= '{$nom_salle}'", "bloc_id" => CSQLDataSource::prepareIn(array_keys($blocs)));
 if (!$salle->loadObject($where)) {
     CAppUI::stepAjax("La salle '{$nom_salle}' n'a pas été retrouvée dans Mediboard", UI_MSG_WARNING);
     $results["count_erreur"]++;
     continue;
 }
 // Recherche d'une éventuelle PlageOp
 $plageOp = new CPlageOp();
 $plageOp->chir_id = $mediuser->_id;
 $plageOp->salle_id = $salle->_id;
 $plageOp->date = $date_op;
 foreach ($plageOp->loadMatchingList() as $_plage) {
     // Si notre intervention est dans la plage Mediboard
     if ($_plage->debut <= $time_op && $temps_op <= $_plage->fin) {
         $plageOp = $_plage;
예제 #13
0
/**
 * 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);
}
예제 #14
0
// Récuperation de la salle à afficher par défaut
$default_salle_id = "";
$default_salles_id = json_decode($default_salles_id);
if (isset($default_salles_id->{"g{$group_id}"})) {
    $default_salle_id = reset(explode("|", $default_salles_id->{"g{$group_id}"}));
}
if (!$salle_id) {
    $salle_id = $default_salle_id;
}
// Chargement des praticiens
$mediuser = new CMediusers();
$listAnesths = $mediuser->loadAnesthesistes(PERM_READ);
// Selection des salles
$listBlocs = CGroups::loadCurrent()->loadBlocs(PERM_READ);
// Selection des plages opératoires de la journée
$salle = new CSalle();
if ($salle->load($salle_id)) {
    $salle->loadRefsForDay($date, true);
}
if ($hide_finished == 1 && $salle->_ref_plages) {
    foreach ($salle->_ref_plages as $_plage) {
        foreach ($_plage->_ref_operations as $_key => $_op) {
            if ($_op->sortie_salle) {
                unset($_plage->_ref_operations[$_key]);
            }
        }
        foreach ($_plage->_unordered_operations as $_key => $_op) {
            if ($_op->sortie_salle) {
                unset($_plage->_unordered_operations[$_key]);
            }
        }
예제 #15
0
 $bloc = new CBlocOperatoire();
 $bloc->nom = $results[$i]["bloc"];
 $bloc->group_id = CGroups::loadCurrent()->_id;
 $bloc->loadMatchingObject();
 if (!$bloc->_id) {
     $msg = $bloc->store();
     if ($msg) {
         CAppUI::setMsg($msg, UI_MSG_ERROR);
         $results[$i]["error"] = $msg;
         $i++;
         continue;
     }
     CAppUI::setMsg("Bloc créé", UI_MSG_OK);
 }
 // Salle
 $salle = new CSalle();
 $salle->nom = $results[$i]["nom"];
 $salle->bloc_id = $bloc->_id;
 $salle->loadMatchingObject();
 if ($salle->_id) {
     $msg = "Salle existante";
     CAppUI::setMsg($msg, UI_MSG_ERROR);
     $results[$i]["error"] = $msg;
     $i++;
     continue;
 }
 $salle->stats = 1;
 $salle->dh = 0;
 $msg = $salle->store();
 if ($msg) {
     CAppUI::setMsg($msg, UI_MSG_ERROR);
예제 #16
0
 /**
  * Mine or remine the first availables salles
  *
  * @param int    $limit
  * @param string $phase
  *
  * @return array Success/failure counts report
  */
 function mineSome($limit = 100, $phase = "mine")
 {
     $date = CMbDT::date();
     $report = array("success" => 0, "failure" => 0);
     $salle = new CSalle();
     $ds = $salle->getDS();
     $min_date = self::getMinDate();
     $phases = array("mine" => array("mined", "remined", "postmined"), "remine" => array("remined", "postmined"), "postmine" => array("postmined"));
     $ref_dates = array("mine" => CMbDT::date(self::$mine_delay), "remine" => CMbDT::date(self::$remine_delay), "postmine" => CMbDT::date(self::$postmine_delay));
     $sql = "SELECT sallesbloc.salle_id, MAX(date) as date FROM sallesbloc\n      LEFT JOIN salle_daily_occupation ON salle_daily_occupation.salle_id = sallesbloc.salle_id\n      WHERE (salle_daily_occupation.status " . $ds->prepareIn($phases[$phase]) . " OR salle_daily_occupation.status IS NULL)\n      GROUP BY salle_id\n      ";
     if (!($result = $ds->loadList($sql))) {
         return;
     }
     // cleanup
     foreach ($result as &$_result) {
         if (!$_result["date"]) {
             $_result["date"] = $min_date;
         }
     }
     // iteration
     $i = $limit;
     while ($i--) {
         // sort
         array_multisort(CMbArray::pluck($result, "date"), SORT_ASC, $result);
         // first
         $result[0]["date"] = CMbDT::date("+1 DAY", $result[0]["date"]);
         if ($result[0]["date"] > $ref_dates[$phase]) {
             break;
         }
         $this->mine($result[0]["salle_id"], $result[0]["date"]);
         if ($msg = $this->store()) {
             $report["failure"]++;
         } else {
             $report["success"]++;
         }
     }
     return $report;
 }
예제 #17
0
/**
 * Récupération du graphique du nombre de patient par jour et par salle
 * au bloc opératoire
 *
 * @param string $debut         Date de début
 * @param string $fin           Date de fin
 * @param int    $prat_id       Identifiant du praticien
 * @param int    $salle_id      Identifiant de la salle
 * @param int    $bloc_id       Identifiant du bloc
 * @param int    $discipline_id Identifiant de la discipline
 * @param string $codeCCAM      Code CCAM
 * @param bool   $hors_plage    Prise en compte des hors plage
 *
 * @return array
 */
function graphPatJourSalle($debut = null, $fin = null, $prat_id = 0, $salle_id = 0, $bloc_id = 0, $func_id = 0, $discipline_id = null, $codeCCAM = '', $hors_plage = true)
{
    if (!$debut) {
        $debut = CMbDT::date("-1 YEAR");
    }
    if (!$fin) {
        $fin = CMbDT::date();
    }
    $prat = new CMediusers();
    $prat->load($prat_id);
    $salle = new CSalle();
    $salle->load($salle_id);
    $discipline = new CDiscipline();
    $discipline->load($discipline_id);
    $ticks = array();
    for ($i = $debut; $i <= $fin; $i = CMbDT::date("+1 MONTH", $i)) {
        $ticks[] = array(count($ticks), CMbDT::transform("+0 DAY", $i, "%m/%Y"));
    }
    // Gestion du hors plage
    $where_hors_plage = !$hors_plage ? "AND operations.plageop_id IS NOT NULL" : "";
    //$salles = CSalle::getSallesStats($salle_id, $bloc_id);
    $series = array();
    $serie = array('data' => array());
    $query = "SELECT COUNT(operations.operation_id) AS total,\r\n      COUNT(DISTINCT(operations.date)) AS nb_days,\r\n      COUNT(DISTINCT(sallesbloc.salle_id)) AS nb_salles,\r\n      DATE_FORMAT(operations.date, '%m/%Y') AS mois,\r\n      DATE_FORMAT(operations.date, '%Y-%m-01') AS orderitem\r\n    FROM operations\r\n    LEFT JOIN sejour ON operations.sejour_id = sejour.sejour_id\r\n    LEFT JOIN sallesbloc ON operations.salle_id = sallesbloc.salle_id\r\n    LEFT JOIN plagesop ON operations.plageop_id = plagesop.plageop_id\r\n    LEFT JOIN users_mediboard ON operations.chir_id = users_mediboard.user_id\r\n    WHERE operations.annulee = '0'\r\n    AND operations.date BETWEEN '{$debut}' AND '{$fin}'\r\n    {$where_hors_plage}\r\n    AND sejour.group_id = '" . CGroups::loadCurrent()->_id . "'\r\n    AND sallesbloc.stats = '1'";
    if ($prat_id) {
        $query .= "\nAND operations.chir_id = '{$prat_id}'";
    }
    if ($discipline_id) {
        $query .= "\nAND users_mediboard.discipline_id = '{$discipline_id}'";
    }
    if ($codeCCAM) {
        $query .= "\nAND operations.codes_ccam LIKE '%{$codeCCAM}%'";
    }
    if ($salle_id) {
        $query .= "\nAND sallesbloc.salle_id = '{$salle_id}'";
    } elseif ($bloc_id) {
        $query .= "\nAND sallesbloc.bloc_id = '{$bloc_id}'";
    }
    $query .= "\nGROUP BY mois ORDER BY orderitem";
    $result = $prat->_spec->ds->loadlist($query);
    foreach ($ticks as $i => $tick) {
        $f = true;
        foreach ($result as $r) {
            if ($tick[1] == $r["mois"]) {
                $res = $r["total"] / ($r["nb_days"] * $r["nb_salles"]);
                //$nbjours = CMbDT::workDaysInMonth($r["orderitem"]);
                //$serie['data'][] = array($i, $r["total"]/($nbjours*count($salles)));
                $serie['data'][] = array($i, $res);
                //$serie['data'][] = array($i, $r["total"]/($r["nb_days"]*count($salles)));
                $f = false;
            }
        }
        if ($f) {
            $serie["data"][] = array(count($serie["data"]), 0);
        }
    }
    $series[] = $serie;
    // Set up the title for the graph
    $title = "Patients / jour / salle active dans le mois";
    $subtitle = "Uniquement les jours d'activité";
    if ($prat_id) {
        $subtitle .= " - Dr {$prat->_view}";
    }
    if ($discipline_id) {
        $subtitle .= " - {$discipline->_view}";
    }
    if ($salle_id) {
        $subtitle .= " - {$salle->nom}";
    }
    if ($codeCCAM) {
        $subtitle .= " - CCAM : {$codeCCAM}";
    }
    $options = array('title' => utf8_encode($title), 'subtitle' => utf8_encode($subtitle), 'xaxis' => array('labelsAngle' => 45, 'ticks' => $ticks), 'yaxis' => array('autoscaleMargin' => 1, 'min' => 0), 'lines' => array('show' => true, 'filled' => true, 'fillColor' => '#999'), 'markers' => array('show' => true), 'points' => array('show' => true), 'HtmlText' => false, 'legend' => array('show' => true, 'position' => 'nw'), 'mouse' => array('track' => true, 'relative' => true, 'position' => 'ne'), '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' => $series, 'options' => $options);
}
}
//gathering
$operation_1 = new COperation();
$operation_1->salle_id = $salle_1;
$operation_1->date = $date;
/** @var COperation[] $operations_1 */
$operations_1 = $operation_1->loadMatchingList();
$operation_2 = new COperation();
$operation_2->salle_id = $salle_2;
$operation_2->date = $date;
/** @var COperation[] $operations_2 */
$operations_2 = $operation_2->loadMatchingList();
// switching
foreach ($operations_1 as $_op_1) {
    $_op_1->salle_id = $salle_2;
    if ($msg = $_op_1->store()) {
        CAppUI::stepAjax($msg, UI_MSG_ERROR);
    }
}
foreach ($operations_2 as $_op_2) {
    $_op_2->salle_id = $salle_1;
    if ($msg = $_op_2->store()) {
        CAppUI::stepAjax($msg, UI_MSG_ERROR);
    }
}
//succeed
$salle_n1 = new CSalle();
$salle_n1->load($salle_1);
$salle_n2 = new CSalle();
$salle_n2->load($salle_2);
CAppUI::stepAjax("dPplanningOp-msg-succeed_switchin_salle1%s_salle2%s", UI_MSG_OK, $salle_n1->nom, $salle_n2->nom);
 * @package    Mediboard
 * @subpackage bloodSalvage
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision:$
 */
CCanDo::checkRead();
$date = CValue::getOrSession("date", CMbDT::date());
$operation_id = CValue::getOrSession("operation_id");
$salle_id = CValue::getOrSession("salle");
// Chargement des praticiens
$listAnesths = new CMediusers();
$listAnesths = $listAnesths->loadAnesthesistes(PERM_READ);
// Liste des blocs
$listBlocs = new CBlocOperatoire();
$listBlocs = $listBlocs->loadGroupList();
// Selection des plages opératoires de la journée
$salle = new CSalle();
if ($salle->load($salle_id)) {
    $salle->loadRefsForDay($date);
}
// Création du template
$smarty = new CSmartyDP();
$smarty->assign("vueReduite", false);
$smarty->assign("salle", $salle);
$smarty->assign("praticien_id", null);
$smarty->assign("listBlocs", $listBlocs);
$smarty->assign("listAnesths", $listAnesths);
$smarty->assign("date", $date);
$smarty->assign("operation_id", $operation_id);
$smarty->display("inc_liste_plages.tpl");
예제 #20
0
}
$listBlocs = array();
if (CAppUI::conf("dPsalleOp COperation modif_salle")) {
    $listBlocs = $group->loadBlocs(PERM_READ, null, "nom");
    // Chargement de la liste des salles de chaque bloc
    foreach ($listBlocs as $_bloc) {
        $_bloc->loadRefsSalles();
    }
}
// Chargement des Anesthésistes
$anesth = new CMediusers();
$listAnesths = $anesth->loadAnesthesistes(PERM_READ);
// Chargement des Chirurgiens
$chir = new CMediusers();
$listChirs = $chir->loadPraticiens(PERM_READ);
$salle = new CSalle();
$where = array("bloc_id" => "='{$bloc->_id}'");
$bloc->_ref_salles = $salle->loadListWithPerms(PERM_READ, $where, "nom");
$total_salles = count($bloc->_ref_salles);
$page_size = CAppUI::conf("dPbloc mode_presentation salles_count", $group);
$page_count = null;
$current_page = null;
if ($page) {
    $page_count = ceil($total_salles / $page_size);
    $current_page = ($page - 1) % $page_count;
    $slice = $current_page * $page_size;
    $bloc->_ref_salles = array_slice($bloc->_ref_salles, $slice, $page_size, true);
}
$systeme_materiel_expert = CAppUI::conf("dPbloc CPlageOp systeme_materiel") == "expert";
foreach ($bloc->_ref_salles as &$salle) {
    /** @var CSalle $salle */
예제 #21
0
 * @package  Mediboard
 * @author   SARL OpenXtrem <*****@*****.**>
 * @license  GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version  SVN: $Id: vw_idx_blocs.php 19148 2013-05-15 12:41:42Z rhum1 $
 * @link     http://www.mediboard.org
 */
CCanDo::checkAdmin();
$bloc_id = CValue::getOrSession("bloc_id");
$salle_id = CValue::getOrSession("salle_id");
$poste_sspi_id = CValue::getOrSession("poste_sspi_id");
// Récupération des blocs de l'etablissement
$blocs_list = CGroups::loadCurrent()->loadBlocs(PERM_EDIT);
// Récupération des postes de l'établissement
$postes_list = CGroups::loadCurrent()->loadPostes(PERM_EDIT);
// Récupération du bloc à à ajouter / modifier
$bloc = new CBlocOperatoire();
$bloc->load($bloc_id);
// Récupération de la salle à ajouter / modifier
$salle = new CSalle();
$salle->load($salle_id);
// Récupération du poste à ajouter / modifier
$poste = new CPosteSSPI();
$poste->load($poste_sspi_id);
// Création du template
$smarty = new CSmartyDP();
$smarty->assign("blocs_list", $blocs_list);
$smarty->assign("postes_list", $postes_list);
$smarty->assign("bloc", $bloc);
$smarty->assign("salle", $salle);
$smarty->assign("poste", $poste);
$smarty->display("vw_idx_blocs.tpl");
 /**
  * Récupération de la salle
  *
  * @param DOMNode $node   Node
  * @param CSejour $sejour Séjour
  *
  * @return string
  */
 function getSalle(DOMNode $node, CSejour $sejour)
 {
     $xpath = new CHPrimXPath($node->ownerDocument);
     $name = $xpath->queryTextNode("hprim:uniteFonctionnelle/hprim:code", $node);
     // Recherche de la salle
     $salle = new CSalle();
     $where = array("sallesbloc.nom" => $salle->_spec->ds->prepare("=%", $name), "bloc_operatoire.group_id" => "= '{$sejour->group_id}'");
     $ljoin = array("bloc_operatoire" => "bloc_operatoire.bloc_operatoire_id = sallesbloc.bloc_id");
     $salle->loadObject($where, null, null, $ljoin);
     return $salle;
 }
예제 #23
0
 * dPbloc
 *
 * @category Bloc
 * @package  Mediboard
 * @author   SARL OpenXtrem <*****@*****.**>
 * @license  GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version  SVN: $Id:$
 * @link     http://www.mediboard.org
 */
CCanDo::read();
$listBlocs = CGroups::loadCurrent()->loadBlocs();
$listSalles = array();
foreach ($listBlocs as $_bloc) {
    $listSalles = $listSalles + $_bloc->loadRefsSalles();
}
$salle = new CSalle();
$salle->load(CValue::get("salle_id"), reset($listSalles)->_id);
$salle->loadRefBloc();
$date = CValue::get("date", CMbDT::date());
// Liste des jours
$listDays = array();
for ($i = 0; $i < 19 * 7; $i += 7) {
    $dateArr = CMbDT::date("+{$i} day", $date);
    $listDays[$dateArr] = $dateArr;
}
// Création du tableau de visualisation
$affichages = array();
foreach ($listDays as $keyDate => $valDate) {
    foreach (CPlageOp::$hours as $keyHours => $valHours) {
        foreach (CPlageOp::$minutes as $keyMins => $valMins) {
            // Initialisation du tableau
예제 #24
0
$bloc_id = CValue::getOrSession("bloc_id");
$type = CValue::get("type", "prevue");
CView::enforceSlave();
if ($mode == "html") {
    $miner = new COperationWorkflow();
    $miner->warnUsage();
}
$blocs = CGroups::loadCurrent()->loadBlocs();
$bloc = new CBlocOperatoire();
$bloc->load($bloc_id);
$where = array();
$where["stats"] = "= '1'";
if ($bloc->_id) {
    $where["bloc_id"] = "= '{$bloc->_id}'";
}
$salle = new CSalle();
$salles = $salle->loadGroupList($where);
// Récupération des plages
$where = array("date" => "BETWEEN '{$deblist} 00:00:00' AND '{$finlist} 23:59:59'", "salle_id" => CSQLDataSource::prepareIn(array_keys($salles)));
/** @var CPlageOp[] $plages */
$plages = array();
/** @var COperation[] $operations */
$operations = array();
/** @var int $nb_interv */
$nb_interv = 1;
if ($type == "prevue") {
    $plage = new CPlageOp();
    $order = "date, salle_id, debut, chir_id";
    $plages = $plage->loadList($where, $order);
    CStoredObject::massLoadFwdRef($plages, "chir_id");
    CStoredObject::massLoadFwdRef($plages, "spec_id");
예제 #25
0
 * $Id: ajax_vw_materiel.php 27325 2015-02-26 09:30:02Z aurelie17 $
 * 
 * @package    Mediboard
 * @subpackage dPbloc
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision: 27325 $
 */
CCanDo::checkEdit();
$bloc_id = CValue::getOrSession("bloc_id");
$date_min = CValue::getOrSession("_date_min", CMbDT::date("-7 day"));
$date_max = CValue::getOrSession("_date_max", CMbDT::date());
$praticien_id = CValue::getOrSession("praticien_id");
$function_id = CValue::getOrSession("function_id");
// Récupération des salles
$salle = new CSalle();
$where["bloc_id"] = "= '{$bloc_id}'";
$salles = $salle->loadListWithPerms(PERM_READ, $where);
// Récupération des opérations
$ljoin = array();
$ljoin["plagesop"] = "operations.plageop_id = plagesop.plageop_id";
$where = array();
$in_salles = CSQLDataSource::prepareIn(array_keys($salles));
$where[] = "plagesop.salle_id {$in_salles}  OR operations.salle_id {$in_salles}";
$where["materiel"] = "!= ''";
$where[] = " operations.date BETWEEN '{$date_min}' AND '{$date_max}'";
if ($praticien_id) {
    $where["operations.chir_id"] = " = '{$praticien_id}'";
} elseif ($function_id) {
    $mediuser = new CMediusers();
    $users = $mediuser->loadProfessionnelDeSante(PERM_READ, $function_id);
예제 #26
0
 * @version    $Revision$
 */
CCanDo::checkRead();
$type_modif = CValue::getOrSession("type_modif", "annule");
$date_max = CValue::getOrSession("_date_max", CMbDT::date());
$date_min = CValue::get("_date_min", $date_max);
$prat_id = CValue::get("prat_id");
$salle_id = CValue::get("salle_id");
$bloc_id = CValue::get("bloc_id");
$code_ccam = CValue::get("code_ccam");
CView::enforceSlave();
$prat = new CMediusers();
$prat->load($prat_id);
$date_min = CMbDT::date("first day of -0 months", $date_min);
$date_max = CMbDT::date("last day of +0 months", $date_max);
$salles = CSalle::getSallesStats($salle_id, $bloc_id);
$miner = new COperationWorkflow();
$miner->warnUsage();
$operation = new COperation();
$ljoin["operation_workflow"] = "operation_workflow.operation_id = operations.operation_id";
$where["date_operation"] = "BETWEEN '{$date_min}' AND '{$date_max}'";
$where["salle_id"] = CSQLDataSource::prepareIn(array_keys($salles));
$where[] = $type_modif == "annule" ? "DATE(date_operation) = DATE(date_cancellation)" : "DATE(date_operation) = DATE(date_creation)";
// Filtre sur le praticien
if ($prat_id) {
    $where["operations.chir_id"] = "= '{$prat_id}'";
}
// Filtre sur les codes CCAM
if ($code_ccam) {
    $where["operations.codes_ccam"] = "LIKE '%{$code_ccam}%'";
}
예제 #27
0
 *
 * @package    Mediboard
 * @subpackage dPstats
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision$
 */
CAppUI::requireLibraryFile("jpgraph/src/mbjpgraph");
CAppUI::requireLibraryFile("jpgraph/src/jpgraph_bar");
$debut = CValue::get("debut", CMbDT::date("-1 YEAR"));
$fin = CValue::get("fin", CMbDT::date());
$prat_id = CValue::get("prat_id", 0);
$service_id = CValue::get("service_id", 0);
$pratSel = new CMediusers();
$pratSel->load($prat_id);
$service = new CSalle();
$service->load($service_id);
$datax = array();
for ($i = $debut; $i <= $fin; $i = CMbDT::date("+1 MONTH", $i)) {
    $datax[] = CMbDT::transform("+0 DAY", $i, "%m/%Y");
}
$sql = "SELECT * FROM service WHERE";
if ($service_id) {
    $sql .= "\nAND id = '{$service_id}'";
}
$ds = CSQLDataSource::get("std");
$services = $ds->loadlist($sql);
$opbysalle = array();
foreach ($services as $service) {
    $id = $service["service_id"];
    $opbysalle[$id]["nom"] = $salle["nom"];
예제 #28
0
 * $Id$
 *
 * @package    Mediboard
 * @subpackage SalleOp
 * @author     SARL OpenXtrem <*****@*****.**>
 * @license    GNU General Public License, see http://www.gnu.org/licenses/gpl.html
 * @version    $Revision$
 */
CCanDo::checkRead();
// Ne pas supprimer, utilisé pour mettre le praticien en session
$praticien_id = CValue::getOrSession("praticien_id");
$hide_finished = CValue::getOrSession("hide_finished", 0);
$salle_id = CValue::getOrSession("salle");
$operation_id = CValue::getOrSession("operation_id");
$date = CValue::getOrSession("date", CMbDT::date());
// Récupération de l'utilisateur courant
$currUser = CMediusers::get();
$currUser->isAnesth();
$currUser->isPraticien();
// Sauvegarde en session du bloc (pour preselectionner dans la salle de reveil)
$salle = new CSalle();
$salle->load($salle_id);
CValue::setSession("bloc_id", $salle->bloc_id);
// Création du template
$smarty = new CSmartyDP();
$smarty->assign("operation_id", $operation_id);
$smarty->assign("salle", $salle_id);
$smarty->assign("currUser", $currUser);
$smarty->assign("date", $date);
$smarty->assign("hide_finished", $hide_finished);
$smarty->display("vw_operations.tpl");