/[openfoncier]/trunk/obj/om_widget.class.php
ViewVC logotype

Annotation of /trunk/obj/om_widget.class.php

Parent Directory Parent Directory | Revision Log Revision Log


Revision 3730 - (hide annotations)
Fri Mar 18 11:50:26 2016 UTC (8 years, 10 months ago) by mbroquet
File size: 24922 byte(s)
Actualisation du trunk
1 mbroquet 3730 <?php
2     /**
3     * OM_WIDGET - Surcharge du core
4     *
5     * L'objectif de la surcharge est de coder les vues spécifiques des widgets
6     * de type 'file'.
7     *
8     * @package openads
9     * @version SVN : $Id: om_widget.class.php 5673 2015-12-21 19:35:24Z nmeucci $
10     */
11    
12     require_once "../core/obj/om_widget.class.php";
13    
14     class om_widget extends om_widget_core {
15    
16     function __construct($id, &$dnu1 = null, $dnu2 = null) {
17     $this->constructeur($id);
18     }
19    
20     /**
21     * WIDGET DASHBOARD - widget_recherche_dossier.
22     *
23     * Quatre cas d'utilisation :
24     * - 1 - La valeur recherchée correspond exactement au code d'un DI,
25     * alors on accède directement à la fiche de visualisation du DI.
26     * - 2 - La valeur recherchée renvoi plusieurs DI, alors on accède au
27     * listing des dossiers d'instruction avec le formulaire de
28     * recherche avancée pré-rempli avec la valeur saisie.
29     * - 3 - La valeur recherchée renvoi aucun enregistrement, alors on
30     * affiche un message en ce sens directement dans le widget.
31     * - 4 - Aucune valeur n'est saisie, alors on affiche un message en ce
32     * sens directement dans le widget.
33     *
34     * @return void
35     */
36     function view_widget_recherche_dossier($content = null) {
37    
38     /**
39     * Traitement de la validation du formulaire
40     */
41     //
42     if ($this->f->get_submitted_post_value("validation") != null
43     && $this->f->get_submitted_post_value("dossier") !== null
44     && $this->f->get_submitted_post_value("dossier") != "") {
45     // Mémorisation de la recherche
46     $search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier"));
47     // Ajout d'une étoile au début s'il n'y en n'a pas.
48     // Par defaut * est toujours ajouté à la fin des recherches.
49     if (substr($search, 0, 1) != '*') {
50     $search = '*'.$search;
51     }
52     // Traitement des valeurs postées
53     $posted_dossiers = $this->f->db->escapesimple(strtolower(str_replace("*", "%", $this->f->get_submitted_post_value("dossier"))));
54     $posted_dossiers = str_replace(';', ',', $posted_dossiers);
55    
56     //
57     // UNE VALEUR SAISIE
58     //
59    
60     // WHERE - Filtre Collectivité
61     $where_collectivite = "";
62     // Si collectivité utilisateur mono alors filtre sur celle-ci
63     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
64     //
65     $where_collectivite = "
66     AND dossier.om_collectivite=".$_SESSION['collectivite']."
67     ";
68     }
69    
70     // Construction de la requête
71     // Pour chaque dossier on cherche sur les deux champs du code du
72     // dossier (un avec et un sans espaces)
73     $posted_dossiers = explode(',', $posted_dossiers);
74     $liste_dossiers = array();
75     foreach ($posted_dossiers as $posted_dossier) {
76     $sql = "
77     SELECT
78     dossier
79     FROM
80     ".DB_PREFIXE."dossier
81     WHERE
82     (LOWER(dossier.dossier) LIKE '%".$posted_dossier."%'
83     OR LOWER(dossier.dossier_libelle) LIKE '%".$posted_dossier."%' )
84     ";
85     $sql .= $where_collectivite;
86     // Exécution de la requête
87     $res = $this->f->db->query($sql);
88     $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
89     $this->f->isDatabaseError($res);
90     // On récupère les numéros de dossier dans les résultats
91     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
92     $liste_dossiers[] = $row['dossier'];
93     }
94     }
95     $total_dossiers = count($liste_dossiers);
96     // Si on obtient un seul résultat
97     if ($total_dossiers == 1) {
98     // On reformate le dossier
99     $dossier = strtoupper(str_replace(' ', '', $liste_dossiers[0]));
100     // On redirige vers le listing des DI
101     echo '
102     <script type="text/javascript" >
103     widget_recherche_dossier(\''.$dossier.'\', 1);
104     </script>
105     ';
106     // On arrête l'exécution du script car l'utilisateur a été
107     // redirigé vers un autre script
108     exit();
109     }
110     // Si on obtient plusieurs résultats
111     if ($total_dossiers > 1) {
112     // On redirige vers le listing des DI
113     echo '
114     <script type="text/javascript" >
115     widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.');
116     </script>
117     ';
118     // On arrête l'exécution du script car l'utilisateur a été
119     // redirigé vers un autre script
120     exit();
121     }
122     // Cas d'utilisation n°3
123     // Si aucun dossier trouve
124     // Affiche un message d'erreur
125     $erreur = _("Aucun dossier trouve");
126    
127     } elseif ($this->f->get_submitted_post_value("validation") != null
128     && $this->f->get_submitted_post_value("dossier") !== null
129     && $this->f->get_submitted_post_value("dossier") == '') {
130    
131     //
132     // AUCUNE VALEUR SAISIE
133     //
134    
135     // Cas d'utilisation n°4
136     // Affiche un message d'erreur
137     $erreur = _("Veuillez saisir un No de dossier.");
138    
139     }
140    
141     /**
142     * Affichage du widget
143     */
144     // Affichage du message d'informations
145     printf(
146     '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
147     _("Permet la recherche directe de dossiers d'instruction.\n\n".
148     "Deux modes de saisie sont possibles :\n".
149     "- 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".
150     "- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.")
151     );
152     // Ouverture du form
153     echo "\t<form method=\"post\" id=\"widget_recherche_dossier_form\" action=\"../scr/dashboard.php\">\n";
154     // Affichage d'un éventuel message d'erreur
155     if (isset($erreur) && $erreur != "") {
156     $class = "error";
157     $this->f->displayMessage($class, $erreur);
158     }
159     // Configuration du formulaire de recherche
160     $champs = array("dossier");
161     $form = new $this->om_formulaire(null, 0, 0, $champs);
162     $form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>');
163     $form->setType("dossier", "text");
164     $form->setTaille("dossier", 20);
165     $form->setMax("dossier", 250);
166     // Affichage du formulaire
167     $form->entete();
168     $form->afficher($champs, 0, false, false);
169     $form->enpied();
170     // Affichage des contrôles du formulaire
171     echo "\t<div class=\"formControls\">\n";
172     echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
173     value=\""._("Valider")."\" name=\"validation\" />\n";
174     echo "\t</div>\n";
175     // Fermeture du form
176     echo "\t</form>\n";
177     }
178    
179     /**
180     * Cette méthode permet de récupérer la configuration du widget 'Dossiers
181     * limites'.
182     *
183     * @return array
184     */
185     function get_config_dossiers_limites($arguments) {
186     // Initialisation du tableau des paramètres avec ses valeur par défaut
187     $arguments_default = array(
188     "nombre_de_jours" => 15,
189     "codes_datd" => null,
190     "filtre" => "instructeur",
191     );
192     // Vérification des arguments
193     foreach ($arguments_default as $key => $value) {
194     //
195     if (isset($arguments[$key])) {
196     //
197     $elem = trim($arguments[$key]);
198     //
199     if ($key === "nombre_de_jours"
200     && intval($elem) > 0) {
201     // Ce doit être un entier
202     $arguments[$key] = intval($elem);
203     continue;
204     } elseif ($key === "codes_datd"
205     && $elem != "") {
206     // Ce doit être un tableau
207     $arguments[$key] = explode(";", $elem);
208     continue;
209     } elseif ($key === "filtre"
210     && in_array($elem, array("instructeur", "division", "aucun"))) {
211     // La valeur doit être dans cette liste
212     $arguments[$key] = $elem;
213     continue;
214     }
215     }
216     //
217     $arguments[$key] = $value;
218     }
219     //
220     $nombre_de_jours = $arguments["nombre_de_jours"];
221     $codes_datd = $arguments["codes_datd"];
222     $filtre = $arguments["filtre"];
223    
224     /**
225     * Construction de la requête
226     */
227     // SELECT
228     $query_ct_select = "
229     dossier.dossier,
230     dossier.dossier_libelle,
231     dossier.date_limite,
232     dossier.date_limite_incompletude,
233     CASE
234     WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE
235     THEN to_char(dossier.date_limite_incompletude, 'DD/MM/YYYY')
236     ELSE
237     to_char(dossier.date_limite, 'DD/MM/YYYY')
238     END as date_limite_na,
239     COALESCE(
240     demandeur.particulier_nom,
241     demandeur.personne_morale_denomination
242     ) AS nom_petitionnaire,
243     CASE
244     WHEN dossier.enjeu_erp is TRUE
245     THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_erp-16'' title=''"._('Enjeu ERP')."''>ERP</span>'
246     ELSE
247     ''
248     END
249     ||
250     CASE
251     WHEN dossier.enjeu_urba is TRUE
252     THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_urba-16'' title=''"._('Enjeu Urba')."''>URBA</span>'
253     ELSE
254     ''
255     END AS enjeu
256     ";
257     // SELECT - CHAMPAFFICHE
258     $query_ct_select_champaffiche = array(
259     'dossier.dossier as "'._("dossier").'"',
260     'dossier.dossier_libelle as "'._("dossier").'"',
261     'COALESCE(
262     demandeur.particulier_nom,
263     demandeur.personne_morale_denomination
264     ) AS "'._("nom_petitionnaire").'"',
265     'CASE
266     WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE
267     THEN to_char(dossier.date_limite_incompletude, \'DD/MM/YYYY\')
268     ELSE
269     to_char(dossier.date_limite, \'DD/MM/YYYY\')
270     END as "'._("date_limite").'"',
271     'CASE
272     WHEN dossier.enjeu_erp is TRUE
273     THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_erp-16" title="'._('Enjeu ERP').'">ERP</span>\'
274     ELSE
275     \'\'
276     END
277     ||
278     CASE
279     WHEN dossier.enjeu_urba is TRUE
280     THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_urba-16" title="'._('Enjeu Urba').'">URBA</span>\'
281     ELSE
282     \'\'
283     END AS "'._("enjeu").'"',
284     // XXX Attention cette colonne est cachée en css est doit donc restée la dernière du tableau
285     'CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
286     dossier.date_limite_incompletude ELSE
287     dossier.date_limite END as date_limite_na',
288     );
289     // FROM
290     $query_ct_from = "
291     ".DB_PREFIXE."dossier
292     LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
293     ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
294     LEFT JOIN ".DB_PREFIXE."demandeur
295     ON lien_dossier_demandeur.demandeur = demandeur.demandeur
296     LEFT JOIN ".DB_PREFIXE."dossier_autorisation
297     ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
298     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
299     ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
300     LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
301     ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
302     LEFT JOIN ".DB_PREFIXE."instructeur
303     ON dossier.instructeur=instructeur.instructeur
304     LEFT JOIN ".DB_PREFIXE."om_utilisateur
305     ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
306     ";
307     // WHERE - COMMON
308     $query_ct_where_common = "
309     (
310     (
311     dossier.incomplet_notifie IS FALSE
312     AND date_limite <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day'
313     )
314     OR
315     (
316     dossier.incomplet_notifie IS TRUE
317     AND dossier.incompletude IS TRUE
318     AND date_limite_incompletude <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day'
319     )
320     )
321     AND dossier.avis_decision IS NULL
322     AND LOWER(dossier.accord_tacite) = 'oui'
323     ";
324     // WHERE - DATD
325     // Filtre sur le type détaillé des dossiers
326     $query_ct_where_datd_filter = "";
327     if (!is_null($codes_datd)
328     && is_array($codes_datd)
329     && count($codes_datd) != 0) {
330     //
331     $sql_codes = "";
332     //
333     foreach ($codes_datd as $code) {
334     $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
335     }
336     $sql_codes = substr($sql_codes, 0, count($sql_codes) - 4);
337     //
338     $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
339     }
340     // WHERE - USER
341     // Filtre sur les dossiers qui concernent l'utilisateur
342     $query_ct_where_user_filter = "";
343     //
344     if ($filtre == "instructeur") {
345     //
346     $query_ct_where_user_filter = "
347     AND om_utilisateur.login='".$_SESSION['login']."'
348     ";
349     } elseif ($filtre == "division") {
350     //
351     $query_ct_where_user_filter .= "
352     AND dossier.division = ".$_SESSION['division']."
353     ";
354     } elseif ($filtre == "aucun") {
355     //
356     if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
357     $query_ct_where_user_filter = "
358     AND dossier.om_collectivite=".$_SESSION['collectivite']."
359     ";
360     }
361     }
362     // ORDER BY
363     $query_ct_orderby = "
364     date_limite_na
365     ";
366    
367     /**
368     * Message d'aide
369     */
370     //
371     $message_filtre = "";
372     //
373     switch($filtre) {
374     case "instructeur" :
375     $message_filtre = " "._("(filtrés par instructeur)");
376     break;
377     case "division" :
378     $message_filtre = " "._("(filtrés par division)");
379     break;
380     }
381     //
382     $message_help = sprintf(
383     _("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."),
384     (is_null($codes_datd) ? "": " (".implode(";",$codes_datd).")"),
385     $nombre_de_jours,
386     $message_filtre
387     );
388    
389     /**
390     * Return
391     */
392     //
393     return array(
394     "arguments" => $arguments,
395     "message_help" => $message_help,
396     "query_ct_select" => $query_ct_select,
397     "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
398     "query_ct_from" => $query_ct_from,
399     "query_ct_where_common" => $query_ct_where_common,
400     "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
401     "query_ct_where_user_filter" => $query_ct_where_user_filter,
402     "query_ct_orderby" => $query_ct_orderby,
403     );
404     }
405    
406     /**
407     * WIDGET DASHBOARD - Dossiers limites
408     *
409     * @return void
410     */
411     function view_widget_dossiers_limites($content = null) {
412    
413     /**
414     * Ce widget est configurable via l'interface Web. Lors de la création
415     * du widget dans le paramétrage il est possible de spécifier la ou les
416     * options suivantes :
417     *
418     * - nombre_de_jours : c'est le délai en jours avant la date limite à
419     * partir duquel on souhaite voir apparaître les dossiers dans le
420     * widget.
421     * (default) Par défaut la valeur est 15 jours.
422     *
423     * - codes_datd : la liste des types de dossiers à afficher. exemple :
424     * "PCI;PCA;DPS;CUa;CUb".
425     * (default) Par défaut tous les types sont affichés. [null]
426     *
427     * - filtre :
428     * = instructeur
429     * = division
430     * = aucun
431     * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
432     */
433     // Liste des paramètres
434     $params = array("nombre_de_jours", "codes_datd", "filtre", );
435     // Formatage des arguments reçus en paramètres
436     $arguments = $this->get_arguments($content, $params);
437     // Récupération de la configuration du widget
438     $conf = $this->get_config_dossiers_limites($arguments);
439     //
440     $nombre_de_jours = $conf["arguments"]["nombre_de_jours"];
441     $codes_datd = $conf["arguments"]["codes_datd"];
442     $filtre = $conf["arguments"]["filtre"];
443    
444     /**
445     * Composition de la requête
446     */
447     //
448     $query = sprintf("
449     SELECT
450     %s
451     FROM
452     %s
453     WHERE
454     %s
455     %s
456     %s
457     ORDER BY
458     %s
459     LIMIT 10",
460     $conf["query_ct_select"],
461     $conf["query_ct_from"],
462     $conf["query_ct_where_common"],
463     $conf["query_ct_where_datd_filter"],
464     $conf["query_ct_where_user_filter"],
465     $conf["query_ct_orderby"]
466     );
467    
468     /**
469     * Exécution de la requête
470     */
471     //
472     $res = $this->f->db->query($query);
473     $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
474     $this->f->isDatabaseError($res);
475    
476     // Affichage du message d'informations
477     printf(
478     '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
479     $conf["message_help"]
480     );
481    
482     /**
483     * Si il n'y a aucun dossier à afficher, alors on affiche un message
484     * clair à l'utilisateur et on sort de la vue.
485     */
486     // Si il n'y a aucun dossier à afficher
487     if ($res->numrows() == 0) {
488     // Affichage du message d'informations
489     echo _("Vous n'avez pas de dossiers limites pour le moment.");
490     // Exit
491     return;
492     }
493    
494     /**
495     * Template nécessaires à l'affichage du widget
496     */
497     //
498     $template_table = '
499     <table class="tab-tab">
500     <thead>
501     <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
502     <th class="title col-0 firstcol">
503     <span class="name">
504     %s
505     </span>
506     </th>
507     <th class="title col-1">
508     <span class="name">
509     %s
510     </span>
511     </th>
512     <th class="title col-2">
513     <span class="name">
514     %s
515     </span>
516     </th>
517     <th class="title col-3 lastcol">
518     <span class="name">
519     %s
520     </span>
521     </th>
522     </tr>
523     </thead>
524     <tbody>
525     %s
526     </tbody>
527     </table>
528     ';
529     //
530     $template_line = '
531     <tr class="tab-data odd">
532     <td class="col-1 firstcol">
533     %s
534     </td>
535     <td class="col-1">
536     %s
537     </td>
538     <td class="col-2">
539     %s
540     </td>
541     <td class="col-3 lastcol">
542     %s
543     </td>
544     </tr>
545     ';
546     //
547     $template_href = '../scr/form.php?obj=dossier_instruction&amp;action=3&amp;idx=%s';
548     //
549     $template_link = '
550     <a class="lienTable" href="%s">
551     %s
552     </a>
553     ';
554     //
555     $template_footer = '
556     <div class="widget-footer">
557     <a href="%s">
558     %s
559     </a>
560     </div>
561     ';
562    
563     /**
564     * Si il y a des dossiers à afficher, alors on affiche le widget.
565     */
566     // On construit le contenu du tableau
567     $ct_tbody = '';
568     while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
569     // On construit l'attribut href du lien
570     $ct_href = sprintf(
571     $template_href,
572     // idx
573     $row["dossier"]
574     );
575     // On construit la ligne
576     $ct_tbody .= sprintf(
577     $template_line,
578     // Colonne 1 - Numéro de dossier
579     sprintf(
580     $template_link,
581     $ct_href,
582     $row["dossier_libelle"]
583     ),
584     // Colonne 2 - Nom du pétitionnaire
585     sprintf(
586     $template_link,
587     $ct_href,
588     $row["nom_petitionnaire"]
589     ),
590     // Colonne 3 - Date limite
591     sprintf(
592     $template_link,
593     $ct_href,
594     $this->f->formatDate($row["date_limite_na"])
595     ),
596     // Colonne 4 - Enjeu
597     sprintf(
598     $template_link,
599     $ct_href,
600     $row["enjeu"]
601     )
602     );
603     }
604     // Affichage du tableau listant les dossiers
605     printf(
606     $template_table,
607     // Colonne 1 - Numéro de dossier
608     _('dossier'),
609     // Colonne 2 - Nom du pétitionnaire
610     _('nom_petitionnaire'),
611     // Colonne 3 - Date limite
612     _('date_limite'),
613     // Colonne 4 - Enjeu
614     _('enjeu'),
615     // Contenu du tableau
616     $ct_tbody
617     );
618     // Affichage du footer
619     printf(
620     $template_footer,
621     // href (avec les paramètres du widget)
622     sprintf(
623     "../scr/tab.php?obj=dossiers_limites&nombre_de_jours=%s&codes_datd=%s&filtre=%s",
624     $nombre_de_jours,
625     (is_null($codes_datd) ? "" : implode(";",$codes_datd)),
626     $filtre
627     ),
628     // titre
629     _("Voir +")
630     );
631     }
632    
633     /**
634     * Cet méthode permet de formater, la chaîne de caractères reçue du
635     * paramétrage du widget en un tableau de valeurs dont les clés
636     * correspondent aux clés passées en paramètre.
637     *
638     * @param string $content
639     * @param array $params
640     *
641     * @return array
642     */
643     function get_arguments($content = null, $params = array()) {
644     //
645     $arguments = array();
646     // On explose les paramètres reçus avec un élément par ligne
647     $params_tmp1 = explode("\n", $content);
648     // On boucle sur chaque ligne de paramètre
649     foreach ($params_tmp1 as $key => $value) {
650     // On explose le paramètre de sa valeur avec le séparateur '='
651     $params_tmp2[] = explode("=", $value);
652     }
653     // On boucle sur chaque paramètre reçu pour vérifier si la valeur reçue
654     // est acceptable ou non
655     foreach ($params_tmp2 as $key => $value) {
656     //
657     if (!isset($value[0]) || !isset($value[1])) {
658     continue;
659     }
660     //
661     if (in_array(trim($value[0]), $params)) {
662     $arguments[trim($value[0])] = trim($value[1]);
663     }
664     }
665     //
666     return $arguments;
667     }
668    
669     }
670    
671     ?>

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26