<?php
/**
 * OM_WIDGET - Surcharge du core
 *
 * L'objectif de la surcharge est de coder les vues spécifiques des widgets
 * de type 'file'.
 *
 * @package openads
 * @version SVN : $Id: om_widget.class.php 5673 2015-12-21 19:35:24Z nmeucci $
 */

require_once "../core/obj/om_widget.class.php";

class om_widget extends om_widget_core {

    /**
     * Constructeur.
     */
    function __construct($id, &$dnu1 = null, $dnu2 = null) {
        $this->constructeur($id);
    }

    /**
     *
     */
    var $template_help = '<div class="widget-help"><span class="info-16" title="%s"></span></div>';

    /**
     *
     */
    var $template_footer = '
    <div class="widget-footer">
        <a href="%s">
            %s
        </a>
    </div>
    ';

    /**
     * Cette méthode retourne un arbre html représentant un raccourci.
     * 
     * Un raccourci est composé d'un lien, d'une image et d'une description.
     * Voir les widgets :
     *  - widget_nouvelle_demande_autre_dossier
     *  - widget_nouvelle_demande_dossier_encours
     *  - widget_nouvelle_demande_nouveau_dossier
     */
    function get_display_widget_shortlink($config) {
        return sprintf (
            '<a href="%s"><span><img src="%s" align="left" alt="%s" />%s</span></a>',
            $config["a_href"],
            $config["img_src"],
            $config["img_alt"],
            $config["a_content"]
        );
    }

