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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9245 - (show annotations)
Fri Apr 3 09:21:03 2020 UTC (4 years, 8 months ago) by softime
File size: 289684 byte(s)
* Merge de la branche d'intégration 4.13.0-develop dans le trunk

1 <?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 PATH_OPENMAIRIE."obj/om_widget.class.php";
13
14 class om_widget extends om_widget_core {
15
16 /**
17 *
18 */
19 var $template_help = '<div class="widget-help"><span class="info-16" title="%s"></span></div>';
20
21 /**
22 *
23 */
24 var $template_footer = '
25 <div class="widget-footer">
26 <a href="%s">
27 %s
28 </a>
29 </div>
30 ';
31
32 /**
33 * Cette méthode retourne un arbre html représentant un raccourci.
34 *
35 * Un raccourci est composé d'un lien, d'une image et d'une description.
36 * Voir les widgets :
37 * - widget_nouvelle_demande_autre_dossier
38 * - widget_nouvelle_demande_dossier_encours
39 * - widget_nouvelle_demande_nouveau_dossier
40 */
41 function get_display_widget_shortlink($config) {
42 return sprintf (
43 '<a href="%s"><span><img src="%s" align="left" alt="%s" />%s</span></a>',
44 $config["a_href"],
45 $config["img_src"],
46 $config["img_alt"],
47 $config["a_content"]
48 );
49 }
50
51 /**
52 * WIDGET DASHBOARD - widget_nouvelle_demande_autre_dossier.
53 */
54 function view_widget_nouvelle_demande_autre_dossier($content = null) {
55 echo $this->get_display_widget_shortlink(array(
56 "a_href" => OM_ROUTE_TAB."&obj=demande_autre_dossier",
57 "img_src" => "../app/img/dossier-existant.png",
58 "img_alt" => _("Autres dossiers"),
59 "a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours ou une autorisation existante"),
60 ));
61 }
62
63 /**
64 * WIDGET DASHBOARD - widget_nouvelle_demande_dossier_encours.
65 */
66 function view_widget_nouvelle_demande_dossier_encours($content = null) {
67 echo $this->get_display_widget_shortlink(array(
68 "a_href" => OM_ROUTE_TAB."&obj=demande_dossier_encours",
69 "img_src" => "../app/img/dossier-existant.png",
70 "img_alt" => _("Dossier en cours"),
71 "a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours"),
72 ));
73 }
74
75 /**
76 * WIDGET DASHBOARD - widget_nouvelle_demande_nouveau_dossier.
77 */
78 function view_widget_nouvelle_demande_nouveau_dossier($content = null) {
79 $params = array("contexte");
80 // Formatage des arguments reçus en paramètres
81 $arguments = $this->get_arguments($content, $params);
82 $arguments_default = array(
83 "contexte" => "standard"
84 );
85 // Vérification des arguments
86 foreach ($arguments_default as $key => $value) {
87 //
88 if (isset($arguments[$key])) {
89 //
90 $elem = trim($arguments[$key]);
91 //
92 if ($key === "contexte"
93 && in_array($elem, array("standard", "contentieux"))) {
94 // La valeur doit être dans cette liste
95 $arguments[$key] = $elem;
96 continue;
97 }
98 }
99 //
100 $arguments[$key] = $value;
101 }
102 $contexte = $arguments["contexte"];
103 $widget_config = array(
104 "a_href" => OM_ROUTE_FORM."&obj=demande_nouveau_dossier&amp;action=0&amp;advs_id=&amp;tricol=&amp;valide=&amp;retour=tab&amp;new=",
105 "img_src" => "../app/img/dossier-nouveau.png",
106 "img_alt" => _("Nouveau dossier"),
107 "a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant le depot d'un nouveau dossier"),
108 );
109 if ($contexte == "contentieux") {
110 $widget_config["a_href"] = OM_ROUTE_FORM."&obj=demande_nouveau_dossier_contentieux&amp;action=0&amp;advs_id=&amp;tricol=&amp;valide=&amp;retour=tab&amp;new=";
111 }
112 echo $this->get_display_widget_shortlink($widget_config);
113 }
114
115 /**
116 * WIDGET DASHBOARD - widget_recherche_dossier.
117 *
118 * Quatre cas d'utilisation :
119 * - 1 - La valeur recherchée correspond exactement au code d'un DI,
120 * alors on accède directement à la fiche de visualisation du DI.
121 * - 2 - La valeur recherchée renvoi plusieurs DI, alors on accède au
122 * listing des dossiers d'instruction avec le formulaire de
123 * recherche avancée pré-rempli avec la valeur saisie.
124 * - 3 - La valeur recherchée renvoi aucun enregistrement, alors on
125 * affiche un message en ce sens directement dans le widget.
126 * - 4 - Aucune valeur n'est saisie, alors on affiche un message en ce
127 * sens directement dans le widget.
128 *
129 * @return void
130 */
131 function view_widget_recherche_dossier($content = null) {
132
133 /**
134 * Traitement de la validation du formulaire
135 */
136 //
137 if ($this->f->get_submitted_post_value("validation") != null
138 && $this->f->get_submitted_post_value("dossier") === '') {
139
140 //
141 // AUCUNE VALEUR SAISIE
142 //
143
144 // Cas d'utilisation n°4
145 // Affiche un message d'erreur
146 $erreur = _("Veuillez saisir un No de dossier.");
147 }
148 //
149 if ($this->f->get_submitted_post_value("validation") != null
150 && $this->f->get_submitted_post_value("dossier") !== null
151 && $this->f->get_submitted_post_value("dossier") !== '') {
152 //
153 $list_dossiers = $this->execute_recherche_dossier();
154
155 $total_dossiers = count($list_dossiers);
156 // Si on obtient un seul résultat
157 if ($total_dossiers == 1) {
158 // On reformate le dossier
159 $dossier = strtoupper(str_replace(' ', '', $list_dossiers[0]));
160 // On redirige vers le listing des DI
161 echo '
162 <script type="text/javascript" >
163 widget_recherche_dossier(\''.$dossier.'\', 1, \'dossier_instruction\');
164 </script>
165 ';
166 // On arrête l'exécution du script car l'utilisateur a été
167 // redirigé vers un autre script
168 exit();
169 }
170 // Si on obtient plusieurs résultats
171 if ($total_dossiers > 1) {
172 // Mémorisation de la recherche
173 $search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier"));
174 // Ajout d'une étoile au début s'il n'y en n'a pas.
175 // Par defaut * est toujours ajouté à la fin des recherches.
176 if (substr($search, 0, 1) != '*') {
177 $search = '*'.$search;
178 }
179 // On redirige vers le listing des DI
180 //
181 echo '
182 <script type="text/javascript" >
183 widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.', \'dossier_instruction\');
184 </script>
185 ';
186 // On arrête l'exécution du script car l'utilisateur a été
187 // redirigé vers un autre script
188 exit();
189 }
190 // Cas d'utilisation n°3
191 // Si aucun dossier trouve
192 // Affiche un message d'erreur
193 $erreur = _("Aucun dossier trouvé.");
194 }
195
196 /**
197 * Affichage du widget
198 */
199 // Affichage du message d'informations
200 printf(
201 '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
202 _("Permet la recherche directe de dossiers d'instruction.\n\n".
203 "Deux modes de saisie sont possibles :\n".
204 "- 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".
205 "- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.")
206 );
207 // Ouverture du form
208 echo "\t<form method=\"post\" id=\"widget_recherche_dossier_form\" action=\"".OM_ROUTE_DASHBOARD."\">\n";
209 // Affichage d'un éventuel message d'erreur
210 if (isset($erreur) && $erreur != "") {
211 $class = "error";
212 $this->f->displayMessage($class, $erreur);
213 }
214 // Configuration du formulaire de recherche
215 $champs = array("dossier");
216 $form = $this->f->get_inst__om_formulaire(array(
217 "validation" => 0,
218 "maj" => 0,
219 "champs" => $champs,
220 ));
221 $form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>');
222 $form->setType("dossier", "text");
223 $form->setTaille("dossier", 20);
224 $form->setMax("dossier", 250);
225 // Affichage du formulaire
226 $form->entete();
227 $form->afficher($champs, 0, false, false);
228 $form->enpied();
229 // Affichage des contrôles du formulaire
230 echo "\t<div class=\"formControls\">\n";
231 echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
232 value=\""._("Valider")."\" name=\"validation\" />\n";
233 echo "\t</div>\n";
234 // Fermeture du form
235 echo "\t</form>\n";
236 }
237
238
239 /**
240 * WIDGET DASHBOARD - widget_recherche_dossier_par_type.
241 *
242 * Le widget de recherche accès direct par type est similaire au widget de recherche
243 * accès direct classique. Il permet en plus de choisir la portée de la recherche par
244 * le biais d'un select : ADS ou RE* ou IN.
245 * Selon le type de dossier choisi, lors de la recherche la redirection se fera vers
246 * le menu Instruction ou Contentieux.
247 *
248 * @return void
249 */
250 function view_widget_recherche_dossier_par_type($content = null) {
251
252 /**
253 * Traitement de la validation du formulaire
254 */
255 if ($this->f->get_submitted_post_value("validation") != null
256 && $this->f->get_submitted_post_value("dossier") !== null
257 && $this->f->get_submitted_post_value("dossier") == '') {
258
259 // AUCUNE VALEUR SAISIE
260 // Affiche un message d'erreur
261 $erreur = _("Veuillez saisir un No de dossier.");
262 }
263 //
264 if ($this->f->get_submitted_post_value("validation") != null
265 && $this->f->get_submitted_post_value("dossier") !== null
266 && $this->f->get_submitted_post_value("dossier") != '') {
267 //
268 $list_dossiers = $this->execute_recherche_dossier("type");
269 $posted_type_dossier = $this->f->get_submitted_post_value("type_dossier_recherche");
270 // Définition des objets sur lesquels la redirection se fera
271 if ($posted_type_dossier === "ADS") {
272 $obj = "dossier_instruction";
273 }
274 if ($posted_type_dossier === "RE*") {
275 $obj = "dossier_contentieux_tous_recours";
276 }
277 if ($posted_type_dossier === "IN") {
278 $obj = "dossier_contentieux_toutes_infractions";
279 }
280 $total_dossiers = count($list_dossiers);
281 // Si on obtient un seul résultat
282 if ($total_dossiers == 1) {
283 // On reformate le dossier
284 $dossier = strtoupper(str_replace(' ', '', $list_dossiers[0]));
285 // On redirige vers le listing des DI
286 echo '
287 <script type="text/javascript" >
288 widget_recherche_dossier(\'' . $dossier . '\', 1, \'' . $obj . '\');
289 </script>
290 ';
291 // On arrête l'exécution du script car l'utilisateur a été
292 // redirigé vers un autre script
293 exit();
294 }
295 // Si on obtient plusieurs résultats
296 if ($total_dossiers > 1) {
297 // Mémorisation de la recherche
298 $search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier"));
299 // Ajout d'une étoile au début s'il n'y en n'a pas.
300 // Par defaut * est toujours ajouté à la fin des recherches.
301 if (substr($search, 0, 1) != '*') {
302 $search = '*'.$search;
303 }
304 // On redirige vers le listing des DI
305 //
306 echo '
307 <script type="text/javascript" >
308 widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.', \'' . $obj . '\');
309 </script>
310 ';
311 // On arrête l'exécution du script car l'utilisateur a été
312 // redirigé vers un autre script
313 exit();
314 }
315 // Si aucun dossier trouve
316 // Affiche un message d'erreur
317 $erreur = _("Aucun dossier trouvé.");
318 }
319
320 /**
321 * Affichage du widget
322 */
323 // Liste des paramètres
324 $params = array("type_defaut", );
325 // Initialisation du tableau des paramètres avec ses valeur par défaut
326 $arguments_default = array(
327 "type_defaut" => "ADS",
328 );
329 $arguments = $this->get_arguments($content, $params);
330
331 // Vérification des arguments
332 foreach ($arguments_default as $key => $value) {
333 //
334 if (isset($arguments[$key])) {
335 //
336 $elem = trim($arguments[$key]);
337 //
338 if ($key === "type_defaut"
339 && in_array($elem, array("ADS", "RE*", "IN"))) {
340 // La valeur doit être dans cette liste
341 $arguments[$key] = $elem;
342 continue;
343 }
344 }
345 //
346 $arguments[$key] = $value;
347 }
348 //
349 $type_defaut = $arguments["type_defaut"];
350
351 // Affichage du message d'informations
352 printf(
353 '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
354 _("Permet la recherche directe de dossiers d'instruction, avec choix de la portée de la recherche : ADS ou RE* ou IN.\n".
355 "La sélection de la famille de dossier filtre les résultats et conditionne la redirection de l'utilisateur :\n".
356 "- ADS : Instruction > Dossiers d'instruction > Recherche\n".
357 "- RE* : Contentieux > Recours > Tous les Recours \n".
358 "- IN : Contentieux > Infractions > Toutes les Infractions\n\n".
359 "Deux modes de saisie sont possibles :\n".
360 "- 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".
361 "- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.")
362 );
363 // Ouverture du form
364 echo "\t<form method=\"post\" id=\"widget_recherche_dossier_par_type_form\" action=\"".OM_ROUTE_DASHBOARD."\">\n";
365 // Affichage d'un éventuel message d'erreur
366 if (isset($erreur) && $erreur != "") {
367 $class = "error";
368 $this->f->displayMessage($class, $erreur);
369 }
370 // Configuration du formulaire de recherche
371 $champs = array("dossier", "type_dossier_recherche");
372 $form = $this->f->get_inst__om_formulaire(array(
373 "validation" => 0,
374 "maj" => 0,
375 "champs" => $champs,
376 ));
377 $form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>');
378 $form->setType("dossier", "text");
379 $form->setTaille("dossier", 20);
380 $form->setMax("dossier", 250);
381
382 // Définition des types de dossiers visibles dans le select
383 $options[0] = array("ADS",
384 "RE*",
385 "IN");
386 $options[1] = array(
387 _("ADS"),
388 _("RE*"),
389 _("IN"));
390
391 $form->setType("type_dossier_recherche", "select");
392 $form->setLib("om_profil", _("Tableau de bord pour le profil"));
393 $form->setSelect('type_dossier_recherche', $options);
394 $form->setVal('type_dossier_recherche', $type_defaut);
395 $form->setLib('type_dossier_recherche', 'Type de dossier');
396
397 // Affichage du formulaire
398 $form->entete();
399 $form->afficher($champs, 0, false, false);
400 $form->enpied();
401 // Affichage des contrôles du formulaire
402 echo "\t<div class=\"formControls\">\n";
403 echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
404 value=\""._("Valider")."\" name=\"validation\" />\n";
405 echo "\t</div>\n";
406 // Fermeture du form
407 echo "\t</form>\n";
408 }
409
410
411 /**
412 * Méthode générique exécutant une recherche par numéro de dossier dans 2 contextes
413 * différents :
414 * - le widget de recherche classique
415 * - le widget de recherche avec choix du type/groupe de dossier
416 *
417 * @param string $filtre Indique si un filtre supplémentaire doit être appliqué à la
418 * recherche de dossier. Seule valeur possible : "type".
419 *
420 * @return string $error_message Le message d'erreur s'il y en a un, sinon chaîne vide
421 */
422 protected function execute_recherche_dossier($filtre = null) {
423
424 // Traitement des valeurs postées
425 $posted_dossiers = $this->f->db->escapesimple(strtolower(str_replace("*", "%", $this->f->get_submitted_post_value("dossier"))));
426 $posted_dossiers = str_replace(';', ',', $posted_dossiers);
427
428 //
429 // UNE VALEUR SAISIE
430 //
431
432 // WHERE - Filtre Collectivité
433 $query_ct_where_collectivite = "";
434 // Si collectivité utilisateur mono alors filtre sur celle-ci
435 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
436 //
437 $query_ct_where_collectivite = " AND dossier.om_collectivite=".$_SESSION['collectivite'];
438 }
439
440 // WHERE - Filtre par groupe
441 $query_ct_where_groupe = "";
442 $query_ct_where_type_da = "";
443 $query_ct_from = "";
444 $query_ct_where_common = "";
445 $posted_type_dossier = $this->f->get_submitted_post_value("type_dossier_recherche");
446 // La variable $posted_type_dossier vaut null si on est dans le contexte du widget
447 // de recherche de dossier classique (sans choix du type)
448 if ($posted_type_dossier === null OR $posted_type_dossier === "ADS") {
449 $query_ct_from = "
450 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
451 ON dossier.dossier_autorisation =
452 dossier_autorisation.dossier_autorisation
453 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
454 ON dossier_autorisation.dossier_autorisation_type_detaille =
455 dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
456 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
457 ON dossier_autorisation_type_detaille.dossier_autorisation_type =
458 dossier_autorisation_type.dossier_autorisation_type
459 LEFT JOIN ".DB_PREFIXE."groupe
460 ON dossier_autorisation_type.groupe = groupe.groupe";
461 //
462 $query_ct_where_groupe = "
463 AND groupe.code != 'CTX'
464 ";
465 }
466 if ($posted_type_dossier === "RE*" OR $posted_type_dossier === "IN") {
467 $query_ct_from = "
468 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
469 ON dossier.dossier_autorisation =
470 dossier_autorisation.dossier_autorisation
471 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
472 ON dossier_autorisation.dossier_autorisation_type_detaille =
473 dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
474 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
475 ON dossier_autorisation_type_detaille.dossier_autorisation_type =
476 dossier_autorisation_type.dossier_autorisation_type
477 ";
478 if ($posted_type_dossier === "RE*") {
479 $posted_type_dossier = "RE";
480 }
481 $query_ct_where_type_da = "
482 AND dossier_autorisation_type.code = '". $posted_type_dossier . "'
483 ";
484 }
485
486 // Gestion des groupes et confidentialité
487 include('../sql/pgsql/filter_group_widgets.inc.php');
488
489 // Construction de la requête
490 // Pour chaque dossier on cherche sur les deux champs du code du
491 // dossier (un avec et un sans espaces)
492 $posted_dossiers = explode(',', $posted_dossiers);
493 $liste_dossiers = array();
494 foreach ($posted_dossiers as $posted_dossier) {
495 $sql = "
496 SELECT
497 dossier
498 FROM
499 " . DB_PREFIXE . "dossier
500 " . $query_ct_from . "
501 WHERE
502 (LOWER(dossier.dossier) LIKE '%".$posted_dossier."%'
503 OR LOWER(dossier.dossier_libelle) LIKE '%".$posted_dossier."%' )
504 ";
505 $sql .= $query_ct_where_collectivite . $query_ct_where_type_da . $query_ct_where_groupe;
506 // Exécution de la requête
507 $res = $this->f->db->query($sql);
508 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
509 $this->f->isDatabaseError($res);
510 // On récupère les numéros de dossier dans les résultats
511 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
512 $liste_dossiers[] = $row['dossier'];
513 }
514 }
515
516 return $liste_dossiers;
517 }
518
519
520 /**
521 * Cette méthode permet de récupérer la configuration du widget 'Dossiers
522 * limites'.
523 *
524 * @return array
525 */
526 function get_config_dossiers_limites($arguments) {
527 // Initialisation du tableau des paramètres avec ses valeur par défaut
528 $arguments_default = array(
529 "nombre_de_jours" => 15,
530 "codes_datd" => null,
531 "filtre" => "instructeur",
532 "restreindre_aux_tacites" => null,
533 );
534 // Vérification des arguments
535 foreach ($arguments_default as $key => $value) {
536 //
537 if (isset($arguments[$key])) {
538 //
539 $elem = trim($arguments[$key]);
540 //
541 if ($key === "nombre_de_jours"
542 && intval($elem) > 0) {
543 // Ce doit être un entier
544 $arguments[$key] = intval($elem);
545 continue;
546 } elseif ($key === "codes_datd"
547 && $elem != "") {
548 // Ce doit être un tableau
549 $arguments[$key] = explode(";", $elem);
550 continue;
551 } elseif ($key === "filtre"
552 && in_array($elem, array("instructeur", "division", "aucun"))) {
553 // La valeur doit être dans cette liste
554 $arguments[$key] = $elem;
555 continue;
556 } elseif ($key === "restreindre_aux_tacites"
557 && in_array($elem, array("true", "false"))) {
558 // La valeur doit être dans cette liste
559 $arguments[$key] = $elem;
560 continue;
561 }
562 }
563 //
564 $arguments[$key] = $value;
565 }
566 //
567 $nombre_de_jours = $arguments["nombre_de_jours"];
568 $codes_datd = $arguments["codes_datd"];
569 $filtre = $arguments["filtre"];
570 $restreindre_aux_tacites = $arguments["restreindre_aux_tacites"];
571
572 /**
573 * Construction de la requête
574 */
575 // SELECT
576 $query_ct_select = "
577 dossier.dossier,
578 dossier.dossier_libelle,
579 dossier.date_limite,
580 dossier.date_limite_incompletude,
581 CASE
582 WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE
583 THEN to_char(dossier.date_limite_incompletude, 'DD/MM/YYYY')
584 ELSE
585 to_char(dossier.date_limite, 'DD/MM/YYYY')
586 END as date_limite_na,
587 COALESCE(
588 demandeur.particulier_nom,
589 demandeur.personne_morale_denomination
590 ) AS nom_petitionnaire,
591 CASE
592 WHEN dossier.enjeu_erp is TRUE
593 THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_erp-16'' title=''"._('Enjeu ERP')."''>ERP</span>'
594 ELSE
595 ''
596 END
597 ||
598 CASE
599 WHEN dossier.enjeu_urba is TRUE
600 THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_urba-16'' title=''"._('Enjeu Urba')."''>URBA</span>'
601 ELSE
602 ''
603 END AS enjeu
604 ";
605 // SELECT - CHAMPAFFICHE
606 $query_ct_select_champaffiche = array(
607 'dossier.dossier as "'._("dossier").'"',
608 'dossier.dossier_libelle as "'._("dossier").'"',
609 'COALESCE(
610 demandeur.particulier_nom,
611 demandeur.personne_morale_denomination
612 ) AS "'._("nom_petitionnaire").'"',
613 'CASE
614 WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE
615 THEN to_char(dossier.date_limite_incompletude, \'DD/MM/YYYY\')
616 ELSE
617 to_char(dossier.date_limite, \'DD/MM/YYYY\')
618 END as "'._("date_limite").'"',
619 'CASE
620 WHEN dossier.enjeu_erp is TRUE
621 THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_erp-16" title="'._('Enjeu ERP').'">ERP</span>\'
622 ELSE
623 \'\'
624 END
625 ||
626 CASE
627 WHEN dossier.enjeu_urba is TRUE
628 THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_urba-16" title="'._('Enjeu Urba').'">URBA</span>\'
629 ELSE
630 \'\'
631 END AS "'._("enjeu").'"',
632 // XXX Attention cette colonne est cachée en css est doit donc restée la dernière du tableau
633 'CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
634 dossier.date_limite_incompletude ELSE
635 dossier.date_limite END as date_limite_na',
636 );
637 // FROM
638 $query_ct_from = "
639 ".DB_PREFIXE."dossier
640 LEFT JOIN ".DB_PREFIXE."etat
641 ON dossier.etat = etat.etat
642 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
643 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
644 LEFT JOIN ".DB_PREFIXE."demandeur
645 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
646 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
647 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
648 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
649 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
650 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
651 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
652 %s
653 %s
654 %s
655 ";
656
657 $query_ct_where_instructeur_filter = "";
658 $query_ct_where_division_filter = "";
659 $query_ct_where_collectivite_filter = "";
660 // Filtre sur les dossiers qui concernent l'utilisateur
661 if ($filtre == "instructeur") {
662 //
663 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
664 ON dossier.instructeur=instructeur.instructeur
665 JOIN ".DB_PREFIXE."om_utilisateur
666 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
667 AND om_utilisateur.login='".$_SESSION['login']."'
668 ";
669 } else {
670 $query_ct_where_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
671 ON dossier.instructeur=instructeur.instructeur
672 LEFT JOIN ".DB_PREFIXE."om_utilisateur
673 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
674 }
675 // Filtre sur les dossier de la division
676 if ($filtre == "division") {
677 //
678 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
679 ON dossier.division=division.division
680 AND division.division = ".$_SESSION['division']."
681 ";
682 } else {
683 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
684 ON dossier.division=division.division";
685 }
686 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
687 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
688 // collectivité
689 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
690 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
691 ON dossier.om_collectivite=om_collectivite.om_collectivite
692 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
693 ";
694 } else {
695 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
696 ON dossier.om_collectivite=om_collectivite.om_collectivite
697 ";
698 }
699
700 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
701 // WHERE - COMMON
702 $query_ct_where_common = "
703 groupe.code != 'CTX'
704 AND
705 (
706 (
707 dossier.incomplet_notifie IS FALSE
708 AND date_limite <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day'
709 )
710 OR
711 (
712 dossier.incomplet_notifie IS TRUE
713 AND dossier.incompletude IS TRUE
714 AND date_limite_incompletude <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day'
715 )
716 )
717 AND etat.statut != 'cloture'
718 AND dossier.avis_decision IS NULL
719 ";
720 // WHERE - TACITE
721 // Filtre sur le caractère tacite
722 $query_ct_where_tacite_filter = '';
723 if (is_null($restreindre_aux_tacites) === false
724 && $restreindre_aux_tacites === 'true') {
725 //
726 //
727 $query_ct_where_tacite_filter = " AND LOWER(dossier.accord_tacite) = 'oui' ";
728 }
729 // WHERE - DATD
730 // Filtre sur le type détaillé des dossiers
731 $query_ct_where_datd_filter = "";
732 if (!is_null($codes_datd)
733 && is_array($codes_datd)
734 && count($codes_datd) != 0) {
735 //
736 $sql_codes = "";
737 //
738 foreach ($codes_datd as $code) {
739 $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
740 }
741 $sql_codes = substr($sql_codes, 0, count($sql_codes) - 4);
742 //
743 $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
744 }
745 // ORDER BY
746 $query_ct_orderby = "
747 date_limite_na
748 ";
749
750 $query_ct_where_groupe = "";
751 // Gestion des groupes et confidentialité
752 include('../sql/pgsql/filter_group_widgets.inc.php');
753
754 /**
755 * Message d'aide
756 */
757 //
758 $message_restreindre_aux_tacites = '';
759 //
760 if (is_null($restreindre_aux_tacites) === false
761 && $restreindre_aux_tacites === 'true') {
762 //
763 $message_restreindre_aux_tacites = " "._("avec tacite automatique");
764 }
765 //
766 $message_filtre = "";
767 //
768 switch($filtre) {
769 case "instructeur" :
770 $message_filtre = " "._("(filtrés par instructeur)");
771 break;
772 case "division" :
773 $message_filtre = " "._("(filtrés par division)");
774 break;
775 }
776 //
777 $message_help = sprintf(
778 _("Les dossiers%s%s sur lesquels aucune décision n'a été prise et dont la date limite est dans moins de %s jours%s."),
779 (is_null($codes_datd) ? "": " (".implode(";",$codes_datd).")"),
780 $message_restreindre_aux_tacites,
781 $nombre_de_jours,
782 $message_filtre
783 );
784
785 /**
786 * Return
787 */
788 //
789 return array(
790 "arguments" => $arguments,
791 "message_help" => $message_help,
792 "query_ct_select" => $query_ct_select,
793 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
794 "query_ct_from" => $query_ct_from,
795 "query_ct_where_common" => $query_ct_where_common,
796 "query_ct_where_tacite_filter" => $query_ct_where_tacite_filter,
797 "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
798 "query_ct_where_groupe" => $query_ct_where_groupe,
799 "query_ct_orderby" => $query_ct_orderby,
800 );
801 }
802
803 /**
804 * WIDGET DASHBOARD - Dossiers limites
805 *
806 * @return void
807 */
808 function view_widget_dossiers_limites($content = null) {
809
810 /**
811 * Ce widget est configurable via l'interface Web. Lors de la création
812 * du widget dans le paramétrage il est possible de spécifier la ou les
813 * options suivantes :
814 *
815 * - nombre_de_jours : c'est le délai en jours avant la date limite à
816 * partir duquel on souhaite voir apparaître les dossiers dans le
817 * widget.
818 * (default) Par défaut la valeur est 15 jours.
819 *
820 * - codes_datd : la liste des types de dossiers à afficher. exemple :
821 * "PCI;PCA;DPS;CUa;CUb".
822 * (default) Par défaut tous les types sont affichés. [null]
823 *
824 * - filtre :
825 * = instructeur
826 * = division
827 * = aucun
828 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
829 *
830 * - restreindre_aux_tacites : permet d'afficher seulement les dossiers
831 * d'instruction dont le caractère tacite est actif.
832 */
833 // Liste des paramètres
834 $params = array("nombre_de_jours", "codes_datd", "filtre", "restreindre_aux_tacites", );
835 // Formatage des arguments reçus en paramètres
836 $arguments = $this->get_arguments($content, $params);
837 // Récupération de la configuration du widget
838 $conf = $this->get_config_dossiers_limites($arguments);
839 //
840 $nombre_de_jours = $conf["arguments"]["nombre_de_jours"];
841 $codes_datd = $conf["arguments"]["codes_datd"];
842 $filtre = $conf["arguments"]["filtre"];
843 $restreindre_aux_tacites = $conf['arguments']['restreindre_aux_tacites'];
844
845 /**
846 * Composition de la requête
847 */
848 //
849 $query = sprintf("
850 SELECT
851 %s
852 FROM
853 %s
854 WHERE
855 %s
856 %s
857 %s
858 %s
859 ORDER BY
860 %s
861 LIMIT 10",
862 $conf["query_ct_select"],
863 $conf["query_ct_from"],
864 $conf["query_ct_where_common"],
865 $conf["query_ct_where_tacite_filter"],
866 $conf["query_ct_where_datd_filter"],
867 $conf["query_ct_where_groupe"],
868 $conf["query_ct_orderby"]
869 );
870
871 /**
872 * Exécution de la requête
873 */
874 //
875 $res = $this->f->db->query($query);
876 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
877 $this->f->isDatabaseError($res);
878
879 // Affichage du message d'informations
880 printf(
881 $this->template_help,
882 $conf["message_help"]
883 );
884
885 /**
886 * Si il n'y a aucun dossier à afficher, alors on affiche un message
887 * clair à l'utilisateur et on sort de la vue.
888 */
889 // Si il n'y a aucun dossier à afficher
890 if ($res->numrows() == 0) {
891 // Affichage du message d'informations
892 echo _("Vous n'avez pas de dossiers limites pour le moment.");
893 // Exit
894 return;
895 }
896
897 /**
898 * Template nécessaires à l'affichage du widget
899 */
900 //
901 $template_table = '
902 <table class="tab-tab">
903 <thead>
904 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
905 <th class="title col-0 firstcol">
906 <span class="name">
907 %s
908 </span>
909 </th>
910 <th class="title col-1">
911 <span class="name">
912 %s
913 </span>
914 </th>
915 <th class="title col-2">
916 <span class="name">
917 %s
918 </span>
919 </th>
920 <th class="title col-3 lastcol">
921 <span class="name">
922 %s
923 </span>
924 </th>
925 </tr>
926 </thead>
927 <tbody>
928 %s
929 </tbody>
930 </table>
931 ';
932 //
933 $template_line = '
934 <tr class="tab-data odd">
935 <td class="col-1 firstcol">
936 %s
937 </td>
938 <td class="col-1">
939 %s
940 </td>
941 <td class="col-2">
942 %s
943 </td>
944 <td class="col-3 lastcol">
945 %s
946 </td>
947 </tr>
948 ';
949 //
950 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&amp;action=3&amp;idx=%s';
951 //
952 $template_link = '
953 <a class="lienTable" href="%s">
954 %s
955 </a>
956 ';
957
958 /**
959 * Si il y a des dossiers à afficher, alors on affiche le widget.
960 */
961 // On construit le contenu du tableau
962 $ct_tbody = '';
963 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
964 // On construit l'attribut href du lien
965 $ct_href = sprintf(
966 $template_href,
967 // idx
968 $row["dossier"]
969 );
970 // On construit la ligne
971 $ct_tbody .= sprintf(
972 $template_line,
973 // Colonne 1 - Numéro de dossier
974 sprintf(
975 $template_link,
976 $ct_href,
977 $row["dossier_libelle"]
978 ),
979 // Colonne 2 - Nom du pétitionnaire
980 sprintf(
981 $template_link,
982 $ct_href,
983 $row["nom_petitionnaire"]
984 ),
985 // Colonne 3 - Date limite
986 sprintf(
987 $template_link,
988 $ct_href,
989 $this->f->formatDate($row["date_limite_na"])
990 ),
991 // Colonne 4 - Enjeu
992 sprintf(
993 $template_link,
994 $ct_href,
995 $row["enjeu"]
996 )
997 );
998 }
999 // Affichage du tableau listant les dossiers
1000 printf(
1001 $template_table,
1002 // Colonne 1 - Numéro de dossier
1003 _('dossier'),
1004 // Colonne 2 - Nom du pétitionnaire
1005 _('nom_petitionnaire'),
1006 // Colonne 3 - Date limite
1007 _('date_limite'),
1008 // Colonne 4 - Enjeu
1009 _('enjeu'),
1010 // Contenu du tableau
1011 $ct_tbody
1012 );
1013 // Affichage du footer
1014 printf(
1015 $this->template_footer,
1016 // href (avec les paramètres du widget)
1017 sprintf(
1018 OM_ROUTE_TAB."&obj=dossiers_limites&nombre_de_jours=%s&codes_datd=%s&filtre=%s&restreindre_aux_tacites=%s",
1019 $nombre_de_jours,
1020 (is_null($codes_datd) ? "" : implode(";",$codes_datd)),
1021 $filtre,
1022 $restreindre_aux_tacites
1023 ),
1024 // titre
1025 _("Voir +")
1026 );
1027 }
1028
1029
1030 /**
1031 * Cette méthode permet de récupérer la configuration du widget 'Mes
1032 * recours'.
1033 *
1034 * @return array
1035 */
1036 function get_config_dossier_contentieux_recours($arguments) {
1037 // Initialisation du tableau des paramètres avec ses valeur par défaut
1038 $arguments_default = array(
1039 "filtre" => "instructeur"
1040 );
1041 // Vérification des arguments
1042 foreach ($arguments_default as $key => $value) {
1043 //
1044 if (isset($arguments[$key])) {
1045 //
1046 $elem = trim($arguments[$key]);
1047 //
1048 if ($key === "filtre"
1049 && in_array($elem, array("instructeur", "aucun"))) {
1050 // La valeur doit être dans cette liste
1051 $arguments[$key] = $elem;
1052 continue;
1053 }
1054 }
1055 //
1056 $arguments[$key] = $value;
1057 }
1058 $filtre = $arguments["filtre"];
1059
1060 // SELECT - CHAMPAFFICHE
1061 //
1062 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
1063 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
1064 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
1065 END";
1066 //
1067 $trim_concat_terrain ='TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
1068 dossier.terrain_adresse_voie,\' \',
1069 dossier.terrain_adresse_lieu_dit,\' \',
1070 dossier.terrain_adresse_code_postal,\' \',
1071 dossier.terrain_adresse_localite,\' \',
1072 dossier.terrain_adresse_bp,\' \',
1073 dossier.terrain_adresse_cedex
1074 )) as "'._("localisation").'"';
1075 //
1076 $case_requerant = "
1077 CASE WHEN demandeur_requerant.qualite = 'particulier'
1078 THEN TRIM(CONCAT(demandeur_requerant.particulier_nom, ' ', demandeur_requerant.particulier_prenom))
1079 ELSE TRIM(CONCAT(demandeur_requerant.personne_morale_raison_sociale, ' ', demandeur_requerant.personne_morale_denomination))
1080 END
1081 ";
1082 //
1083 $query_ct_select_champaffiche = array(
1084 'dossier.dossier as "'._("dossier").'"',
1085 'dossier.dossier_libelle as "'._("dossier").'"',
1086 'dossier_autorisation_type_detaille.libelle as "'._("type de dossier").'"',
1087 'dossier_autorisation_contestee.dossier_libelle as "'._("autorisation").'"',
1088 $case_demandeur.' as "'._("petitionnaire").'"',
1089 $trim_concat_terrain,
1090 $case_requerant.' as "'._("requerant").'"',
1091 'donnees_techniques.ctx_reference_dsj as "'._("ctx_reference_dsj").'"',
1092 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'._("date de recours").'"',
1093 'avis_decision.libelle as "'._("decision").'"',
1094 'etat.libelle as "'._("etat").'"',
1095 );
1096
1097 /**
1098 * Construction de la requête
1099 */
1100 // SELECT
1101 $query_ct_select = "
1102 dossier.dossier,
1103 dossier.dossier_libelle,
1104 dossier.date_depot
1105 ";
1106
1107 // FROM
1108 $query_ct_from =
1109 DB_PREFIXE."dossier
1110 LEFT JOIN (
1111 SELECT *
1112 FROM ".DB_PREFIXE."lien_dossier_demandeur
1113 INNER JOIN ".DB_PREFIXE."demandeur
1114 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
1115 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
1116 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
1117 ) as demandeur
1118 ON demandeur.dossier = dossier.dossier
1119 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
1120 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
1121 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
1122 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_autorisation.dossier_autorisation_type_detaille
1123 LEFT JOIN ".DB_PREFIXE."etat
1124 ON dossier.etat = etat.etat
1125 LEFT JOIN ".DB_PREFIXE."division
1126 ON dossier.division = division.division
1127 LEFT JOIN ".DB_PREFIXE."avis_decision
1128 ON avis_decision.avis_decision=dossier.avis_decision
1129 LEFT OUTER JOIN ".DB_PREFIXE."arrondissement
1130 ON arrondissement.code_postal = dossier.terrain_adresse_code_postal
1131 LEFT JOIN (
1132 SELECT *
1133 FROM ".DB_PREFIXE."lien_dossier_demandeur
1134 INNER JOIN ".DB_PREFIXE."demandeur
1135 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
1136 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
1137 AND LOWER(demandeur.type_demandeur) = LOWER('requerant')
1138 ) as demandeur_requerant
1139 ON demandeur_requerant.dossier = dossier.dossier
1140 LEFT JOIN ".DB_PREFIXE."dossier as dossier_autorisation_contestee
1141 ON dossier.autorisation_contestee = dossier_autorisation_contestee.dossier
1142 INNER JOIN (
1143 SELECT
1144 ctx_reference_dsj,
1145 dossier_instruction
1146 FROM ".DB_PREFIXE."donnees_techniques
1147 ) as donnees_techniques
1148 ON donnees_techniques.dossier_instruction = dossier.dossier
1149 %s
1150 %s
1151 ";
1152
1153 $query_ct_from_collectivite_filter = "";
1154 $query_ct_from_instructeur_filter = "";
1155 // Filtre sur les dossiers qui concernent l'utilisateur
1156 if ($filtre == "instructeur") {
1157 $query_ct_from_instructeur_filter = "
1158 JOIN ".DB_PREFIXE."instructeur
1159 ON dossier.instructeur=instructeur.instructeur
1160 OR dossier.instructeur_2=instructeur.instructeur
1161 JOIN ".DB_PREFIXE."om_utilisateur
1162 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
1163 AND om_utilisateur.login='".$_SESSION['login']."'
1164 ";
1165 }
1166 else {
1167 $query_ct_from_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
1168 ON dossier.instructeur=instructeur.instructeur
1169 LEFT JOIN ".DB_PREFIXE."om_utilisateur
1170 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
1171 }
1172
1173 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
1174 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
1175 // collectivité
1176 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1177 $query_ct_from_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
1178 ON dossier.om_collectivite=om_collectivite.om_collectivite
1179 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
1180 ";
1181 }
1182 else {
1183 $query_ct_from_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
1184 ON dossier.om_collectivite=om_collectivite.om_collectivite
1185 ";
1186 }
1187
1188 $query_ct_from = sprintf($query_ct_from, $query_ct_from_instructeur_filter, $query_ct_from_collectivite_filter);
1189
1190 // WHERE - COMMON
1191 $query_ct_where_common = "
1192 LOWER(dossier_autorisation_type.code) = LOWER('RE')
1193 ";
1194
1195 // ORDER BY
1196 $query_ct_orderby = "
1197 dossier.date_depot DESC, dossier.dossier DESC
1198 ";
1199
1200 $query_ct_where_groupe = "";
1201 // Gestion des groupes et confidentialité
1202 include('../sql/pgsql/filter_group_widgets.inc.php');
1203
1204 /**
1205 * Message d'aide
1206 */
1207 //
1208 $message_filtre = "";
1209 //
1210 switch ($filtre) {
1211 case "instructeur":
1212 $message_filtre = " "._("dont je suis l'instructeur");
1213 break;
1214 case "aucun":
1215 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1216 $message_filtre = " "._("situés dans ma collectivité");
1217 } else {
1218 $message_filtre = " "._("situés dans toutes les collectivités");
1219 }
1220 break;
1221 }
1222 //
1223 $message_help = sprintf(
1224 _("Les derniers recours%s."),
1225 $message_filtre
1226 );
1227
1228 /**
1229 * Return
1230 */
1231 //
1232 return array(
1233 "arguments" => $arguments,
1234 "message_help" => $message_help,
1235 "query_ct_select" => $query_ct_select,
1236 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
1237 "query_ct_from" => $query_ct_from,
1238 "query_ct_where" => $query_ct_where_common,
1239 "query_ct_where_groupe" => $query_ct_where_groupe,
1240 "query_ct_orderby" => $query_ct_orderby
1241 );
1242 }
1243
1244
1245 /**
1246 * WIDGET DASHBOARD - Mes recours
1247 * @return void
1248 */
1249 function view_widget_dossier_contentieux_recours($content = null) {
1250 /**
1251 * Ce widget est configurable via l'interface Web. Lors de la création
1252 * du widget dans le paramétrage il est possible de spécifier la ou les
1253 * options suivantes :
1254 * - filtre :
1255 * = instructeur
1256 * = aucun
1257 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
1258 */
1259 // Liste des paramètres
1260 $params = array("filtre");
1261 // Formatage des arguments reçus en paramètres
1262 $arguments = $this->get_arguments($content, $params);
1263 // Récupération de la configuration du widget
1264 $conf = $this->get_config_dossier_contentieux_recours($arguments);
1265 // Récupération du filtre
1266 $filtre = $conf["arguments"]["filtre"];
1267 // Définit l'objet cible
1268 $obj = 'dossier_contentieux_tous_recours';
1269 if ($filtre === 'instructeur') {
1270 //
1271 $obj = 'dossier_contentieux_mes_recours';
1272 }
1273
1274 /**
1275 * Composition de la requête
1276 */
1277 //
1278 $query = sprintf("
1279 SELECT
1280 %s
1281 FROM
1282 %s
1283 WHERE
1284 %s
1285 ORDER BY
1286 %s
1287 LIMIT 5",
1288 $conf["query_ct_select"],
1289 $conf["query_ct_from"],
1290 $conf["query_ct_where"],
1291 $conf["query_ct_orderby"]
1292 );
1293
1294 /**
1295 * Exécution de la requête
1296 */
1297 //
1298 $res = $this->f->db->query($query);
1299 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
1300 $this->f->isDatabaseError($res);
1301
1302 // Affichage du message d'informations
1303 printf(
1304 $this->template_help,
1305 $conf["message_help"]
1306 );
1307 /**
1308 * Si il n'y a aucun dossier à afficher, alors on affiche un message
1309 * clair à l'utilisateur et on sort de la vue.
1310 */
1311 // Si il n'y a aucun dossier à afficher
1312 if ($res->numrows() == 0) {
1313 echo _("Vous n'avez pas de recours.");
1314 return;
1315 }
1316
1317 /**
1318 * Template nécessaires à l'affichage du widget
1319 */
1320 //
1321 $template_table = '
1322 <table class="tab-tab">
1323 <thead>
1324 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
1325 <th class="title col-0 firstcol">
1326 <span class="name">
1327 %s
1328 </span>
1329 </th>
1330 <th class="title col-1">
1331 <span class="name">
1332 %s
1333 </span>
1334 </th>
1335 <th class="title col-2 lastcol">
1336 <span class="name">
1337 %s
1338 </span>
1339 </th>
1340 </tr>
1341 </thead>
1342 <tbody>
1343 %s
1344 </tbody>
1345 </table>
1346 ';
1347 //
1348 $template_line = '
1349 <tr class="tab-data odd">
1350 <td class="col-0 firstcol">
1351 %s
1352 </td>
1353 <td class="col-1 ">
1354 %s
1355 </td>
1356 <td class="col-2 lastcol">
1357 %s
1358 </td>
1359 </tr>
1360 ';
1361 //
1362 $template_href = OM_ROUTE_FORM.'&obj=%s&amp;action=3&amp;idx=%s';
1363 //
1364 $template_link = '
1365 <a class="lienTable" href="%s">
1366 %s
1367 </a>
1368 ';
1369 // Bouton consulter
1370 $template_btn_consulter = '
1371 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
1372 ._('Consulter')
1373 .'</span>
1374 ';
1375 //
1376
1377 /**
1378 * Si il y a des dossiers à afficher, alors on affiche le widget.
1379 */
1380 // On construit le contenu du tableau
1381 $ct_tbody = '';
1382 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1383 // On construit l'attribut href du lien
1384 $ct_href = sprintf(
1385 $template_href,
1386 // obj
1387 $obj,
1388 // idx
1389 $row["dossier"]
1390 );
1391 // On construit la ligne
1392 $ct_tbody .= sprintf(
1393 $template_line,
1394 // Colonne 1 - Numéro de dossier
1395 sprintf(
1396 $template_link,
1397 $ct_href,
1398 $template_btn_consulter
1399 ),
1400 // Colonne 2 - Numéro de dossier
1401 sprintf(
1402 $template_link,
1403 $ct_href,
1404 $row["dossier_libelle"]
1405 ),
1406 // Colonne 3 - Date de depot
1407 sprintf(
1408 $template_link,
1409 $ct_href,
1410 $this->f->formatDate($row["date_depot"])
1411 )
1412 );
1413 }
1414 // Affichage du tableau listant les dossiers
1415 printf(
1416 $template_table,
1417 // Colonne 1 - Consulter
1418 '',
1419 // Colonne 2 - Numéro de dossier
1420 _('dossier'),
1421 // Colonne 3 - Date de depot
1422 _("Date de recours"),
1423 // Le Contenu
1424 $ct_tbody
1425 );
1426
1427 /**
1428 * Affichage du footer
1429 */
1430 //
1431 $template_link_footer = OM_ROUTE_TAB.'&obj=%s';
1432 //
1433 $link_footer = sprintf(
1434 $template_link_footer,
1435 $obj
1436 );
1437 //
1438 printf(
1439 $this->template_footer,
1440 $link_footer,
1441 _("Voir +")
1442 );
1443 }
1444
1445
1446 /**
1447 * Cette méthode permet de récupérer la configuration du widget 'Mes
1448 * infractions'.
1449 *
1450 * @return array
1451 */
1452 function get_config_dossier_contentieux_infraction($arguments) {
1453 // Initialisation du tableau des paramètres avec ses valeur par défaut
1454 $arguments_default = array(
1455 "filtre" => "instructeur"
1456 );
1457 // Vérification des arguments
1458 foreach ($arguments_default as $key => $value) {
1459 //
1460 if (isset($arguments[$key])) {
1461 //
1462 $elem = trim($arguments[$key]);
1463 //
1464 if ($key === "filtre"
1465 && in_array($elem, array("instructeur", "aucun"))) {
1466 // La valeur doit être dans cette liste
1467 $arguments[$key] = $elem;
1468 continue;
1469 }
1470 }
1471 //
1472 $arguments[$key] = $value;
1473 }
1474 $filtre = $arguments["filtre"];
1475
1476 // SELECT - CHAMPAFFICHE
1477 //
1478 $trim_concat_terrain ='TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
1479 dossier.terrain_adresse_voie,\' \',
1480 dossier.terrain_adresse_lieu_dit,\' \',
1481 dossier.terrain_adresse_code_postal,\' \',
1482 dossier.terrain_adresse_localite,\' \',
1483 dossier.terrain_adresse_bp,\' \',
1484 dossier.terrain_adresse_cedex
1485 )) as "'._("localisation").'"';
1486 //
1487 $case_contrevenant = "
1488 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
1489 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
1490 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
1491 END
1492 ";
1493 //
1494 $query_ct_select_champaffiche = array(
1495 'dossier.dossier as "'._("dossier").'"',
1496 'dossier.dossier_libelle as "'._("dossier").'"',
1497 $trim_concat_terrain,
1498 $case_contrevenant.' as "'._("contrevenant").'"',
1499 'donnees_techniques.ctx_reference_dsj as "'._("ctx_reference_dsj").'"',
1500 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
1501 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
1502 'etat.libelle as "'._("etat").'"',
1503 );
1504
1505 /**
1506 * Construction de la requête
1507 */
1508 // SELECT
1509 $query_ct_select = "
1510 dossier.dossier,
1511 dossier.dossier_libelle,
1512 dossier.date_depot
1513 ";
1514
1515 // FROM
1516 $query_ct_from =
1517 DB_PREFIXE."dossier
1518 LEFT JOIN (
1519 SELECT *
1520 FROM ".DB_PREFIXE."lien_dossier_demandeur
1521 INNER JOIN ".DB_PREFIXE."demandeur
1522 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
1523 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
1524 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
1525 ) as demandeur
1526 ON demandeur.dossier = dossier.dossier
1527 INNER JOIN ".DB_PREFIXE."etat
1528 ON dossier.etat = etat.etat%s
1529 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
1530 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
1531 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
1532 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_autorisation.dossier_autorisation_type_detaille
1533 LEFT JOIN ".DB_PREFIXE."division
1534 ON dossier.division = division.division
1535 LEFT JOIN ".DB_PREFIXE."avis_decision
1536 ON avis_decision.avis_decision=dossier.avis_decision
1537 LEFT OUTER JOIN ".DB_PREFIXE."arrondissement
1538 ON arrondissement.code_postal = dossier.terrain_adresse_code_postal
1539 LEFT JOIN (
1540 SELECT *
1541 FROM ".DB_PREFIXE."lien_dossier_demandeur
1542 INNER JOIN ".DB_PREFIXE."demandeur
1543 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
1544 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
1545 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
1546 ) as demandeur_contrevenant
1547 ON demandeur_contrevenant.dossier = dossier.dossier
1548 INNER JOIN (
1549 SELECT
1550 ctx_reference_dsj,
1551 ctx_infraction,
1552 dossier_instruction
1553 FROM ".DB_PREFIXE."donnees_techniques
1554 ) as donnees_techniques
1555 ON donnees_techniques.dossier_instruction = dossier.dossier
1556 %s
1557 %s
1558 ";
1559
1560 $query_ct_from_collectivite_filter = "";
1561 $query_ct_from_instructeur_filter = "";
1562 // Filtre sur les dossiers qui concernent l'utilisateur
1563 if ($filtre == "instructeur") {
1564 $query_ct_from_instructeur_filter = "
1565 JOIN ".DB_PREFIXE."instructeur
1566 ON dossier.instructeur=instructeur.instructeur
1567 OR dossier.instructeur_2=instructeur.instructeur
1568 JOIN ".DB_PREFIXE."om_utilisateur
1569 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
1570 AND om_utilisateur.login='".$_SESSION['login']."'
1571 ";
1572 }
1573 else {
1574 $query_ct_from_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
1575 ON dossier.instructeur=instructeur.instructeur
1576 LEFT JOIN ".DB_PREFIXE."instructeur as instructeur_2
1577 ON dossier.instructeur_2=instructeur_2.instructeur
1578 LEFT JOIN ".DB_PREFIXE."om_utilisateur
1579 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
1580 }
1581
1582 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
1583 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
1584 // collectivité
1585 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1586 $query_ct_from_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
1587 ON dossier.om_collectivite=om_collectivite.om_collectivite
1588 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
1589 ";
1590 }
1591 else {
1592 $query_ct_from_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
1593 ON dossier.om_collectivite=om_collectivite.om_collectivite
1594 ";
1595 }
1596
1597 // Retourne seulement les dossiers en cours d'instruction, lorsque le
1598 // filtre sur instructeur est activé
1599 $query_ct_where_etat_ctx_filter = "" ;
1600 if ($filtre === "instructeur") {
1601 $query_ct_where_etat_ctx_filter = " AND etat.statut = 'encours'";
1602 }
1603
1604 $query_ct_from = sprintf(
1605 $query_ct_from,
1606 $query_ct_where_etat_ctx_filter,
1607 $query_ct_from_instructeur_filter,
1608 $query_ct_from_collectivite_filter
1609 );
1610
1611 // WHERE - COMMON
1612 $query_ct_where_common = "
1613 LOWER(dossier_autorisation_type.code) = LOWER('IN')
1614 ";
1615
1616 // ORDER BY
1617 $query_ct_orderby = "
1618 dossier.date_depot DESC, dossier.dossier DESC
1619 ";
1620
1621 $query_ct_where_groupe = "";
1622 // Gestion des groupes et confidentialité
1623 include('../sql/pgsql/filter_group_widgets.inc.php');
1624
1625 /**
1626 * Message d'aide
1627 */
1628 //
1629 $message_filtre = "";
1630 //
1631 switch ($filtre) {
1632 case "instructeur":
1633 $message_filtre = " ".__("en cours d'instruction")." ".__("dont je suis l'instructeur");
1634 break;
1635 case "aucun":
1636 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1637 $message_filtre = " "._("situés dans ma collectivité");
1638 } else {
1639 $message_filtre = " "._("situés dans toutes les collectivités");
1640 }
1641 break;
1642 }
1643 //
1644 $message_help = sprintf(
1645 _("Les dernières infractions%s."),
1646 $message_filtre
1647 );
1648
1649 /**
1650 * Return
1651 */
1652 //
1653 return array(
1654 "arguments" => $arguments,
1655 "message_help" => $message_help,
1656 "query_ct_select" => $query_ct_select,
1657 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
1658 "query_ct_from" => $query_ct_from,
1659 "query_ct_where" => $query_ct_where_common,
1660 "query_ct_orderby" => $query_ct_orderby
1661 );
1662 }
1663
1664 /**
1665 * WIDGET DASHBOARD - RSS
1666 *
1667 * Cette fonction gère l'affichage du widget RSS.
1668 *
1669 * Elle récupère trois arguments :
1670 * - urls (l'urls des flux rss séparé par une virgule)
1671 * - mode (le mode utilisé par le widget, soit "server_side" donc uniquement
1672 * sur server, soit "client_side" avec une récuperation des informations en
1673 * javascript)
1674 * - max_item (le nombre d'information provenant du flux, à afficher)
1675 *
1676 * Si mode = "server_side" alors
1677 * le DOM est construit dans la méthode view_widget_rss() de cette classe
1678 *
1679 * Si mode = client_side alors
1680 * le DOM est construit en javascript dans script.js::bind_widget_rss()
1681 *
1682 * @param string $content Contenu du champ "texte" ou "arguments" du widget
1683 * @param string $id Identifiant de l'enregistrement "om_dashboard"
1684 *
1685 * @return void
1686 */
1687 function display_widget_rss($content = null, $id) {
1688 // Liste des paramètres
1689 $params = array("urls", "mode", "max_item");
1690 // Formatage des arguments reçus en paramètres
1691 $arguments = $this->get_arguments($content, $params);
1692
1693 // Requête SQL
1694 $sql_template = "
1695 SELECT om_dashboard.om_widget
1696 FROM %som_dashboard
1697 WHERE om_dashboard.om_dashboard=%s;
1698 ";
1699 $sql = sprintf($sql_template, DB_PREFIXE, $id);
1700 $row = $this->f->db->getone($sql);
1701 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1702 $this->f->isDatabaseError($row);
1703
1704 if ($arguments["mode"] === "client_side") {
1705 $widget_template = "
1706 <div class='widget-rss-marker' data-id_widget='%d' data-mode='%s' data-urls='%s' data-max_item='%s'/></div>
1707 ";
1708 echo sprintf($widget_template, $row, "client_side", $arguments['urls'], $arguments['max_item']);
1709 } else {
1710 $widget_template = "
1711 <div class='widget-rss-marker' data-id_widget='%d' data-mode='%s'/></div>
1712 ";
1713 echo sprintf($widget_template, $row, "server_side");
1714 }
1715 }
1716
1717
1718
1719 /**
1720 * WIDGET DASHBOARD
1721 *
1722 * Création du DOM du widget RSS dans le cas server_side.
1723 *
1724 * @return void
1725 */
1726 function view_widget_rss() {
1727 // Liste des paramètres
1728 $params = array("urls", "mode", "max_item");
1729 // Formatage des arguments reçus en paramètres
1730 $arguments = $this->get_arguments($this->getVal('arguments'), $params);
1731 // Récupère les URLs des différents flux dans un tableau
1732 $urls = explode(',', $arguments['urls']);
1733
1734 // On retire 1 à la valeur de max_item car nous bouclons à partir de 0
1735 $real_max_item = $arguments['max_item'] - 1;
1736
1737 //Pour chaque url
1738 foreach ($urls as $url) {
1739 // Instanciation de la classe DOMDocument
1740 $xmlDoc = new DOMDocument();
1741 $xmlDoc->load($url);
1742
1743 // Initialise le contenu vide
1744 $content = "";
1745
1746 // Template de l'affichage en liste
1747 $render = "
1748 <ul>
1749 <h4>%s</h4>
1750 %s
1751 </ul>
1752 ";
1753
1754 // Tempalte de l'affichage du contenu
1755 $content_flux_template = "
1756 <li>
1757 <a href=%s target=_blank>
1758 <h5>%s</h5>
1759 </a>
1760 <p>%s</>
1761 </li>
1762 ";
1763
1764 // Récupération du nom du flux
1765 $channel_title = $xmlDoc->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
1766
1767 // Pour chaque item du flux
1768 $x = $xmlDoc->getElementsByTagName('item');
1769 if ($x->length > 0) {
1770 for ($i=0; $i<=$real_max_item; $i++) {
1771 $item_title = $x->item($i)->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
1772 $item_link = $x->item($i)->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
1773 $item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;
1774 // Contenu
1775 $content .= sprintf($content_flux_template, $item_link, $item_title, $item_desc);
1776 }
1777 } else {
1778 $content = "Aucune donnée disponible";
1779 }
1780
1781 // Affiche le contenu du widget
1782 echo sprintf($render, $channel_title, $content);
1783 }
1784 }
1785
1786 /**
1787 * Définition des actions disponibles sur la classe.
1788 *
1789 * @return void
1790 */
1791 function init_class_actions() {
1792
1793 // On récupère les actions génériques définies dans la méthode
1794 // d'initialisation de la classe parente
1795 parent::init_class_actions();
1796
1797 // ACTION - 004 - view_widget_rss
1798 // Permet d'accéder au widget RSS "server_side" depuis une URL
1799 $this->class_actions[4] = array(
1800 "identifier" => "widget-rss",
1801 "view" => "view_widget_rss",
1802 "permission_suffix" => "widget_rss",
1803 );
1804
1805 }
1806
1807 /**
1808 * WIDGET DASHBOARD - Mes infractions
1809 * @return void
1810 */
1811 function view_widget_dossier_contentieux_infraction($content = null) {
1812 /**
1813 * Ce widget est configurable via l'interface Web. Lors de la création
1814 * du widget dans le paramétrage il est possible de spécifier la ou les
1815 * options suivantes :
1816 * - filtre :
1817 * = instructeur
1818 * = aucun
1819 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
1820 */
1821 // Liste des paramètres
1822 $params = array("filtre");
1823 // Formatage des arguments reçus en paramètres
1824 $arguments = $this->get_arguments($content, $params);
1825 // Récupération de la configuration du widget
1826 $conf = $this->get_config_dossier_contentieux_infraction($arguments);
1827 // Récupération du filtre
1828 $filtre = $conf["arguments"]["filtre"];
1829 // Définit l'objet cible
1830 $obj = 'dossier_contentieux_toutes_infractions';
1831 if ($filtre === 'instructeur') {
1832 //
1833 $obj = 'dossier_contentieux_mes_infractions';
1834 }
1835
1836 /**
1837 * Composition de la requête
1838 */
1839 //
1840 $query = sprintf("
1841 SELECT
1842 %s
1843 FROM
1844 %s
1845 WHERE
1846 %s
1847 ORDER BY
1848 %s
1849 LIMIT 5",
1850 $conf["query_ct_select"],
1851 $conf["query_ct_from"],
1852 $conf["query_ct_where"],
1853 $conf["query_ct_orderby"]
1854 );
1855
1856 /**
1857 * Exécution de la requête
1858 */
1859 //
1860 $res = $this->f->db->query($query);
1861 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
1862 $this->f->isDatabaseError($res);
1863
1864 // Affichage du message d'informations
1865 printf(
1866 $this->template_help,
1867 $conf["message_help"]
1868 );
1869 /**
1870 * Si il n'y a aucun dossier à afficher, alors on affiche un message
1871 * clair à l'utilisateur et on sort de la vue.
1872 */
1873 // Si il n'y a aucun dossier à afficher
1874 if ($res->numrows() == 0) {
1875 // Affichage du message d'informations
1876 echo _("Vous n'avez pas d'infraction.");
1877 // Exit
1878 return;
1879 }
1880
1881 /**
1882 * Template nécessaires à l'affichage du widget
1883 */
1884 //
1885 $template_table = '
1886 <table class="tab-tab">
1887 <thead>
1888 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
1889 <th class="title col-0 firstcol">
1890 <span class="name">
1891 %s
1892 </span>
1893 </th>
1894 <th class="title col-1">
1895 <span class="name">
1896 %s
1897 </span>
1898 </th>
1899 <th class="title col-2 lastcol">
1900 <span class="name">
1901 %s
1902 </span>
1903 </th>
1904 </tr>
1905 </thead>
1906 <tbody>
1907 %s
1908 </tbody>
1909 </table>
1910 ';
1911 //
1912 $template_line = '
1913 <tr class="tab-data odd">
1914 <td class="col-0 firstcol">
1915 %s
1916 </td>
1917 <td class="col-1 ">
1918 %s
1919 </td>
1920 <td class="col-2 lastcol">
1921 %s
1922 </td>
1923 </tr>
1924 ';
1925
1926 // Bouton consulter
1927 $template_btn_consulter = '
1928 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
1929 ._('Consulter')
1930 .'</span>
1931 ';
1932 //
1933 $template_href = OM_ROUTE_FORM.'&obj=%s&amp;action=3&amp;idx=%s';
1934 //
1935 $template_link = '
1936 <a class="lienTable" href="%s">
1937 %s
1938 </a>
1939 ';
1940
1941 /**
1942 * Si il y a des dossiers à afficher, alors on affiche le widget.
1943 */
1944 // On construit le contenu du tableau
1945 $ct_tbody = '';
1946 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
1947 // On construit l'attribut href du lien
1948 $ct_href = sprintf(
1949 $template_href,
1950 // obj
1951 $obj,
1952 // idx
1953 $row["dossier"]
1954 );
1955 // On construit la ligne
1956 $ct_tbody .= sprintf(
1957 $template_line,
1958 // Colonne 1 - Numéro de dossier
1959 sprintf(
1960 $template_link,
1961 $ct_href,
1962 $template_btn_consulter
1963 ),
1964 // Colonne 2 - Numéro de dossier
1965 sprintf(
1966 $template_link,
1967 $ct_href,
1968 $row["dossier_libelle"]
1969 ),
1970 // Colonne 3 - Date de depot
1971 sprintf(
1972 $template_link,
1973 $ct_href,
1974 $this->f->formatDate($row["date_depot"])
1975 )
1976 );
1977 }
1978 // Affichage du tableau listant les dossiers
1979 printf(
1980 $template_table,
1981 // Colonne 1 - Consulter
1982 '',
1983 // Colonne 2 - Numéro de dossier
1984 _('dossier'),
1985 // Colonne 3 - Date de depot
1986 _("Date de réception"),
1987 // Le Contenu
1988 $ct_tbody
1989 );
1990
1991 /**
1992 * Affichage du footer
1993 */
1994 //
1995 $template_link_footer = OM_ROUTE_TAB.'&obj=%s';
1996 //
1997 $link_footer = sprintf(
1998 $template_link_footer,
1999 $obj
2000 );
2001 //
2002 printf(
2003 $this->template_footer,
2004 $link_footer,
2005 _("Voir +")
2006 );
2007 }
2008
2009 /**
2010 * Cet méthode permet de formater, la chaîne de caractères reçue du
2011 * paramétrage du widget en un tableau de valeurs dont les clés
2012 * correspondent aux clés passées en paramètre.
2013 *
2014 * @param string $content
2015 * @param array $params
2016 *
2017 * @return array
2018 */
2019 function get_arguments($content = null, $params = array()) {
2020 //
2021 $arguments = array();
2022 // On explose les paramètres reçus avec un élément par ligne
2023 $params_tmp1 = explode("\n", $content);
2024 // On boucle sur chaque ligne de paramètre
2025 foreach ($params_tmp1 as $key => $value) {
2026 // On explose le paramètre de sa valeur avec le séparateur '='
2027 $params_tmp2[] = explode("=", $value);
2028 }
2029 // On boucle sur chaque paramètre reçu pour vérifier si la valeur reçue
2030 // est acceptable ou non
2031 foreach ($params_tmp2 as $key => $value) {
2032 //
2033 if (!isset($value[0]) || !isset($value[1])) {
2034 continue;
2035 }
2036 //
2037 if (in_array(trim($value[0]), $params)) {
2038 $arguments[trim($value[0])] = trim($value[1]);
2039 }
2040 }
2041 //
2042 return $arguments;
2043 }
2044
2045 /**
2046 * WIDGET DASHBOARD - Retours de messages
2047 *
2048 * @return void
2049 */
2050 function view_widget_messages_retours($content = null) {
2051
2052 /**
2053 * Ce widget est configurable via l'interface Web. Lors de la création
2054 * du widget dans le paramétrage il est possible de spécifier la ou les
2055 * options suivantes :
2056 *
2057 * - filtre :
2058 * = instructeur
2059 * = division
2060 * = aucun
2061 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
2062 *
2063 * - contexte :
2064 * = standard
2065 * = contentieux
2066 * (defaut) Par défaut le contexte est standard.
2067 */
2068 // Liste des paramètres
2069 $params = array("filtre", "contexte");
2070 // Formatage des arguments reçus en paramètres
2071 $arguments = $this->get_arguments($content, $params);
2072 // Récupération de la configuration du widget
2073 $conf = $this->get_config_messages_retours($arguments);
2074 //
2075 $filtre = $conf["arguments"]["filtre"];
2076 //
2077 $contexte = $conf["arguments"]["contexte"];
2078
2079 /**
2080 * Composition de la requête
2081 */
2082 //
2083 $query = sprintf(
2084 "SELECT
2085 count(*)
2086 FROM
2087 %s
2088 WHERE
2089 %s",
2090 $conf["query_ct_from"],
2091 $conf["query_ct_where_common"],
2092 $conf["query_ct_where_groupe"]
2093 );
2094
2095 /**
2096 * Exécution de la requête
2097 */
2098 //
2099 $res = $this->f->db->getone($query);
2100 $this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE);
2101 $this->f->isDatabaseError($res);
2102
2103 // Affichage du message d'informations
2104 printf(
2105 $this->template_help,
2106 $conf["message_help"]
2107 );
2108
2109 //
2110 if (intval($res) === 0) {
2111 //
2112 echo _("Aucun message non lu.");
2113 return;
2114 }
2115
2116
2117 /**
2118 *
2119 */
2120 $template_panel = '
2121 <div class="panel panel-box">
2122 <div class="list-justified-container">
2123 <ul class="list-justified text-center">
2124 %s
2125 </ul>
2126 </div>
2127 </div>';
2128 /**
2129 *
2130 */
2131 //
2132 $panel = "";
2133 //
2134 $template_elem = '
2135 <li>
2136 <span class="size-h3 box-icon rounded %s">%s</span>
2137 <p class="text-muted">%s %s</p>
2138 </li>
2139 ';
2140 $panel_elem = sprintf(
2141 $template_elem,
2142 "bg-info",
2143 intval($res),
2144 _("Non lu"),
2145 ""
2146 );
2147 //
2148 $panel .= sprintf(
2149 $template_panel,
2150 $panel_elem
2151 );
2152 echo $panel;
2153
2154 // Définit le lien de redirection vers le listing en fonction du
2155 // contexte et du filtre
2156 if ($contexte === 'standard') {
2157 //
2158 switch ($filtre) {
2159 case 'instructeur':
2160 $obj_href_more_link = 'messages_mes_retours';
2161 break;
2162 case 'division':
2163 $obj_href_more_link = 'messages_retours_ma_division';
2164 break;
2165 case 'aucun':
2166 $obj_href_more_link = 'messages_tous_retours';
2167 break;
2168 }
2169 }
2170 //
2171 if ($contexte === 'contentieux') {
2172 //
2173 switch ($filtre) {
2174 case 'instructeur':
2175 $obj_href_more_link = 'messages_contentieux_mes_retours';
2176 break;
2177 case 'division':
2178 $obj_href_more_link = 'messages_contentieux_retours_ma_division';
2179 break;
2180 case 'aucun':
2181 $obj_href_more_link = 'messages_contentieux_tous_retours';
2182 break;
2183 }
2184 }
2185
2186 //
2187 if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) {
2188 return;
2189 }
2190 // Affichage du footer
2191 printf(
2192 $this->template_footer,
2193 // href
2194 sprintf(
2195 OM_ROUTE_TAB.'&obj=%s',
2196 $obj_href_more_link
2197 ),
2198 // titre
2199 _("Voir +")
2200 );
2201
2202 }
2203
2204
2205 /**
2206 * Cette méthode permet de récupérer la configuration du widget 'Retours de
2207 * messages'.
2208 *
2209 * @return array
2210 */
2211 function get_config_messages_retours($arguments) {
2212 // Initialisation du tableau des paramètres avec ses valeur par défaut
2213 $arguments_default = array(
2214 "filtre" => "instructeur",
2215 "contexte" => "standard",
2216 );
2217 // Vérification des arguments
2218 foreach ($arguments_default as $key => $value) {
2219 //
2220 if (isset($arguments[$key])) {
2221 //
2222 $elem = trim($arguments[$key]);
2223 //
2224 if ($key === "filtre"
2225 && in_array($elem, array("instructeur", "division", "aucun"))) {
2226 // La valeur doit être dans cette liste
2227 $arguments[$key] = $elem;
2228 continue;
2229 }
2230 //
2231 if ($key === "contexte"
2232 && in_array($elem, array("standard", "contentieux"))) {
2233 // La valeur doit être dans cette liste
2234 $arguments[$key] = $elem;
2235 continue;
2236 }
2237 }
2238 //
2239 $arguments[$key] = $value;
2240 }
2241 //
2242 $filtre = $arguments["filtre"];
2243 //
2244 $contexte = $arguments["contexte"];
2245
2246 /**
2247 * Construction de la requête
2248 */
2249 //
2250 $query_ct_from_instructeur_filter = "";
2251 $query_ct_from_division_filter = "";
2252 $query_ct_from_collectivite_filter = "";
2253 //
2254 $query_ct_from_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
2255 ON dossier.instructeur=instructeur.instructeur
2256 LEFT JOIN ".DB_PREFIXE."om_utilisateur
2257 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
2258 LEFT JOIN ".DB_PREFIXE."instructeur as instructeur_2
2259 ON dossier.instructeur_2=instructeur_2.instructeur ";
2260 //
2261 if ($filtre == "instructeur") {
2262 $query_ct_from_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
2263 ON dossier.instructeur=instructeur.instructeur
2264 OR dossier.instructeur_2=instructeur.instructeur
2265 JOIN ".DB_PREFIXE."om_utilisateur
2266 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
2267 ";
2268 }
2269 //
2270 $query_ct_from_division_filter = " JOIN ".DB_PREFIXE."division
2271 ON dossier.division=division.division
2272 ";
2273 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
2274 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
2275 // collectivité
2276 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2277 $query_ct_from_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
2278 ON dossier.om_collectivite=om_collectivite.om_collectivite
2279 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
2280 ";
2281 } else {
2282 $query_ct_from_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
2283 ON dossier.om_collectivite=om_collectivite.om_collectivite
2284 ";
2285 }
2286
2287 // FROM
2288 $query_ct_from = "
2289 ".DB_PREFIXE."dossier_message
2290 LEFT JOIN ".DB_PREFIXE."dossier
2291 ON dossier_message.dossier=dossier.dossier
2292 %s
2293 %s
2294 %s";
2295
2296 //
2297 $query_ct_from = sprintf($query_ct_from, $query_ct_from_instructeur_filter, $query_ct_from_division_filter, $query_ct_from_collectivite_filter);
2298
2299 //
2300 $query_ct_where_instructeur_filter = "";
2301 $query_ct_where_division_filter = "";
2302 $query_ct_where_collectivite_filter = "";
2303 // Filtre sur les dossiers qui concernent l'utilisateur
2304 if ($filtre == "instructeur") {
2305 //
2306 $query_ct_where_instructeur_filter = " AND om_utilisateur.login='".$_SESSION['login']."'
2307 AND dossier_message.destinataire = 'instructeur'
2308 ";
2309 //
2310 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2311 $query_ct_where_instructeur_filter = " AND (om_utilisateur.login='".$_SESSION['login']."'
2312 OR dossier_message.destinataire = 'commune')
2313 ";
2314 }
2315 }
2316 // Filtre sur les dossier de la division
2317 if ($filtre == "division") {
2318 //
2319 $query_ct_where_division_filter = " AND division.division = ".$_SESSION['division']."
2320 AND dossier_message.destinataire = 'instructeur'
2321 ";
2322 //
2323 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2324 $query_ct_where_division_filter = " AND (division.division = ".$_SESSION['division']."
2325 OR dossier_message.destinataire = 'commune')
2326 ";
2327 }
2328 }
2329
2330 // Filtre les dossiers par contexte
2331 $query_ct_where_groupe_filter = " AND LOWER(groupe.code) != 'ctx'";
2332 if ($contexte === 'contentieux') {
2333 //
2334 $query_ct_where_groupe_filter = " AND LOWER(groupe.code) = 'ctx'";
2335 }
2336
2337 // WHERE - COMMON
2338 $query_ct_where_common = "
2339 dossier_message.lu IS FALSE
2340 %s
2341 %s
2342 %s
2343 %s
2344 ";
2345
2346 //
2347 $query_ct_where_common = sprintf($query_ct_where_common, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter, $query_ct_where_groupe_filter);
2348
2349 // Filtre du groupe
2350 $query_ct_where_groupe = "";
2351 // Gestion des groupes et confidentialité
2352 include('../sql/pgsql/filter_group_widgets.inc.php');
2353
2354 /**
2355 * Message d'aide
2356 */
2357 //
2358 $message_filtre = "";
2359 //
2360 switch ($filtre) {
2361 case "instructeur":
2362 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2363 $message_filtre = " "._("dont je suis l'instructeur ou dont le destinataire est 'commune'");
2364 } else {
2365 $message_filtre = " "._("dont je suis l'instructeur et dont le destinataire est 'instructeur'");
2366 }
2367 break;
2368 case "division":
2369 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2370 $message_filtre = " "._("situés dans ma division ou dont le destinataire est 'commune'");
2371 } else {
2372 $message_filtre = " "._("situés dans ma division et dont le destinataire est 'instructeur'");
2373 }
2374 break;
2375 case "aucun":
2376 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2377 $message_filtre = " "._("situés dans ma collectivité");
2378 } else {
2379 $message_filtre = " "._("situés dans toutes les collectivités");
2380 }
2381 break;
2382 }
2383 //
2384 $template_message_help = _("Les messages marqués comme 'non lu' qui concernent des dossiers d'instruction%s.");
2385 //
2386 if ($contexte === 'contentieux') {
2387 //
2388 $template_message_help = _("Les messages marqués comme 'non lu' qui concernent des dossiers contentieux%s.");
2389 }
2390 //
2391 $message_help = sprintf(
2392 $template_message_help,
2393 $message_filtre
2394 );
2395
2396 /**
2397 * Return
2398 */
2399 //
2400 return array(
2401 "arguments" => $arguments,
2402 "message_help" => $message_help,
2403 "query_ct_from" => $query_ct_from,
2404 "query_ct_where_common" => $query_ct_where_common,
2405 "query_ct_where_groupe" => $query_ct_where_groupe,
2406 );
2407 }
2408
2409 /**
2410 * WIDGET DASHBOARD - Retours de consultation
2411 *
2412 * @return void
2413 */
2414 function view_widget_consultation_retours($content = null) {
2415
2416 /**
2417 * Ce widget est configurable via l'interface Web. Lors de la création
2418 * du widget dans le paramétrage il est possible de spécifier la ou les
2419 * options suivantes :
2420 *
2421 * - filtre :
2422 * = instructeur
2423 * = division
2424 * = aucun
2425 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
2426 */
2427 // Liste des paramètres
2428 $params = array("filtre", );
2429 // Formatage des arguments reçus en paramètres
2430 $arguments = $this->get_arguments($content, $params);
2431 // Récupération de la configuration du widget
2432 $conf = $this->get_config_consultation_retours($arguments);
2433 //
2434 $filtre = $conf["arguments"]["filtre"];
2435
2436 /**
2437 * Composition de la requête
2438 */
2439 //
2440 $query = sprintf(
2441 "SELECT
2442 count(*)
2443 FROM
2444 %s
2445 WHERE
2446 %s",
2447 $conf["query_ct_from"],
2448 $conf["query_ct_where_common"]
2449 );
2450
2451 /**
2452 * Exécution de la requête
2453 */
2454 //
2455 $res = $this->f->db->getone($query);
2456 $this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE);
2457 $this->f->isDatabaseError($res);
2458
2459 // Affichage du message d'informations
2460 printf(
2461 $this->template_help,
2462 $conf["message_help"]
2463 );
2464
2465 //
2466 if (intval($res) === 0) {
2467 //
2468 echo _("Aucun retour de consultation non lu.");
2469 return;
2470 }
2471
2472
2473 /**
2474 *
2475 */
2476 $template_panel = '
2477 <div class="panel panel-box">
2478 <div class="list-justified-container">
2479 <ul class="list-justified text-center">
2480 %s
2481 </ul>
2482 </div>
2483 </div>';
2484 /**
2485 *
2486 */
2487 //
2488 $panel = "";
2489 //
2490 $template_elem = '
2491 <li>
2492 <span class="size-h3 box-icon rounded %s">%s</span>
2493 <p class="text-muted">%s %s</p>
2494 </li>
2495 ';
2496 $panel_elem = sprintf(
2497 $template_elem,
2498 "bg-info",
2499 intval($res),
2500 _("Non lu"),
2501 ""
2502 );
2503 //
2504 $panel .= sprintf(
2505 $template_panel,
2506 $panel_elem
2507 );
2508 echo $panel;
2509
2510 /**
2511 *
2512 */
2513 if ($filtre === "aucun") {
2514 $obj_href_more_link = "consultation_tous_retours";
2515 } elseif ($filtre === "division") {
2516 $obj_href_more_link = "consultation_retours_ma_division";
2517 } else {
2518 $obj_href_more_link = "consultation_mes_retours";
2519 }
2520
2521 //
2522 if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) {
2523 return;
2524 }
2525 // Affichage du footer
2526 printf(
2527 $this->template_footer,
2528 // href
2529 sprintf(
2530 OM_ROUTE_TAB.'&obj=%s',
2531 $obj_href_more_link
2532 ),
2533 // titre
2534 _("Voir +")
2535 );
2536
2537 }
2538
2539
2540 /**
2541 * Cette méthode permet de récupérer la configuration du widget 'Retours de
2542 * consultation'.
2543 *
2544 * @return array
2545 */
2546 function get_config_consultation_retours($arguments) {
2547 // Initialisation du tableau des paramètres avec ses valeurs par défaut
2548 $arguments_default = array(
2549 "filtre" => "instructeur",
2550 );
2551 // Vérification des arguments
2552 foreach ($arguments_default as $key => $value) {
2553 //
2554 if (isset($arguments[$key])) {
2555 //
2556 $elem = trim($arguments[$key]);
2557 //
2558 if ($key === "filtre"
2559 && in_array($elem, array("instructeur", "division", "aucun"))) {
2560 // La valeur doit être dans cette liste
2561 $arguments[$key] = $elem;
2562 continue;
2563 }
2564 }
2565 //
2566 $arguments[$key] = $value;
2567 }
2568 //
2569 $filtre = $arguments["filtre"];
2570
2571 /**
2572 * Construction de la requête
2573 */
2574 // FROM
2575 $query_ct_from = "
2576 ".DB_PREFIXE."consultation
2577 LEFT JOIN ".DB_PREFIXE."avis_consultation
2578 ON consultation.avis_consultation=avis_consultation.avis_consultation
2579 LEFT JOIN ".DB_PREFIXE."dossier
2580 ON consultation.dossier=dossier.dossier
2581 LEFT JOIN ".DB_PREFIXE."service
2582 ON consultation.service=service.service
2583 %s
2584 %s
2585 %s";
2586
2587 $query_ct_where_instructeur_filter = "";
2588 $query_ct_where_division_filter = "";
2589 $query_ct_where_collectivite_filter = "";
2590 // Filtre sur les dossiers qui concernent l'utilisateur
2591 if ($filtre === "instructeur") {
2592 //
2593 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
2594 ON dossier.instructeur=instructeur.instructeur
2595 JOIN ".DB_PREFIXE."om_utilisateur
2596 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
2597 AND om_utilisateur.login='".$_SESSION['login']."'
2598 ";
2599 } else {
2600 $query_ct_where_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
2601 ON dossier.instructeur=instructeur.instructeur
2602 LEFT JOIN ".DB_PREFIXE."om_utilisateur
2603 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
2604 }
2605 // Filtre sur les dossier de la division
2606 if ($filtre === "division") {
2607 //
2608 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
2609 ON dossier.division=division.division
2610 AND division.division = ".$_SESSION['division']."
2611 ";
2612 } else {
2613 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
2614 ON dossier.division=division.division";
2615 }
2616 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
2617 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
2618 // collectivité
2619 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2620 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
2621 ON dossier.om_collectivite=om_collectivite.om_collectivite
2622 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
2623 ";
2624 } else {
2625 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
2626 ON dossier.om_collectivite=om_collectivite.om_collectivite
2627 ";
2628 }
2629
2630 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
2631
2632 // WHERE - COMMON
2633 $query_ct_where_common = "
2634 consultation.lu IS FALSE
2635 ";
2636
2637 /**
2638 * Message d'aide
2639 */
2640 //
2641 $message_filtre = "";
2642 //
2643 switch ($filtre) {
2644 case "instructeur":
2645 $message_filtre = " "._("dont je suis l'instructeur");
2646 break;
2647 case "division":
2648 $message_filtre = " "._("situés dans ma division");
2649 break;
2650 case "aucun":
2651 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2652 $message_filtre = " "._("situés dans ma collectivité");
2653 } else {
2654 $message_filtre = " "._("situés dans toutes les collectivités");
2655 }
2656 break;
2657 }
2658 //
2659 $message_help = sprintf(
2660 _("Les consultations marquées comme 'non lu' qui concernent des ".
2661 "dossiers d'instruction%s."),
2662 $message_filtre
2663 );
2664
2665 /**
2666 * Return
2667 */
2668 //
2669 return array(
2670 "arguments" => $arguments,
2671 "message_help" => $message_help,
2672 "query_ct_from" => $query_ct_from,
2673 "query_ct_where_common" => $query_ct_where_common,
2674 );
2675 }
2676
2677
2678 /**
2679 * WIDGET DASHBOARD - widget_commission_retours
2680 *
2681 * Ce widget est configurable via l'interface Web. Lors de la création
2682 * du widget dans le paramétrage il est possible de spécifier la ou les
2683 * options suivantes :
2684 *
2685 * - filtre :
2686 * = instructeur
2687 * = division
2688 * = aucun
2689 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
2690 *
2691 * @param string $content Arguments pour le widget, ici les filtres.
2692 * @return void
2693 */
2694 function view_widget_commission_retours($content = null) {
2695 // Liste des paramètres
2696 $params = array("filtre", );
2697 // Formatage des arguments reçus en paramètres
2698 $arguments = $this->get_arguments($content, $params);
2699 // Récupération de la configuration du widget
2700 $conf = $this->get_config_commission_retours($arguments);
2701 //
2702 $filtre = $conf["arguments"]["filtre"];
2703
2704 /**
2705 * Composition de la requête
2706 */
2707 //
2708 $query = sprintf(
2709 "SELECT
2710 count(*)
2711 FROM
2712 %s
2713 WHERE
2714 %s",
2715 $conf["query_ct_from"],
2716 $conf["query_ct_where_common"]
2717 );
2718
2719 /**
2720 * Exécution de la requête
2721 */
2722 //
2723 $res = $this->f->db->getone($query);
2724 $this->addToLog(__METHOD__ . "(): db->getone(\"" . $query . "\");", VERBOSE_MODE);
2725 $this->f->isDatabaseError($res);
2726
2727 // Affichage du message d'informations
2728 printf(
2729 $this->template_help,
2730 $conf["message_help"]
2731 );
2732
2733 if (intval($res) === 0) {
2734 //
2735 echo _("Aucun retour de commission non lu.");
2736 return;
2737 }
2738
2739
2740 /**
2741 * Panel
2742 */
2743 $template_panel = '
2744 <div class="panel panel-box">
2745 <div class="list-justified-container">
2746 <ul class="list-justified text-center">
2747 %s
2748 </ul>
2749 </div>
2750 </div>';
2751 $panel = "";
2752 //
2753 $template_elem = '
2754 <li>
2755 <span class="size-h3 box-icon rounded %s">%s</span>
2756 <p class="text-muted">%s %s</p>
2757 </li>
2758 ';
2759 $panel_elem = sprintf(
2760 $template_elem,
2761 "bg-info",
2762 intval($res),
2763 _("Non lu"),
2764 ""
2765 );
2766 $panel .= sprintf(
2767 $template_panel,
2768 $panel_elem
2769 );
2770 echo $panel;
2771
2772 /**
2773 * Widget footer
2774 */
2775 if ($filtre === "aucun") {
2776 $obj_href_more_link = "commission_tous_retours";
2777 } elseif ($filtre === "division") {
2778 $obj_href_more_link = "commission_retours_ma_division";
2779 } else {
2780 $obj_href_more_link = "commission_mes_retours";
2781 }
2782
2783 //
2784 if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link . "_tab"), "OR")) {
2785 return;
2786 }
2787 // Affichage du footer
2788 printf(
2789 $this->template_footer,
2790 // href
2791 sprintf(
2792 OM_ROUTE_TAB.'&obj=%s',
2793 $obj_href_more_link
2794 ),
2795 // titre
2796 _("Voir +")
2797 );
2798 }
2799
2800 /**
2801 * Cette méthode permet de récupérer la configuration du widget 'Retours de
2802 * consultation'.
2803 *
2804 * @return array
2805 */
2806 function get_config_commission_retours($arguments) {
2807 // Initialisation du tableau des paramètres avec ses valeurs par défaut
2808 $arguments_default = array(
2809 "filtre" => "instructeur",
2810 );
2811 // Vérification des arguments
2812 foreach ($arguments_default as $key => $value) {
2813 //
2814 if (isset($arguments[$key])) {
2815 //
2816 $elem = trim($arguments[$key]);
2817 //
2818 if ($key === "filtre"
2819 && in_array($elem, array("instructeur", "division", "aucun"))) {
2820 // La valeur doit être dans cette liste
2821 $arguments[$key] = $elem;
2822 continue;
2823 }
2824 }
2825 //
2826 $arguments[$key] = $value;
2827 }
2828 //
2829 $filtre = $arguments["filtre"];
2830
2831 /**
2832 * Construction de la requête
2833 */
2834 // FROM
2835 $query_ct_from ="
2836 " . DB_PREFIXE . "dossier_commission
2837 LEFT JOIN " . DB_PREFIXE . "dossier
2838 ON dossier_commission.dossier=dossier.dossier
2839 LEFT JOIN " . DB_PREFIXE . "commission
2840 ON dossier_commission.commission=commission.commission
2841 %s
2842 %s
2843 %s";
2844
2845 $query_ct_where_instructeur_filter = "";
2846 $query_ct_where_division_filter = "";
2847 $query_ct_where_collectivite_filter = "";
2848
2849 // Filtre sur les dossiers qui concernent l'utilisateur
2850 if ($filtre === "instructeur") {
2851 //
2852 $query_ct_where_instructeur_filter = " JOIN " . DB_PREFIXE . "instructeur
2853 ON dossier.instructeur=instructeur.instructeur
2854 JOIN " . DB_PREFIXE . "om_utilisateur
2855 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
2856 AND om_utilisateur.login='" . $_SESSION['login'] . "'
2857 ";
2858 } else {
2859 $query_ct_where_instructeur_filter = " LEFT JOIN " . DB_PREFIXE . "instructeur
2860 ON dossier.instructeur=instructeur.instructeur
2861 LEFT JOIN " . DB_PREFIXE . "om_utilisateur
2862 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
2863 }
2864 // Filtre sur les dossier de la division
2865 if ($filtre === "division") {
2866 //
2867 $query_ct_where_division_filter = " JOIN " . DB_PREFIXE . "division
2868 ON dossier.division=division.division
2869 AND division.division = " . $_SESSION['division'] . "
2870 ";
2871 } else {
2872 $query_ct_where_division_filter = " LEFT JOIN " . DB_PREFIXE . "division
2873 ON dossier.division=division.division";
2874 }
2875 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
2876 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
2877 // collectivité
2878 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2879 $query_ct_where_collectivite_filter = " JOIN " . DB_PREFIXE . "om_collectivite
2880 ON dossier.om_collectivite=om_collectivite.om_collectivite
2881 AND om_collectivite.om_collectivite=" . $_SESSION['collectivite'] . "
2882 ";
2883 } else {
2884 $query_ct_where_collectivite_filter = " LEFT JOIN " . DB_PREFIXE . "om_collectivite
2885 ON dossier.om_collectivite=om_collectivite.om_collectivite
2886 ";
2887 }
2888
2889 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
2890
2891 // WHERE - COMMON
2892 $query_ct_where_common = "
2893 dossier_commission.lu IS FALSE
2894 ";
2895
2896 /**
2897 * Message d'aide
2898 */
2899 //
2900 $message_filtre = "";
2901 //
2902 switch ($filtre) {
2903 case "instructeur":
2904 $message_filtre = " " . _("dont je suis l'instructeur");
2905 break;
2906 case "division":
2907 $message_filtre = " " . _("situés dans ma division");
2908 break;
2909 case "aucun":
2910 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2911 $message_filtre = " " . _("situés dans ma collectivité");
2912 } else {
2913 $message_filtre = " " . _("situés dans toutes les collectivités");
2914 }
2915 break;
2916 }
2917 //
2918 $message_help = sprintf(
2919 _("Les retours de commission marqués comme 'non lu' qui concernent des " .
2920 "dossiers d'instruction%s."),
2921 $message_filtre
2922 );
2923
2924 return array(
2925 "arguments" => $arguments,
2926 "message_help" => $message_help,
2927 "query_ct_from" => $query_ct_from,
2928 "query_ct_where_common" => $query_ct_where_common,
2929 );
2930
2931 }
2932
2933
2934 /**
2935 * WIDGET DASHBOARD - Dossiers incomplets ou majorés sans date de notification
2936 *
2937 * @return void
2938 */
2939 function view_widget_dossiers_evenement_incomplet_majoration($content = null) {
2940
2941 /**
2942 * Ce widget est configurable via l'interface Web. Lors de la création
2943 * du widget dans le paramétrage il est possible de spécifier la ou les
2944 * options suivantes :
2945 *
2946 * - filtre :
2947 * = instructeur
2948 * = division
2949 * = aucun
2950 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
2951 */
2952 // Liste des paramètres
2953 $params = array("filtre", );
2954 // Formatage des arguments reçus en paramètres
2955 $arguments = $this->get_arguments($content, $params);
2956 // Récupération de la configuration du widget
2957 $conf = $this->get_config_dossiers_evenement_incomplet_majoration($arguments);
2958 //
2959 $filtre = $conf["arguments"]["filtre"];
2960
2961 /**
2962 * Composition de la requête
2963 */
2964 //
2965 $query = sprintf("
2966 SELECT
2967 %s
2968 FROM
2969 %s
2970 WHERE
2971 %s
2972 %s
2973 ORDER BY
2974 %s
2975 LIMIT 10",
2976 $conf["query_ct_select"],
2977 $conf["query_ct_from"],
2978 $conf["query_ct_where_common"],
2979 $conf["query_ct_where_groupe"],
2980 $conf["query_ct_orderby"]
2981 );
2982
2983 // Exécution de la requête
2984 $res = $this->f->db->query($query);
2985 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
2986 $this->f->isDatabaseError($res);
2987
2988 // Affichage du message d'informations
2989 printf(
2990 $this->template_help,
2991 $conf["message_help"]
2992 );
2993
2994 /**
2995 * Si il n'y a aucun dossier à afficher, alors on affiche un message
2996 * clair à l'utilisateur et on sort de la vue.
2997 */
2998 // Si il n'y a aucun dossier à afficher
2999 if ($res->numrows() == 0) {
3000 // Affichage du message d'informations
3001 echo _("Vous n'avez pas de dossiers d'instruction avec un événement d'incomplétude ou de majoration de délai sans date de notification.");
3002 // Exit
3003 return;
3004 }
3005
3006 /**
3007 * Template nécessaires à l'affichage du widget
3008 */
3009 // Lien vers le dossier d'instructions
3010
3011 // Bouton consulter
3012 $template_btn_consulter = '
3013 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
3014 ._('Consulter')
3015 .'</span>
3016 ';
3017
3018 $template_table = '
3019 <table class="tab-tab">
3020 <thead>
3021 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
3022 <th class="title col-0 firstcol">
3023 <span class="name">
3024 %s
3025 </span>
3026 </th>
3027 <th class="title col-1">
3028 <span class="name">
3029 %s
3030 </span>
3031 </th>
3032 <th class="title col-2 lastcol">
3033 <span class="name">
3034 %s
3035 </span>
3036 </th>
3037 </tr>
3038 </thead>
3039 <tbody>
3040 %s
3041 </tbody>
3042 </table>
3043 ';
3044
3045 // Données dans le tableau
3046 //
3047 $template_line = '
3048 <tr class="tab-data odd">
3049 <td class="col-1 firstcol">
3050 %s
3051 </td>
3052 <td class="col-1">
3053 %s
3054 </td>
3055 <td class="col-2 lastcol">
3056 %s
3057 </td>
3058 </tr>
3059 ';
3060 //
3061 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&amp;action=3&amp;idx=%s';
3062 //
3063 $template_link = '
3064 <a class="lienTable" href="%s">
3065 %s
3066 </a>
3067 ';
3068
3069 /**
3070 * Si il y a des dossiers à afficher, alors on affiche le widget.
3071 */
3072 // On construit le contenu du tableau
3073 $ct_tbody = '';
3074 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3075 // On construit l'attribut href du lien
3076 $ct_href = sprintf(
3077 $template_href,
3078 // idx
3079 $row["dossier"]
3080 );
3081 // On construit la ligne
3082 $ct_tbody .= sprintf(
3083 $template_line,
3084 // Colonne 1 - Bouton consulter
3085 sprintf(
3086 $template_link,
3087 $ct_href,
3088 $template_btn_consulter
3089 ),
3090 // Colonne 2 - Numéro de dossier
3091 sprintf(
3092 $template_link,
3093 $ct_href,
3094 $row["dossier_libelle"]
3095 ),
3096 // Colonne 3 - Date de dépôt
3097 sprintf(
3098 $template_link,
3099 $ct_href,
3100 $this->f->formatDate($row["date_depot"])
3101 )
3102 );
3103 }
3104 // Affichage du tableau listant les dossiers
3105 printf(
3106 $template_table,
3107 // Colonne 1 - Bouton consulter
3108 '',
3109 // Colonne 2 - Numéro de dossier
3110 _('dossier'),
3111 // Colonne 3 - Date de dépôt du dossier
3112 _('date_depot'),
3113 // Contenu du tableau
3114 $ct_tbody
3115 );
3116
3117 // Affichage du footer
3118 printf(
3119 $this->template_footer,
3120 // href (avec les paramètres du widget)
3121 sprintf(
3122 OM_ROUTE_TAB."&obj=dossiers_evenement_incomplet_majoration&filtre=%s",
3123 $filtre
3124 ),
3125 // titre
3126 __("Voir tous les dossiers d'instruction avec un événement d'incomplétude ou de majoration de délai sans date de notification")
3127 );
3128 }
3129
3130
3131 /**
3132 * Cette méthode permet de récupérer la configuration du widget 'Retours de
3133 * consultation'.
3134 *
3135 * @return array
3136 */
3137 function get_config_dossiers_evenement_incomplet_majoration($arguments) {
3138 // Initialisation du tableau des paramètres avec ses valeur par défaut
3139 $arguments_default = array(
3140 "filtre" => "instructeur",
3141 );
3142 // Vérification des arguments
3143 foreach ($arguments_default as $key => $value) {
3144 //
3145 if (isset($arguments[$key])) {
3146 //
3147 $elem = trim($arguments[$key]);
3148 //
3149 if ($key === "filtre"
3150 && in_array($elem, array("instructeur", "division", "aucun"))) {
3151 // La valeur doit être dans cette liste
3152 $arguments[$key] = $elem;
3153 continue;
3154 }
3155 }
3156 //
3157 $arguments[$key] = $value;
3158 }
3159 //
3160 $filtre = $arguments["filtre"];
3161
3162 /**
3163 * Construction de la requête
3164 */
3165 // SELECT
3166 $query_ct_select = "
3167 dossier.dossier,
3168 dossier.dossier_libelle,
3169 dossier.date_depot
3170 ";
3171 // SELECT - CHAMPAFFICHE
3172 $query_ct_select_champaffiche = array(
3173 'dossier.dossier as "'._("dossier").'"',
3174 'dossier.dossier_libelle as "'._("dossier").'"',
3175 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'._("date_depot").'"'
3176 );
3177 // FROM
3178 $query_ct_from = "
3179 ".DB_PREFIXE."dossier
3180 LEFT JOIN
3181 ".DB_PREFIXE."instruction
3182 ON
3183 dossier.dossier = instruction.dossier
3184 LEFT JOIN
3185 ".DB_PREFIXE."evenement
3186 ON
3187 instruction.evenement = evenement.evenement
3188 %s
3189 %s
3190 %s
3191 ";
3192
3193 $query_ct_where_instructeur_filter = "";
3194 $query_ct_where_division_filter = "";
3195 $query_ct_where_collectivite_filter = "";
3196 // Filtre sur les dossiers qui concernent l'utilisateur
3197 if ($filtre == "instructeur") {
3198 //
3199 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
3200 ON dossier.instructeur=instructeur.instructeur
3201 JOIN ".DB_PREFIXE."om_utilisateur
3202 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
3203 AND om_utilisateur.login='".$_SESSION['login']."'
3204 ";
3205 } else {
3206 $query_ct_where_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
3207 ON dossier.instructeur=instructeur.instructeur
3208 LEFT JOIN ".DB_PREFIXE."om_utilisateur
3209 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
3210 }
3211 // Filtre sur les dossier de la division
3212 if ($filtre == "division") {
3213 //
3214 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
3215 ON dossier.division=division.division
3216 AND division.division = ".$_SESSION['division']."
3217 ";
3218 } else {
3219 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
3220 ON dossier.division=division.division";
3221 }
3222 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
3223 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
3224 // collectivité
3225 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3226 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
3227 ON dossier.om_collectivite=om_collectivite.om_collectivite
3228 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
3229 ";
3230 } else {
3231 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
3232 ON dossier.om_collectivite=om_collectivite.om_collectivite
3233 ";
3234 }
3235
3236 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
3237
3238 // WHERE - COMMON
3239 $query_ct_where_common = "
3240 (
3241 LOWER(evenement.type) = 'incompletude' OR
3242 LOWER(evenement.type) = 'majoration_delai'
3243 ) AND
3244 (
3245 instruction.date_envoi_rar > CURRENT_TIMESTAMP - interval '1 month' AND
3246 instruction.date_envoi_rar <= CURRENT_TIMESTAMP
3247 ) AND
3248 instruction.date_retour_rar IS NULL AND
3249 evenement.retour = 'f'
3250 ";
3251
3252 // ORDER BY
3253 $query_ct_orderby = "
3254 dossier.date_depot desc
3255 ";
3256
3257 $query_ct_where_groupe = "";
3258 // Gestion des groupes et confidentialité
3259 include('../sql/pgsql/filter_group_widgets.inc.php');
3260
3261 /**
3262 * Message d'aide
3263 */
3264 //
3265 $message_filtre = "";
3266 //
3267 switch ($filtre) {
3268 case "instructeur":
3269 $message_filtre = " "._("dont je suis l'instructeur");
3270 break;
3271 case "division":
3272 $message_filtre = " "._("situés dans ma division");
3273 break;
3274 case "aucun":
3275 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3276 $message_filtre = " "._("situés dans ma collectivité");
3277 } else {
3278 $message_filtre = " "._("situés dans toutes les collectivités");
3279 }
3280 break;
3281 }
3282 //
3283 $message_help = sprintf(
3284 __("Les dossiers d'instruction%s qui ont un événement d'incomplétude ou de majoration de délai avec une date d'envoi AR, mais sans date de notification."),
3285 $message_filtre
3286 );
3287
3288 /**
3289 * Return
3290 */
3291 //
3292 return array(
3293 "arguments" => $arguments,
3294 "message_help" => $message_help,
3295 "query_ct_select" => $query_ct_select,
3296 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
3297 "query_ct_from" => $query_ct_from,
3298 "query_ct_where_common" => $query_ct_where_common,
3299 "query_ct_where_groupe" => $query_ct_where_groupe,
3300 "query_ct_orderby" => $query_ct_orderby,
3301 );
3302 }
3303
3304
3305 /**
3306 * WIDGET DASHBOARD - widget_infos_profil.
3307 */
3308 function view_widget_infos_profil($content = null) {
3309
3310 /**
3311 * Template nécessaires à l'affichage du widget
3312 */
3313 //
3314 $template_table = '
3315 </br>
3316 <h4>Liste des accès</h4>
3317 <table class="tab-tab">
3318 <thead>
3319 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
3320 <th class="title col-0 firstcol">
3321 <span class="name">
3322 %s
3323 </span>
3324 </th>
3325 <th class="title col-1">
3326 <span class="name">
3327 %s
3328 </span>
3329 </th>
3330 <th class="title col-2 lastcol">
3331 <span class="name">
3332 %s
3333 </span>
3334 </th>
3335 </tr>
3336 </thead>
3337 <tbody>
3338 %s
3339 </tbody>
3340 </table>
3341 ';
3342 //
3343 $template_line = '
3344 <tr class="tab-data odd">
3345 <td class="col-1 firstcol">
3346 %s
3347 </td>
3348 <td class="col-1">
3349 %s
3350 </td>
3351 <td class="col-2 lastcol">
3352 %s
3353 </td>
3354 </tr>
3355 ';
3356
3357
3358 // Récupère les informations sur l'utilisateur
3359 $this->f->getUserInfos();
3360
3361 // Si l'utilisateur est loggé $_SESSION existe
3362 if(isset($_SESSION['login']) AND !empty($_SESSION['login'])) {
3363
3364 // On compose le bloc html d'affichage des informations de l'utilisateur
3365 $bloc_infos_profil = "
3366 %s
3367 <div class=\"profil-infos\">
3368 <h4>Utilisateur</h4>
3369 <div class=\"profil-infos-profil\">
3370 <span class=\"libelle\">%s</span> : <span class=\"value\">%s</span>
3371 </div>
3372 <div class=\"profil-infos-nom\">
3373 <span class=\"libelle\">%s</span> : <span class=\"value\">%s</span>
3374 </div>
3375 ";
3376
3377 // Si l'utilisateur connecté est un instructeur
3378 if ($this->f->isUserInstructeur() === true) {
3379
3380 // On compose le bloc html d'affichage des informations de l'utilisateur
3381 $bloc_infos_profil .= "
3382 <div class=\"profil-infos-division\">
3383 <span class=\"libelle\">%s</span> : <span class=\"value\">%s</span>
3384 </div>
3385 ";
3386
3387 // Requête de récupération de la qualité de l'instructeur
3388 $query = sprintf(
3389 "SELECT
3390 instructeur_qualite.libelle
3391 FROM
3392 " . DB_PREFIXE. "instructeur
3393 INNER JOIN " . DB_PREFIXE . "instructeur_qualite
3394 ON instructeur.instructeur_qualite=instructeur_qualite.instructeur_qualite
3395 WHERE
3396 instructeur.om_utilisateur = " . intval($this->f->om_utilisateur["om_utilisateur"])
3397 );
3398 $instr_qualite_lib = $this->f->db->getone($query);
3399 $this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE);
3400 $this->f->isDatabaseError($instr_qualite_lib);
3401 // S'il y a un résultat
3402 if ($instr_qualite_lib !== null) {
3403 $bloc_infos_profil .= "
3404 <div class=\"profil-infos-instructeur_qualite\">
3405 <span class=\"libelle\">" . _("Qualité") . "</span> : <span class=\"value\">" . $instr_qualite_lib . "</span>
3406 </div>
3407 ";
3408 }
3409 } else {
3410 // Pour éviter une NOTICE
3411 $this->f->om_utilisateur["code"] = '';
3412 }
3413 //
3414 $bloc_infos_profil .= "</div>";
3415
3416 // Ajout d'un tableau listant les groupes de l'utilisateur ainsi que ses
3417 // accès aux groupes
3418 $msg_erreur_groupe = '';
3419 $bloc_tableau_droits = '';
3420 // Si le profil et l'utilisateur n'ont pas de groupe défini
3421 if (isset($_SESSION['groupe']) === false) {
3422 $msg_erreur_groupe = '
3423 <div class="message ui-widget ui-corner-all ui-state-highlight ui-state-error borderless">
3424 <p>
3425 <span class="ui-icon ui-icon-info"></span>
3426 <span class="text">Problème de paramétrage : vous n\'avez pas de groupe associé.</span>
3427 </p>
3428 </div>
3429 ';
3430 } else {
3431 $ct_tbody = '';
3432 // On construit le contenu du tableau
3433 foreach ($_SESSION['groupe'] as $key => $value) {
3434 if ($value['confidentiel'] === true) {
3435 $value['confidentiel'] = _('Oui');
3436 }
3437 else {
3438 $value['confidentiel'] = _('Non');
3439 }
3440 if ($value['enregistrement_demande'] === true) {
3441 $value['enregistrement_demande'] = _('Oui');
3442 }
3443 else {
3444 $value['enregistrement_demande'] = _('Non');
3445 }
3446 // On construit la ligne
3447 $ct_tbody .= sprintf(
3448 $template_line,
3449 // Colonne 1 - Libellé du groupe
3450 $value["libelle"],
3451 // Colonne 2 - A accès aux dossiers confidentiels
3452 $value["confidentiel"],
3453 // Colonne 3 - Peut créer une demande
3454 $value["enregistrement_demande"]
3455 );
3456 }
3457 // Affichage du tableau listant les dossiers
3458 $bloc_infos_profil .= sprintf(
3459 $template_table,
3460 // Colonne 1 - Libellé du groupe
3461 _('groupe'),
3462 // Colonne 2 - A accès aux dossiers confidentiels
3463 _('dossiers confidentiels'),
3464 // Colonne 3 - Peut créer une demande
3465 _('enregistrement demande'),
3466 // Contenu du tableau
3467 $ct_tbody
3468 );
3469 }
3470 // Affichage du bloc html avec les variables associées
3471 printf(
3472 $bloc_infos_profil,
3473 $msg_erreur_groupe,
3474 _('Profil'), $this->f->om_utilisateur["libelle_profil"],
3475 _('Nom'), $this->f->om_utilisateur["nom"],
3476 _('Division'), $this->f->om_utilisateur["code"]
3477 );
3478 }
3479 }
3480
3481
3482 /**
3483 * Cette méthode permet de récupérer la configuration du widget
3484 * 'Mes contradictoires' ou 'Les contradictoires'.
3485 *
3486 * @return array
3487 */
3488 function get_config_dossier_contentieux_contradictoire($arguments) {
3489 // Initialisation du tableau des paramètres avec ses valeur par défaut
3490 $arguments_default = array(
3491 "filtre" => "instructeur"
3492 );
3493 // Vérification des arguments
3494 foreach ($arguments_default as $key => $value) {
3495 //
3496 if (isset($arguments[$key])) {
3497 //
3498 $elem = trim($arguments[$key]);
3499 //
3500 if ($key === "filtre"
3501 && in_array($elem, array("instructeur", "division", "aucun"))) {
3502 // La valeur doit être dans cette liste
3503 $arguments[$key] = $elem;
3504 continue;
3505 }
3506 }
3507 //
3508 $arguments[$key] = $value;
3509 }
3510 $filtre = $arguments["filtre"];
3511
3512 // SELECT - CHAMPAFFICHE
3513 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
3514 dossier.terrain_adresse_voie,\' \',
3515 dossier.terrain_adresse_lieu_dit,\' \',
3516 dossier.terrain_adresse_code_postal,\' \',
3517 dossier.terrain_adresse_localite,\' \',
3518 dossier.terrain_adresse_bp,\' \',
3519 dossier.terrain_adresse_cedex
3520 )) as "'._("localisation").'"';
3521 //
3522 $case_contrevenant = "
3523 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
3524 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
3525 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
3526 END
3527 ";
3528 //
3529 $query_ct_select_champaffiche = array(
3530 'dossier.dossier as "'._("dossier").'"',
3531 'dossier.dossier_libelle as "'._("dossier").'"',
3532 $trim_concat_terrain,
3533 $case_contrevenant.' as "'._("contrevenant").'"',
3534 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
3535 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
3536 'etat.libelle as "'._("etat").'"',
3537 'to_char(dossier.date_contradictoire, \'DD/MM/YYYY\') as "'._("date_contradictoire").'"',
3538 'to_char(dossier.date_retour_contradictoire, \'DD/MM/YYYY\') as "'._("date_retour_contradictoire").'"',
3539 );
3540
3541 /**
3542 * Construction de la requête
3543 */
3544 // SELECT
3545 $query_ct_select = "
3546 dossier.dossier,
3547 dossier.dossier_libelle,
3548 dossier.date_contradictoire,
3549 dossier.date_retour_contradictoire
3550 ";
3551
3552 // FROM
3553 $query_ct_from = "
3554 ".DB_PREFIXE."dossier
3555 LEFT JOIN ".DB_PREFIXE."etat
3556 ON dossier.etat = etat.etat
3557 LEFT JOIN (
3558 SELECT *
3559 FROM ".DB_PREFIXE."lien_dossier_demandeur
3560 INNER JOIN ".DB_PREFIXE."demandeur
3561 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
3562 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
3563 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
3564 ) as demandeur_contrevenant
3565 ON demandeur_contrevenant.dossier = dossier.dossier
3566 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
3567 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
3568 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
3569 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
3570 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
3571 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
3572 LEFT JOIN ".DB_PREFIXE."avis_decision
3573 ON avis_decision.avis_decision=dossier.avis_decision
3574 %s
3575 %s
3576 %s
3577 ";
3578
3579 $query_ct_where_instructeur_filter = "";
3580 $query_ct_where_division_filter = "";
3581 $query_ct_where_collectivite_filter = "";
3582 // Filtre sur les dossiers qui concernent l'utilisateur
3583 if ($filtre == "instructeur") {
3584 //
3585 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
3586 ON dossier.instructeur=instructeur.instructeur
3587 OR dossier.instructeur_2=instructeur.instructeur
3588 JOIN ".DB_PREFIXE."om_utilisateur
3589 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
3590 AND om_utilisateur.login='".$_SESSION['login']."'
3591 ";
3592 }
3593
3594 // Filtre sur les dossier de la division
3595 if ($filtre == "division") {
3596 //
3597 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
3598 ON dossier.division=division.division
3599 AND division.division = ".$_SESSION['division']."
3600 ";
3601 }
3602
3603 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
3604 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
3605 // collectivité
3606 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3607 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
3608 ON dossier.om_collectivite=om_collectivite.om_collectivite
3609 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
3610 ";
3611 } else {
3612 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
3613 ON dossier.om_collectivite=om_collectivite.om_collectivite
3614 ";
3615 }
3616
3617 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
3618
3619 // WHERE - COMMON
3620 $query_ct_where_common = "
3621 LOWER(dossier_autorisation_type.code) = LOWER('IN')
3622 AND NOT EXISTS
3623 (SELECT NULL
3624 FROM ".DB_PREFIXE."instruction
3625 INNER JOIN ".DB_PREFIXE."evenement
3626 ON instruction.evenement = evenement.evenement
3627 WHERE instruction.dossier = dossier.dossier
3628 AND evenement.type = 'annul_contradictoire')
3629 AND (dossier.date_contradictoire >= CURRENT_DATE + interval '3 weeks'
3630 OR (dossier.date_contradictoire IS NOT NULL
3631 AND dossier.date_retour_contradictoire IS NULL))
3632 AND date_ait IS NULL
3633 ";
3634
3635 // ORDER BY
3636 $query_ct_orderby = "
3637 dossier.date_depot ASC
3638 ";
3639
3640 $query_ct_where_groupe = "";
3641 // Gestion des groupes et confidentialité
3642 include('../sql/pgsql/filter_group_widgets.inc.php');
3643
3644 /**
3645 * Message d'aide
3646 */
3647 //
3648 $message_filtre = "";
3649 //
3650 switch ($filtre) {
3651 case "instructeur":
3652 $message_filtre = " "._("dont je suis l'instructeur");
3653 break;
3654 case "division":
3655 $message_filtre = " "._("situés dans ma division");
3656 break;
3657 case "aucun":
3658 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3659 $message_filtre = " "._("situés dans ma collectivité");
3660 } else {
3661 $message_filtre = " "._("situés dans toutes les collectivités");
3662 }
3663 break;
3664 }
3665 //
3666 $message_help = sprintf(
3667 _("Les infractions%s les plus anciennes pour lesquelles la date de contradictoire est saisie (soit elle est supérieure ou égale à la date du jour + 3 semaines, soit elle ne rentre pas dans cette condition et la date de retour du contradictoire est vide), il n'y a pas d'événements de type 'Annulation de contradictoire' et il n'y a pas d'AIT créé."),
3668 $message_filtre
3669 );
3670
3671 /**
3672 * Return
3673 */
3674 //
3675 return array(
3676 "arguments" => $arguments,
3677 "message_help" => $message_help,
3678 "query_ct_select" => $query_ct_select,
3679 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
3680 "query_ct_from" => $query_ct_from,
3681 "query_ct_where" => $query_ct_where_common,
3682 "query_ct_where_groupe" => $query_ct_where_groupe,
3683 "query_ct_orderby" => $query_ct_orderby,
3684 );
3685 }
3686
3687 /**
3688 * WIDGET DASHBOARD - Les ou Mes dossiers contradictoires
3689 * @return void
3690 */
3691 function view_widget_dossier_contentieux_contradictoire($content = null) {
3692 /**
3693 * Ce widget est configurable via l'interface Web. Lors de la création
3694 * du widget dans le paramétrage il est possible de spécifier la ou les
3695 * options suivantes :
3696 * - filtre :
3697 * = instructeur
3698 * = division
3699 * = aucun
3700 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
3701 */
3702 // Liste des paramètres
3703 $params = array("filtre");
3704 // Formatage des arguments reçus en paramètres
3705 $arguments = $this->get_arguments($content, $params);
3706 // Récupération de la configuration du widget
3707 $conf = $this->get_config_dossier_contentieux_contradictoire($arguments);
3708
3709 $filtre = $conf["arguments"]["filtre"];
3710 //
3711
3712
3713 /**
3714 * Composition de la requête
3715 */
3716 //
3717 $query = sprintf("
3718 SELECT
3719 %s
3720 FROM
3721 %s
3722 WHERE
3723 %s
3724 %s
3725 ORDER BY
3726 %s
3727 LIMIT 5",
3728 $conf["query_ct_select"],
3729 $conf["query_ct_from"],
3730 $conf["query_ct_where"],
3731 $conf["query_ct_where_groupe"],
3732 $conf["query_ct_orderby"]
3733 );
3734
3735 /**
3736 * Exécution de la requête
3737 */
3738 //
3739 $res = $this->f->db->query($query);
3740 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
3741 $this->f->isDatabaseError($res);
3742
3743 // Affichage du message d'informations
3744 printf(
3745 $this->template_help,
3746 $conf["message_help"]
3747 );
3748 /**
3749 * Si il n'y a aucun dossier à afficher, alors on affiche un message
3750 * clair à l'utilisateur et on sort de la vue.
3751 */
3752 // Si il n'y a aucun dossier à afficher
3753 if ($res->numrows() == 0) {
3754 echo _("Il n'y a pas d'infractions pour lesquelles la date de contradictoire est saisie (soit elle est supérieure ou égale à la date du jour + 3 semaines, soit elle ne rentre pas dans cette condition et la date de retour du contradictoire est vide), il n'y a pas d'événements de type 'Annulation de contradictoire' et il n'y a pas d'AIT créé.");
3755 return;
3756 }
3757
3758 /**
3759 * Template nécessaires à l'affichage du widget
3760 */
3761 //
3762 $template_table = '
3763 <table class="tab-tab">
3764 <thead>
3765 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
3766 <th class="title col-0 firstcol">
3767 <span class="name">
3768 %s
3769 </span>
3770 </th>
3771 <th class="title col-1">
3772 <span class="name">
3773 %s
3774 </span>
3775 </th>
3776 <th class="title col-2">
3777 <span class="name">
3778 %s
3779 </span>
3780 </th>
3781 <th class="title col-3 lastcol">
3782 <span class="name">
3783 %s
3784 </span>
3785 </th>
3786 </tr>
3787 </thead>
3788 <tbody>
3789 %s
3790 </tbody>
3791 </table>
3792 ';
3793 //
3794 $template_line = '
3795 <tr class="tab-data odd">
3796 <td class="col-0 firstcol">
3797 %s
3798 </td>
3799 <td class="col-1 ">
3800 %s
3801 </td>
3802 <td class="col-2">
3803 %s
3804 </td>
3805 <td class="col-3 lastcol">
3806 %s
3807 </td>
3808 </tr>
3809 ';
3810 //
3811 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
3812 //
3813 $template_link = '
3814 <a class="lienTable" href="%s">
3815 %s
3816 </a>
3817 ';
3818 // Bouton consulter
3819 $template_btn_consulter = '
3820 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
3821 ._('Consulter')
3822 .'</span>
3823 ';
3824 //
3825
3826 /**
3827 * Si il y a des dossiers à afficher, alors on affiche le widget.
3828 */
3829 // On construit le contenu du tableau
3830 $ct_tbody = '';
3831 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3832 // On construit l'attribut href du lien
3833 $ct_href = sprintf(
3834 $template_href,
3835 // idx
3836 $row["dossier"]
3837 );
3838 // On construit la ligne
3839 $ct_tbody .= sprintf(
3840 $template_line,
3841 // Colonne 1 - Numéro de dossier
3842 sprintf(
3843 $template_link,
3844 $ct_href,
3845 $template_btn_consulter
3846 ),
3847 // Colonne 2 - Numéro de dossier
3848 sprintf(
3849 $template_link,
3850 $ct_href,
3851 $row["dossier_libelle"]
3852 ),
3853 // Colonne 3 - Date contradictoire
3854 sprintf(
3855 $template_link,
3856 $ct_href,
3857 $this->f->formatDate($row["date_contradictoire"])
3858 ),
3859 // Colonne 4 - Date retour contradictoire
3860 sprintf(
3861 $template_link,
3862 $ct_href,
3863 $this->f->formatDate($row["date_retour_contradictoire"])
3864 )
3865 );
3866 }
3867 // Affichage du tableau listant les dossiers
3868 printf(
3869 $template_table,
3870 // Colonne 1 - Consulter
3871 '',
3872 // Colonne 2 - Numéro de dossier
3873 _('dossier'),
3874 // Colonne 3 - Date contradictoire
3875 _('date_contradictoire'),
3876 // Colonne 4 - Date retour contradictoire
3877 _('date_retour_contradictoire'),
3878 // Le Contenu
3879 $ct_tbody
3880 );
3881 // Affichage du footer
3882 printf(
3883 $this->template_footer,
3884 OM_ROUTE_TAB."&obj=dossier_contentieux_contradictoire&filtre=" . $filtre,
3885 _("Voir +")
3886 );
3887 }
3888
3889
3890 /**
3891 * Cette méthode permet de récupérer la configuration du widget 'Mes AIT'
3892 * ou 'Les AIT'.
3893 *
3894 * @return array
3895 */
3896 function get_config_dossier_contentieux_ait($arguments) {
3897 // Initialisation du tableau des paramètres avec ses valeur par défaut
3898 $arguments_default = array(
3899 "filtre" => "instructeur"
3900 );
3901 // Vérification des arguments
3902 foreach ($arguments_default as $key => $value) {
3903 //
3904 if (isset($arguments[$key])) {
3905 //
3906 $elem = trim($arguments[$key]);
3907 //
3908 if ($key === "filtre"
3909 && in_array($elem, array("instructeur", "division", "aucun"))) {
3910 // La valeur doit être dans cette liste
3911 $arguments[$key] = $elem;
3912 continue;
3913 }
3914 }
3915 //
3916 $arguments[$key] = $value;
3917 }
3918 $filtre = $arguments["filtre"];
3919
3920 // SELECT - CHAMPAFFICHE
3921 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
3922 dossier.terrain_adresse_voie,\' \',
3923 dossier.terrain_adresse_lieu_dit,\' \',
3924 dossier.terrain_adresse_code_postal,\' \',
3925 dossier.terrain_adresse_localite,\' \',
3926 dossier.terrain_adresse_bp,\' \',
3927 dossier.terrain_adresse_cedex
3928 )) as "'._("localisation").'"';
3929 //
3930 $case_contrevenant = "
3931 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
3932 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
3933 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
3934 END
3935 ";
3936 //
3937 $query_ct_select_champaffiche = array(
3938 'dossier.dossier as "'._("dossier").'"',
3939 'dossier.dossier_libelle as "'._("dossier").'"',
3940 $trim_concat_terrain,
3941 $case_contrevenant.' as "'._("contrevenant").'"',
3942 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
3943 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
3944 'etat.libelle as "'._("etat").'"',
3945 'to_char(dossier.date_ait, \'DD/MM/YYYY\') as "'._("date_ait").'"',
3946 'to_char(instruction.date_retour_signature, \'DD/MM/YYYY\') as "'._("date_retour_signature").'"',
3947 );
3948
3949 /**
3950 * Construction de la requête
3951 */
3952 // SELECT
3953 $query_ct_select = "
3954 dossier.dossier,
3955 dossier.dossier_libelle,
3956 dossier.date_ait,
3957 instruction.date_retour_signature
3958 ";
3959
3960 // FROM
3961 $query_ct_from = "
3962 ".DB_PREFIXE."dossier
3963 LEFT JOIN ".DB_PREFIXE."etat
3964 ON dossier.etat = etat.etat
3965 LEFT JOIN (
3966 SELECT *
3967 FROM ".DB_PREFIXE."lien_dossier_demandeur
3968 INNER JOIN ".DB_PREFIXE."demandeur
3969 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
3970 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
3971 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
3972 ) as demandeur_contrevenant
3973 ON demandeur_contrevenant.dossier = dossier.dossier
3974 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
3975 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
3976 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
3977 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
3978 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
3979 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
3980 LEFT JOIN ".DB_PREFIXE."avis_decision
3981 ON avis_decision.avis_decision=dossier.avis_decision
3982 INNER JOIN ".DB_PREFIXE."instruction
3983 ON dossier.dossier = instruction.dossier
3984 AND date_retour_signature IS NOT NULL
3985 INNER JOIN ".DB_PREFIXE."evenement
3986 ON instruction.evenement = evenement.evenement
3987 AND LOWER(evenement.type) LIKE 'ait'
3988 %s
3989 %s
3990 %s
3991 ";
3992
3993 $query_ct_where_instructeur_filter = "";
3994 $query_ct_where_division_filter = "";
3995 $query_ct_where_collectivite_filter = "";
3996 // Filtre sur les dossiers qui concernent l'utilisateur
3997 if ($filtre == "instructeur") {
3998 //
3999 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
4000 ON dossier.instructeur=instructeur.instructeur
4001 OR dossier.instructeur_2=instructeur.instructeur
4002 JOIN ".DB_PREFIXE."om_utilisateur
4003 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
4004 AND om_utilisateur.login='".$_SESSION['login']."'
4005 ";
4006 }
4007
4008 // Filtre sur les dossier de la division
4009 if ($filtre == "division") {
4010 //
4011 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
4012 ON dossier.division=division.division
4013 AND division.division = ".$_SESSION['division']."
4014 ";
4015 }
4016
4017 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
4018 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
4019 // collectivité
4020 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4021 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
4022 ON dossier.om_collectivite=om_collectivite.om_collectivite
4023 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
4024 ";
4025 } else {
4026 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
4027 ON dossier.om_collectivite=om_collectivite.om_collectivite
4028 ";
4029 }
4030
4031 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
4032
4033 // WHERE
4034 $query_ct_where_common = "
4035 LOWER(dossier_autorisation_type.code) = LOWER('IN')
4036 ";
4037
4038 // ORDER BY
4039 $query_ct_orderby = "
4040 dossier.date_depot DESC
4041 ";
4042
4043 $query_ct_where_groupe = "";
4044 // Gestion des groupes et confidentialité
4045 include('../sql/pgsql/filter_group_widgets.inc.php');
4046
4047 /**
4048 * Message d'aide
4049 */
4050 //
4051 $message_filtre = "";
4052 //
4053 switch ($filtre) {
4054 case "instructeur":
4055 $message_filtre = " "._("dont je suis l'instructeur");
4056 break;
4057 case "division":
4058 $message_filtre = " "._("situés dans ma division");
4059 break;
4060 case "aucun":
4061 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4062 $message_filtre = " "._("situés dans ma collectivité");
4063 } else {
4064 $message_filtre = " "._("situés dans toutes les collectivités");
4065 }
4066 break;
4067 }
4068 //
4069 $message_help = sprintf(
4070 _("Les infractions%s les plus récentes pour lesquelles il y a un AIT signé."),
4071 $message_filtre
4072 );
4073
4074 /**
4075 * Return
4076 */
4077 //
4078 return array(
4079 "arguments" => $arguments,
4080 "message_help" => $message_help,
4081 "query_ct_select" => $query_ct_select,
4082 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
4083 "query_ct_from" => $query_ct_from,
4084 "query_ct_where" => $query_ct_where_common,
4085 "query_ct_where_groupe" => $query_ct_where_groupe,
4086 "query_ct_orderby" => $query_ct_orderby
4087 );
4088 }
4089
4090
4091 /**
4092 * WIDGET DASHBOARD - Les ou Mes dossiers AIT
4093 * @return void
4094 */
4095 function view_widget_dossier_contentieux_ait($content = null) {
4096 /**
4097 * Ce widget est configurable via l'interface Web. Lors de la création
4098 * du widget dans le paramétrage il est possible de spécifier la ou les
4099 * options suivantes :
4100 * - filtre :
4101 * = instructeur
4102 * = division
4103 * = aucun
4104 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
4105 */
4106 // Liste des paramètres
4107 $params = array("filtre");
4108 // Formatage des arguments reçus en paramètres
4109 $arguments = $this->get_arguments($content, $params);
4110 // Récupération de la configuration du widget
4111 $conf = $this->get_config_dossier_contentieux_ait($arguments);
4112 $filtre = $conf["arguments"]["filtre"];
4113
4114
4115 /**
4116 * Composition de la requête
4117 */
4118 //
4119 $query = sprintf("
4120 SELECT
4121 %s
4122 FROM
4123 %s
4124 WHERE
4125 %s
4126 %s
4127 ORDER BY
4128 %s
4129 LIMIT 5",
4130 $conf["query_ct_select"],
4131 $conf["query_ct_from"],
4132 $conf["query_ct_where"],
4133 $conf["query_ct_where_groupe"],
4134 $conf["query_ct_orderby"]
4135 );
4136
4137 /**
4138 * Exécution de la requête
4139 */
4140 //
4141 $res = $this->f->db->query($query);
4142 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
4143 $this->f->isDatabaseError($res);
4144
4145 // Affichage du message d'informations
4146 printf(
4147 $this->template_help,
4148 $conf["message_help"]
4149 );
4150 /**
4151 * Si il n'y a aucun dossier à afficher, alors on affiche un message
4152 * clair à l'utilisateur et on sort de la vue.
4153 */
4154 // Si il n'y a aucun dossier à afficher
4155 if ($res->numrows() == 0) {
4156 echo _("Il n'y a pas d'infractions pour lesquelles il y a un AIT signé.");
4157 return;
4158 }
4159
4160 /**
4161 * Template nécessaires à l'affichage du widget
4162 */
4163 //
4164 $template_table = '
4165 <table class="tab-tab">
4166 <thead>
4167 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
4168 <th class="title col-0 firstcol">
4169 <span class="name">
4170 %s
4171 </span>
4172 </th>
4173 <th class="title col-1">
4174 <span class="name">
4175 %s
4176 </span>
4177 </th>
4178 <th class="title col-2">
4179 <span class="name">
4180 %s
4181 </span>
4182 </th>
4183 <th class="title col-3 lastcol">
4184 <span class="name">
4185 %s
4186 </span>
4187 </th>
4188 </tr>
4189 </thead>
4190 <tbody>
4191 %s
4192 </tbody>
4193 </table>
4194 ';
4195 //
4196 $template_line = '
4197 <tr class="tab-data odd">
4198 <td class="col-0 firstcol">
4199 %s
4200 </td>
4201 <td class="col-1 ">
4202 %s
4203 </td>
4204 <td class="col-2">
4205 %s
4206 </td>
4207 <td class="col-3 lastcol">
4208 %s
4209 </td>
4210 </tr>
4211 ';
4212 //
4213 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
4214 //
4215 $template_link = '
4216 <a class="lienTable" href="%s">
4217 %s
4218 </a>
4219 ';
4220 // Bouton consulter
4221 $template_btn_consulter = '
4222 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
4223 ._('Consulter')
4224 .'</span>
4225 ';
4226 //
4227
4228 /**
4229 * Si il y a des dossiers à afficher, alors on affiche le widget.
4230 */
4231 // On construit le contenu du tableau
4232 $ct_tbody = '';
4233 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
4234 // On construit l'attribut href du lien
4235 $ct_href = sprintf(
4236 $template_href,
4237 // idx
4238 $row["dossier"]
4239 );
4240 // On construit la ligne
4241 $ct_tbody .= sprintf(
4242 $template_line,
4243 // Colonne 1 - Numéro de dossier
4244 sprintf(
4245 $template_link,
4246 $ct_href,
4247 $template_btn_consulter
4248 ),
4249 // Colonne 2 - Numéro de dossier
4250 sprintf(
4251 $template_link,
4252 $ct_href,
4253 $row["dossier_libelle"]
4254 ),
4255 // Colonne 3 - Date AIT
4256 sprintf(
4257 $template_link,
4258 $ct_href,
4259 $this->f->formatDate($row["date_ait"])
4260 ),
4261 // Colonne 4 - Date retour signature
4262 sprintf(
4263 $template_link,
4264 $ct_href,
4265 $this->f->formatDate($row["date_retour_signature"])
4266 )
4267 );
4268 }
4269 // Affichage du tableau listant les dossiers
4270 printf(
4271 $template_table,
4272 // Colonne 1 - Consulter
4273 '',
4274 // Colonne 2 - Numéro de dossier
4275 _('dossier'),
4276 // Colonne 3 - Date AIT
4277 _('date_ait'),
4278 // Colonne 4 - Date retour signature
4279 _('date_retour_signature'),
4280 // Le Contenu
4281 $ct_tbody
4282 );
4283 // Affichage du footer
4284 printf(
4285 $this->template_footer,
4286 OM_ROUTE_TAB."&obj=dossier_contentieux_ait&filtre=" . $filtre,
4287 _("Voir +")
4288 );
4289 }
4290
4291
4292 /**
4293 * Cette méthode permet de récupérer la configuration du widget 'Les infractions
4294 * non affectées'.
4295 *
4296 * @return array
4297 */
4298 function get_config_dossier_contentieux_inaffectes($arguments) {
4299 // Initialisation du tableau des paramètres avec ses valeur par défaut
4300 $arguments_default = array(
4301 "filtre" => "division",
4302 "dossier_encours" => "true",
4303 );
4304 // Vérification des arguments
4305 foreach ($arguments_default as $key => $value) {
4306 //
4307 if (isset($arguments[$key])) {
4308 //
4309 $elem = trim($arguments[$key]);
4310 //
4311 if ($key === "filtre"
4312 && in_array($elem, array("division", "aucun"))) {
4313 // La valeur doit être dans cette liste
4314 $arguments[$key] = $elem;
4315 continue;
4316 } elseif ($key === "dossier_encours"
4317 && in_array($elem, array("true", "false"))) {
4318 // La valeur doit être dans cette liste
4319 $arguments[$key] = $elem;
4320 continue;
4321 }
4322 }
4323 //
4324 $arguments[$key] = $value;
4325 }
4326 $filtre = $arguments["filtre"];
4327 $d_encours = $arguments["dossier_encours"];
4328
4329 // SELECT - CHAMPAFFICHE
4330 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
4331 dossier.terrain_adresse_voie,\' \',
4332 dossier.terrain_adresse_lieu_dit,\' \',
4333 dossier.terrain_adresse_code_postal,\' \',
4334 dossier.terrain_adresse_localite,\' \',
4335 dossier.terrain_adresse_bp,\' \',
4336 dossier.terrain_adresse_cedex
4337 )) as "'._("localisation").'"';
4338 //
4339 $case_contrevenant = "
4340 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
4341 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
4342 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
4343 END
4344 ";
4345 //
4346 $query_ct_select_champaffiche = array(
4347 'dossier.dossier as "'._("dossier").'"',
4348 'dossier.dossier_libelle as "'._("dossier").'"',
4349 $trim_concat_terrain,
4350 $case_contrevenant.' as "'._("contrevenant").'"',
4351 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
4352 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
4353 'etat.libelle as "'._("etat").'"',
4354 'to_char(dossier.date_depot, \'DD/MM/YYYY\') as "'._("Date de réception").'"',
4355 );
4356
4357 /**
4358 * Construction de la requête
4359 */
4360 // SELECT
4361 $query_ct_select = "
4362 dossier.dossier,
4363 dossier.dossier_libelle,
4364 dossier.date_depot
4365 ";
4366
4367 // FROM
4368 $query_ct_from = "
4369 ".DB_PREFIXE."dossier
4370 INNER JOIN ".DB_PREFIXE."etat
4371 ON dossier.etat = etat.etat%s
4372 LEFT JOIN (
4373 SELECT *
4374 FROM ".DB_PREFIXE."lien_dossier_demandeur
4375 INNER JOIN ".DB_PREFIXE."demandeur
4376 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4377 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
4378 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
4379 ) as demandeur_contrevenant
4380 ON demandeur_contrevenant.dossier = dossier.dossier
4381 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
4382 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
4383 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
4384 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4385 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
4386 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
4387 LEFT JOIN ".DB_PREFIXE."avis_decision
4388 ON avis_decision.avis_decision=dossier.avis_decision
4389 %s
4390 %s
4391 ";
4392
4393 $query_ct_where_division_filter = "";
4394 $query_ct_where_collectivite_filter = "";
4395 $query_ct_where_statut_filter = "";
4396 // Filtre sur les dossier de la division
4397 if ($filtre == "division") {
4398 //
4399 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
4400 ON dossier.division=division.division
4401 AND division.division = ".$_SESSION['division']."
4402 ";
4403 } else {
4404 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
4405 ON dossier.division=division.division";
4406 }
4407
4408 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
4409 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
4410 // collectivité
4411 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4412 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
4413 ON dossier.om_collectivite=om_collectivite.om_collectivite
4414 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
4415 ";
4416 } else {
4417 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
4418 ON dossier.om_collectivite=om_collectivite.om_collectivite
4419 ";
4420 }
4421
4422 // Permet de filtrer les dossiers d'instruction pour n'afficher
4423 // seulement ceux dont l'état est considéré comme 'encours'
4424 if ($d_encours === 'true') {
4425 $query_ct_where_statut_filter = " AND etat.statut = 'encours' ";
4426 }
4427
4428 $query_ct_from = sprintf($query_ct_from,
4429 $query_ct_where_statut_filter,
4430 $query_ct_where_division_filter,
4431 $query_ct_where_collectivite_filter
4432 );
4433
4434 // WHERE - COMMON
4435 $query_ct_where_common = "
4436 LOWER(dossier_autorisation_type.code) = LOWER('IN')
4437 AND dossier.instructeur_2 IS NULL
4438 ";
4439
4440 // ORDER BY
4441
4442 $query_ct_orderby = "
4443 dossier.date_depot ASC
4444 ";
4445
4446 $query_ct_where_groupe = "";
4447 // Gestion des groupes et confidentialité
4448 include('../sql/pgsql/filter_group_widgets.inc.php');
4449
4450 /**
4451 * Message d'aide
4452 */
4453 //
4454 $message_filtre = "";
4455 //
4456 switch ($filtre) {
4457 case "division":
4458 $message_filtre = " "._("situés dans ma division");
4459 break;
4460 case "aucun":
4461 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4462 $message_filtre = " "._("situés dans ma collectivité");
4463 } else {
4464 $message_filtre = " "._("situés dans toutes les collectivités");
4465 }
4466 break;
4467 }
4468
4469 // Complète le message d'aide pour préciser que les dossiers
4470 // d'instruction sont seulement ceux considérés comme 'encours'
4471 if ($d_encours === 'true') {
4472 $message_filtre = " "._("en cours d'instruction").$message_filtre;
4473 }
4474 //
4475 $message_help = sprintf(
4476 _("Les infractions%s les plus anciennes non-affectées à un technicien."),
4477 $message_filtre
4478 );
4479
4480 /**
4481 * Return
4482 */
4483 //
4484 return array(
4485 "arguments" => $arguments,
4486 "message_help" => $message_help,
4487 "query_ct_select" => $query_ct_select,
4488 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
4489 "query_ct_from" => $query_ct_from,
4490 "query_ct_where" => $query_ct_where_common,
4491 "query_ct_where_groupe" => $query_ct_where_groupe,
4492 "query_ct_orderby" => $query_ct_orderby
4493 );
4494 }
4495
4496 /**
4497 * WIDGET DASHBOARD - Les infractions non affectées
4498 * @return void
4499 */
4500 function view_widget_dossier_contentieux_inaffectes($content = null) {
4501 /**
4502 * Ce widget est configurable via l'interface Web. Lors de la création
4503 * du widget dans le paramétrage il est possible de spécifier la ou les
4504 * options suivantes :
4505 * - filtre :
4506 * = instructeur
4507 * = division
4508 * = aucun
4509 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
4510 * - dossier_encours (permet d'afficher seulement les DI en cours) :
4511 * = true (affiche seulement les DI en cours)
4512 * = false (affiche tous les DI)
4513 * (default) true
4514 */
4515 // Liste des paramètres
4516 $params = array("filtre", "dossier_encours",);
4517 // Formatage des arguments reçus en paramètres
4518 $arguments = $this->get_arguments($content, $params);
4519 // Récupération de la configuration du widget
4520 $conf = $this->get_config_dossier_contentieux_inaffectes($arguments);
4521
4522 $filtre = $conf["arguments"]["filtre"];
4523 $d_encours = $conf["arguments"]["dossier_encours"];
4524 //
4525
4526
4527 /**
4528 * Composition de la requête
4529 */
4530 //
4531 $query = sprintf("
4532 SELECT
4533 %s
4534 FROM
4535 %s
4536 WHERE
4537 %s
4538 %s
4539 ORDER BY
4540 %s
4541 LIMIT 5",
4542 $conf["query_ct_select"],
4543 $conf["query_ct_from"],
4544 $conf["query_ct_where"],
4545 $conf["query_ct_where_groupe"],
4546 $conf["query_ct_orderby"]
4547 );
4548
4549 /**
4550 * Exécution de la requête
4551 */
4552 //
4553 $res = $this->f->db->query($query);
4554 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
4555 $this->f->isDatabaseError($res);
4556
4557 // Affichage du message d'informations
4558 printf(
4559 $this->template_help,
4560 $conf["message_help"]
4561 );
4562 /**
4563 * Si il n'y a aucun dossier à afficher, alors on affiche un message
4564 * clair à l'utilisateur et on sort de la vue.
4565 */
4566 // Si il n'y a aucun dossier à afficher
4567 if ($res->numrows() == 0) {
4568 echo _("Il n'y a pas d'infractions non-affectées à un technicien.");
4569 return;
4570 }
4571
4572 /**
4573 * Template nécessaires à l'affichage du widget
4574 */
4575 //
4576 $template_table = '
4577 <table class="tab-tab">
4578 <thead>
4579 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
4580 <th class="title col-0 firstcol">
4581 <span class="name">
4582 %s
4583 </span>
4584 </th>
4585 <th class="title col-1">
4586 <span class="name">
4587 %s
4588 </span>
4589 </th>
4590 <th class="title col-2 lastcol">
4591 <span class="name">
4592 %s
4593 </span>
4594 </th>
4595 </tr>
4596 </thead>
4597 <tbody>
4598 %s
4599 </tbody>
4600 </table>
4601 ';
4602 //
4603 $template_line = '
4604 <tr class="tab-data odd">
4605 <td class="col-0 firstcol">
4606 %s
4607 </td>
4608 <td class="col-1 ">
4609 %s
4610 </td>
4611 <td class="col-2 lastcol">
4612 %s
4613 </td>
4614 </tr>
4615 ';
4616 //
4617 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
4618 //
4619 $template_link = '
4620 <a class="lienTable" href="%s">
4621 %s
4622 </a>
4623 ';
4624 // Bouton consulter
4625 $template_btn_consulter = '
4626 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
4627 ._('Consulter')
4628 .'</span>
4629 ';
4630 //
4631
4632 /**
4633 * Si il y a des dossiers à afficher, alors on affiche le widget.
4634 */
4635 // On construit le contenu du tableau
4636 $ct_tbody = '';
4637 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
4638 // On construit l'attribut href du lien
4639 $ct_href = sprintf(
4640 $template_href,
4641 // idx
4642 $row["dossier"]
4643 );
4644 // On construit la ligne
4645 $ct_tbody .= sprintf(
4646 $template_line,
4647 // Colonne 1 - Numéro de dossier
4648 sprintf(
4649 $template_link,
4650 $ct_href,
4651 $template_btn_consulter
4652 ),
4653 // Colonne 2 - Numéro de dossier
4654 sprintf(
4655 $template_link,
4656 $ct_href,
4657 $row["dossier_libelle"]
4658 ),
4659 // Colonne 3 - Date de réception
4660 sprintf(
4661 $template_link,
4662 $ct_href,
4663 $this->f->formatDate($row["date_depot"])
4664 )
4665 );
4666 }
4667 // Affichage du tableau listant les dossiers
4668 printf(
4669 $template_table,
4670 // Colonne 1 - Consulter
4671 '',
4672 // Colonne 2 - Numéro de dossier
4673 _('dossier'),
4674 // Colonne 3 - Date de réception
4675 _('Date de réception'),
4676 // Le Contenu
4677 $ct_tbody
4678 );
4679 // Affichage du footer
4680 printf(
4681 $this->template_footer,
4682 OM_ROUTE_TAB."&obj=dossier_contentieux_inaffectes&filtre=" . $filtre."&dossier_encours=".$d_encours,
4683 _("Voir +")
4684 );
4685 }
4686
4687
4688 /**
4689 * Cette méthode permet de récupérer la configuration du widget 'Alerte Visite'.
4690 *
4691 * @return array
4692 */
4693 function get_config_dossier_contentieux_alerte_visite($arguments) {
4694 // Initialisation du tableau des paramètres avec ses valeur par défaut
4695 $arguments_default = array(
4696 "filtre" => "instructeur",
4697 "dossier_encours" => "true",
4698 );
4699 // Vérification des arguments
4700 foreach ($arguments_default as $key => $value) {
4701 //
4702 if (isset($arguments[$key])) {
4703 //
4704 $elem = trim($arguments[$key]);
4705 //
4706 if ($key === "filtre"
4707 && in_array($elem, array("instructeur", "division", "aucun"))) {
4708 // La valeur doit être dans cette liste
4709 $arguments[$key] = $elem;
4710 continue;
4711 } elseif ($key === "dossier_encours"
4712 && in_array($elem, array("true", "false"))) {
4713 // La valeur doit être dans cette liste
4714 $arguments[$key] = $elem;
4715 continue;
4716 }
4717 }
4718 //
4719 $arguments[$key] = $value;
4720 }
4721 $filtre = $arguments["filtre"];
4722 $d_encours = $arguments["dossier_encours"];
4723
4724 // SELECT - CHAMPAFFICHE
4725 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
4726 dossier.terrain_adresse_voie,\' \',
4727 dossier.terrain_adresse_lieu_dit,\' \',
4728 dossier.terrain_adresse_code_postal,\' \',
4729 dossier.terrain_adresse_localite,\' \',
4730 dossier.terrain_adresse_bp,\' \',
4731 dossier.terrain_adresse_cedex
4732 )) as "'._("localisation").'"';
4733 //
4734 $case_contrevenant = "
4735 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
4736 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
4737 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
4738 END
4739 ";
4740 //
4741 $query_ct_select_champaffiche = array(
4742 'dossier.dossier as "'._("dossier").'"',
4743 'dossier.dossier_libelle as "'._("dossier").'"',
4744 $trim_concat_terrain,
4745 $case_contrevenant.' as "'._("contrevenant").'"',
4746 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
4747 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
4748 'etat.libelle as "'._("etat").'"',
4749 'to_char(dossier.date_depot, \'DD/MM/YYYY\') as "'._("Date de réception").'"',
4750 );
4751
4752 /**
4753 * Construction de la requête
4754 */
4755 // SELECT
4756 $query_ct_select = "
4757 dossier.dossier,
4758 dossier.dossier_libelle,
4759 dossier.date_depot
4760 ";
4761
4762 // FROM
4763 $query_ct_from = "
4764 ".DB_PREFIXE."dossier
4765 INNER JOIN ".DB_PREFIXE."etat
4766 ON dossier.etat = etat.etat%s
4767 LEFT JOIN (
4768 SELECT *
4769 FROM ".DB_PREFIXE."lien_dossier_demandeur
4770 INNER JOIN ".DB_PREFIXE."demandeur
4771 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4772 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
4773 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
4774 ) as demandeur_contrevenant
4775 ON demandeur_contrevenant.dossier = dossier.dossier
4776 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
4777 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
4778 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
4779 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4780 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
4781 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
4782 LEFT JOIN ".DB_PREFIXE."avis_decision
4783 ON avis_decision.avis_decision=dossier.avis_decision
4784 %s
4785 %s
4786 %s
4787 ";
4788
4789 $query_ct_where_instructeur_filter = "";
4790 $query_ct_where_division_filter = "";
4791 $query_ct_where_collectivite_filter = "";
4792 $query_ct_where_statut_filter = "";
4793 // Filtre sur les dossiers qui concernent l'utilisateur
4794 if ($filtre == "instructeur") {
4795 //
4796 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
4797 ON dossier.instructeur=instructeur.instructeur
4798 OR dossier.instructeur_2=instructeur.instructeur
4799 JOIN ".DB_PREFIXE."om_utilisateur
4800 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
4801 AND om_utilisateur.login='".$_SESSION['login']."'
4802 ";
4803 }
4804
4805 // Filtre sur les dossier de la division
4806 if ($filtre == "division") {
4807 //
4808 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
4809 ON dossier.division=division.division
4810 AND division.division = ".$_SESSION['division']."
4811 ";
4812 }
4813
4814 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
4815 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
4816 // collectivité
4817 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4818 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
4819 ON dossier.om_collectivite=om_collectivite.om_collectivite
4820 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
4821 ";
4822 } else {
4823 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
4824 ON dossier.om_collectivite=om_collectivite.om_collectivite
4825 ";
4826 }
4827
4828 //
4829 if ($d_encours === 'true') {
4830 $query_ct_where_statut_filter = " AND etat.statut = 'encours' ";
4831 }
4832
4833 $query_ct_from = sprintf(
4834 $query_ct_from,
4835 $query_ct_where_statut_filter,
4836 $query_ct_where_instructeur_filter,
4837 $query_ct_where_division_filter,
4838 $query_ct_where_collectivite_filter
4839 );
4840
4841 // WHERE - COMMON
4842 $query_ct_where_common = "
4843 LOWER(dossier_autorisation_type.code) = LOWER('IN')
4844 AND dossier.date_depot < CURRENT_TIMESTAMP - interval '3 months'
4845 AND dossier.date_premiere_visite IS NULL
4846 ";
4847
4848 // ORDER BY
4849 $query_ct_orderby = "
4850 dossier.date_depot ASC
4851 ";
4852
4853 $query_ct_where_groupe = "";
4854 // Gestion des groupes et confidentialité
4855 include('../sql/pgsql/filter_group_widgets.inc.php');
4856
4857 /**
4858 * Message d'aide
4859 */
4860 //
4861 $message_filtre = "";
4862 //
4863 switch ($filtre) {
4864 case "instructeur":
4865 $message_filtre = " "._("dont je suis l'instructeur");
4866 break;
4867 case "division":
4868 $message_filtre = " "._("situés dans ma division");
4869 break;
4870 case "aucun":
4871 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4872 $message_filtre = " "._("situés dans ma collectivité");
4873 } else {
4874 $message_filtre = " "._("situés dans toutes les collectivités");
4875 }
4876 break;
4877 }
4878 // Complète le message d'aide pour préciser que les dossiers
4879 // d'instruction sont seulement ceux considérés comme 'encours'
4880 if ($d_encours === 'true') {
4881 $message_filtre = " "._("en cours d'instruction").$message_filtre;
4882 }
4883 //
4884 $message_help = sprintf(
4885 _("Les infractions%s les plus anciennes pour lesquelles la date de réception est dépassée depuis plus de 3 mois et dont la date de première visite n'est pas saisie."),
4886 $message_filtre
4887 );
4888
4889 /**
4890 * Return
4891 */
4892 //
4893 return array(
4894 "arguments" => $arguments,
4895 "message_help" => $message_help,
4896 "query_ct_select" => $query_ct_select,
4897 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
4898 "query_ct_from" => $query_ct_from,
4899 "query_ct_where" => $query_ct_where_common,
4900 "query_ct_where_groupe" => $query_ct_where_groupe,
4901 "query_ct_orderby" => $query_ct_orderby
4902 );
4903 }
4904
4905 /**
4906 * WIDGET DASHBOARD - Alerte Visite
4907 * @return void
4908 */
4909 function view_widget_dossier_contentieux_alerte_visite($content = null) {
4910 /**
4911 * Ce widget est configurable via l'interface Web. Lors de la création
4912 * du widget dans le paramétrage il est possible de spécifier la ou les
4913 * options suivantes :
4914 * - filtre :
4915 * = instructeur
4916 * = division
4917 * = aucun
4918 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
4919 * - dossier_encours (permet d'afficher seulement les DI en cours) :
4920 * = true (affiche seulement les DI en cours)
4921 * = false (affiche tous les DI)
4922 * (default) true
4923 */
4924 // Liste des paramètres
4925 $params = array("filtre", "dossier_encours", );
4926 // Formatage des arguments reçus en paramètres
4927 $arguments = $this->get_arguments($content, $params);
4928 // Récupération de la configuration du widget
4929 $conf = $this->get_config_dossier_contentieux_alerte_visite($arguments);
4930
4931 //
4932 $filtre = $conf["arguments"]["filtre"];
4933 $d_encours = $conf["arguments"]["dossier_encours"];
4934
4935 /**
4936 * Composition de la requête
4937 */
4938 //
4939 $query = sprintf("
4940 SELECT
4941 %s
4942 FROM
4943 %s
4944 WHERE
4945 %s
4946 %s
4947 ORDER BY
4948 %s
4949 LIMIT 5",
4950 $conf["query_ct_select"],
4951 $conf["query_ct_from"],
4952 $conf["query_ct_where"],
4953 $conf["query_ct_where_groupe"],
4954 $conf["query_ct_orderby"]
4955 );
4956
4957 /**
4958 * Exécution de la requête
4959 */
4960 //
4961 $res = $this->f->db->query($query);
4962 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
4963 $this->f->isDatabaseError($res);
4964
4965 // Affichage du message d'informations
4966 printf(
4967 $this->template_help,
4968 $conf["message_help"]
4969 );
4970 /**
4971 * Si il n'y a aucun dossier à afficher, alors on affiche un message
4972 * clair à l'utilisateur et on sort de la vue.
4973 */
4974 // Si il n'y a aucun dossier à afficher
4975 if ($res->numrows() == 0) {
4976 echo _("Il n'y a pas d'infractions pour lesquelles la date de réception est dépassée depuis plus de 3 mois et dont la date de première visite n'est pas saisie.");
4977 return;
4978 }
4979
4980 /**
4981 * Template nécessaires à l'affichage du widget
4982 */
4983 //
4984 $template_table = '
4985 <table class="tab-tab">
4986 <thead>
4987 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
4988 <th class="title col-0 firstcol">
4989 <span class="name">
4990 %s
4991 </span>
4992 </th>
4993 <th class="title col-1">
4994 <span class="name">
4995 %s
4996 </span>
4997 </th>
4998 <th class="title col-2 lastcol">
4999 <span class="name">
5000 %s
5001 </span>
5002 </th>
5003 </tr>
5004 </thead>
5005 <tbody>
5006 %s
5007 </tbody>
5008 </table>
5009 ';
5010 //
5011 $template_line = '
5012 <tr class="tab-data odd">
5013 <td class="col-0 firstcol">
5014 %s
5015 </td>
5016 <td class="col-1 ">
5017 %s
5018 </td>
5019 <td class="col-2 lastcol">
5020 %s
5021 </td>
5022 </tr>
5023 ';
5024 //
5025 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
5026 //
5027 $template_link = '
5028 <a class="lienTable" href="%s">
5029 %s
5030 </a>
5031 ';
5032 // Bouton consulter
5033 $template_btn_consulter = '
5034 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
5035 ._('Consulter')
5036 .'</span>
5037 ';
5038 //
5039
5040 /**
5041 * Si il y a des dossiers à afficher, alors on affiche le widget.
5042 */
5043 // On construit le contenu du tableau
5044 $ct_tbody = '';
5045 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5046 // On construit l'attribut href du lien
5047 $ct_href = sprintf(
5048 $template_href,
5049 // idx
5050 $row["dossier"]
5051 );
5052 // On construit la ligne
5053 $ct_tbody .= sprintf(
5054 $template_line,
5055 // Colonne 1 - Numéro de dossier
5056 sprintf(
5057 $template_link,
5058 $ct_href,
5059 $template_btn_consulter
5060 ),
5061 // Colonne 2 - Numéro de dossier
5062 sprintf(
5063 $template_link,
5064 $ct_href,
5065 $row["dossier_libelle"]
5066 ),
5067 // Colonne 3 - Date de réception
5068 sprintf(
5069 $template_link,
5070 $ct_href,
5071 $this->f->formatDate($row["date_depot"])
5072 )
5073 );
5074 }
5075 // Affichage du tableau listant les dossiers
5076 printf(
5077 $template_table,
5078 // Colonne 1 - Consulter
5079 '',
5080 // Colonne 2 - Numéro de dossier
5081 _('dossier'),
5082 // Colonne 3 - Date de réception
5083 _('Date de réception'),
5084 // Le Contenu
5085 $ct_tbody
5086 );
5087 // Affichage du footer
5088 printf(
5089 $this->template_footer,
5090 OM_ROUTE_TAB."&obj=dossier_contentieux_alerte_visite&filtre=".$filtre."&dossier_encours=".$d_encours,
5091 _("Voir +")
5092 );
5093 }
5094
5095 /**
5096 * Cette méthode permet de récupérer la configuration du widget 'Alerte Parquet'.
5097 *
5098 * @return array
5099 */
5100 function get_config_dossier_contentieux_alerte_parquet($arguments) {
5101 // Initialisation du tableau des paramètres avec ses valeur par défaut
5102 $arguments_default = array(
5103 "filtre" => "instructeur",
5104 "dossier_encours" => "true",
5105 );
5106 // Vérification des arguments
5107 foreach ($arguments_default as $key => $value) {
5108 //
5109 if (isset($arguments[$key])) {
5110 //
5111 $elem = trim($arguments[$key]);
5112 //
5113 if ($key === "filtre"
5114 && in_array($elem, array("instructeur", "division", "aucun"))) {
5115 // La valeur doit être dans cette liste
5116 $arguments[$key] = $elem;
5117 continue;
5118 } elseif ($key === "dossier_encours"
5119 && in_array($elem, array("true", "false"))) {
5120 // La valeur doit être dans cette liste
5121 $arguments[$key] = $elem;
5122 continue;
5123 }
5124 }
5125 //
5126 $arguments[$key] = $value;
5127 }
5128 $filtre = $arguments["filtre"];
5129 $d_encours = $arguments["dossier_encours"];
5130
5131 // SELECT - CHAMPAFFICHE
5132 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
5133 dossier.terrain_adresse_voie,\' \',
5134 dossier.terrain_adresse_lieu_dit,\' \',
5135 dossier.terrain_adresse_code_postal,\' \',
5136 dossier.terrain_adresse_localite,\' \',
5137 dossier.terrain_adresse_bp,\' \',
5138 dossier.terrain_adresse_cedex
5139 )) as "'._("localisation").'"';
5140 //
5141 $case_contrevenant = "
5142 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
5143 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
5144 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
5145 END
5146 ";
5147 //
5148 $query_ct_select_champaffiche = array(
5149 'dossier.dossier as "'._("dossier").'"',
5150 'dossier.dossier_libelle as "'._("dossier").'"',
5151 $trim_concat_terrain,
5152 $case_contrevenant.' as "'._("contrevenant").'"',
5153 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
5154 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
5155 'etat.libelle as "'._("etat").'"',
5156 'to_char(dossier.date_depot, \'DD/MM/YYYY\') as "'._("Date de réception").'"',
5157 );
5158
5159 /**
5160 * Construction de la requête
5161 */
5162 // SELECT
5163 $query_ct_select = "
5164 dossier.dossier,
5165 dossier.dossier_libelle,
5166 dossier.date_depot
5167 ";
5168
5169 // FROM
5170 $query_ct_from = "
5171 ".DB_PREFIXE."dossier
5172 INNER JOIN ".DB_PREFIXE."etat
5173 ON dossier.etat = etat.etat%s
5174 LEFT JOIN (
5175 SELECT *
5176 FROM ".DB_PREFIXE."lien_dossier_demandeur
5177 INNER JOIN ".DB_PREFIXE."demandeur
5178 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5179 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
5180 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
5181 ) as demandeur_contrevenant
5182 ON demandeur_contrevenant.dossier = dossier.dossier
5183 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5184 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5185 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5186 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5187 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5188 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5189 LEFT JOIN ".DB_PREFIXE."avis_decision
5190 ON avis_decision.avis_decision=dossier.avis_decision
5191 %s
5192 %s
5193 %s
5194 ";
5195
5196 $query_ct_where_instructeur_filter = "";
5197 $query_ct_where_division_filter = "";
5198 $query_ct_where_collectivite_filter = "";
5199 $query_ct_where_statut_filter = "";
5200 // Filtre sur les dossiers qui concernent l'utilisateur
5201 if ($filtre == "instructeur") {
5202 //
5203 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
5204 ON dossier.instructeur=instructeur.instructeur
5205 OR dossier.instructeur_2=instructeur.instructeur
5206 JOIN ".DB_PREFIXE."om_utilisateur
5207 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
5208 AND om_utilisateur.login='".$_SESSION['login']."'
5209 ";
5210 }
5211
5212 // Filtre sur les dossier de la division
5213 if ($filtre == "division") {
5214 //
5215 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
5216 ON dossier.division=division.division
5217 AND division.division = ".$_SESSION['division']."
5218 ";
5219 }
5220
5221 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
5222 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
5223 // collectivité
5224 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5225 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
5226 ON dossier.om_collectivite=om_collectivite.om_collectivite
5227 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
5228 ";
5229 } else {
5230 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
5231 ON dossier.om_collectivite=om_collectivite.om_collectivite
5232 ";
5233 }
5234
5235 // Permet de filtrer les dossiers d'instruction pour n'afficher
5236 // seulement ceux dont l'état est considéré comme 'encours'
5237 if ($d_encours === 'true') {
5238 $query_ct_where_statut_filter = " AND etat.statut = 'encours' ";
5239 }
5240
5241 $query_ct_from = sprintf(
5242 $query_ct_from,
5243 $query_ct_where_statut_filter,
5244 $query_ct_where_instructeur_filter,
5245 $query_ct_where_division_filter,
5246 $query_ct_where_collectivite_filter
5247 );
5248
5249 // WHERE - COMMON
5250 $query_ct_where_common = "
5251 LOWER(dossier_autorisation_type.code) = LOWER('IN')
5252 AND dossier.date_depot < CURRENT_TIMESTAMP - interval '9 months'
5253 AND dossier.date_transmission_parquet IS NULL
5254 ";
5255
5256 // ORDER BY
5257 $query_ct_orderby = "
5258 dossier.date_depot ASC
5259 ";
5260
5261 $query_ct_where_groupe = "";
5262 // Gestion des groupes et confidentialité
5263 include('../sql/pgsql/filter_group_widgets.inc.php');
5264
5265 /**
5266 * Message d'aide
5267 */
5268 //
5269 $message_filtre = "";
5270 //
5271 switch ($filtre) {
5272 case "instructeur":
5273 $message_filtre = " "._("dont je suis l'instructeur");
5274 break;
5275 case "division":
5276 $message_filtre = " "._("situés dans ma division");
5277 break;
5278 case "aucun":
5279 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5280 $message_filtre = " "._("situés dans ma collectivité");
5281 } else {
5282 $message_filtre = " "._("situés dans toutes les collectivités");
5283 }
5284 break;
5285 }
5286 // Complète le message d'aide pour préciser que les dossiers
5287 // d'instruction sont seulement ceux considérés comme 'encours'
5288 if ($d_encours === 'true') {
5289 $message_filtre = " "._("en cours d'instruction").$message_filtre;
5290 }
5291 //
5292 $message_help = sprintf(
5293 _("Les infractions%s les plus anciennes pour lesquelles la date de réception est dépassée depuis plus de 9 mois et dont la date de transmission au parquet n'est pas saisie."),
5294 $message_filtre
5295 );
5296
5297 /**
5298 * Return
5299 */
5300 //
5301 return array(
5302 "arguments" => $arguments,
5303 "message_help" => $message_help,
5304 "query_ct_select" => $query_ct_select,
5305 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
5306 "query_ct_from" => $query_ct_from,
5307 "query_ct_where" => $query_ct_where_common,
5308 "query_ct_where_groupe" => $query_ct_where_groupe,
5309 "query_ct_orderby" => $query_ct_orderby
5310 );
5311 }
5312
5313 /**
5314 * WIDGET DASHBOARD - Alerte Parquet
5315 * @return void
5316 */
5317 function view_widget_dossier_contentieux_alerte_parquet($content = null) {
5318 /**
5319 * Ce widget est configurable via l'interface Web. Lors de la création
5320 * du widget dans le paramétrage il est possible de spécifier la ou les
5321 * options suivantes :
5322 * - filtre :
5323 * = instructeur
5324 * = division
5325 * = aucun
5326 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
5327 * - dossier_encours (permet d'afficher seulement les DI en cours) :
5328 * = true (affiche seulement les DI en cours)
5329 * = false (affiche tous les DI)
5330 * (default) true
5331 */
5332 // Liste des paramètres
5333 $params = array("filtre", "dossier_encours", );
5334 // Formatage des arguments reçus en paramètres
5335 $arguments = $this->get_arguments($content, $params);
5336 // Récupération de la configuration du widget
5337 $conf = $this->get_config_dossier_contentieux_alerte_parquet($arguments);
5338
5339 //
5340 $filtre = $conf["arguments"]["filtre"];
5341 $d_encours = $conf["arguments"]["dossier_encours"];
5342
5343 /**
5344 * Composition de la requête
5345 */
5346 //
5347 $query = sprintf("
5348 SELECT
5349 %s
5350 FROM
5351 %s
5352 WHERE
5353 %s
5354 %s
5355 ORDER BY
5356 %s
5357 LIMIT 5",
5358 $conf["query_ct_select"],
5359 $conf["query_ct_from"],
5360 $conf["query_ct_where"],
5361 $conf["query_ct_where_groupe"],
5362 $conf["query_ct_orderby"]
5363 );
5364
5365 /**
5366 * Exécution de la requête
5367 */
5368 //
5369 $res = $this->f->db->query($query);
5370 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
5371 $this->f->isDatabaseError($res);
5372
5373 // Affichage du message d'informations
5374 printf(
5375 $this->template_help,
5376 $conf["message_help"]
5377 );
5378 /**
5379 * Si il n'y a aucun dossier à afficher, alors on affiche un message
5380 * clair à l'utilisateur et on sort de la vue.
5381 */
5382 // Si il n'y a aucun dossier à afficher
5383 if ($res->numrows() == 0) {
5384 echo _("Il n'y a pas d'infractions pour lesquelles la date de réception est dépassée depuis plus de 9 mois et dont la date de transmission au parquet n'est pas saisie.");
5385 return;
5386 }
5387
5388 /**
5389 * Template nécessaires à l'affichage du widget
5390 */
5391 //
5392 $template_table = '
5393 <table class="tab-tab">
5394 <thead>
5395 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
5396 <th class="title col-0 firstcol">
5397 <span class="name">
5398 %s
5399 </span>
5400 </th>
5401 <th class="title col-1">
5402 <span class="name">
5403 %s
5404 </span>
5405 </th>
5406 <th class="title col-2 lastcol">
5407 <span class="name">
5408 %s
5409 </span>
5410 </th>
5411 </tr>
5412 </thead>
5413 <tbody>
5414 %s
5415 </tbody>
5416 </table>
5417 ';
5418 //
5419 $template_line = '
5420 <tr class="tab-data odd">
5421 <td class="col-0 firstcol">
5422 %s
5423 </td>
5424 <td class="col-1 ">
5425 %s
5426 </td>
5427 <td class="col-2 lastcol">
5428 %s
5429 </td>
5430 </tr>
5431 ';
5432 //
5433 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
5434 //
5435 $template_link = '
5436 <a class="lienTable" href="%s">
5437 %s
5438 </a>
5439 ';
5440 // Bouton consulter
5441 $template_btn_consulter = '
5442 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
5443 ._('Consulter')
5444 .'</span>
5445 ';
5446 //
5447
5448 /**
5449 * Si il y a des dossiers à afficher, alors on affiche le widget.
5450 */
5451 // On construit le contenu du tableau
5452 $ct_tbody = '';
5453 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5454 // On construit l'attribut href du lien
5455 $ct_href = sprintf(
5456 $template_href,
5457 // idx
5458 $row["dossier"]
5459 );
5460 // On construit la ligne
5461 $ct_tbody .= sprintf(
5462 $template_line,
5463 // Colonne 1 - Numéro de dossier
5464 sprintf(
5465 $template_link,
5466 $ct_href,
5467 $template_btn_consulter
5468 ),
5469 // Colonne 2 - Numéro de dossier
5470 sprintf(
5471 $template_link,
5472 $ct_href,
5473 $row["dossier_libelle"]
5474 ),
5475 // Colonne 3 - Date de réception
5476 sprintf(
5477 $template_link,
5478 $ct_href,
5479 $this->f->formatDate($row["date_depot"])
5480 )
5481 );
5482 }
5483 // Affichage du tableau listant les dossiers
5484 printf(
5485 $template_table,
5486 // Colonne 1 - Consulter
5487 '',
5488 // Colonne 2 - Numéro de dossier
5489 _('dossier'),
5490 // Colonne 3 - Date de réception
5491 _('Date de réception'),
5492 // Le Contenu
5493 $ct_tbody
5494 );
5495 // Affichage du footer
5496 printf(
5497 $this->template_footer,
5498 OM_ROUTE_TAB."&obj=dossier_contentieux_alerte_parquet&filtre=".$filtre."&dossier_encours=".$d_encours,
5499 _("Voir +")
5500 );
5501 }
5502
5503 /**
5504 * Cette méthode permet de récupérer la configuration du widget 'Mes clôtures'.
5505 *
5506 * @return array
5507 */
5508 function get_config_dossier_contentieux_clotures($arguments) {
5509 // Initialisation du tableau des paramètres avec ses valeur par défaut
5510 $arguments_default = array(
5511 "filtre" => "instructeur",
5512 );
5513 // Vérification des arguments
5514 foreach ($arguments_default as $key => $value) {
5515 //
5516 if (isset($arguments[$key])) {
5517 //
5518 $elem = trim($arguments[$key]);
5519 //
5520 if ($key === "filtre"
5521 && in_array($elem, array("instructeur", "division", "aucun"))) {
5522 // La valeur doit être dans cette liste
5523 $arguments[$key] = $elem;
5524 continue;
5525 }
5526 }
5527 //
5528 $arguments[$key] = $value;
5529 }
5530
5531 $filtre = $arguments["filtre"];
5532
5533 // SELECT - CHAMPAFFICHE
5534 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
5535 dossier.terrain_adresse_voie,\' \',
5536 dossier.terrain_adresse_lieu_dit,\' \',
5537 dossier.terrain_adresse_code_postal,\' \',
5538 dossier.terrain_adresse_localite,\' \',
5539 dossier.terrain_adresse_bp,\' \',
5540 dossier.terrain_adresse_cedex
5541 )) as "'._("localisation").'"';
5542 //
5543 $case_requerant = "
5544 CASE WHEN demandeur_requerant.qualite = 'particulier'
5545 THEN TRIM(CONCAT(demandeur_requerant.particulier_nom, ' ', demandeur_requerant.particulier_prenom))
5546 ELSE TRIM(CONCAT(demandeur_requerant.personne_morale_raison_sociale, ' ', demandeur_requerant.personne_morale_denomination))
5547 END
5548 ";
5549 //
5550 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
5551 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
5552 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
5553 END";
5554 //
5555 $query_ct_select_champaffiche = array(
5556 'dossier.dossier as "'._("dossier").'"',
5557 'dossier.dossier_libelle as "'._("dossier").'"',
5558 'dossier_autorisation_type_detaille.libelle as "'._("type de dossier").'"',
5559 'dossier_autorisation_contestee.dossier_libelle as "'._("autorisation").'"',
5560 $case_demandeur.' as "'._("petitionnaire").'"',
5561 $trim_concat_terrain,
5562 $case_requerant.' as "'._("requerant").'"',
5563 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'._("date_depot").'"',
5564 'avis_decision.libelle as "'._("decision").'"',
5565 'etat.libelle as "'._("etat").'"',
5566 'to_char(dossier.date_cloture_instruction, \'DD/MM/YYYY\') as "'._("date_cloture_instruction").'"',
5567 );
5568
5569 /**
5570 * Construction de la requête
5571 */
5572 // SELECT
5573 $query_ct_select = "
5574 dossier.dossier,
5575 dossier.dossier_libelle,
5576 dossier.date_cloture_instruction
5577 ";
5578
5579 // FROM
5580 $query_ct_from = "
5581 ".DB_PREFIXE."dossier
5582 LEFT JOIN ".DB_PREFIXE."etat
5583 ON dossier.etat = etat.etat
5584 LEFT JOIN (
5585 SELECT *
5586 FROM ".DB_PREFIXE."lien_dossier_demandeur
5587 INNER JOIN ".DB_PREFIXE."demandeur
5588 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5589 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
5590 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
5591 ) as demandeur
5592 ON demandeur.dossier = dossier.dossier
5593 LEFT JOIN (
5594 SELECT *
5595 FROM ".DB_PREFIXE."lien_dossier_demandeur
5596 INNER JOIN ".DB_PREFIXE."demandeur
5597 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5598 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
5599 AND LOWER(demandeur.type_demandeur) = LOWER('requerant')
5600 ) as demandeur_requerant
5601 ON demandeur_requerant.dossier = dossier.dossier
5602 LEFT JOIN ".DB_PREFIXE."dossier as dossier_autorisation_contestee
5603 ON dossier.autorisation_contestee = dossier_autorisation_contestee.dossier
5604 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5605 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5606 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5607 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5608 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5609 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5610 LEFT JOIN ".DB_PREFIXE."avis_decision
5611 ON avis_decision.avis_decision=dossier.avis_decision
5612 %s
5613 %s
5614 %s
5615 ";
5616
5617 $query_ct_where_instructeur_filter = "";
5618 $query_ct_where_division_filter = "";
5619 $query_ct_where_collectivite_filter = "";
5620 // Filtre sur les dossiers qui concernent l'utilisateur
5621 if ($filtre == "instructeur") {
5622 //
5623 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
5624 ON dossier.instructeur=instructeur.instructeur
5625 OR dossier.instructeur_2=instructeur.instructeur
5626 JOIN ".DB_PREFIXE."om_utilisateur
5627 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
5628 AND om_utilisateur.login='".$_SESSION['login']."'
5629 ";
5630 }
5631
5632 // Filtre sur les dossier de la division
5633 if ($filtre == "division") {
5634 //
5635 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
5636 ON dossier.division=division.division
5637 AND division.division = ".$_SESSION['division']."
5638 ";
5639 }
5640
5641 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
5642 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
5643 // collectivité
5644 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5645 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
5646 ON dossier.om_collectivite=om_collectivite.om_collectivite
5647 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
5648 ";
5649 } else {
5650 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
5651 ON dossier.om_collectivite=om_collectivite.om_collectivite
5652 ";
5653 }
5654
5655 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
5656
5657 // WHERE - COMMON
5658 $query_ct_where_common = "
5659 LOWER(dossier_autorisation_type.code) = LOWER('RE')
5660 AND dossier.date_cloture_instruction >= CURRENT_TIMESTAMP
5661 AND dossier.date_cloture_instruction <= CURRENT_TIMESTAMP + interval '1 month'
5662 ";
5663
5664 // ORDER BY
5665
5666 $query_ct_orderby = "
5667 dossier.date_cloture_instruction ASC
5668 ";
5669
5670 $query_ct_where_groupe = "";
5671 // Gestion des groupes et confidentialité
5672 include('../sql/pgsql/filter_group_widgets.inc.php');
5673
5674 /**
5675 * Message d'aide
5676 */
5677 //
5678 $message_filtre = "";
5679 //
5680 switch ($filtre) {
5681 case "instructeur":
5682 $message_filtre = " "._("dont je suis l'instructeur");
5683 break;
5684 case "division":
5685 $message_filtre = " "._("situés dans ma division");
5686 break;
5687 case "aucun":
5688 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5689 $message_filtre = " "._("situés dans ma collectivité");
5690 } else {
5691 $message_filtre = " "._("situés dans toutes les collectivités");
5692 }
5693 break;
5694 }
5695 //
5696 $message_help = sprintf(
5697 _("Les recours%s les plus récents pour lesquels une date de clôture d'instruction existe et est comprise entre le jour courant et un mois dans le futur."),
5698 $message_filtre
5699 );
5700
5701 /**
5702 * Return
5703 */
5704 //
5705 return array(
5706 "arguments" => $arguments,
5707 "message_help" => $message_help,
5708 "query_ct_select" => $query_ct_select,
5709 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
5710 "query_ct_from" => $query_ct_from,
5711 "query_ct_where" => $query_ct_where_common,
5712 "query_ct_where_groupe" => $query_ct_where_groupe,
5713 "query_ct_orderby" => $query_ct_orderby
5714 );
5715 }
5716
5717 /**
5718 * WIDGET DASHBOARD - Les clôtures
5719 * @return void
5720 */
5721 function view_widget_dossier_contentieux_clotures($content = null) {
5722
5723 /**
5724 * Ce widget est configurable via l'interface Web. Lors de la création
5725 * du widget dans le paramétrage il est possible de spécifier la ou les
5726 * options suivantes :
5727 * - filtre :
5728 * = instructeur
5729 * = division
5730 * = aucun
5731 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
5732 */
5733 // Liste des paramètres
5734 $params = array("filtre");
5735 // Formatage des arguments reçus en paramètres
5736 $arguments = $this->get_arguments($content, $params);
5737 // Récupération de la configuration du widget
5738 $conf = $this->get_config_dossier_contentieux_clotures($arguments);
5739
5740 $filtre = $conf["arguments"]["filtre"];
5741 //
5742
5743
5744 /**
5745 * Composition de la requête
5746 */
5747 //
5748 $query = sprintf("
5749 SELECT
5750 %s
5751 FROM
5752 %s
5753 WHERE
5754 %s
5755 %s
5756 ORDER BY
5757 %s
5758 LIMIT 5",
5759 $conf["query_ct_select"],
5760 $conf["query_ct_from"],
5761 $conf["query_ct_where"],
5762 $conf["query_ct_where_groupe"],
5763 $conf["query_ct_orderby"]
5764 );
5765
5766 /**
5767 * Exécution de la requête
5768 */
5769 //
5770 $res = $this->f->db->query($query);
5771 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
5772 $this->f->isDatabaseError($res);
5773
5774 // Affichage du message d'informations
5775 printf(
5776 $this->template_help,
5777 $conf["message_help"]
5778 );
5779 /**
5780 * Si il n'y a aucun dossier à afficher, alors on affiche un message
5781 * clair à l'utilisateur et on sort de la vue.
5782 */
5783 // Si il n'y a aucun dossier à afficher
5784 if ($res->numrows() == 0) {
5785 echo _("Il n'y a pas de recours pour lesquels une date de clôture d'instruction existe et est comprise entre le jour courant et un mois dans le futur.");
5786 return;
5787 }
5788
5789 /**
5790 * Template nécessaires à l'affichage du widget
5791 */
5792 //
5793 $template_table = '
5794 <table class="tab-tab">
5795 <thead>
5796 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
5797 <th class="title col-0 firstcol">
5798 <span class="name">
5799 %s
5800 </span>
5801 </th>
5802 <th class="title col-1">
5803 <span class="name">
5804 %s
5805 </span>
5806 </th>
5807 <th class="title col-2 lastcol">
5808 <span class="name">
5809 %s
5810 </span>
5811 </th>
5812 </tr>
5813 </thead>
5814 <tbody>
5815 %s
5816 </tbody>
5817 </table>
5818 ';
5819 //
5820 $template_line = '
5821 <tr class="tab-data odd">
5822 <td class="col-0 firstcol">
5823 %s
5824 </td>
5825 <td class="col-1 ">
5826 %s
5827 </td>
5828 <td class="col-2 lastcol">
5829 %s
5830 </td>
5831 </tr>
5832 ';
5833 //
5834 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_tous_recours&amp;action=3&amp;idx=%s';
5835 //
5836 $template_link = '
5837 <a class="lienTable" href="%s">
5838 %s
5839 </a>
5840 ';
5841 // Bouton consulter
5842 $template_btn_consulter = '
5843 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
5844 ._('Consulter')
5845 .'</span>
5846 ';
5847 //
5848
5849 /**
5850 * Si il y a des dossiers à afficher, alors on affiche le widget.
5851 */
5852 // On construit le contenu du tableau
5853 $ct_tbody = '';
5854 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5855 // On construit l'attribut href du lien
5856 $ct_href = sprintf(
5857 $template_href,
5858 // idx
5859 $row["dossier"]
5860 );
5861 // On construit la ligne
5862 $ct_tbody .= sprintf(
5863 $template_line,
5864 // Colonne 1 - Numéro de dossier
5865 sprintf(
5866 $template_link,
5867 $ct_href,
5868 $template_btn_consulter
5869 ),
5870 // Colonne 2 - Numéro de dossier
5871 sprintf(
5872 $template_link,
5873 $ct_href,
5874 $row["dossier_libelle"]
5875 ),
5876 // Colonne 3 - Date de clôture d'instruction
5877 sprintf(
5878 $template_link,
5879 $ct_href,
5880 $this->f->formatDate($row["date_cloture_instruction"])
5881 )
5882 );
5883 }
5884 // Affichage du tableau listant les dossiers
5885 printf(
5886 $template_table,
5887 // Colonne 1 - Consulter
5888 '',
5889 // Colonne 2 - Numéro de dossier
5890 _('dossier'),
5891 // Colonne 3 - Date de clôture d'instruction
5892 _("date_cloture_instruction"),
5893 // Le Contenu
5894 $ct_tbody
5895 );
5896 // Affichage du footer
5897 printf(
5898 $this->template_footer,
5899 OM_ROUTE_TAB."&obj=dossier_contentieux_clotures&filtre=" . $filtre,
5900 _("Voir +")
5901 );
5902 }
5903
5904 /**
5905 * Cette méthode permet de récupérer la configuration du widget 'Les audience'.
5906 *
5907 * @return array
5908 */
5909 function get_config_dossier_contentieux_audience($arguments) {
5910 // Initialisation du tableau des paramètres avec ses valeur par défaut
5911 $arguments_default = array(
5912 "filtre" => "instructeur"
5913 );
5914 // Vérification des arguments
5915 foreach ($arguments_default as $key => $value) {
5916 //
5917 if (isset($arguments[$key])) {
5918 //
5919 $elem = trim($arguments[$key]);
5920 //
5921 if ($key === "filtre"
5922 && in_array($elem, array("instructeur", "division", "aucun"))) {
5923 // La valeur doit être dans cette liste
5924 $arguments[$key] = $elem;
5925 continue;
5926 }
5927 }
5928 //
5929 $arguments[$key] = $value;
5930 }
5931
5932 $filtre = $arguments["filtre"];
5933
5934 // SELECT - CHAMPAFFICHE
5935 $trim_concat_terrain = 'TRIM(CONCAT(dossier.terrain_adresse_voie_numero,\' \',
5936 dossier.terrain_adresse_voie,\' \',
5937 dossier.terrain_adresse_lieu_dit,\' \',
5938 dossier.terrain_adresse_code_postal,\' \',
5939 dossier.terrain_adresse_localite,\' \',
5940 dossier.terrain_adresse_bp,\' \',
5941 dossier.terrain_adresse_cedex
5942 )) as "'._("localisation").'"';
5943 //
5944 $case_contrevenant = "
5945 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
5946 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
5947 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
5948 END
5949 ";
5950 //
5951 $query_ct_select_champaffiche = array(
5952 'dossier.dossier as "'._("dossier").'"',
5953 'dossier.dossier_libelle as "'._("dossier").'"',
5954 $trim_concat_terrain,
5955 $case_contrevenant.' as "'._("contrevenant").'"',
5956 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'._("date_premiere_visite").'"',
5957 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'._("date_derniere_visite").'"',
5958 'etat.libelle as "'._("etat").'"',
5959 'to_char(donnees_techniques.ctx_date_audience, \'DD/MM/YYYY\') as "'._("ctx_date_audience").'"',
5960 );
5961
5962 /**
5963 * Construction de la requête
5964 */
5965 // SELECT
5966 $query_ct_select = "
5967 dossier.dossier,
5968 dossier.dossier_libelle,
5969 donnees_techniques.ctx_date_audience
5970 ";
5971
5972 // FROM
5973 $query_ct_from = "
5974 ".DB_PREFIXE."dossier
5975 LEFT JOIN ".DB_PREFIXE."etat
5976 ON dossier.etat = etat.etat
5977 LEFT JOIN (
5978 SELECT *
5979 FROM ".DB_PREFIXE."lien_dossier_demandeur
5980 INNER JOIN ".DB_PREFIXE."demandeur
5981 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5982 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
5983 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
5984 ) as demandeur_contrevenant
5985 ON demandeur_contrevenant.dossier = dossier.dossier
5986 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5987 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5988 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5989 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5990 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5991 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5992 LEFT JOIN ".DB_PREFIXE."avis_decision
5993 ON avis_decision.avis_decision=dossier.avis_decision
5994 LEFT JOIN ".DB_PREFIXE."donnees_techniques
5995 ON donnees_techniques.dossier_instruction = dossier.dossier
5996 %s
5997 %s
5998 %s
5999 ";
6000
6001 $query_ct_where_instructeur_filter = "";
6002 $query_ct_where_division_filter = "";
6003 $query_ct_where_collectivite_filter = "";
6004 // Filtre sur les dossiers qui concernent l'utilisateur
6005 if ($filtre == "instructeur") {
6006 //
6007 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
6008 ON dossier.instructeur=instructeur.instructeur
6009 OR dossier.instructeur_2=instructeur.instructeur
6010 JOIN ".DB_PREFIXE."om_utilisateur
6011 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
6012 AND om_utilisateur.login='".$_SESSION['login']."'
6013 ";
6014 }
6015
6016 // Filtre sur les dossier de la division
6017 if ($filtre == "division") {
6018 //
6019 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
6020 ON dossier.division=division.division
6021 AND division.division = ".$_SESSION['division']."
6022 ";
6023 }
6024
6025 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
6026 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
6027 // collectivité
6028 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6029 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
6030 ON dossier.om_collectivite=om_collectivite.om_collectivite
6031 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
6032 ";
6033 } else {
6034 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
6035 ON dossier.om_collectivite=om_collectivite.om_collectivite
6036 ";
6037 }
6038
6039 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
6040
6041 // WHERE - COMMON
6042 $query_ct_where_common = "
6043 LOWER(dossier_autorisation_type.code) = LOWER('IN')
6044 AND donnees_techniques.ctx_date_audience IS NOT NULL
6045 AND donnees_techniques.ctx_date_audience >= CURRENT_TIMESTAMP
6046 AND donnees_techniques.ctx_date_audience <= CURRENT_TIMESTAMP + interval '1 month'
6047 ";
6048 // ORDER BY
6049
6050 $query_ct_orderby = "
6051 donnees_techniques.ctx_date_audience ASC
6052 ";
6053
6054 $query_ct_where_groupe = "";
6055 // Gestion des groupes et confidentialité
6056 include('../sql/pgsql/filter_group_widgets.inc.php');
6057
6058 /**
6059 * Message d'aide
6060 */
6061 //
6062 $message_filtre = "";
6063 //
6064 switch ($filtre) {
6065 case "instructeur":
6066 $message_filtre = " "._("dont je suis l'instructeur");
6067 break;
6068 case "division":
6069 $message_filtre = " "._("situés dans ma division");
6070 break;
6071 case "aucun":
6072 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6073 $message_filtre = " "._("situés dans ma collectivité");
6074 } else {
6075 $message_filtre = " "._("situés dans toutes les collectivités");
6076 }
6077 break;
6078 }
6079 //
6080 $message_help = sprintf(
6081 _("Les infractions%s les plus récentes pour lesquelles une date d'audience existe et est comprise entre le jour courant et un mois dans le futur."),
6082 $message_filtre
6083 );
6084
6085 /**
6086 * Return
6087 */
6088 //
6089 return array(
6090 "arguments" => $arguments,
6091 "message_help" => $message_help,
6092 "query_ct_select" => $query_ct_select,
6093 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
6094 "query_ct_from" => $query_ct_from,
6095 "query_ct_where" => $query_ct_where_common,
6096 "query_ct_where_groupe" => $query_ct_where_groupe,
6097 "query_ct_orderby" => $query_ct_orderby,
6098 );
6099 }
6100
6101 /**
6102 * WIDGET DASHBOARD - Les audiences
6103 * @return void
6104 */
6105 function view_widget_dossier_contentieux_audience($content = null) {
6106 /**
6107 * Ce widget est configurable via l'interface Web. Lors de la création
6108 * du widget dans le paramétrage il est possible de spécifier la ou les
6109 * options suivantes :
6110 * - filtre :
6111 * = instructeur
6112 * = division
6113 * = aucun
6114 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
6115 */
6116 // Liste des paramètres
6117 $params = array("filtre");
6118 // Formatage des arguments reçus en paramètres
6119 $arguments = $this->get_arguments($content, $params);
6120 // Récupération de la configuration du widget
6121 $conf = $this->get_config_dossier_contentieux_audience($arguments);
6122
6123 //
6124 $filtre = $conf["arguments"]["filtre"];
6125 //
6126
6127 /**
6128 * Composition de la requête
6129 */
6130 //
6131 $query = sprintf("
6132 SELECT
6133 %s
6134 FROM
6135 %s
6136 WHERE
6137 %s
6138 %s
6139 ORDER BY
6140 %s
6141 LIMIT 5",
6142 $conf["query_ct_select"],
6143 $conf["query_ct_from"],
6144 $conf["query_ct_where"],
6145 $conf["query_ct_where_groupe"],
6146 $conf["query_ct_orderby"]
6147 );
6148
6149 /**
6150 * Exécution de la requête
6151 */
6152 //
6153 $res = $this->f->db->query($query);
6154 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
6155 $this->f->isDatabaseError($res);
6156
6157 // Affichage du message d'informations
6158 printf(
6159 $this->template_help,
6160 $conf["message_help"]
6161 );
6162 /**
6163 * Si il n'y a aucun dossier à afficher, alors on affiche un message
6164 * clair à l'utilisateur et on sort de la vue.
6165 */
6166 // Si il n'y a aucun dossier à afficher
6167 if ($res->numrows() == 0) {
6168 echo _("Il n'y a pas d'infractions pour lesquelles une date d'audience existe et est comprise entre le jour courant et un mois dans le futur.");
6169 return;
6170 }
6171
6172 /**
6173 * Template nécessaires à l'affichage du widget
6174 */
6175 //
6176 $template_table = '
6177 <table class="tab-tab">
6178 <thead>
6179 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
6180 <th class="title col-0 firstcol">
6181 <span class="name">
6182 %s
6183 </span>
6184 </th>
6185 <th class="title col-1">
6186 <span class="name">
6187 %s
6188 </span>
6189 </th>
6190 <th class="title col-2 lastcol">
6191 <span class="name">
6192 %s
6193 </span>
6194 </th>
6195 </tr>
6196 </thead>
6197 <tbody>
6198 %s
6199 </tbody>
6200 </table>
6201 ';
6202 //
6203 $template_line = '
6204 <tr class="tab-data odd">
6205 <td class="col-0 firstcol">
6206 %s
6207 </td>
6208 <td class="col-1 ">
6209 %s
6210 </td>
6211 <td class="col-2 lastcol">
6212 %s
6213 </td>
6214 </tr>
6215 ';
6216 //
6217 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
6218 //
6219 $template_link = '
6220 <a class="lienTable" href="%s">
6221 %s
6222 </a>
6223 ';
6224 // Bouton consulter
6225 $template_btn_consulter = '
6226 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
6227 ._('Consulter')
6228 .'</span>
6229 ';
6230 //
6231
6232 /**
6233 * Si il y a des dossiers à afficher, alors on affiche le widget.
6234 */
6235 // On construit le contenu du tableau
6236 $ct_tbody = '';
6237 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6238 // On construit l'attribut href du lien
6239 $ct_href = sprintf(
6240 $template_href,
6241 // idx
6242 $row["dossier"]
6243 );
6244 // On construit la ligne
6245 $ct_tbody .= sprintf(
6246 $template_line,
6247 // Colonne 1 - Numéro de dossier
6248 sprintf(
6249 $template_link,
6250 $ct_href,
6251 $template_btn_consulter
6252 ),
6253 // Colonne 2 - Numéro de dossier
6254 sprintf(
6255 $template_link,
6256 $ct_href,
6257 $row["dossier_libelle"]
6258 ),
6259 // Colonne 3 - Date d'audience
6260 sprintf(
6261 $template_link,
6262 $ct_href,
6263 $this->f->formatDate($row["ctx_date_audience"])
6264 )
6265 );
6266 }
6267 // Affichage du tableau listant les dossiers
6268 printf(
6269 $template_table,
6270 // Colonne 1 - Consulter
6271 '',
6272 // Colonne 2 - Numéro de dossier
6273 _('dossier'),
6274 // Colonne 3 - Date d'audience
6275 _('ctx_date_audience'),
6276 // Le Contenu
6277 $ct_tbody
6278 );
6279 // Affichage du footer
6280 printf(
6281 $this->template_footer,
6282 OM_ROUTE_TAB."&obj=dossier_contentieux_audience&filtre=" . $filtre,
6283 _("Voir +")
6284 );
6285 }
6286
6287 /**
6288 * WIDGET DASHBOARD - Derniers dossiers déposés
6289 *
6290 * @return void
6291 */
6292 function view_widget_derniers_dossiers_deposes($content = null) {
6293
6294 /**
6295 * Ce widget est configurable via l'interface Web. Lors de la création
6296 * du widget dans le paramétrage il est possible de spécifier la ou les
6297 * options suivantes :
6298 *
6299 * - filtre :
6300 * = instructeur
6301 * = division
6302 * = aucun
6303 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
6304 *
6305 * - nombre_de_jours : c'est le délai en jours avant la date limite à
6306 * partir duquel on souhaite voir apparaître les dossiers dans le
6307 * widget.
6308 * (default) Par défaut la valeur est 15 jours.
6309 *
6310 * - codes_datd : la liste des types de dossiers à afficher. exemple :
6311 * "PCI;PCA;DPS;CUa;CUb".
6312 * (default) Par défaut tous les types sont affichés. [null]
6313 *
6314 * - restreindre_msg_non_lus : dans le listing associé, la colonne "message
6315 * manuel" affiche un indicateur
6316 * = true : que si le dossier comporte au moins un message
6317 * manuel NON LU.
6318 * = (default)false :si le dossier comporte au moins un message
6319 * manuel.
6320 *
6321 * - filtre_depot :
6322 * = depot_electronique
6323 * = guichet
6324 * = (default) aucun
6325 * Par défaut le filtre de dépôt est aucun,
6326 * donc autorise tous les types de dépôt.
6327 */
6328 // Liste des paramètres
6329 $params = array("filtre", "nombre_de_jours", "codes_datd", "filtre_depot", "restreindre_msg_non_lus");
6330 // Formatage des arguments reçus en paramètres
6331 $arguments = $this->get_arguments($content, $params);
6332 // Récupération de la configuration du widget
6333 $conf = $this->get_config_derniers_dossiers_deposes($arguments);
6334 //
6335 $filtre = $conf["arguments"]["filtre"];
6336 $nombre_de_jours = $conf["arguments"]["nombre_de_jours"];
6337 $codes_datd = $conf["arguments"]["codes_datd"];
6338 $filtre_depot = $conf["arguments"]["filtre_depot"];
6339 $restreindre_msg_non_lus = $conf["arguments"]["restreindre_msg_non_lus"];
6340
6341 /**
6342 * Composition de la requête
6343 */
6344 //
6345 $query = sprintf(
6346 "SELECT COUNT (DISTINCT(dossier.dossier))
6347 FROM
6348 %s
6349 WHERE
6350 %s
6351 %s
6352 %s
6353 %s
6354 %s",
6355 $conf["query_ct_from"],
6356 $conf["query_ct_where_common"],
6357 $conf["query_ct_where_date_filter"],
6358 $conf["query_ct_where_groupe"],
6359 $conf["query_ct_where_depot_filter"],
6360 $conf["query_ct_where_datd_filter"]
6361 );
6362
6363 /**
6364 * Exécution de la requête
6365 */
6366 //
6367 $res = $this->f->db->getone($query);
6368 $this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE);
6369 $this->f->isDatabaseError($res);
6370
6371 // Affichage du message d'informations
6372 printf(
6373 $this->template_help,
6374 $conf["message_help"]
6375 );
6376
6377 //
6378 if (intval($res) === 0) {
6379 //
6380 echo _("Aucun dossier déposé dernièrement.");
6381 return;
6382 }
6383
6384
6385 /**
6386 *
6387 */
6388 $template_panel = '
6389 <div class="panel panel-box">
6390 <div class="list-justified-container">
6391 <ul class="list-justified text-center">
6392 %s
6393 </ul>
6394 </div>
6395 </div>';
6396 /**
6397 *
6398 */
6399 //
6400 $panel = "";
6401 //
6402 $template_elem = '
6403 <li>
6404 <span class="size-h3 box-icon rounded %s">%s</span>
6405 <p class="text-muted">%s %s</p>
6406 </li>
6407 ';
6408 $panel_elem = sprintf(
6409 $template_elem,
6410 "bg-info",
6411 intval($res),
6412 _("Déposés dernièrement"),
6413 ""
6414 );
6415 //
6416 $panel .= sprintf(
6417 $template_panel,
6418 $panel_elem
6419 );
6420 echo $panel;
6421
6422 // Affichage du footer
6423 printf(
6424 $this->template_footer,
6425 // href (avec les paramètres du widget)
6426 sprintf(
6427 OM_ROUTE_TAB."&obj=derniers_dossiers_deposes&filtre=%s&nombre_de_jours=%s&codes_datd=%s&filtre_depot=%s&restreindre_msg_non_lus=%s",
6428 $filtre,
6429 $nombre_de_jours,
6430 (is_null($codes_datd) ? "" : implode(";",$codes_datd)),
6431 $filtre_depot,
6432 $restreindre_msg_non_lus
6433 ),
6434 // titre
6435 _("Voir +")
6436 );
6437
6438 }
6439
6440 /**
6441 * Cette méthode permet de récupérer la configuration du widget 'Dossiers
6442 * limites'.
6443 *
6444 * @return array
6445 */
6446 function get_config_derniers_dossiers_deposes($arguments) {
6447 // Initialisation du tableau des paramètres avec ses valeur par défaut
6448 $arguments_default = array(
6449 "nombre_de_jours" => 15,
6450 "codes_datd" => null,
6451 "filtre" => "division",
6452 "filtre_depot"=> "aucun",
6453 "restreindre_msg_non_lus" => "false"
6454 );
6455 // Vérification des arguments
6456 foreach ($arguments_default as $key => $value) {
6457 //
6458 if (isset($arguments[$key])) {
6459 //
6460 $elem = trim($arguments[$key]);
6461 //
6462 if ($key === "nombre_de_jours"
6463 && intval($elem) > 0) {
6464 // Ce doit être un entier
6465 $arguments[$key] = intval($elem);
6466 continue;
6467 } elseif ($key === "codes_datd"
6468 && $elem != "") {
6469 // Ce doit être un tableau
6470 $arguments[$key] = explode(";", $elem);
6471 continue;
6472 } elseif ($key === "filtre"
6473 && in_array($elem, array("instructeur", "division", "aucun"))) {
6474 // La valeur doit être dans cette liste
6475 $arguments[$key] = $elem;
6476 continue;
6477 } elseif ($key === "filtre_depot"
6478 && in_array($elem, array("depot_electronique", "guichet", "aucun"))) {
6479 // La valeur doit être dans cette liste
6480 $arguments[$key] = $elem;
6481 continue;
6482 } elseif ($key === "restreindre_msg_non_lus"
6483 && in_array($elem, array("true", "false"))) {
6484 // La valeur doit être dans cette liste
6485 $arguments[$key] = $elem;
6486 continue;
6487 }
6488 }
6489 //
6490 $arguments[$key] = $value;
6491 }
6492 //
6493 $nombre_de_jours = $arguments["nombre_de_jours"];
6494 $codes_datd = $arguments["codes_datd"];
6495 $filtre = $arguments["filtre"];
6496 $filtre_depot = $arguments["filtre_depot"];
6497 $restreindre_msg_non_lus = $arguments["restreindre_msg_non_lus"];
6498
6499 // SELECT - CHAMPAFFICHE - pour le listing
6500 // On distingue par dossier_libelle car la jointure à la table message
6501 // provoque des doublons lorsqu'un dossier a plusieurs messages
6502 // On distingue par date de dépot car les arguments du "DISTINCT ON"
6503 // doivent être ceux de "ORDER BY"
6504 $case_demandeur = "CASE WHEN demandeur.qualite = 'particulier'
6505 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
6506 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
6507 END";
6508 $query_ct_select_champrecherche = array(
6509 'dossier.dossier as "'._("dossier").'"',
6510 'dossier.dossier_libelle as "'._("dossier_libelle").'"',
6511 );
6512 $query_ct_select_champaffiche = array(
6513 'dossier.dossier as "'._("dossier").'"',
6514 'dossier.dossier_libelle as "'._("dossier").'"',
6515 $case_demandeur.' AS "'._("petitionnaire").'"',
6516 'to_char(dossier.date_depot, \'DD/MM/YYYY\') AS "'._("date_depot").'"',
6517 "CASE WHEN dossier.a_qualifier IS TRUE
6518 THEN 'Oui'
6519 ELSE 'Non'
6520 END".' as "'._("a_qualifier").'"',
6521 'donnees_techniques.co_tot_log_nb as "'._("nombre total de logements").'"',
6522 'CASE WHEN su2_avt_shon1 IS NOT NULL
6523 OR su2_avt_shon2 IS NOT NULL
6524 OR su2_avt_shon3 IS NOT NULL
6525 OR su2_avt_shon4 IS NOT NULL
6526 OR su2_avt_shon5 IS NOT NULL
6527 OR su2_avt_shon6 IS NOT NULL
6528 OR su2_avt_shon7 IS NOT NULL
6529 OR su2_avt_shon8 IS NOT NULL
6530 OR su2_avt_shon9 IS NOT NULL
6531 OR su2_avt_shon10 IS NOT NULL
6532 OR su2_avt_shon11 IS NOT NULL
6533 OR su2_avt_shon12 IS NOT NULL
6534 OR su2_avt_shon13 IS NOT NULL
6535 OR su2_avt_shon14 IS NOT NULL
6536 OR su2_avt_shon15 IS NOT NULL
6537 OR su2_avt_shon16 IS NOT NULL
6538 OR su2_avt_shon17 IS NOT NULL
6539 OR su2_avt_shon18 IS NOT NULL
6540 OR su2_avt_shon19 IS NOT NULL
6541 OR su2_avt_shon20 IS NOT NULL
6542 OR su2_cstr_shon1 IS NOT NULL
6543 OR su2_cstr_shon2 IS NOT NULL
6544 OR su2_cstr_shon3 IS NOT NULL
6545 OR su2_cstr_shon4 IS NOT NULL
6546 OR su2_cstr_shon5 IS NOT NULL
6547 OR su2_cstr_shon6 IS NOT NULL
6548 OR su2_cstr_shon7 IS NOT NULL
6549 OR su2_cstr_shon8 IS NOT NULL
6550 OR su2_cstr_shon9 IS NOT NULL
6551 OR su2_cstr_shon10 IS NOT NULL
6552 OR su2_cstr_shon11 IS NOT NULL
6553 OR su2_cstr_shon12 IS NOT NULL
6554 OR su2_cstr_shon13 IS NOT NULL
6555 OR su2_cstr_shon14 IS NOT NULL
6556 OR su2_cstr_shon15 IS NOT NULL
6557 OR su2_cstr_shon16 IS NOT NULL
6558 OR su2_cstr_shon17 IS NOT NULL
6559 OR su2_cstr_shon18 IS NOT NULL
6560 OR su2_cstr_shon19 IS NOT NULL
6561 OR su2_cstr_shon20 IS NOT NULL
6562 OR su2_chge_shon1 IS NOT NULL
6563 OR su2_chge_shon2 IS NOT NULL
6564 OR su2_chge_shon3 IS NOT NULL
6565 OR su2_chge_shon4 IS NOT NULL
6566 OR su2_chge_shon5 IS NOT NULL
6567 OR su2_chge_shon6 IS NOT NULL
6568 OR su2_chge_shon7 IS NOT NULL
6569 OR su2_chge_shon8 IS NOT NULL
6570 OR su2_chge_shon9 IS NOT NULL
6571 OR su2_chge_shon10 IS NOT NULL
6572 OR su2_chge_shon11 IS NOT NULL
6573 OR su2_chge_shon12 IS NOT NULL
6574 OR su2_chge_shon13 IS NOT NULL
6575 OR su2_chge_shon14 IS NOT NULL
6576 OR su2_chge_shon15 IS NOT NULL
6577 OR su2_chge_shon16 IS NOT NULL
6578 OR su2_chge_shon17 IS NOT NULL
6579 OR su2_chge_shon18 IS NOT NULL
6580 OR su2_chge_shon19 IS NOT NULL
6581 OR su2_chge_shon20 IS NOT NULL
6582 OR su2_demo_shon1 IS NOT NULL
6583 OR su2_demo_shon2 IS NOT NULL
6584 OR su2_demo_shon3 IS NOT NULL
6585 OR su2_demo_shon4 IS NOT NULL
6586 OR su2_demo_shon5 IS NOT NULL
6587 OR su2_demo_shon6 IS NOT NULL
6588 OR su2_demo_shon7 IS NOT NULL
6589 OR su2_demo_shon8 IS NOT NULL
6590 OR su2_demo_shon9 IS NOT NULL
6591 OR su2_demo_shon10 IS NOT NULL
6592 OR su2_demo_shon11 IS NOT NULL
6593 OR su2_demo_shon12 IS NOT NULL
6594 OR su2_demo_shon13 IS NOT NULL
6595 OR su2_demo_shon14 IS NOT NULL
6596 OR su2_demo_shon15 IS NOT NULL
6597 OR su2_demo_shon16 IS NOT NULL
6598 OR su2_demo_shon17 IS NOT NULL
6599 OR su2_demo_shon18 IS NOT NULL
6600 OR su2_demo_shon19 IS NOT NULL
6601 OR su2_demo_shon20 IS NOT NULL
6602 OR su2_sup_shon1 IS NOT NULL
6603 OR su2_sup_shon2 IS NOT NULL
6604 OR su2_sup_shon3 IS NOT NULL
6605 OR su2_sup_shon4 IS NOT NULL
6606 OR su2_sup_shon5 IS NOT NULL
6607 OR su2_sup_shon6 IS NOT NULL
6608 OR su2_sup_shon7 IS NOT NULL
6609 OR su2_sup_shon8 IS NOT NULL
6610 OR su2_sup_shon9 IS NOT NULL
6611 OR su2_sup_shon10 IS NOT NULL
6612 OR su2_sup_shon11 IS NOT NULL
6613 OR su2_sup_shon12 IS NOT NULL
6614 OR su2_sup_shon13 IS NOT NULL
6615 OR su2_sup_shon14 IS NOT NULL
6616 OR su2_sup_shon15 IS NOT NULL
6617 OR su2_sup_shon16 IS NOT NULL
6618 OR su2_sup_shon17 IS NOT NULL
6619 OR su2_sup_shon18 IS NOT NULL
6620 OR su2_sup_shon19 IS NOT NULL
6621 OR su2_sup_shon20 IS NOT NULL
6622 THEN
6623 donnees_techniques.su2_cstr_shon_tot
6624 ELSE
6625 donnees_techniques.su_cstr_shon_tot
6626 END as "'._("surface de plancher construite totale").'"',
6627 "CASE WHEN su2_avt_shon1 IS NOT NULL
6628 OR su2_avt_shon2 IS NOT NULL
6629 OR su2_avt_shon3 IS NOT NULL
6630 OR su2_avt_shon4 IS NOT NULL
6631 OR su2_avt_shon5 IS NOT NULL
6632 OR su2_avt_shon6 IS NOT NULL
6633 OR su2_avt_shon7 IS NOT NULL
6634 OR su2_avt_shon8 IS NOT NULL
6635 OR su2_avt_shon9 IS NOT NULL
6636 OR su2_avt_shon10 IS NOT NULL
6637 OR su2_avt_shon11 IS NOT NULL
6638 OR su2_avt_shon12 IS NOT NULL
6639 OR su2_avt_shon13 IS NOT NULL
6640 OR su2_avt_shon14 IS NOT NULL
6641 OR su2_avt_shon15 IS NOT NULL
6642 OR su2_avt_shon16 IS NOT NULL
6643 OR su2_avt_shon17 IS NOT NULL
6644 OR su2_avt_shon18 IS NOT NULL
6645 OR su2_avt_shon19 IS NOT NULL
6646 OR su2_avt_shon20 IS NOT NULL
6647 OR su2_cstr_shon1 IS NOT NULL
6648 OR su2_cstr_shon2 IS NOT NULL
6649 OR su2_cstr_shon3 IS NOT NULL
6650 OR su2_cstr_shon4 IS NOT NULL
6651 OR su2_cstr_shon5 IS NOT NULL
6652 OR su2_cstr_shon6 IS NOT NULL
6653 OR su2_cstr_shon7 IS NOT NULL
6654 OR su2_cstr_shon8 IS NOT NULL
6655 OR su2_cstr_shon9 IS NOT NULL
6656 OR su2_cstr_shon10 IS NOT NULL
6657 OR su2_cstr_shon11 IS NOT NULL
6658 OR su2_cstr_shon12 IS NOT NULL
6659 OR su2_cstr_shon13 IS NOT NULL
6660 OR su2_cstr_shon14 IS NOT NULL
6661 OR su2_cstr_shon15 IS NOT NULL
6662 OR su2_cstr_shon16 IS NOT NULL
6663 OR su2_cstr_shon17 IS NOT NULL
6664 OR su2_cstr_shon18 IS NOT NULL
6665 OR su2_cstr_shon19 IS NOT NULL
6666 OR su2_cstr_shon20 IS NOT NULL
6667 OR su2_chge_shon1 IS NOT NULL
6668 OR su2_chge_shon2 IS NOT NULL
6669 OR su2_chge_shon3 IS NOT NULL
6670 OR su2_chge_shon4 IS NOT NULL
6671 OR su2_chge_shon5 IS NOT NULL
6672 OR su2_chge_shon6 IS NOT NULL
6673 OR su2_chge_shon7 IS NOT NULL
6674 OR su2_chge_shon8 IS NOT NULL
6675 OR su2_chge_shon9 IS NOT NULL
6676 OR su2_chge_shon10 IS NOT NULL
6677 OR su2_chge_shon11 IS NOT NULL
6678 OR su2_chge_shon12 IS NOT NULL
6679 OR su2_chge_shon13 IS NOT NULL
6680 OR su2_chge_shon14 IS NOT NULL
6681 OR su2_chge_shon15 IS NOT NULL
6682 OR su2_chge_shon16 IS NOT NULL
6683 OR su2_chge_shon17 IS NOT NULL
6684 OR su2_chge_shon18 IS NOT NULL
6685 OR su2_chge_shon19 IS NOT NULL
6686 OR su2_chge_shon20 IS NOT NULL
6687 OR su2_demo_shon1 IS NOT NULL
6688 OR su2_demo_shon2 IS NOT NULL
6689 OR su2_demo_shon3 IS NOT NULL
6690 OR su2_demo_shon4 IS NOT NULL
6691 OR su2_demo_shon5 IS NOT NULL
6692 OR su2_demo_shon6 IS NOT NULL
6693 OR su2_demo_shon7 IS NOT NULL
6694 OR su2_demo_shon8 IS NOT NULL
6695 OR su2_demo_shon9 IS NOT NULL
6696 OR su2_demo_shon10 IS NOT NULL
6697 OR su2_demo_shon11 IS NOT NULL
6698 OR su2_demo_shon12 IS NOT NULL
6699 OR su2_demo_shon13 IS NOT NULL
6700 OR su2_demo_shon14 IS NOT NULL
6701 OR su2_demo_shon15 IS NOT NULL
6702 OR su2_demo_shon16 IS NOT NULL
6703 OR su2_demo_shon17 IS NOT NULL
6704 OR su2_demo_shon18 IS NOT NULL
6705 OR su2_demo_shon19 IS NOT NULL
6706 OR su2_demo_shon20 IS NOT NULL
6707 OR su2_sup_shon1 IS NOT NULL
6708 OR su2_sup_shon2 IS NOT NULL
6709 OR su2_sup_shon3 IS NOT NULL
6710 OR su2_sup_shon4 IS NOT NULL
6711 OR su2_sup_shon5 IS NOT NULL
6712 OR su2_sup_shon6 IS NOT NULL
6713 OR su2_sup_shon7 IS NOT NULL
6714 OR su2_sup_shon8 IS NOT NULL
6715 OR su2_sup_shon9 IS NOT NULL
6716 OR su2_sup_shon10 IS NOT NULL
6717 OR su2_sup_shon11 IS NOT NULL
6718 OR su2_sup_shon12 IS NOT NULL
6719 OR su2_sup_shon13 IS NOT NULL
6720 OR su2_sup_shon14 IS NOT NULL
6721 OR su2_sup_shon15 IS NOT NULL
6722 OR su2_sup_shon16 IS NOT NULL
6723 OR su2_sup_shon17 IS NOT NULL
6724 OR su2_sup_shon18 IS NOT NULL
6725 OR su2_sup_shon19 IS NOT NULL
6726 OR su2_sup_shon20 IS NOT NULL
6727 THEN
6728 REGEXP_REPLACE(CONCAT(
6729 CASE WHEN donnees_techniques.su2_cstr_shon1 IS NULL
6730 THEN ''
6731 ELSE CONCAT ('Exploitation agricole - ', donnees_techniques.su2_cstr_shon1, ' m² / ')
6732 END,
6733 CASE WHEN donnees_techniques.su2_cstr_shon2 IS NULL
6734 THEN ''
6735 ELSE CONCAT ('Exploitation forestière - ', donnees_techniques.su2_cstr_shon2, ' m² / ')
6736 END,
6737 CASE WHEN donnees_techniques.su2_cstr_shon3 IS NULL
6738 THEN ''
6739 ELSE CONCAT ('Logement - ', donnees_techniques.su2_cstr_shon3, ' m² / ')
6740 END,
6741 CASE WHEN donnees_techniques.su2_cstr_shon4 IS NULL
6742 THEN ''
6743 ELSE CONCAT ('Hébergement - ', donnees_techniques.su2_cstr_shon4, ' m² / ')
6744 END,
6745 CASE WHEN donnees_techniques.su2_cstr_shon5 IS NULL
6746 THEN ''
6747 ELSE CONCAT ('Artisanat et commerce de détail - ', donnees_techniques.su2_cstr_shon5, ' m² / ')
6748 END,
6749 CASE WHEN donnees_techniques.su2_cstr_shon6 IS NULL
6750 THEN ''
6751 ELSE CONCAT ('Restauration - ', donnees_techniques.su2_cstr_shon6, ' m² / ')
6752 END,
6753 CASE WHEN donnees_techniques.su2_cstr_shon7 IS NULL
6754 THEN ''
6755 ELSE CONCAT ('Commerce de gros - ', donnees_techniques.su2_cstr_shon7, ' m² / ')
6756 END,
6757 CASE WHEN donnees_techniques.su2_cstr_shon8 IS NULL
6758 THEN ''
6759 ELSE CONCAT ('Activités de services où s''effectue l''accueil d''une clientèle - ', donnees_techniques.su2_cstr_shon8, ' m² / ')
6760 END,
6761 CASE WHEN donnees_techniques.su2_cstr_shon9 IS NULL
6762 THEN ''
6763 ELSE CONCAT ('Hébergement hôtelier et touristique - ', donnees_techniques.su2_cstr_shon9, ' m² / ')
6764 END,
6765 CASE WHEN donnees_techniques.su2_cstr_shon10 IS NULL
6766 THEN ''
6767 ELSE CONCAT ('Cinéma - ', donnees_techniques.su2_cstr_shon10, ' m² / ')
6768 END,
6769 CASE WHEN donnees_techniques.su2_cstr_shon11 IS NULL
6770 THEN ''
6771 ELSE CONCAT ('Locaux et bureaux accueillant du public des administrations publiques et assimilés - ', donnees_techniques.su2_cstr_shon11, ' m² / ')
6772 END,
6773 CASE WHEN donnees_techniques.su2_cstr_shon12 IS NULL
6774 THEN ''
6775 ELSE CONCAT ('Locaux techniques et industriels des administrations publiques et assimilés - ', donnees_techniques.su2_cstr_shon12, ' m² / ')
6776 END,
6777 CASE WHEN donnees_techniques.su2_cstr_shon13 IS NULL
6778 THEN ''
6779 ELSE CONCAT ('Établissements d''enseignement, de santé et d''action sociale - ', donnees_techniques.su2_cstr_shon13, ' m² / ')
6780 END,
6781 CASE WHEN donnees_techniques.su2_cstr_shon14 IS NULL
6782 THEN ''
6783 ELSE CONCAT ('Salles d''art et de spectacles - ', donnees_techniques.su2_cstr_shon14, ' m² / ')
6784 END,
6785 CASE WHEN donnees_techniques.su2_cstr_shon15 IS NULL
6786 THEN ''
6787 ELSE CONCAT ('Équipements sportifs - ', donnees_techniques.su2_cstr_shon15, ' m² / ')
6788 END,
6789 CASE WHEN donnees_techniques.su2_cstr_shon16 IS NULL
6790 THEN ''
6791 ELSE CONCAT ('Autres équipements recevant du public - ', donnees_techniques.su2_cstr_shon16, ' m² / ')
6792 END,
6793 CASE WHEN donnees_techniques.su2_cstr_shon17 IS NULL
6794 THEN ''
6795 ELSE CONCAT ('Industrie - ', donnees_techniques.su2_cstr_shon17, ' m² / ')
6796 END,
6797 CASE WHEN donnees_techniques.su2_cstr_shon18 IS NULL
6798 THEN ''
6799 ELSE CONCAT ('Entrepôt - ', donnees_techniques.su2_cstr_shon18, ' m² / ')
6800 END,
6801 CASE WHEN donnees_techniques.su2_cstr_shon19 IS NULL
6802 THEN ''
6803 ELSE CONCAT ('Bureau - ', donnees_techniques.su2_cstr_shon19, ' m² / ')
6804 END,
6805 CASE WHEN donnees_techniques.su2_cstr_shon20 IS NULL
6806 THEN ''
6807 ELSE CONCAT ('Centre de congrès et d''exposition - ', donnees_techniques.su2_cstr_shon20, ' m²')
6808 END
6809 ), ' / $', '')
6810 ELSE
6811 REGEXP_REPLACE(CONCAT(
6812 CASE
6813 WHEN donnees_techniques.su_cstr_shon1 IS NULL
6814 THEN ''
6815 ELSE CONCAT('Habitation - ', donnees_techniques.su_cstr_shon1, ' m² / ')
6816 END,
6817 CASE
6818 WHEN donnees_techniques.su_cstr_shon2 IS NULL
6819 THEN ''
6820 ELSE CONCAT('Hébergement hôtelier - ', donnees_techniques.su_cstr_shon2, ' m² / ')
6821 END,
6822 CASE
6823 WHEN donnees_techniques.su_cstr_shon3 IS NULL
6824 THEN ''
6825 ELSE CONCAT('Bureaux - ', donnees_techniques.su_cstr_shon3, ' m² / ')
6826 END,
6827 CASE
6828 WHEN donnees_techniques.su_cstr_shon4 IS NULL
6829 THEN ''
6830 ELSE CONCAT('Commerce - ', donnees_techniques.su_cstr_shon4, ' m² / ')
6831 END,
6832 CASE
6833 WHEN donnees_techniques.su_cstr_shon5 IS NULL
6834 THEN ''
6835 ELSE CONCAT('Artisanat - ', donnees_techniques.su_cstr_shon5, ' m² / ')
6836 END,
6837 CASE
6838 WHEN donnees_techniques.su_cstr_shon6 IS NULL
6839 THEN ''
6840 ELSE CONCAT('Industrie - ', donnees_techniques.su_cstr_shon6, ' m² / ')
6841 END,
6842 CASE
6843 WHEN donnees_techniques.su_cstr_shon7 IS NULL
6844 THEN ''
6845 ELSE CONCAT('Exploitation agricole ou forestière - ', donnees_techniques.su_cstr_shon7, ' m² / ')
6846 END,
6847 CASE
6848 WHEN donnees_techniques.su_cstr_shon8 IS NULL
6849 THEN ''
6850 ELSE CONCAT('Entrepôt - ', donnees_techniques.su_cstr_shon8, ' m² / ')
6851 END,
6852 CASE
6853 WHEN donnees_techniques.su_cstr_shon9 IS NULL
6854 THEN ''
6855 ELSE CONCAT('Service public ou d''intérêt collectif - ', donnees_techniques.su_cstr_shon9, ' m²')
6856 END
6857 ), ' / $', '')
6858 END".' as "'._("destination").'"'
6859 );
6860
6861 //SELECT DEPOT ELECTRONIQUE (LISTING)
6862 // Si le filtre_depot précise le type de dépot il est inutile de faire apparaitre cette colonne
6863 if ($filtre_depot == "aucun") {
6864 //
6865 $query_ct_select_depot_electronique="CASE WHEN dossier.depot_electronique IS TRUE
6866 THEN 'Oui'
6867 ELSE 'Non'
6868 END".' as "'._("depot_electronique").'"';
6869 // On l'ajoute aux champs affichés
6870 $query_ct_select_champaffiche[] = $query_ct_select_depot_electronique;
6871 }
6872
6873 // SELECT COLONNE MESSAGE (LISTING)
6874 $query_ct_select_message ="";
6875 $title_icon_message = __("Le dossier d'instruction possède au moins un message ajouté manuellement%s.")." ".__("Cliquez sur l'icône pour accéder à la liste des messages du dossier.");
6876 switch($restreindre_msg_non_lus) {
6877 case "false" :
6878 $query_ct_select_message =
6879 "CASE
6880 WHEN dossier.dossier IN (
6881 SELECT dossier.dossier
6882 FROM ".DB_PREFIXE."dossier
6883 LEFT JOIN ".DB_PREFIXE."dossier_message ON dossier.dossier=dossier_message.dossier
6884 WHERE dossier_message.lu IS NOT NULL
6885 AND dossier_message.type ='"._("message manuel")."'
6886 )
6887 THEN %s
6888 ELSE %s
6889 END as message";
6890 $title_icon_message = sprintf($title_icon_message, "");
6891 break;
6892 case "true" :
6893 $query_ct_select_message =
6894 "CASE
6895 WHEN dossier.dossier IN (
6896 SELECT dossier.dossier
6897 FROM ".DB_PREFIXE."dossier
6898 LEFT JOIN ".DB_PREFIXE."dossier_message ON dossier.dossier=dossier_message.dossier
6899 WHERE dossier_message.lu IS NOT NULL
6900 AND dossier_message.type ='"._("message manuel")."'
6901 AND dossier_message.lu IS FALSE
6902 )
6903 THEN %s
6904 ELSE %s
6905 END as message";
6906 $title_icon_message = sprintf($title_icon_message, " ".__('qui soit non lu'));
6907 break;
6908 }
6909 //Selon le paramétrage, une icone de notification message s'affiche à l'utilisateur. Cliquer dessus redirige vers l'onglet des messages.
6910 $icone_msg = "CONCAT ('<a title=\"', '".pg_escape_string($title_icon_message)."','\" href=','".OM_ROUTE_FORM."','&obj=dossier_instruction&action=3&idx=',dossier.dossier,'&advs_id=&premier=0&tricol=&valide=&retour=tab#ui-tabs-6>".'<span class=".om-icon om-icon-16 om-icon-fix message-manuel-16"/></a>'."')";
6911 // Sans message (ou message non lu selon paramétrage) rien ne s'affiche dans la colonne
6912 $icone_no_msg = "''";
6913 $query_ct_select_message = sprintf($query_ct_select_message, $icone_msg, $icone_no_msg);
6914 //Les requêtes de la colonne message sont ajoutées aux requêtes des champs affichés pour le listing
6915 $query_ct_select_champaffiche[] = $query_ct_select_message;
6916
6917 // FROM
6918 $query_ct_from = "
6919 ".DB_PREFIXE."dossier
6920 LEFT JOIN (
6921 SELECT *
6922 FROM ".DB_PREFIXE."lien_dossier_demandeur
6923 INNER JOIN ".DB_PREFIXE."demandeur
6924 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
6925 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
6926 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
6927 ) AS demandeur
6928 ON demandeur.dossier = dossier.dossier
6929 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
6930 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6931 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6932 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6933 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
6934 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6935 LEFT JOIN ".DB_PREFIXE."donnees_techniques
6936 ON dossier.dossier = donnees_techniques.dossier_instruction
6937 LEFT JOIN ".DB_PREFIXE."dossier_message
6938 ON dossier.dossier = dossier_message.dossier
6939 %s
6940 %s
6941 %s
6942 ";
6943
6944 $query_ct_where_instructeur_filter = "";
6945 $query_ct_where_division_filter = "";
6946 $query_ct_where_collectivite_filter = "";
6947 // Filtre sur les dossiers qui concernent l'utilisateur
6948 if ($filtre == "instructeur") {
6949 //
6950 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
6951 ON dossier.instructeur=instructeur.instructeur
6952 JOIN ".DB_PREFIXE."om_utilisateur
6953 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
6954 AND om_utilisateur.login='".$_SESSION['login']."'
6955 ";
6956 } else {
6957 $query_ct_where_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
6958 ON dossier.instructeur=instructeur.instructeur
6959 LEFT JOIN ".DB_PREFIXE."om_utilisateur
6960 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
6961 }
6962 // Filtre sur les dossier de la division
6963 if ($filtre == "division") {
6964 //
6965 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
6966 ON dossier.division=division.division
6967 AND division.division = ".$_SESSION['division']."
6968 ";
6969 } else {
6970 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
6971 ON dossier.division=division.division";
6972 }
6973 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
6974 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
6975 // collectivité
6976 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6977 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
6978 ON dossier.om_collectivite=om_collectivite.om_collectivite
6979 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
6980 ";
6981 } else {
6982 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
6983 ON dossier.om_collectivite=om_collectivite.om_collectivite
6984 ";
6985 }
6986
6987 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
6988 // WHERE - COMMON
6989 $query_ct_where_common = "
6990 groupe.code != 'CTX'
6991 ";
6992 // WHERE - nombre_de_jours
6993 // Filtre sur l'intervalle pour la date de dépôt
6994 $query_ct_where_date_filter = "
6995 AND dossier.date_depot >= CURRENT_TIMESTAMP - ".$nombre_de_jours." * interval '1 day'
6996 ";
6997 // WHERE - DATD
6998 // Filtre sur le type détaillé des dossiers
6999 $query_ct_where_datd_filter = "";
7000 if (!is_null($codes_datd)
7001 && is_array($codes_datd)
7002 && count($codes_datd) != 0) {
7003 //
7004 $sql_codes = "";
7005 //
7006 foreach ($codes_datd as $code) {
7007 $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
7008 }
7009 $sql_codes = substr($sql_codes, 0, count($sql_codes) - 4);
7010 //
7011 $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
7012 }
7013 //WHERE - filtre_depot
7014 // Filtre sur le type de dépôt des dossiers
7015 $query_ct_where_depot_filter = "";
7016 if ($filtre_depot == "depot_electronique") {
7017 //
7018 $query_ct_where_depot_filter = "
7019 AND dossier.depot_electronique IS TRUE
7020 ";
7021 }
7022 if ($filtre_depot == "guichet") {
7023
7024 $query_ct_where_depot_filter = "
7025 AND dossier.depot_electronique IS FALSE
7026 ";
7027 }
7028
7029 // ORDER BY
7030 $query_ct_orderby = "
7031 dossier.date_depot DESC,
7032 dossier.dossier
7033 ";
7034
7035 $query_ct_where_groupe = "";
7036 // Gestion des groupes et confidentialité
7037 include('../sql/pgsql/filter_group_widgets.inc.php');
7038
7039 /**
7040 * Message d'aide
7041 */
7042 //
7043 $message_filtre_depot = '';
7044 //
7045 switch ($filtre_depot) {
7046 case "depot_electronique" :
7047 $message_filtre_depot = " "._("déposés électroniquement uniquement");
7048 break;
7049 case "guichet" :
7050 $message_filtre_depot = " "._("déposés uniquement via le guichet");
7051 break;
7052 case "aucun" :
7053 $message_filtre_depot = " "._("déposés");
7054 break;
7055 }
7056 //
7057 $message_filtre = "";
7058 //
7059 switch ($filtre) {
7060 case "instructeur" :
7061 $message_filtre = " "._("(filtrés par instructeur)");
7062 break;
7063 case "division" :
7064 $message_filtre = " "._("(filtrés par division)");
7065 break;
7066 }
7067 //
7068 $message_restreindre_msg_non_lus = "";
7069 //
7070 if ($restreindre_msg_non_lus === "true") {
7071 $message_restreindre_msg_non_lus =" "._("et dont l'indicateur des messages manuels est restreint aux messages non lus");
7072 }
7073 //
7074 $message_help = sprintf(
7075 _("Les dossiers%s%s dans les %s derniers jours%s%s."),
7076 (is_null($codes_datd) ? "": " (".implode(", ",$codes_datd).")"),
7077 $message_filtre_depot,
7078 $nombre_de_jours,
7079 $message_filtre,
7080 $message_restreindre_msg_non_lus
7081 );
7082
7083 /**
7084 * Return
7085 */
7086 //
7087 return array(
7088 "arguments" => $arguments,
7089 "message_help" => $message_help,
7090 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
7091 "query_ct_select_champrecherche" => $query_ct_select_champrecherche,
7092 "query_ct_from" => $query_ct_from,
7093 "query_ct_where_common" => $query_ct_where_common,
7094 "query_ct_where_date_filter" => $query_ct_where_date_filter,
7095 "query_ct_where_depot_filter" => $query_ct_where_depot_filter,
7096 "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
7097 "query_ct_where_groupe" => $query_ct_where_groupe,
7098 "query_ct_orderby" => $query_ct_orderby,
7099 );
7100 }
7101
7102
7103 /**
7104 * Cette méthode permet de récupérer la configuration du widget 'Dossier consulter'.
7105 *
7106 * @return array
7107 */
7108 function get_config_dossier_consulter($idx) {
7109 /**
7110 * Construction de la requête
7111 */
7112 //
7113 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
7114 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
7115 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
7116 END";
7117 // SELECT
7118 $query_ct_select = "
7119 dossier.dossier,
7120 dossier.dossier_libelle,
7121 $case_demandeur as nom_petitionnaire,
7122 dossier.date_depot,
7123 dossier_autorisation_type.code
7124 ";
7125
7126 // FROM
7127 $query_ct_from = "
7128 ".DB_PREFIXE."dossier
7129 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
7130 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7131 LEFT JOIN ".DB_PREFIXE."demandeur
7132 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7133 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7134 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
7135 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7136 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7137 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
7138 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7139 ";
7140
7141 $query_ct_where_id_dossier_consulte ="
7142 dossier.dossier ='".$idx."'
7143 ";
7144
7145 /**
7146 * Return
7147 */
7148 //
7149 return array(
7150 "query_ct_select" => $query_ct_select,
7151 "query_ct_from" => $query_ct_from,
7152 "query_ct_where_id_dossier_consulte" => $query_ct_where_id_dossier_consulte,
7153 );
7154 }
7155
7156 /**
7157 * WIDGET DASHBOARD - widget_dossier_consulter
7158 * @return void
7159 */
7160 function view_widget_dossier_consulter($content = null) {
7161 /**
7162 * Ce widget est configurable via l'interface Web. Lors de la création
7163 * du widget dans le paramétrage il est possible de spécifier l'options suivantes :
7164 *
7165 * - nb_dossiers : le nombre de dossiers récemment consultés visibile dans le
7166 * widget.
7167 * (default) Par défaut la valeur est 5 derniers dossiers.
7168 **/
7169
7170 // Liste des paramètres
7171 $params = array("nb_dossiers");
7172 // Formatage des arguments reçus en paramètres
7173 $arguments = $this->get_arguments($content, $params);
7174
7175 //On retire 1 à la valeur de nb_dossiers car $i boucle à partir de 0
7176 if(isset($arguments['nb_dossiers']) == false) {
7177 $nb_dossiers = 4;
7178 } else {
7179 $nb_dossiers = $arguments['nb_dossiers']-1;
7180 }
7181
7182
7183 $dossier_brut = null;
7184 if (isset($_SESSION['dossiers_consulte']) === false) {
7185 $dossiers_consulte = array();
7186 } else {
7187 $dossier_brut = $_SESSION['dossiers_consulte'];
7188 $dossiers_consulte = array_reverse($dossier_brut);
7189 }
7190
7191 /**
7192 * Template nécessaires à l'affichage du widget
7193 */
7194 //
7195 $template_table = '
7196 <table class="tab-tab widget_dossier_consulter">
7197 <thead>
7198 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
7199 <th class="title col-0 firstcol">
7200 <span class="name">
7201 %s
7202 </span>
7203 </th>
7204 <th class="title col-1">
7205 <span class="name">
7206 %s
7207 </span>
7208 </th>
7209 <th class="title col-2">
7210 <span class="name">
7211 %s
7212 </span>
7213 </th>
7214 </tr>
7215 </thead>
7216 <tbody>
7217 %s
7218 </tbody>
7219 </table>
7220 ';
7221 //
7222 $template_line = '
7223 <tr class="tab-data odd">
7224 <td class="col-1 firstcol">
7225 %s
7226 </td>
7227 <td class="col-1">
7228 %s
7229 </td>
7230 <td class="col-2">
7231 %s
7232 </td>
7233 </tr>
7234 ';
7235
7236 //
7237 $template_line_hidden = '
7238 <tr class="tab-data odd" hidden>
7239 <td class="col-1 firstcol">
7240 %s
7241 </td>
7242 <td class="col-1">
7243 %s
7244 </td>
7245 <td class="col-2">
7246 %s
7247 </td>
7248 </tr>
7249 ';
7250 // Récupererle type du dossier pour bien rediriger et son id.
7251 $template_href = OM_ROUTE_FORM.'&obj=%s&action=3&idx=%s';
7252
7253 $template_link = '
7254 <a class="lienTable" href="%s">
7255 %s
7256 </a>
7257 ';
7258 //
7259 $template_footer_consulter = '
7260 <div class="widget-footer">
7261 <a class="simple-btn" onClick="%s">
7262 %s
7263 </a>
7264 </div>
7265 ';
7266
7267 if ($dossier_brut === null) {
7268 // Affichage du message d'information
7269 echo __("Vous n'avez pas consulté de dossier pour le moment.");
7270 // Exit
7271 return;
7272 }
7273
7274 $ct_tbody = '';
7275
7276 $i = 0;
7277 // On construit le contenu du tableau
7278 foreach ($dossiers_consulte as $key => $value) {
7279
7280 // Récupération en bdd des données necessaire par idx
7281 $conf = $this->get_config_dossier_consulter($value);
7282
7283 // Composition de la requête
7284 $query = sprintf("
7285 SELECT
7286 %s
7287 FROM
7288 %s
7289 WHERE
7290 %s",
7291 $conf["query_ct_select"],
7292 $conf["query_ct_from"],
7293 $conf["query_ct_where_id_dossier_consulte"]
7294 );
7295
7296 // Exécution de la requête
7297 $res = $this->f->db->query($query);
7298 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
7299 $this->f->isDatabaseError($res);
7300 $row = $res->fetchRow(DB_FETCHMODE_ASSOC);
7301
7302 // Determination de la route à utiliser.
7303 switch ($row['code']) {
7304 case 'IN':
7305 $route="dossier_contentieux_toutes_infractions";
7306 break;
7307 case 'RE':
7308 $route="dossier_contentieux_tous_recours";
7309 break;
7310 default: $route="dossier_instruction";
7311 }
7312
7313 // On construit l'attribut href du lien
7314 $ct_href = sprintf(
7315 $template_href,
7316 $route,
7317 // idx
7318 $row['dossier']
7319 );
7320
7321 if ($i > $nb_dossiers){
7322 $good_template_line = $template_line_hidden;
7323 } else {
7324 $good_template_line = $template_line;
7325 }
7326 // Construction d'une ligne
7327 $ct_tbody .= sprintf(
7328 $good_template_line,
7329 // Colonne 1 - Numéro de dossier
7330 sprintf(
7331 $template_link,
7332 $ct_href,
7333 $row['dossier_libelle']
7334 ),
7335 // Colonne 2 - Nom du pétitionnaire
7336 sprintf(
7337 $template_link,
7338 $ct_href,
7339 $row["nom_petitionnaire"]
7340 ),
7341 // Colonne 3 - Date depot
7342 sprintf(
7343 $template_link,
7344 $ct_href,
7345 $this->f->formatDate($row["date_depot"])
7346 )
7347 );
7348
7349 $i++;
7350 }
7351 // Affichage du tableau listant les dossiers
7352 printf(
7353 $template_table,
7354 // Colonne 1 - Numéro de dossier
7355 __('dossier'),
7356 // Colonne 2 - petitionnaire
7357 __('demandeur'),
7358 // Colonne 3 - date depot
7359 __('date_depot'),
7360 // Contenu du tableau
7361 $ct_tbody
7362 );
7363
7364 // On affiche le footer seulement si l'utilisateur à consulté plus de
7365 // dossier que le nombre de dossier affiché par défaut (paramétrage)
7366 if ($i > $nb_dossiers) {
7367 // Affichage du footer
7368 printf(
7369 $template_footer_consulter,
7370 "get_all_dossier_consulte($(this).parent().parent().parent().parent().attr('id'))",
7371 __("Afficher +")
7372 );
7373 }
7374 }
7375
7376 /**
7377 * WIDGET DASHBOARD - Dossiers à qualifier (limite de la notification du délai)
7378 * @return void
7379 */
7380 function view_widget_dossiers_pre_instruction($content = null) {
7381 /**
7382 * Ce widget est configurable via l'interface Web. Lors de la création
7383 * du widget dans le paramétrage il est possible de spécifier la ou les
7384 * options suivantes :
7385 * - filtre :
7386 * = instructeur
7387 * = aucun
7388 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
7389 */
7390 // Liste des paramètres
7391 $params = array("filtre", "codes_datd");
7392 // Formatage des arguments reçus en paramètres
7393 $arguments = $this->get_arguments($content, $params);
7394 // Récupération de la configuration du widget
7395 $conf = $this->get_config_dossiers_pre_instruction($arguments);
7396 // Récupération du filtre
7397 $filtre = $conf["arguments"]["filtre"];
7398 //Récupération du code datd
7399 $codes_datd = $conf["arguments"]["codes_datd"];
7400 // Définit l'objet cible
7401 $obj = 'dossier_instruction';
7402
7403 /**
7404 * Composition de la requête
7405 */
7406 //
7407 $query = sprintf("
7408 SELECT
7409 %s
7410 FROM
7411 %s
7412 WHERE
7413 %s
7414 %s
7415 ORDER BY
7416 %s
7417 LIMIT 5",
7418 $conf["query_ct_select"],
7419 $conf["query_ct_from"],
7420 $conf["query_ct_where"],
7421 $conf["query_ct_where_datd_filter"],
7422 $conf["query_ct_orderby"]
7423 );
7424
7425 /**
7426 * Exécution de la requête
7427 */
7428 //
7429 $res = $this->f->db->query($query);
7430 $this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE);
7431 $this->f->isDatabaseError($res);
7432
7433 // Affichage du message d'informations
7434 printf(
7435 $this->template_help,
7436 $conf["message_help"]
7437 );
7438
7439 /**
7440 * Si il n'y a aucun dossier à afficher, alors on affiche un message
7441 * clair à l'utilisateur et on sort de la vue.
7442 */
7443 // Si il n'y a aucun dossier à afficher
7444 if ($res->numrows() == 0) {
7445 // Affichage du message d'informations
7446 echo __("Vous n'avez aucun dossier d'instruction à qualifier dont la date limite de notification du délai au pétitionnaire arrive bientôt à échéance.");
7447 // Exit
7448 return;
7449 }
7450
7451 /**
7452 * Template nécessaires à l'affichage du widget
7453 */
7454 //
7455 $template_table = '
7456 <table class="tab-tab">
7457 <thead>
7458 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
7459 <th class="title col-0 firstcol">
7460 <span class="name">
7461 %s
7462 </span>
7463 </th>
7464 <th class="title col-1">
7465 <span class="name">
7466 %s
7467 </span>
7468 </th>
7469 <th class="title col-2">
7470 <span class="name">
7471 %s
7472 </span>
7473 </th>
7474 <th class="title col-3 lastcol">
7475 <span class="name">
7476 %s
7477 </span>
7478 </th>
7479 </tr>
7480 </thead>
7481 <tbody>
7482 %s
7483 </tbody>
7484 </table>
7485 ';
7486 //
7487 $template_line = '
7488 <tr id="dossier_dossiers_pre_instruction_%s" class="tab-data odd">
7489 <td class="col-0 firstcol">
7490 %s
7491 </td>
7492 <td class="col-1 ">
7493 %s
7494 </td>
7495 <td class="col-2">
7496 %s
7497 </td>
7498 <td class="col-3 lastcol">
7499 %s
7500 </td>
7501 </tr>
7502 ';
7503
7504 // Bouton consulter
7505 $template_btn_consulter = '
7506 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">'
7507 ._('Consulter')
7508 .'</span>
7509 ';
7510 //
7511 $template_href = OM_ROUTE_FORM.'&obj=%s&amp;action=3&amp;idx=%s';
7512 //
7513 $template_link = '
7514 <a class="lienTable" href="%s">
7515 %s
7516 </a>
7517 ';
7518
7519 /**
7520 * Si il y a des dossiers à afficher, alors on affiche le widget.
7521 */
7522 // On construit le contenu du tableau
7523 $ct_tbody = '';
7524 $compteur = 0;
7525 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
7526 // On construit l'attribut href du lien
7527 $ct_href = sprintf(
7528 $template_href,
7529 // obj
7530 $obj,
7531 // idx
7532 $row["dossier"]
7533 );
7534 // On construit la ligne
7535 $ct_tbody .= sprintf(
7536 $template_line,
7537 //Numero des id html
7538 $compteur,
7539 // Colonne 1 - Numéro de dossier
7540 sprintf(
7541 $template_link,
7542 $ct_href,
7543 $template_btn_consulter
7544 ),
7545 // Colonne 2 - Numéro de dossier
7546 sprintf(
7547 $template_link,
7548 $ct_href,
7549 $row["dossier_libelle"]
7550 ),
7551 // Colonne 3 - Demandeur
7552 sprintf(
7553 $template_link,
7554 $ct_href,
7555 $row["nom_petitionnaire"]
7556 ),
7557 // Colonne 4 - Date de Notification de délai
7558 sprintf(
7559 $template_link,
7560 $ct_href,
7561 $this->f->formatDate($row["date_notification_delai"])
7562 )
7563 );
7564 $compteur++;
7565 }
7566 // Affichage du tableau listant les dossiers
7567 printf(
7568 $template_table,
7569 // Colonne 1 - Consulter
7570 '',
7571 // Colonne 2 - Libellé du dossier
7572 __('dossier'),
7573 // Colonne 3 - Demandeur
7574 __('nom_petitionnaire'),
7575 // Colonne 4 - Date de notification de delai
7576 __("date de notification limite"),
7577 // Le Contenu
7578 $ct_tbody
7579 );
7580
7581 /**
7582 * Affichage du footer
7583 */
7584 //
7585 $template_link_footer = OM_ROUTE_TAB.'&obj=%s';
7586 //
7587 $link_footer = sprintf(
7588 $template_link_footer,
7589 "dossiers_pre_instruction"
7590 );
7591 //
7592 printf(
7593 $this->template_footer,
7594 // href (avec les paramètres du widget)
7595 sprintf(
7596 "%s&filtre=%s&codes_datd=%s",
7597 $link_footer,
7598 $filtre,
7599 (is_null($codes_datd) ? "" : implode(";",$codes_datd))
7600 ),
7601 // titre
7602 __("Voir +")
7603 );
7604 }
7605
7606 /**
7607 * Cette méthode permet de récupérer la configuration du widget
7608 * 'Dossiers à qualifier (limite de la notification du délai)'.
7609 *
7610 * @return array
7611 */
7612 function get_config_dossiers_pre_instruction($arguments) {
7613 // Initialisation du tableau des paramètres avec ses valeur par défaut
7614 $arguments_default = array(
7615 "filtre" => "instructeur",
7616 "codes_datd" => null
7617 );
7618 // Vérification des arguments
7619 foreach ($arguments_default as $key => $value) {
7620 //
7621 if (isset($arguments[$key])) {
7622 //
7623 $elem = trim($arguments[$key]);
7624 //
7625 if ($key === "filtre"
7626 && in_array($elem, array("instructeur", "division", "aucun"))) {
7627 // La valeur doit être dans cette liste
7628 $arguments[$key] = $elem;
7629 continue;
7630 } elseif ($key === "codes_datd"
7631 && $elem != "") {
7632 // Ce doit être un tableau
7633 $arguments[$key] = explode(";", $elem);
7634 continue;
7635 }
7636 }
7637 //
7638 $arguments[$key] = $value;
7639 }
7640
7641 $filtre = $arguments["filtre"];
7642 $codes_datd = $arguments["codes_datd"];
7643 /**
7644 * Construction de la requête
7645 */
7646 //
7647 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
7648 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
7649 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
7650 END";
7651 // SELECT
7652 $query_ct_select = "
7653 dossier.dossier,
7654 dossier.dossier_libelle,
7655 $case_demandeur as nom_petitionnaire,
7656 dossier.date_notification_delai
7657 ";
7658
7659 // SELECT - CHAMPAFFICHE
7660 $query_ct_select_champaffiche = array(
7661 'dossier.dossier as "'._("dossier").'"',
7662 'dossier.dossier_libelle as "'._("dossier").'"',
7663 $case_demandeur.' as "'._("nom_petitionnaire").'"',
7664 'to_char(dossier.date_notification_delai ,\'DD/MM/YYYY\') as "'._("date de notification limite").'"',
7665 );
7666
7667 // FROM
7668 $query_ct_from = "
7669 ".DB_PREFIXE."dossier
7670 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
7671 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7672 LEFT JOIN ".DB_PREFIXE."demandeur
7673 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7674 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7675 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
7676 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7677 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7678 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
7679 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7680 LEFT JOIN ".DB_PREFIXE."etat
7681 ON dossier.etat = etat.etat
7682 %s
7683 %s
7684 %s
7685 ";
7686
7687 $query_ct_where_instructeur_filter = "";
7688 $query_ct_where_division_filter = "";
7689 $query_ct_where_collectivite_filter = "";
7690 // Filtre sur les dossiers qui concernent l'utilisateur
7691 if ($filtre == "instructeur") {
7692 //
7693 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
7694 ON dossier.instructeur=instructeur.instructeur
7695 OR dossier.instructeur_2=instructeur.instructeur
7696 JOIN ".DB_PREFIXE."om_utilisateur
7697 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
7698 AND om_utilisateur.login='".$_SESSION['login']."'
7699 ";
7700 } else {
7701 $query_ct_where_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
7702 ON dossier.instructeur=instructeur.instructeur
7703 LEFT JOIN ".DB_PREFIXE."om_utilisateur
7704 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
7705 }
7706 // Filtre sur les dossier de la division
7707 if ($filtre == "division") {
7708 //
7709 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
7710 ON dossier.division=division.division
7711 AND division.division = ".$_SESSION['division']."
7712 ";
7713 } else {
7714 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
7715 ON dossier.division=division.division";
7716 }
7717
7718 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
7719 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
7720 // collectivité
7721 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7722 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
7723 ON dossier.om_collectivite=om_collectivite.om_collectivite
7724 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
7725 ";
7726 } else {
7727 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
7728 ON dossier.om_collectivite=om_collectivite.om_collectivite
7729 ";
7730 }
7731
7732 $query_ct_from = sprintf($query_ct_from, $query_ct_where_instructeur_filter, $query_ct_where_division_filter, $query_ct_where_collectivite_filter);
7733
7734 $query_ct_where ="
7735 dossier.a_qualifier IS TRUE
7736 AND dossier.date_notification_delai >= DATE(NOW())
7737 AND etat.statut = 'encours'
7738 ";
7739
7740 $query_ct_where_datd_filter = "";
7741 if (!is_null($codes_datd)
7742 && is_array($codes_datd)
7743 && count($codes_datd) != 0) {
7744 //
7745 $sql_codes = "";
7746 //
7747 foreach ($codes_datd as $code) {
7748 $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
7749 }
7750 $sql_codes = substr($sql_codes, 0, count($sql_codes) - 4);
7751 //
7752 $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
7753 }
7754
7755 $query_ct_orderby ="
7756 dossier.date_notification_delai ASC NULLS LAST, dossier.dossier ASC NULLS LAST
7757 ";
7758
7759 $query_ct_where_groupe = "";
7760 // Gestion des groupes et confidentialité
7761 include('../sql/pgsql/filter_group_widgets.inc.php');
7762
7763 /**
7764 * Message d'aide
7765 */
7766 // Filtre
7767 $message_filtre = "";
7768 //
7769 switch ($filtre) {
7770 case "instructeur":
7771 $message_filtre = " ".__("dont je suis l'instructeur");
7772 break;
7773 case "aucun":
7774 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7775 $message_filtre = " ".__("situés dans ma collectivité");
7776 } else {
7777 $message_filtre = " ".__("situés dans toutes les collectivités");
7778 }
7779 break;
7780 }
7781 //
7782 $message_help = sprintf(
7783 __("Les dossiers d'instruction%s%s, qui sont à qualifier, non clôturés et sur lesquels la date limite de notification du délai au pétitionnaire arrive bientôt à échéance."),
7784 (is_null($codes_datd) ? "": " (".implode(", ",$codes_datd).")"),
7785 $message_filtre
7786 );
7787
7788 /**
7789 * Return
7790 */
7791 //
7792 return array(
7793 "arguments" => $arguments,
7794 "message_help" => $message_help,
7795 "query_ct_select" => $query_ct_select,
7796 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
7797 "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
7798 "query_ct_from" => $query_ct_from,
7799 "query_ct_where" => $query_ct_where,
7800 "query_ct_where_groupe" => $query_ct_where_groupe,
7801 "query_ct_orderby" => $query_ct_orderby
7802 );
7803 }
7804 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26