    /**
     * WIDGET DASHBOARD - widget_nouvelle_demande_autre_dossier.
     */
    function view_widget_nouvelle_demande_autre_dossier($content = null) {
        echo $this->get_display_widget_shortlink(array(
            "a_href" => "../scr/tab.php?obj=demande_autre_dossier",
            "img_src" => "../app/img/dossier-existant.png",
            "img_alt" => _("Autres dossiers"),
            "a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours ou une autorisation existante"),
        ));
    }

    /**
     * WIDGET DASHBOARD - widget_nouvelle_demande_dossier_encours.
     */
    function view_widget_nouvelle_demande_dossier_encours($content = null) {
        echo $this->get_display_widget_shortlink(array(
            "a_href" => "../scr/tab.php?obj=demande_dossier_encours",
            "img_src" => "../app/img/dossier-existant.png",
            "img_alt" => _("Dossier en cours"),
            "a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours"),
        ));
    }

    /**
     * WIDGET DASHBOARD - widget_nouvelle_demande_nouveau_dossier.
     */
    function view_widget_nouvelle_demande_nouveau_dossier($content = null) {
        echo $this->get_display_widget_shortlink(array(
            "a_href" => "../scr/form.php?obj=demande_nouveau_dossier&amp;action=0&amp;advs_id=&amp;tricol=&amp;valide=&amp;retour=tab&amp;new=",
            "img_src" => "../app/img/dossier-nouveau.png",
            "img_alt" => _("Nouveau dossier"),
            "a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant le depot d'un nouveau dossier"),
        ));
    }

    /**
     * WIDGET DASHBOARD - widget_recherche_dossier.
     *
     * Quatre cas d'utilisation :
     *  - 1 - La valeur recherchée correspond exactement au code d'un DI,
     *    alors on accède directement à la fiche de visualisation du DI.
     *  - 2 - La valeur recherchée renvoi plusieurs DI, alors on accède au
     *    listing des dossiers d'instruction avec le formulaire de 
     *    recherche avancée pré-rempli avec la valeur saisie.
     *  - 3 - La valeur recherchée renvoi aucun enregistrement, alors on 
     *    affiche un message en ce sens directement dans le widget.
     *  - 4 - Aucune valeur n'est saisie, alors on affiche un message en ce 
     *    sens directement dans le widget.
     *
     * @return void
     */
    function view_widget_recherche_dossier($content = null) {

        /**
         * Traitement de la validation du formulaire
         */
        //
        if ($this->f->get_submitted_post_value("validation") != null
            && $this->f->get_submitted_post_value("dossier") !== null
            && $this->f->get_submitted_post_value("dossier") != "") {
            // Mémorisation de la recherche
            $search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier"));
            // Ajout d'une étoile au début s'il n'y en n'a pas.
            // Par defaut * est toujours ajouté à la fin des recherches.
            if (substr($search, 0, 1) != '*') {
                $search = '*'.$search;
            }
            // Traitement des valeurs postées
            $posted_dossiers = $this->f->db->escapesimple(strtolower(str_replace("*", "%", $this->f->get_submitted_post_value("dossier"))));
            $posted_dossiers = str_replace(';', ',', $posted_dossiers);

            //
            // UNE VALEUR SAISIE
            //

            // WHERE - Filtre Collectivité
            $where_collectivite = "";
            // Si collectivité utilisateur mono alors filtre sur celle-ci
            if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
                //
                $where_collectivite = " 
                AND dossier.om_collectivite=".$_SESSION['collectivite']."
                ";
            }

            // Construction de la requête
            // Pour chaque dossier on cherche sur les deux champs du code du
            // dossier (un avec et un sans espaces)
            $posted_dossiers = explode(',', $posted_dossiers);
            $liste_dossiers = array();
            foreach ($posted_dossiers as $posted_dossier) {
                $sql = "
                SELECT 
                    dossier
                FROM
                    ".DB_PREFIXE."dossier
                WHERE
                    (LOWER(dossier.dossier) LIKE '%".$posted_dossier."%' 
                    OR LOWER(dossier.dossier_libelle) LIKE '%".$posted_dossier."%' )
                ";
                $sql .= $where_collectivite;
                // Exécution de la requête
                $res = $this->f->db->query($sql);
                $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
                $this->f->isDatabaseError($res);
                // On récupère les numéros de dossier dans les résultats
                while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
                    $liste_dossiers[] = $row['dossier'];
                }
            }
            $total_dossiers = count($liste_dossiers);
            // Si on obtient un seul résultat
            if ($total_dossiers == 1) {
                // On reformate le dossier
                $dossier = strtoupper(str_replace(' ', '', $liste_dossiers[0]));
                // On redirige vers le listing des DI
                echo '
                <script type="text/javascript" >
                    widget_recherche_dossier(\''.$dossier.'\', 1);
                </script>
                ';
                // On arrête l'exécution du script car l'utilisateur a été 
                // redirigé vers un autre script
                exit();
            }
            // Si on obtient plusieurs résultats
            if ($total_dossiers > 1) {
                // On redirige vers le listing des DI
                echo '
                <script type="text/javascript" >
                    widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.');
                </script>
                ';
                // On arrête l'exécution du script car l'utilisateur a été 
                // redirigé vers un autre script
                exit();
            }
            // Cas d'utilisation n°3
            // Si aucun dossier trouve
            // Affiche un message d'erreur
            $erreur = _("Aucun dossier trouve");

        } elseif ($this->f->get_submitted_post_value("validation") != null
            && $this->f->get_submitted_post_value("dossier") !== null
            && $this->f->get_submitted_post_value("dossier") == '') {

            //
            // AUCUNE VALEUR SAISIE
            //

            // Cas d'utilisation n°4
            // Affiche un message d'erreur
            $erreur = _("Veuillez saisir un No de dossier.");

        }

        /**
         * Affichage du widget
         */
        // Affichage du message d'informations
        printf(
            '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
            _("Permet la recherche directe de dossiers d'instruction.\n\n".
               "Deux modes de saisie sont possibles :\n".
               "- Code de dossier intégral 'PC0130551300027P0' ou 'PC 013055 13 00027P0' pour un accès direct à la fiche de visualisation du dossier d'instruction,\n".
               "- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.")
        );
        // Ouverture du form
        echo "\t<form method=\"post\" id=\"widget_recherche_dossier_form\" action=\"../scr/dashboard.php\">\n";
        // Affichage d'un éventuel message d'erreur
        if (isset($erreur) && $erreur != "") {
            $class = "error";
            $this->f->displayMessage($class, $erreur);
        }
        // Configuration du formulaire de recherche
        $champs = array("dossier");
        $form = new $this->om_formulaire(null, 0, 0, $champs);
        $form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>');
        $form->setType("dossier", "text");
        $form->setTaille("dossier", 20);
        $form->setMax("dossier", 250);
        // Affichage du formulaire
        $form->entete();
        $form->afficher($champs, 0, false, false);
        $form->enpied();
        // Affichage des contrôles du formulaire
        echo "\t<div class=\"formControls\">\n";
        echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
        value=\""._("Valider")."\" name=\"validation\" />\n";
        echo "\t</div>\n";
        // Fermeture du form
        echo "\t</form>\n";
    }

    /**
     * Cette méthode permet de récupérer la configuration du widget 'Dossiers
     * limites'.
     *
     * @return array
     */
    function get_config_dossiers_limites($arguments) {
        // Initialisation du tableau des paramètres avec ses valeur par défaut
        $arguments_default = array(
            "nombre_de_jours" => 15,
            "codes_datd" => null,
            "filtre" => "instructeur",
        );
        // Vérification des arguments
        foreach ($arguments_default as $key => $value) {
            //
            if (isset($arguments[$key])) {
                //
                $elem = trim($arguments[$key]);
                //
                if ($key === "nombre_de_jours" 
                    && intval($elem) > 0) {
                    // Ce doit être un entier
                    $arguments[$key] = intval($elem);
                    continue;
                } elseif ($key === "codes_datd"
                    && $elem != "") {
                    // Ce doit être un tableau
                    $arguments[$key] = explode(";", $elem);
                    continue;
                } elseif ($key === "filtre"
                    && in_array($elem, array("instructeur", "division", "aucun"))) {
                    // La valeur doit être dans cette liste
                    $arguments[$key] = $elem;
                    continue;
                }
            }
            //
            $arguments[$key] = $value;
        }
        //
        $nombre_de_jours = $arguments["nombre_de_jours"];
        $codes_datd = $arguments["codes_datd"];
        $filtre = $arguments["filtre"];

        /**
         * Construction de la requête
         */
        // SELECT
        $query_ct_select = "
        dossier.dossier,
        dossier.dossier_libelle,
        dossier.date_limite,
        dossier.date_limite_incompletude,
        CASE 
            WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE 
                THEN to_char(dossier.date_limite_incompletude, 'DD/MM/YYYY') 
            ELSE 
                to_char(dossier.date_limite, 'DD/MM/YYYY')
        END as date_limite_na,
        COALESCE(
            demandeur.particulier_nom, 
            demandeur.personne_morale_denomination
        ) AS nom_petitionnaire,
        CASE 
            WHEN dossier.enjeu_erp is TRUE 
                THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_erp-16'' title=''"._('Enjeu ERP')."''>ERP</span>' 
            ELSE 
                '' 
        END 
        ||
        CASE
            WHEN dossier.enjeu_urba is TRUE 
                THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_urba-16'' title=''"._('Enjeu Urba')."''>URBA</span>' 
            ELSE 
                '' 
        END AS enjeu
        ";
        // SELECT - CHAMPAFFICHE
        $query_ct_select_champaffiche = array(
            'dossier.dossier as "'._("dossier").'"',
            'dossier.dossier_libelle as "'._("dossier").'"',
            'COALESCE(
                demandeur.particulier_nom, 
                demandeur.personne_morale_denomination
            ) AS "'._("nom_petitionnaire").'"',
            'CASE 
                WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE 
                    THEN to_char(dossier.date_limite_incompletude, \'DD/MM/YYYY\') 
                ELSE
                    to_char(dossier.date_limite, \'DD/MM/YYYY\') 
            END as "'._("date_limite").'"',
            'CASE 
                WHEN dossier.enjeu_erp is TRUE 
                    THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_erp-16" title="'._('Enjeu ERP').'">ERP</span>\'
                ELSE 
                    \'\' 
            END 
            ||
            CASE
                WHEN dossier.enjeu_urba is TRUE 
                    THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_urba-16" title="'._('Enjeu Urba').'">URBA</span>\'
                ELSE 
                    \'\' 
            END AS "'._("enjeu").'"',
            // XXX Attention cette colonne est cachée en css est doit donc restée la dernière du tableau
            'CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
                dossier.date_limite_incompletude ELSE
                dossier.date_limite END as date_limite_na',
        );
        // FROM
        $query_ct_from = "
        ".DB_PREFIXE."dossier
        LEFT JOIN ".DB_PREFIXE."etat
            ON dossier.etat = etat.etat
        LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
            ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
        LEFT JOIN ".DB_PREFIXE."demandeur
            ON lien_dossier_demandeur.demandeur = demandeur.demandeur
        LEFT JOIN ".DB_PREFIXE."dossier_autorisation
            ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
        LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
            ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
        LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
            ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
        LEFT JOIN ".DB_PREFIXE."instructeur
            ON dossier.instructeur=instructeur.instructeur
        LEFT JOIN ".DB_PREFIXE."om_utilisateur
            ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
        ";
        // WHERE - COMMON
        $query_ct_where_common = "
        (
            (
                dossier.incomplet_notifie IS FALSE
                AND date_limite <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day'
            )
            OR
            (
                dossier.incomplet_notifie IS TRUE
                AND dossier.incompletude IS TRUE
                AND date_limite_incompletude <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day'
            )
        )
        AND etat.statut != 'cloture'
        AND dossier.avis_decision IS NULL
        AND LOWER(dossier.accord_tacite) = 'oui' 
        ";
        // WHERE - DATD
        // Filtre sur le type détaillé des dossiers
        $query_ct_where_datd_filter = "";
        if (!is_null($codes_datd)
            && is_array($codes_datd)
            && count($codes_datd) != 0) {
            //
            $sql_codes = "";
            //
            foreach ($codes_datd as $code) {
                $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
            }
            $sql_codes = substr($sql_codes, 0, count($sql_codes) - 4);
            //
            $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
        }
        // WHERE - USER
        // Filtre sur les dossiers qui concernent l'utilisateur
        $query_ct_where_user_filter = "";
        //
        if ($filtre == "instructeur") {
            //
            $query_ct_where_user_filter = " 
            AND om_utilisateur.login='".$_SESSION['login']."' 
            ";
        } elseif ($filtre == "division") {
            //
            $query_ct_where_user_filter .= "
            AND dossier.division = ".$_SESSION['division']."
            ";
        } elseif ($filtre == "aucun") {
            //
            if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
                $query_ct_where_user_filter = " 
                AND dossier.om_collectivite=".$_SESSION['collectivite']." 
                ";
            }
        }
        // ORDER BY
        $query_ct_orderby = "
        date_limite_na
        ";

        /**
         * Message d'aide
         */
        //
        $message_filtre = "";
        //
        switch($filtre) {
            case "instructeur" : 
                $message_filtre = " "._("(filtrés par instructeur)"); 
                break;
            case "division" : 
                $message_filtre = " "._("(filtrés par division)"); 
                break;
        }
        //
        $message_help = sprintf(
            _("Les dossiers%s avec acceptation tacite sur lesquels aucune décision n'a été prise et dont la date limite est dans moins de %s jours%s."),
            (is_null($codes_datd) ? "": " (".implode(";",$codes_datd).")"),
            $nombre_de_jours,
            $message_filtre
        );

        /**
         * Return
         */
        //
        return array(
            "arguments" => $arguments,
            "message_help" => $message_help,
            "query_ct_select" => $query_ct_select,
            "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
            "query_ct_from" => $query_ct_from,
            "query_ct_where_common" => $query_ct_where_common,
            "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
            "query_ct_where_user_filter" => $query_ct_where_user_filter,
            "query_ct_orderby" => $query_ct_orderby,
        );
    }

    /**
     * WIDGET DASHBOARD - Dossiers limites
     *
     * @return void
     */
    function view_widget_dossiers_limites($content = null) {

        /**
         * Ce widget est configurable via l'interface Web. Lors de la création 
         * du widget dans le paramétrage il est possible de spécifier la ou les
         * options suivantes :
         *
         * - nombre_de_jours : c'est le délai en jours avant la date limite à 
         *   partir duquel on souhaite voir apparaître les dossiers dans le 
         *   widget.
         *   (default) Par défaut la valeur est 15 jours.
         *
         * - codes_datd : la liste des types de dossiers à afficher. exemple :
         *   "PCI;PCA;DPS;CUa;CUb".
         *   (default) Par défaut tous les types sont affichés. [null]
         *
         * - filtre : 
         *    = instructeur
         *    = division
         *    = aucun   
         *   (default) Par défaut les dossiers sont filtrés sur l'instructeur.
         */
        // Liste des paramètres
        $params = array("nombre_de_jours", "codes_datd", "filtre", );
        // Formatage des arguments reçus en paramètres
        $arguments = $this->get_arguments($content, $params);
        // Récupération de la configuration du widget
        $conf = $this->get_config_dossiers_limites($arguments);
        //
        $nombre_de_jours = $conf["arguments"]["nombre_de_jours"];
        $codes_datd = $conf["arguments"]["codes_datd"];
        $filtre = $conf["arguments"]["filtre"];

        /**
         * Composition de la requête
         */
        //
        $query = sprintf("
            SELECT
                %s
            FROM
                %s
            WHERE
                %s
                %s
                %s
            ORDER BY
                %s
            LIMIT 10",
            $conf["query_ct_select"],
            $conf["query_ct_from"],
            $conf["query_ct_where_common"],
            $conf["query_ct_where_datd_filter"],
            $conf["query_ct_where_user_filter"],
            $conf["query_ct_orderby"]
        );

        /**
         * Exécution de la requête
         */
        //
        $res = $this->f->db->query($query);
        $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
        $this->f->isDatabaseError($res);

        // Affichage du message d'informations
        printf(
            $this->template_help,
            $conf["message_help"]
        );

        /**
         * Si il n'y a aucun dossier à afficher, alors on affiche un message 
         * clair à l'utilisateur et on sort de la vue.
         */
        // Si il n'y a aucun dossier à afficher
        if ($res->numrows() == 0) {
            // Affichage du message d'informations
            echo _("Vous n'avez pas de dossiers limites pour le moment.");
            // Exit
            return;
        }

        /**
         * Template nécessaires à l'affichage du widget
         */
        //
        $template_table = '
        <table class="tab-tab">
            <thead>
                <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
                    <th class="title col-0 firstcol">
                        <span class="name">
                            %s
                        </span>
                    </th>
                    <th class="title col-1">
                        <span class="name">
                            %s
                        </span>
                    </th>
                    <th class="title col-2">
                        <span class="name">
                            %s
                        </span>
                    </th>
                    <th class="title col-3 lastcol">
                        <span class="name">
                            %s
                        </span>
                    </th>
                </tr>
            </thead>
            <tbody>
        %s
            </tbody>
        </table>
        ';
        //
        $template_line = '
        <tr class="tab-data odd">
            <td class="col-1 firstcol">
                %s
            </td>
            <td class="col-1">
                %s
            </td>
            <td class="col-2">
                %s
            </td>
            <td class="col-3 lastcol">
                %s
            </td>
        </tr>
        ';
        //
        $template_href = '../scr/form.php?obj=dossier_instruction&amp;action=3&amp;idx=%s';
        //
        $template_link = '
        <a class="lienTable" href="%s">
            %s
        </a>
        ';

        /**
         * Si il y a des dossiers à afficher, alors on affiche le widget.
         */
        // On construit le contenu du tableau
        $ct_tbody = '';
        while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
            // On construit l'attribut href du lien
            $ct_href = sprintf(
                $template_href,
                // idx
                $row["dossier"]
            );
            // On construit la ligne
            $ct_tbody .= sprintf(
                $template_line,
                // Colonne 1 - Numéro de dossier
                sprintf(
                    $template_link,
                    $ct_href,
                    $row["dossier_libelle"]
                ),
                // Colonne 2 - Nom du pétitionnaire
                sprintf(
                    $template_link,
                    $ct_href,
                    $row["nom_petitionnaire"]
                ),
                // Colonne 3 - Date limite
                sprintf(
                    $template_link,
                    $ct_href,
                    $this->f->formatDate($row["date_limite_na"])
                ),
                // Colonne 4 - Enjeu
                sprintf(
                    $template_link,
                    $ct_href,
                    $row["enjeu"]
                )
            );
        }
        // Affichage du tableau listant les dossiers
        printf(
            $template_table,
            // Colonne 1 - Numéro de dossier
            _('dossier'),
            // Colonne 2 - Nom du pétitionnaire
            _('nom_petitionnaire'),
            // Colonne 3 - Date limite
            _('date_limite'),
            // Colonne 4 - Enjeu
            _('enjeu'),
            // Contenu du tableau
            $ct_tbody
        );
        // Affichage du footer
        printf(
            $this->template_footer,
            // href (avec les paramètres du widget)
            sprintf(
                "../scr/tab.php?obj=dossiers_limites&nombre_de_jours=%s&codes_datd=%s&filtre=%s",
                $nombre_de_jours,
                (is_null($codes_datd) ? "" : implode(";",$codes_datd)),
                $filtre
            ),
            // titre
            _("Voir +")
        );
    }

    /**
     * Cet méthode permet de formater, la chaîne de caractères reçue du 
     * paramétrage du widget en un tableau de valeurs dont les clés 
     * correspondent aux clés passées en paramètre.
     *
     * @param string $content
     * @param array $params
     *
     * @return array
     */
    function get_arguments($content = null, $params = array()) {
        //
        $arguments = array();
        // On explose les paramètres reçus avec un élément par ligne
        $params_tmp1 = explode("\n", $content);
        // On boucle sur chaque ligne de paramètre
        foreach ($params_tmp1 as $key => $value) {
            // On explose le paramètre de sa valeur avec le séparateur '='
            $params_tmp2[] = explode("=", $value);
        }
        // On boucle sur chaque paramètre reçu pour vérifier si la valeur reçue
        // est acceptable ou non
        foreach ($params_tmp2 as $key => $value) {
            //
            if (!isset($value[0]) || !isset($value[1])) {
                continue;
            }
            //
            if (in_array(trim($value[0]), $params)) {
                $arguments[trim($value[0])] = trim($value[1]);
            }
        }
        //
        return $arguments;
    }

    /**
     * WIDGET DASHBOARD - Retours de messages
     *
     * @return void
     */
    function view_widget_messages_retours($content = null) {

        /**
         * Ce widget est configurable via l'interface Web. Lors de la création
         * du widget dans le paramétrage il est possible de spécifier la ou les
         * options suivantes :
         *
         * - filtre :
         *    = instructeur
         *    = division
         *    = aucun
         *   (default) Par défaut les dossiers sont filtrés sur l'instructeur.
         */
        // Liste des paramètres
        $params = array("filtre", );
        // Formatage des arguments reçus en paramètres
        $arguments = $this->get_arguments($content, $params);
        // Récupération de la configuration du widget
        $conf = $this->get_config_messages_retours($arguments);
        //
        $filtre = $conf["arguments"]["filtre"];

        /**
         * Composition de la requête
         */
        //
        $query = sprintf(
            "SELECT
                count(*)
            FROM
                %s
            WHERE
                %s
                %s",
            $conf["query_ct_from"],
            $conf["query_ct_where_common"],
            $conf["query_ct_where_user_filter"]
        );

        /**
         * Exécution de la requête
         */
        //
        $res = $this->f->db->getone($query);
        $this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE);
        $this->f->isDatabaseError($res);

        // Affichage du message d'informations
        printf(
            $this->template_help,
            $conf["message_help"]
        );

        //
        if (intval($res) === 0) {
            //
            echo _("Aucun message non lu.");
            return;
        }


        /**
         *
         */
        $template_panel = '
        <div class="panel panel-box">
            <div class="list-justified-container">
                <ul class="list-justified text-center">
                    %s
                </ul>
            </div>
        </div>';
        /**
         *
         */
        //
        $panel = "";
        //
        $template_elem = '
        <li>
            <span class="size-h3 box-icon rounded %s">%s</span>
            <p class="text-muted">%s %s</p> 
        </li>
        ';
        $panel_elem = sprintf(
            $template_elem,
            "bg-info",
            intval($res),
            _("Non lu"),
            ""
        );
        //
        $panel .= sprintf(
            $template_panel,
            $panel_elem
        );
        echo $panel;

        /**
         *
         */
        if ($filtre === "aucun") {
            $obj_href_more_link = "messages_tous_retours";
        } elseif ($filtre === "division") {
            $obj_href_more_link = "messages_retours_ma_division";
        } else {
            $obj_href_more_link = "messages_mes_retours";
        }

        //
        if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) {
            return;
        }
        // Affichage du footer
        printf(
            $this->template_footer,
            // href
            sprintf(
                '../scr/tab.php?obj=%s',
                $obj_href_more_link
            ),
            // titre
            _("Voir +")
        );

    }


    /**
     * Cette méthode permet de récupérer la configuration du widget 'Retours de
     * messages'.
     *
     * @return array
     */
    function get_config_messages_retours($arguments) {
        // Initialisation du tableau des paramètres avec ses valeur par défaut
        $arguments_default = array(
            "filtre" => "instructeur",
        );
        // Vérification des arguments
        foreach ($arguments_default as $key => $value) {
            //
            if (isset($arguments[$key])) {
                //
                $elem = trim($arguments[$key]);
                //
                if ($key === "filtre"
                    && in_array($elem, array("instructeur", "division", "aucun"))) {
                    // La valeur doit être dans cette liste
                    $arguments[$key] = $elem;
                    continue;
                }
            }
            //
            $arguments[$key] = $value;
        }
        //
        $filtre = $arguments["filtre"];

        /**
         * Construction de la requête
         */
        // FROM
        $query_ct_from = "
        ".DB_PREFIXE."dossier_message
        LEFT JOIN ".DB_PREFIXE."dossier
            ON dossier_message.dossier=dossier.dossier
        INNER JOIN ".DB_PREFIXE."instructeur
            ON instructeur.instructeur=dossier.instructeur
        INNER JOIN ".DB_PREFIXE."om_utilisateur
            ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
        LEFT JOIN ".DB_PREFIXE."division
            ON dossier.division=division.division
        LEFT JOIN ".DB_PREFIXE."om_collectivite
            ON dossier.om_collectivite=om_collectivite.om_collectivite";
        // WHERE - COMMON
        $query_ct_where_common = "
        dossier_message.lu IS FALSE
        ";
        // WHERE - USER
        // Filtre sur les dossiers qui concernent l'utilisateur
        $query_ct_where_user_filter = "";
        //
        if ($filtre == "instructeur") {
            //
            $query_ct_where_user_filter .= " 
            AND om_utilisateur.login='".$_SESSION['login']."' 
            ";
        } elseif ($filtre == "division") {
            //
            $query_ct_where_user_filter .= "
            AND dossier.division = ".$_SESSION['division']."
            ";
        }
        // Dans tous les cas si l'utilisateur fait partie d'une collectivité
        // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
        // collectivité
        if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
            $query_ct_where_user_filter .= " 
            AND dossier.om_collectivite=".$_SESSION['collectivite']." 
            ";
        }

        /**
         * Message d'aide
         */
        //
        $message_filtre = "";
        //
        switch ($filtre) {
            case "instructeur":
                $message_filtre = " "._("dont je suis l'instructeur");
                break;
            case "division":
                $message_filtre = " "._("situés dans ma division");
                break;
            case "aucun":
                if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
                    $message_filtre = " "._("situés dans ma collectivité");
                } else {
                    $message_filtre = " "._("situés dans toutes les collectivités");
                }
                break;
        }
        //
        $message_help = sprintf(
            _("Les messages marqués comme 'non lu' qui concernent des ".
               "dossiers d'instruction%s."),
            $message_filtre
        );

        /**
         * Return
         */
        //
        return array(
            "arguments" => $arguments,
            "message_help" => $message_help,
            "query_ct_from" => $query_ct_from,
            "query_ct_where_common" => $query_ct_where_common,
            "query_ct_where_user_filter" => $query_ct_where_user_filter,
        );
    }

    /**
     * WIDGET DASHBOARD - Retours de consultation
     *
     * @return void
     */
    function view_widget_consultation_retours($content = null) {

        /**
         * Ce widget est configurable via l'interface Web. Lors de la création
         * du widget dans le paramétrage il est possible de spécifier la ou les
         * options suivantes :
         *
         * - filtre :
         *    = instructeur
         *    = division
         *    = aucun
         *   (default) Par défaut les dossiers sont filtrés sur l'instructeur.
         */
        // Liste des paramètres
        $params = array("filtre", );
        // Formatage des arguments reçus en paramètres
        $arguments = $this->get_arguments($content, $params);
        // Récupération de la configuration du widget
        $conf = $this->get_config_consultation_retours($arguments);
        //
        $filtre = $conf["arguments"]["filtre"];

        /**
         * Composition de la requête
         */
        //
        $query = sprintf(
            "SELECT
                count(*)
            FROM
                %s
            WHERE
                %s
                %s",
            $conf["query_ct_from"],
            $conf["query_ct_where_common"],
            $conf["query_ct_where_user_filter"]
        );

        /**
         * Exécution de la requête
         */
        //
        $res = $this->f->db->getone($query);
        $this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE);
        $this->f->isDatabaseError($res);

        // Affichage du message d'informations
        printf(
            $this->template_help,
            $conf["message_help"]
        );

        //
        if (intval($res) === 0) {
            //
            echo _("Aucun retour de consultation non lu.");
            return;
        }


        /**
         *
         */
        $template_panel = '
        <div class="panel panel-box">
            <div class="list-justified-container">
                <ul class="list-justified text-center">
                    %s
                </ul>
            </div>
        </div>';
        /**
         *
         */
        //
        $panel = "";
        //
        $template_elem = '
        <li>
            <span class="size-h3 box-icon rounded %s">%s</span>
            <p class="text-muted">%s %s</p> 
        </li>
        ';
        $panel_elem = sprintf(
            $template_elem,
            "bg-info",
            intval($res),
            _("Non lu"),
            ""
        );
        //
        $panel .= sprintf(
            $template_panel,
            $panel_elem
        );
        echo $panel;

        /**
         *
         */
        if ($filtre === "aucun") {
            $obj_href_more_link = "consultation_tous_retours";
        } elseif ($filtre === "division") {
            $obj_href_more_link = "consultation_retours_ma_division";
        } else {
            $obj_href_more_link = "consultation_mes_retours";
        }

        //
        if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) {
            return;
        }
        // Affichage du footer
        printf(
            $this->template_footer,
            // href
            sprintf(
                '../scr/tab.php?obj=%s',
                $obj_href_more_link
            ),
            // titre
            _("Voir +")
        );

    }


    /**
     * Cette méthode permet de récupérer la configuration du widget 'Retours de
     * consultation'.
     *
     * @return array
     */
    function get_config_consultation_retours($arguments) {
        // Initialisation du tableau des paramètres avec ses valeur par défaut
        $arguments_default = array(
            "filtre" => "instructeur",
        );
        // Vérification des arguments
        foreach ($arguments_default as $key => $value) {
            //
            if (isset($arguments[$key])) {
                //
                $elem = trim($arguments[$key]);
                //
                if ($key === "filtre"
                    && in_array($elem, array("instructeur", "division", "aucun"))) {
                    // La valeur doit être dans cette liste
                    $arguments[$key] = $elem;
                    continue;
                }
            }
            //
            $arguments[$key] = $value;
        }
        //
        $filtre = $arguments["filtre"];

        /**
         * Construction de la requête
         */
        // FROM
        $query_ct_from = "
        ".DB_PREFIXE."consultation
        LEFT JOIN ".DB_PREFIXE."avis_consultation
            ON consultation.avis_consultation=avis_consultation.avis_consultation
        LEFT JOIN ".DB_PREFIXE."dossier
            ON consultation.dossier=dossier.dossier
        LEFT JOIN ".DB_PREFIXE."service
            ON consultation.service=service.service
        INNER JOIN ".DB_PREFIXE."instructeur
            ON instructeur.instructeur=dossier.instructeur
        INNER JOIN ".DB_PREFIXE."om_utilisateur
            ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
        LEFT JOIN ".DB_PREFIXE."division
            ON dossier.division=division.division
        LEFT JOIN ".DB_PREFIXE."om_collectivite
            ON dossier.om_collectivite=om_collectivite.om_collectivite";
        // WHERE - COMMON
        $query_ct_where_common = "
        consultation.lu IS FALSE
        ";
        // WHERE - USER
        // Filtre sur les dossiers qui concernent l'utilisateur
        $query_ct_where_user_filter = "";
        //
        if ($filtre == "instructeur") {
            //
            $query_ct_where_user_filter .= " 
            AND om_utilisateur.login='".$_SESSION['login']."' 
            ";
        } elseif ($filtre == "division") {
            //
            $query_ct_where_user_filter .= "
            AND dossier.division = ".$_SESSION['division']."
            ";
        }
        // Dans tous les cas si l'utilisateur fait partie d'une collectivité
        // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
        // collectivité
        if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
            $query_ct_where_user_filter .= " 
            AND dossier.om_collectivite=".$_SESSION['collectivite']." 
            ";
        }

        /**
         * Message d'aide
         */
        //
        $message_filtre = "";
        //
        switch ($filtre) {
            case "instructeur":
                $message_filtre = " "._("dont je suis l'instructeur");
                break;
            case "division":
                $message_filtre = " "._("situés dans ma division");
                break;
            case "aucun":
                if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
                    $message_filtre = " "._("situés dans ma collectivité");
                } else {
                    $message_filtre = " "._("situés dans toutes les collectivités");
                }
                break;
        }
        //
        $message_help = sprintf(
            _("Les consultations marquées comme 'non lu' qui concernent des ".
               "dossiers d'instruction%s."),
            $message_filtre
        );

        /**
         * Return
         */
        //
        return array(
            "arguments" => $arguments,
            "message_help" => $message_help,
            "query_ct_from" => $query_ct_from,
            "query_ct_where_common" => $query_ct_where_common,
            "query_ct_where_user_filter" => $query_ct_where_user_filter,
        );
    }


    /**
     * WIDGET DASHBOARD - Dossiers en incomplet ou majoration sans retour RAR
     *
     * @return void
     */
    function view_widget_dossiers_evenement_incomplet_majoration($content = null) {

        /**
         * Ce widget est configurable via l'interface Web. Lors de la création 
         * du widget dans le paramétrage il est possible de spécifier la ou les
         * options suivantes :
         *
         * - filtre : 
         *    = instructeur
         *    = division
         *    = aucun
         *   (default) Par défaut les dossiers sont filtrés sur l'instructeur.
         */
        // Liste des paramètres
        $params = array("filtre", );
        // Formatage des arguments reçus en paramètres
        $arguments = $this->get_arguments($content, $params);
        // Récupération de la configuration du widget
        $conf = $this->get_config_dossiers_evenement_incomplet_majoration($arguments);
        //
        $filtre = $conf["arguments"]["filtre"];

        /**
         * Composition de la requête
         */
        //
        $query = sprintf("
            SELECT
                %s
            FROM
                %s
            WHERE
                %s
                %s
            ORDER BY
                %s
            LIMIT 10",
            $conf["query_ct_select"],
            $conf["query_ct_from"],
            $conf["query_ct_where_common"],
            $conf["query_ct_where_user_filter"],
            $conf["query_ct_orderby"]
        );

        // Exécution de la requête
        $res = $this->f->db->query($query);
        $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
        $this->f->isDatabaseError($res);

        // Affichage du message d'informations
        printf(
            $this->template_help,
            $conf["message_help"]
        );

        /**
         * Si il n'y a aucun dossier à afficher, alors on affiche un message 
         * clair à l'utilisateur et on sort de la vue.
         */
        // Si il n'y a aucun dossier à afficher
        if ($res->numrows() == 0) {
            // Affichage du message d'informations
            echo _("Vous n'avez pas de dossiers avec un evenement incomplet ou majoration sans RAR pour le moment.");
            // Exit
            return;
        }

        /**
         * Template nécessaires à l'affichage du widget
         */
        // Lien vers le dossier d'instructions

        // Bouton consulter
        $template_btn_consulter = '
        <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
            ._('Consulter')
        .'</span>
        ';

        $template_table = '
        <table class="tab-tab">
            <thead>
                <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
                    <th class="title col-0 firstcol">
                        <span class="name">
                            %s
                        </span>
                    </th>
                    <th class="title col-1">
                        <span class="name">
                            %s
                        </span>
                    </th>
                    <th class="title col-2 lastcol">
                        <span class="name">
                            %s
                        </span>
                    </th>
                </tr>
            </thead>
            <tbody>
        %s
            </tbody>
        </table>
        ';

        // Données dans le tableau
        // 
        $template_line = '
        <tr class="tab-data odd">
            <td class="col-1 firstcol">
                %s
            </td>
            <td class="col-1">
                %s
            </td>
            <td class="col-2 lastcol">
                %s
            </td>
        </tr>
        ';
        //
        $template_href = '../scr/form.php?obj=dossier_instruction&amp;action=3&amp;idx=%s';
        //
        $template_link = '
        <a class="lienTable" href="%s">
            %s
        </a>
        ';

        /**
         * Si il y a des dossiers à afficher, alors on affiche le widget.
         */
        // On construit le contenu du tableau
        $ct_tbody = '';
        while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
            // On construit l'attribut href du lien
            $ct_href = sprintf(
                $template_href,
                // idx
                $row["dossier"]
            );
            // On construit la ligne
            $ct_tbody .= sprintf(
                $template_line,
                // Colonne 1 - Bouton consulter
                sprintf(
                    $template_link,
                    $ct_href,
                    $template_btn_consulter
                ),
                // Colonne 2 - Numéro de dossier
                sprintf(
                    $template_link,
                    $ct_href,
                    $row["dossier_libelle"]
                ),
                // Colonne 3 - Date de dépôt
                sprintf(
                    $template_link,
                    $ct_href,
                    $this->f->formatDate($row["date_depot"])
                )
            );
        }
        // Affichage du tableau listant les dossiers
        printf(
            $template_table,
            // Colonne 1 - Bouton consulter
            '',
            // Colonne 2 - Numéro de dossier
            _('dossier'),
            // Colonne 3 - Date de dépôt du dossier
            _('date_depot'),
            // Contenu du tableau
            $ct_tbody
        );

        // Affichage du footer
        printf(
            $this->template_footer,
            // href (avec les paramètres du widget)
            sprintf(
                "../scr/tab.php?obj=dossiers_evenement_incomplet_majoration&filtre=%s",
                $filtre
            ),
            // titre
            _("Voir tous les dossiers evenement incomplet ou majoration sans RAR")
        );
    }


    /**
     * Cette méthode permet de récupérer la configuration du widget 'Retours de
     * consultation'.
     *
     * @return array
     */
    function get_config_dossiers_evenement_incomplet_majoration($arguments) {
        // Initialisation du tableau des paramètres avec ses valeur par défaut
        $arguments_default = array(
            "filtre" => "instructeur",
        );
        // Vérification des arguments
        foreach ($arguments_default as $key => $value) {
            //
            if (isset($arguments[$key])) {
                //
                $elem = trim($arguments[$key]);
                //
                if ($key === "filtre"
                    && in_array($elem, array("instructeur", "division", "aucun"))) {
                    // La valeur doit être dans cette liste
                    $arguments[$key] = $elem;
                    continue;
                }
            }
            //
            $arguments[$key] = $value;
        }
        //
        $filtre = $arguments["filtre"];

        /**
         * Construction de la requête
         */
        // SELECT
        $query_ct_select = "
            dossier.dossier,
            dossier.dossier_libelle,
            dossier.date_depot
        ";
        // SELECT - CHAMPAFFICHE
        $query_ct_select_champaffiche = array(
            'dossier.dossier as "'._("dossier").'"',
            'dossier.dossier_libelle as "'._("dossier").'"',
            'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'._("date_depot").'"'
        );
        // FROM
        $query_ct_from = "
        ".DB_PREFIXE."dossier
        LEFT JOIN 
            ".DB_PREFIXE."instruction
            ON
                dossier.dossier = instruction.dossier
        LEFT JOIN
            ".DB_PREFIXE."evenement
            ON
                instruction.evenement = evenement.evenement
        LEFT JOIN
            ".DB_PREFIXE."instructeur
            ON
                instructeur.instructeur = dossier.instructeur
        LEFT JOIN
            ".DB_PREFIXE."om_utilisateur
            ON
                instructeur.om_utilisateur=om_utilisateur.om_utilisateur
        ";
        // WHERE - COMMON
        $query_ct_where_common = "
            (
                LOWER(evenement.type) = 'incompletude' OR
                LOWER(evenement.type) = 'majoration_delai'
            ) AND
            (
                instruction.date_envoi_rar > CURRENT_TIMESTAMP  - interval '1 month' AND
                instruction.date_envoi_rar <= CURRENT_TIMESTAMP
            ) AND
            instruction.date_retour_rar IS NULL AND
            evenement.retour = 'f'
        ";

        // WHERE - USER
        // Filtre sur les dossiers qui concernent l'utilisateur
        $query_ct_where_user_filter = "";
        //
        if ($filtre == "instructeur") {
            //
            $query_ct_where_user_filter .= " 
            AND om_utilisateur.login='".$_SESSION['login']."' 
            ";
        } elseif ($filtre == "division") {
            //
            $query_ct_where_user_filter .= "
            AND dossier.division = ".$_SESSION['division']."
            ";
        } elseif ($filtre == "aucun") {
            // Dans tous les cas si l'utilisateur fait partie d'une collectivité
            // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
            // collectivité
            if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
                $query_ct_where_user_filter = " 
                AND dossier.om_collectivite=".$_SESSION['collectivite']." 
                ";
            }
        }
        // ORDER BY
        $query_ct_orderby = "
            dossier.date_depot desc
        ";

        /**
         * Message d'aide
         */
        //
        $message_filtre = "";
        //
        switch ($filtre) {
            case "instructeur":
                $message_filtre = " "._("dont je suis l'instructeur");
                break;
            case "division":
                $message_filtre = " "._("situés dans ma division");
                break;
            case "aucun":
                if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
                    $message_filtre = " "._("situés dans ma collectivité");
                } else {
                    $message_filtre = " "._("situés dans toutes les collectivités");
                }
                break;
        }
        //
        $message_help = sprintf(
            _("Les dossiers d'instruction%s qui ont un evenement incomplet ou majoration".
            " avec une date d'envoi RAR, mais pas de date de retour RAR."),
            $message_filtre
        );

        /**
         * Return
         */
        //
        return array(
            "arguments" => $arguments,
            "message_help" => $message_help,
            "query_ct_select" => $query_ct_select,
            "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
            "query_ct_from" => $query_ct_from,
            "query_ct_where_common" => $query_ct_where_common,
            "query_ct_where_user_filter" => $query_ct_where_user_filter,
            "query_ct_orderby" => $query_ct_orderby,
        );
    }

}

?>
