/[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 19307 - (show annotations)
Wed Nov 6 10:57:56 2024 UTC (3 months ago) by softime
File size: 425537 byte(s)
merge: fusion de la branche d'intégration 6.9.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 const WIDGET_COMPTEUR_SIGNATURE_TPL = '
17 <div class="container">
18 {{message}}
19 <section class="widget-suivi-conso-stats">
20 <div class="statistic {{class}}">
21 <h4>Signatures utilisées</h4>
22 <div>
23 <span class="disk"></span>
24 <p>
25 <span class="count">{{count}}</span>
26 <span class="quota"> / {{quota}}</span>
27 signatures
28 </p>
29 </div>
30 </div>
31 <div class="statistic remaining">
32 <h4>Signatures {{left_or_over_label}}</h4>
33 <div>
34 <span class="disk"></span>
35 <p>
36 <span class="count">{{left_or_over}}</span>
37 <span class="quota"> / {{quota}}</span> signatures
38 </p>
39 </div>
40 </div>
41 </section>
42 <section class="widget-suivi-conso-progress">
43 <div class="signature-progress-bar {{class}}" style="width: {{consumed_percent}}%"></div>
44 <p class="percent">{{consumed_percent}} %</p>
45 </section>
46 </div>
47 ';
48
49 /**
50 *
51 */
52 var $template_help = '<div class="widget-help"><span class="info-16" title="%s"></span></div>';
53
54 /**
55 *
56 */
57 var $template_footer = '
58 <div class="widget-footer">
59 <a href="%s">
60 %s
61 </a>
62 </div>
63 ';
64
65 /**
66 * Tableau contenant la liste des filtres pouvant être utilisé
67 * dans les widgets.
68 */
69 protected $existing_filters = array(
70 'division',
71 'instructeur',
72 'instructeur_secondaire',
73 'instructeur_ou_instructeur_secondaire'
74 );
75
76 /**
77 * Cette méthode retourne un arbre html représentant un raccourci.
78 *
79 * Un raccourci est composé d'un lien, d'une image et d'une description.
80 * Voir les widgets :
81 * - widget_nouvelle_demande_autre_dossier
82 * - widget_nouvelle_demande_dossier_encours
83 * - widget_nouvelle_demande_nouveau_dossier
84 */
85 function get_display_widget_shortlink($config) {
86 return sprintf (
87 '<section><a class="flex_center" href="%s"><img src="%s" alt="%s"/><p>%s</p></a></section>',
88 $config["a_href"],
89 $config["img_src"],
90 $config["img_alt"],
91 $config["a_content"]
92 );
93 }
94
95 /**
96 * WIDGET DASHBOARD - widget_nouvelle_demande_autre_dossier.
97 */
98 function view_widget_nouvelle_demande_autre_dossier($content = null) {
99 echo $this->get_display_widget_shortlink(array(
100 "a_href" => OM_ROUTE_TAB."&obj=demande_autre_dossier",
101 "img_src" => "../app/img/dossier-existant.png",
102 "img_alt" => __("Autres dossiers"),
103 "a_content" => __("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours ou une autorisation existante"),
104 ));
105 }
106
107 /**
108 * WIDGET DASHBOARD - widget_nouvelle_demande_dossier_encours.
109 */
110 function view_widget_nouvelle_demande_dossier_encours($content = null) {
111 echo $this->get_display_widget_shortlink(array(
112 "a_href" => OM_ROUTE_TAB."&obj=demande_dossier_encours",
113 "img_src" => "../app/img/dossier-existant.png",
114 "img_alt" => __("Dossier en cours"),
115 "a_content" => __("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours"),
116 ));
117 }
118
119 /**
120 * WIDGET DASHBOARD - widget_nouvelle_demande_nouveau_dossier.
121 */
122 function view_widget_nouvelle_demande_nouveau_dossier($content = null) {
123 $params = array("contexte");
124 // Formatage des arguments reçus en paramètres
125 $arguments = $this->get_arguments($content, $params);
126 $arguments_default = array(
127 "contexte" => "standard"
128 );
129 // Vérification des arguments
130 foreach ($arguments_default as $key => $value) {
131 //
132 if (isset($arguments[$key])) {
133 //
134 $elem = trim($arguments[$key]);
135 //
136 if ($key === "contexte"
137 && in_array($elem, array("standard", "contentieux"))) {
138 // La valeur doit être dans cette liste
139 $arguments[$key] = $elem;
140 continue;
141 }
142 }
143 //
144 $arguments[$key] = $value;
145 }
146 $contexte = $arguments["contexte"];
147 $widget_config = array(
148 "a_href" => OM_ROUTE_FORM."&obj=demande_nouveau_dossier&amp;action=0&amp;advs_id=&amp;tricol=&amp;valide=&amp;retour=tab&amp;new=",
149 "img_src" => "../app/img/dossier-nouveau.png",
150 "img_alt" => __("Nouveau dossier"),
151 "a_content" => __("Cliquer ici pour saisir une nouvelle demande concernant le depot d'un nouveau dossier"),
152 );
153 if ($contexte == "contentieux") {
154 $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=";
155 }
156 echo $this->get_display_widget_shortlink($widget_config);
157 }
158
159 /**
160 * WIDGET DASHBOARD - widget_recherche_dossier.
161 *
162 * Quatre cas d'utilisation :
163 * - 1 - La valeur recherchée correspond exactement au code d'un DI,
164 * alors on accède directement à la fiche de visualisation du DI.
165 * - 2 - La valeur recherchée renvoi plusieurs DI, alors on accède au
166 * listing des dossiers d'instruction avec le formulaire de
167 * recherche avancée pré-rempli avec la valeur saisie.
168 * - 3 - La valeur recherchée renvoi aucun enregistrement, alors on
169 * affiche un message en ce sens directement dans le widget.
170 * - 4 - Aucune valeur n'est saisie, alors on affiche un message en ce
171 * sens directement dans le widget.
172 *
173 * @return void
174 */
175 function view_widget_recherche_dossier($content = null) {
176
177 /**
178 * Traitement de la validation du formulaire
179 */
180 //
181 if ($this->f->get_submitted_post_value("validation") != null
182 && $this->f->get_submitted_post_value("dossier") === '') {
183
184 //
185 // AUCUNE VALEUR SAISIE
186 //
187
188 // Cas d'utilisation n°4
189 // Affiche un message d'erreur
190 $erreur = __("Veuillez saisir un No de dossier.");
191 }
192 //
193 if ($this->f->get_submitted_post_value("validation") != null
194 && $this->f->get_submitted_post_value("dossier") !== null
195 && $this->f->get_submitted_post_value("dossier") !== '') {
196 //
197 $list_dossiers = $this->execute_recherche_dossier();
198
199 $total_dossiers = count($list_dossiers);
200 // Si on obtient un seul résultat
201 if ($total_dossiers == 1) {
202 // On reformate le dossier
203 $dossier = str_replace(' ', '', $list_dossiers[0]);
204 // On redirige vers le listing des DI
205 echo '
206 <script type="text/javascript" >
207 widget_recherche_dossier(\''.$dossier.'\', 1, \'dossier_instruction\');
208 </script>
209 ';
210 // On arrête l'exécution du script car l'utilisateur a été
211 // redirigé vers un autre script
212 exit();
213 }
214 // Si on obtient plusieurs résultats
215 if ($total_dossiers > 1) {
216 // Mémorisation de la recherche
217 $search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier"));
218 // Ajout d'une étoile au début s'il n'y en n'a pas.
219 // Par defaut * est toujours ajouté à la fin des recherches.
220 if (substr($search, 0, 1) != '*') {
221 $search = '*'.$search;
222 }
223 // On redirige vers le listing des DI
224 //
225 echo '
226 <script type="text/javascript" >
227 widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.', \'dossier_instruction\');
228 </script>
229 ';
230 // On arrête l'exécution du script car l'utilisateur a été
231 // redirigé vers un autre script
232 exit();
233 }
234 // Cas d'utilisation n°3
235 // Si aucun dossier trouve
236 // Affiche un message d'erreur
237 $erreur = __("Aucun dossier trouvé.");
238 }
239
240 /**
241 * Affichage du widget
242 */
243 // Affichage du message d'informations
244 printf(
245 '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
246 __("Permet la recherche directe de dossiers d'instruction.\n\n".
247 "Deux modes de saisie sont possibles :\n".
248 "- 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".
249 "- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.")
250 );
251 // Ouverture du form
252 echo "\t<form method=\"post\" id=\"widget_recherche_dossier_form\" action=\"".OM_ROUTE_DASHBOARD."\">\n";
253 // Affichage d'un éventuel message d'erreur
254 if (isset($erreur) && $erreur != "") {
255 $class = "error";
256 $this->f->displayMessage($class, $erreur);
257 }
258 // Configuration du formulaire de recherche
259 $champs = array("dossier");
260 $form = $this->f->get_inst__om_formulaire(array(
261 "validation" => 0,
262 "maj" => 0,
263 "champs" => $champs,
264 ));
265 $form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>');
266 $form->setType("dossier", "text");
267 $form->setTaille("dossier", 20);
268 $form->setMax("dossier", 250);
269 // Affichage du formulaire
270 $form->entete();
271 $form->afficher($champs, 0, false, false);
272 $form->enpied();
273 // Affichage des contrôles du formulaire
274 echo "\t<div class=\"formControls\">\n";
275 echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
276 value=\"".__("Valider")."\" name=\"validation\" />\n";
277 echo "\t</div>\n";
278 // Fermeture du form
279 echo "\t</form>\n";
280 }
281
282 /**
283 * WIDGET DASHBOARD - widget_recherche_parametrable.
284 *
285 * Le widget permet de lister les dossiers en fonction de l'état,
286 * du filtre instructeur ou division et d'avoir un message d'aide personnalisé
287 */
288 function view_widget_recherche_parametrable($content=null) {
289 $params = array('etat', 'filtre', 'tri', 'affichage', 'source_depot', 'message_help');
290 $arguments = $this->get_arguments($content, $params);
291 $conf = $this->get_config_recherche_dossier_parametrable($arguments);
292
293 $sql = sprintf(
294 "SELECT
295 %s
296 FROM
297 %s
298 %s
299 %s
300 %s
301 %s
302 %s
303 %s",
304 $conf["query_ct_select"],
305 $conf["query_ct_from"],
306 '%s',
307 trim($conf["query_ct_where"]) !== '' ? "WHERE" : '',
308 $conf["query_ct_where"],
309 '%s', // emplacement pour les conditions du filtre
310 $conf["query_ct_orderby"],
311 $conf["query_ct_limit"]
312 );
313 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
314 $sqlFilter = $this->get_query_filter(
315 $sql,
316 $conf['arguments']['filtre']
317 );
318 $sql = sprintf(
319 $sql,
320 $sqlFilter["FROM"],
321 $sqlFilter["WHERE"]
322 );
323
324 $search = array(
325 "valide" => "false",
326 "advanced-search-submit" => "",
327 );
328
329 // Ajout des arguments pour la recherche avancée
330 foreach ($conf['arguments'] as $key => $argument) {
331 $search[$key] = $argument;
332 }
333
334 // Récupération de l'identifiant de l'instructeur pour la recherche avancée
335 if ($conf['arguments']['filtre'] == 'instructeur' || $conf['arguments']['filtre'] == 'instructeur_secondaire') {
336 $id_instructeur = $this->f->get_one_result_from_db_query(
337 sprintf(
338 'SELECT
339 instructeur.instructeur
340 FROM
341 %1$sinstructeur
342 LEFT JOIN %1$som_utilisateur
343 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
344 WHERE
345 om_utilisateur.login = \'%2$s\'',
346 DB_PREFIXE,
347 $this->f->db->escapeSimple($_SESSION['login'])
348 ),
349 array(
350 "origin" => __METHOD__
351 )
352 );
353
354 $conf['arguments']['filtre'] == 'instructeur' ?
355 ($search['instructeur'] = $id_instructeur['result']) :
356 ($search['instructeur_2'] = $id_instructeur['result']);
357 }
358
359 // Récupération de l'identifiant de la division pour la recherche avancée
360 if ($conf['arguments']['filtre'] == 'division') {
361 $search['division'] = $_SESSION['division'];
362 }
363
364 // Récupération de la collectivité pour la recherche avancée
365 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
366 $search['om_collectivite'] = $_SESSION['collectivite'];
367 }
368
369 // Génération de l'advs_id
370 $advs_id = str_replace(array('.',','), '', microtime(true));
371 $search["advanced-search-submit"] = "";
372 $_SESSION["advs_ids"][$advs_id] = serialize($search);
373
374 // Affichage du message d'informations
375 printf(
376 $this->template_help,
377 $conf["message_help"]
378 );
379 // Affichage du widget avec une bulle
380 if ($conf["arguments"]["affichage"] === "nombre") {
381 $qres = $this->f->get_one_result_from_db_query(
382 $sql,
383 array(
384 "origin" => __METHOD__
385 )
386 );
387
388 // Si il n'y a aucun dossier à afficher
389 if (intval($qres['result']) == 0) {
390 // Affichage du message d'informations
391 echo __("Aucun dossier trouvé.");
392 // Exit
393 return;
394 }
395 $this->display_resultat_bulle($qres['result'], __("dossier(s) trouvé(s)"), "bg-info", "");
396 } else {
397 // Exécution de la requête
398 $qres = $this->f->get_all_results_from_db_query(
399 $sql,
400 array(
401 'origin' => __METHOD__
402 )
403 );
404
405 // Si il n'y a aucun dossier à afficher
406 if ($qres['row_count'] === 0) {
407 // Affichage du message d'informations
408 echo __("Vous n'avez pas de dossiers pour le moment.");
409 // Exit
410 return;
411 }
412
413 //
414 $template_table = '
415 <table class="tab-tab">
416 <thead>
417 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
418 <th class="title col-0 firstcol">
419 <span class="name">
420 %s
421 </span>
422 </th>
423 <th class="title col-1">
424 <span class="name">
425 %s
426 </span>
427 </th>
428 <th class="title col-2 lastcol">
429 <span class="name">
430 %s
431 </span>
432 </th>
433 </tr>
434 </thead>
435 <tbody>
436 %s
437 </tbody>
438 </table>
439 ';
440 //
441 $template_line = '
442 <tr class="tab-data odd">
443 <td class="col-1 firstcol">
444 %s
445 </td>
446 <td class="col-1">
447 %s
448 </td>
449 <td class="col-2 lastcol">
450 %s
451 </td>
452 </tr>
453 ';
454 //
455 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&amp;action=3&amp;idx=%s';
456 //
457 $template_link = '
458 <a class="lienTable" href="%s">
459 %s
460 </a>
461 ';
462
463 /**
464 * Si il y a des dossiers à afficher, alors on affiche le widget.
465 */
466 // On construit le contenu du tableau
467 $ct_tbody = '';
468 foreach ($qres['result'] as $row) {
469 // On construit l'attribut href du lien
470 $ct_href = sprintf(
471 $template_href,
472 // idx
473 $row["dossier"]
474 );
475 // On construit la ligne
476 $ct_tbody .= sprintf(
477 $template_line,
478 // Colonne 1 - Numéro du dossier
479 sprintf(
480 $template_link,
481 $ct_href,
482 $row["dossier"]
483 ),
484 // Colonne 2 - Libellé du dossier
485 sprintf(
486 $template_link,
487 $ct_href,
488 $row["dossier_libelle"]
489 ),
490 // Colonne 3 - Date dépôt
491 sprintf(
492 $template_link,
493 $ct_href,
494 $this->f->formatDate($row["date_depot"])
495 )
496 );
497 }
498 // Affichage du tableau listant les dossiers
499 printf(
500 $template_table,
501 // Colonne 1 - Numéro de dossier
502 __('dossier'),
503 // Colonne 2 - Libellé du dossier
504 __('nom_petitionnaire'),
505 // Colonne 3 - Date de dépôt
506 __('date_depot'),
507 // Contenu du tableau
508 $ct_tbody
509 );
510 }
511
512
513 // Affichage du footer
514 printf(
515 $this->template_footer,
516 sprintf(
517 OM_ROUTE_TAB."&obj=dossier_instruction&advs_id=%s&tricol=%s&message_help=%s",
518 $advs_id,
519 $conf['arguments']['tri'],
520 urlencode($conf['message_help'])
521 ),
522
523 // titre
524 __("Voir +")
525 );
526 }
527
528 /**
529 * Cette méthode permet de récupérer la configuration du widget 'Recherche
530 * paramétrable'.
531 *
532 * @return array
533 */
534 function get_config_recherche_dossier_parametrable($arguments) {
535 include "../sql/pgsql/app_om_tab_common_select.inc.php";
536 $arguments_default = array(
537 'affichage' => "nombre",
538 'filtre' => 'instructeur',
539 'tri' => -6
540 );
541
542 // Vérification des arguments
543 foreach ($arguments_default as $key => $value) {
544 //
545 if (isset($arguments[$key])) {
546 //
547 $elem = trim($arguments[$key]);
548 if ($key === "filtre"
549 && in_array($elem, array("instructeur", "division", "instructeur_secondaire", "aucun"))) {
550 // La valeur doit être dans cette liste
551 $arguments[$key] = $elem;
552 continue;
553 }
554 if ($key === "affichage"
555 && in_array($elem, array('liste', 'nombre'))) {
556 // La valeur doit être dans cette liste
557 $arguments[$key] = $elem;
558 continue;
559 }
560 if ($key === "tri"
561 && is_numeric(str_replace('-', '', $elem)) === true) {
562 //
563 $arguments[$key] = $elem;
564 continue;
565 }
566 }
567 //
568 $arguments[$key] = $value;
569 }
570
571 // Ajout du filtre sur la source du dépôt
572 $query_ct_where_source_depot = "";
573 if (isset($arguments["source_depot"])
574 && ! is_null($arguments["source_depot"])
575 && $arguments["source_depot"] !== "") {
576
577 $source_depot = $arguments["source_depot"];
578 if (! is_null($source_depot) && $source_depot !== "") {
579 $query_ct_where_source_depot = sprintf(
580 " demande.source_depot = '%s' ",
581 $source_depot
582 );
583 }
584 }
585
586 $query_limit = '';
587 // Gestion de l'affichage
588 if ($arguments['affichage'] == 'nombre') {
589 $query_ct_select = "COUNT(DISTINCT(dossier.dossier))";
590 $query_ct_orderby = '';
591 } else {
592 $query_ct_select = "
593 dossier.dossier,
594 $select__dossier_libelle__column as dossier_libelle,
595 dossier.date_depot
596 ";
597
598 $query_ct_orderby = sprintf("ORDER BY dossier.date_depot DESC");
599 }
600
601 $query_ct_from = sprintf(
602 '%1$sdossier
603 INNER JOIN %1$sdossier_instruction_type
604 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
605 INNER JOIN %1$sdossier_autorisation_type_detaille
606 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
607 LEFT JOIN %1$sdemande
608 ON demande.dossier_instruction = dossier.dossier
609 LEFT JOIN %1$sinstructeur
610 ON dossier.instructeur=instructeur.instructeur
611 LEFT JOIN %1$som_utilisateur
612 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
613 LEFT JOIN %1$sdivision
614 ON dossier.division=division.division',
615 DB_PREFIXE
616 );
617
618 // Filtre sur la collectivité en fonction du niveau
619 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
620 $query_ct_join_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
621 ON dossier.om_collectivite=om_collectivite.om_collectivite
622 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
623 ";
624 } else {
625 $query_ct_join_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
626 ON dossier.om_collectivite=om_collectivite.om_collectivite
627 ";
628 }
629
630 $query_ct_where_filtre = "";
631
632 //
633 $query_ct_where = ' dossier_instruction_type.sous_dossier IS NOT TRUE';
634 if (isset($arguments["etat"])
635 && is_null($arguments["etat"]) === false
636 && $arguments["etat"] !== "") {
637 //
638 $query_ct_where .= sprintf(
639 " AND dossier.etat = '%s' ",
640 $arguments['etat']
641 );
642 }
643
644 $query_ct_select_champaffiche = array(
645 'dossier.dossier as "'.__("dossier").'"',
646 $select__dossier_libelle__column_as,
647 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("date_depot").'"'
648 );
649
650 $message_help = "";
651 // Récupération du message d'aide
652 if (isset($arguments["message_help"])
653 && ! is_null($arguments["message_help"])
654 && $arguments["message_help"] !== "") {
655
656 $message_help = $arguments["message_help"];
657 }
658
659 // Construction du FROM
660 $query_ct_from = $query_ct_from.$query_ct_join_collectivite_filter;
661
662 // Construction du WHERE
663 $query_ct_where = sprintf(
664 '%s %s %s',
665 $query_ct_where,
666 trim($query_ct_where_source_depot) !== '' ? 'AND' : '',
667 $query_ct_where_source_depot
668 );
669
670 return array(
671 "arguments" => $arguments,
672 "message_help" => $message_help,
673 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
674 "query_ct_select" => $query_ct_select,
675 "query_ct_from" => $query_ct_from,
676 "query_ct_where" => $query_ct_where,
677 "query_ct_orderby" => $query_ct_orderby,
678 "query_ct_limit" => $query_limit,
679 );
680 }
681
682 /**
683 * WIDGET DASHBOARD - widget_suivi_instruction_parametrable.
684 *
685 * Le widget permet de lister les instructions en fonction du statut de signature,
686 * du filtre instructeur ou division et d'avoir un message d'aide personnalisé
687 */
688 function view_widget_suivi_instruction_parametrable($content=null) {
689 $params = array(
690 'statut_signature',
691 'filtre',
692 'tri',
693 'affichage',
694 'message_help',
695 'etat',
696 'evenement_type',
697 'nb_jours_avant_date_limite',
698 'nb_mois_avant_date_limite',
699 'nb_jours_max_apres_date_evenement',
700 'nb_mois_max_apres_date_evenement',
701 'affichage_colonne',
702 'envoi_cl',
703 'type_cl',
704 'evenement_id',
705 'instruction_finalisee',
706 'instruction_notifiee',
707 'signataire_description',
708 'nb_max_resultat',
709 'codes_datd',
710 'combinaison_criteres',
711 'exclure_evenement_id',
712 'statut_dossier',
713 'tri_tab_widget',
714 );
715 $arguments = $this->get_arguments($content, $params);
716 $conf = $this->get_config_suivi_instruction_parametrable($arguments);
717 $filtre = $conf["arguments"]["filtre"];
718
719 $sql = sprintf(
720 "SELECT
721 %s
722 FROM
723 %s
724 %s
725 %s
726 %s
727 %s
728 %s
729 %s",
730 $conf["query_ct_select"],
731 $conf["query_ct_from"],
732 '%s', // emplacement pour les jointure du filtre
733 trim($conf["query_ct_where"]) !== '' ? "WHERE" : '',
734 $conf["query_ct_where"],
735 '%s', // emplacement pour les conditions du filtre
736 $conf["query_ct_orderby"],
737 $conf["query_ct_limit"]
738 );
739 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
740 $sqlFilter = $this->get_query_filter(
741 $sql,
742 $conf['arguments']['filtre']
743 );
744 $sql = sprintf(
745 $sql,
746 $sqlFilter["FROM"],
747 $sqlFilter["WHERE"]
748 );
749
750 // Affichage du message d'informations
751 printf(
752 $this->template_help,
753 $conf["message_help"]
754 );
755
756 // Affichage du widget avec une bulle
757 if ($conf["arguments"]["affichage"] === "nombre") {
758 // Execution de la requête
759 $qres = $this->f->get_one_result_from_db_query(
760 $sql,
761 array(
762 "origin" => __METHOD__
763 )
764 );
765
766 // Si il n'y a aucun dossier à afficher
767 if (intval($qres['result']) == 0) {
768 // Affichage du message d'informations
769 echo __("Aucun document trouvé.");
770 // Exit
771 return;
772 }
773 $this->display_resultat_bulle($qres['result'], __("document(s) trouvé(s)"), "bg-info", "");
774 } else {
775 // Exécution de la requête
776 $qres = $this->f->get_all_results_from_db_query(
777 $sql,
778 array(
779 'origin' => __METHOD__
780 )
781 );
782
783 // Si il n'y a aucun dossier à afficher
784 if ($qres['row_count'] === 0) {
785 // Affichage du message d'informations
786 echo __("Il n'y a pas de documents pour le moment.");
787 // Exit
788 return;
789 }
790
791 $affichage_colonne = '';
792 $aff_col_is_array = false;
793 if (isset($conf['arguments']['affichage_colonne'])
794 && $conf['arguments']['affichage_colonne'] != '') {
795
796 $affichage_colonne = explode(';', $conf['arguments']['affichage_colonne']);
797
798 // On veut savoir si c'est un tableau
799 $aff_col_is_array = is_array($affichage_colonne);
800 }
801
802 // La classe css "title" a été enlevé pour chaque colonne afin que les intitulés soit centrés.
803 $template_table = '
804 <table class="tab-tab">
805 <thead>
806 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
807 <th class="col-0 firstcol">
808 <span class="name">
809 %s
810 </span>
811 </th>
812 <th class="col-1 %s">
813 <span class="name">
814 %s
815 </span>
816 </th>
817 <th class="col-2 %s">
818 <span class="name">
819 %s
820 </span>
821 </th>
822 <th class="col-3 %s">
823 <span class="name">
824 %s
825 </span>
826 </th>
827 <th class="col-4 %s">
828 <span class="name">
829 %s
830 </span>
831 </th>
832 <th class="col-5 %s">
833 <span class="name">
834 %s
835 </span>
836 </th>
837 <th class="col-6 %s">
838 <span class="name">
839 %s
840 </span>
841 </th>
842 <th class="col-7 %s">
843 <span class="name">
844 %s
845 </span>
846 </th>
847 <th class="col-8 %s lastcol">
848 <span class="name">
849 %s
850 </span>
851 </th>
852 <th class="col-9 %s lastcol">
853 <span class="name">
854 %s
855 </span>
856 </th>
857 </tr>
858 </thead>
859 <tbody>
860 %s
861 </tbody>
862 </table>
863 ';
864 //
865 $template_line = '
866 <tr class="tab-data odd">
867 <td class="col-1 firstcol">
868 %s
869 </td>
870 <td class="col-2 %s">
871 %s
872 </td>
873 <td class="col-3 %s">
874 %s
875 </td>
876 <td class="col-4 %s .tab-date">
877 %s
878 </td>
879 <td class="col-5 %s .tab-date">
880 %s
881 </td>
882 <td class="col-6 %s .tab-date">
883 %s
884 </td>
885 <td class="col-7 %s">
886 %s
887 </td>
888 <td class="col-8 %s">
889 %s
890 </td>
891 <td class="col-9 %s .tab-date">
892 %s
893 </td>
894 <td class="col-10 widget_icon_align_center %s lastcol">
895 %s
896 </td>
897 </tr>
898 ';
899
900 //
901 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&retour_widget=suivi_instruction_parametrable&widget_recherche_id='.$conf['widget_recherche_id'].'&amp;action=3&amp;idx=%s%s';
902 //
903 $template_link = '
904 <a class="lienTable" href="%s">
905 %s
906 </a>
907 ';
908
909 $tab_trad = array(
910 'waiting' => __('waiting'),
911 'in_progress' => __('en cours'),
912 'canceled' => __('annulé'),
913 'expired' => __('expiré'),
914 'finished' => __('signé')
915 );
916
917 /**
918 * Si il y a des dossiers à afficher, alors on affiche le widget.
919 */
920 // On construit le contenu du tableau
921 $ct_tbody = '';
922 foreach ($qres['result'] as $row) {
923 // On construit l'attribut href du lien
924 $ct_href = sprintf(
925 $template_href,
926 // idx
927 $row["dossier"],
928 isset($conf['arguments']['tri']) ? '&tricol='.$conf['arguments']['tri'] : ''
929 );
930 // On construit la ligne
931 $ct_tbody .= sprintf(
932 $template_line,
933 // Colonne 1 - Libellé du dossier
934 sprintf(
935 $template_link,
936 $ct_href,
937 $row["dossier_libelle"]
938 ),
939
940 isset($row['petitionnaire']) === true ? '' : 'widget_hide_col',
941
942 // Colonne 2 - Pétitionnaire
943 sprintf(
944 $template_link,
945 $ct_href,
946 isset($row['petitionnaire']) === true ? $row["petitionnaire"] : null
947 ),
948
949 isset($row['evenement_libelle']) === true ? '' : 'widget_hide_col',
950
951 // Colonne 3 - Instruction
952 sprintf(
953 $template_link,
954 $ct_href,
955 isset($row['evenement_libelle']) === true ? $row["evenement_libelle"] : null
956 ),
957
958 isset($row['date_envoi_signature']) === true ? '' : 'widget_hide_col',
959
960 // Colonne 4 - Date envoi en signature
961 sprintf(
962 $template_link,
963 $ct_href,
964 isset($row['date_envoi_signature']) === true ? $this->f->formatDate($row["date_envoi_signature"]) : null
965 ),
966
967 isset($row['date_retour_signature']) === true ? '' : 'widget_hide_col',
968
969 // Colonne 5 - Date de retour signature
970 sprintf(
971 $template_link,
972 $ct_href,
973 isset($row['date_retour_signature']) === true ? $this->f->formatDate($row["date_retour_signature"]) : null
974 ),
975
976 isset($row['date_evenement']) === true ? '' : 'widget_hide_col',
977
978 // Colonne 6 - Date de "dépôt"
979 sprintf(
980 $template_link,
981 $ct_href,
982 isset($row['date_evenement']) === true ? $this->f->formatDate($row["date_evenement"]) : null
983 ),
984
985 isset($row['signataire']) === true ? '' : 'widget_hide_col',
986
987 // Colonne 7 - Signataire
988 sprintf(
989 $template_link,
990 $ct_href,
991 isset($row['signataire']) === true ? $row["signataire"] : null
992 ),
993
994 isset($row['statut_signature']) === true ? '' : 'widget_hide_col',
995
996 // Colonne 8 - Statut signature
997 sprintf(
998 $template_link,
999 $ct_href,
1000 isset($row['statut_signature']) === true && $row['statut_signature'] != null ? $tab_trad[$row["statut_signature"]] : null
1001 ),
1002
1003 isset($row['date_limite']) === true ? '' : 'widget_hide_col',
1004
1005 // Colonne 9 - Date limite
1006 sprintf(
1007 $template_link,
1008 $ct_href,
1009 isset($row['date_limite']) === true ? $this->f->formatDate($row["date_limite"]) : null
1010 ),
1011
1012 isset($row['alerte_5_jours']) === true ? '' : 'widget_hide_col',
1013
1014 // Colonne 10 - Alerte 5 jours
1015 sprintf(
1016 $template_link,
1017 $ct_href,
1018 (isset($row['alerte_5_jours']) === true && $row['alerte_5_jours'] === 't') ? '<img src="../app/img/enjeu-urba-16x16.png"></img>' : null
1019 )
1020 );
1021 }
1022 // Affichage du tableau listant les dossiers
1023 printf(
1024 $template_table,
1025 // Colonne 1 - Libellé du dossier
1026 __('dossier'),
1027
1028 ($aff_col_is_array == true && in_array('petitionnaire', $affichage_colonne)) || $affichage_colonne == 'petitionnaire' ? '' : 'widget_hide_col',
1029 // Colonne 2 - Pétitionnaire
1030 __('petitionnaire'),
1031
1032 ($aff_col_is_array == true && in_array('instruction', $affichage_colonne)) || $affichage_colonne == 'instruction' ? '' : 'widget_hide_col',
1033 // Colonne 3 - Instruction
1034 __('instruction'),
1035
1036 ($aff_col_is_array == true && in_array('date_envoi_signature', $affichage_colonne)) || $affichage_colonne == 'date_envoi_signature' ? '' : 'widget_hide_col',
1037
1038 // Colonne 4 - Date envoi signature
1039 __('envoi parapheur'),
1040
1041 ($aff_col_is_array == true && in_array('date_retour_signature', $affichage_colonne)) || $affichage_colonne == 'date_retour_signature' ? '' : 'widget_hide_col',
1042 // Colonne 5 - Date de retour signature
1043 __('retour parapheur'),
1044
1045 ($aff_col_is_array == true && in_array('date_evenement', $affichage_colonne)) || $affichage_colonne == 'date_evenement' ? '' : 'widget_hide_col',
1046 // Colonne 6 - Date de retour signature
1047 __('dépôt document'),
1048
1049 ($aff_col_is_array == true && in_array('signataire', $affichage_colonne)) || $affichage_colonne == 'signataire' ? '' : 'widget_hide_col',
1050 // Colonne 7 - Signataire
1051 __('signataire'),
1052
1053 ($aff_col_is_array == true && in_array('statut_signature', $affichage_colonne)) || $affichage_colonne == 'statut_signature' ? '' : 'widget_hide_col',
1054 // Colonne 8 - Instruction
1055 __('statut_signature'),
1056
1057 ($aff_col_is_array == true && in_array('date_limite', $affichage_colonne)) || $affichage_colonne == 'date_limite' ? '' : 'widget_hide_col',
1058 // Colonne 9 - Date limite
1059 __('limite'),
1060
1061 ($aff_col_is_array == true && in_array('alerte_5_jours', $affichage_colonne)) || $affichage_colonne == 'alerte_5_jours' ? '' : 'widget_hide_col',
1062 // Colonne 10 - Alerte 5 jours
1063 __('alerte à 5 jours'),
1064
1065 // Contenu du tableau
1066 $ct_tbody
1067 );
1068 }
1069
1070
1071 // Affichage du footer
1072 printf(
1073 $this->template_footer,
1074 sprintf(
1075 OM_ROUTE_TAB."&obj=suivi_instruction_parametrable&widget_recherche_id=%s%s",
1076 $conf['widget_recherche_id'],
1077 isset($conf['arguments']['tri']) ? '&tricol='.$conf['arguments']['tri'] : ''
1078 ),
1079
1080 // titre
1081 __("Voir +")
1082 );
1083 }
1084
1085 /**
1086 * Cette méthode permet de récupérer la configuration du widget 'Suivi
1087 * d'instruction paramétrable.
1088 *
1089 * @return array
1090 */
1091 function get_config_suivi_instruction_parametrable($arguments) {
1092 include "../sql/pgsql/app_om_tab_common_select.inc.php";
1093 $arguments_default = array(
1094 'statut_signature' => null,
1095 'affichage' => "liste",
1096 'filtre' => 'instructeur',
1097 'affichage_colonne' => 'date_envoi_signature;date_limite',
1098 'evenement_type' => null,
1099 'etat' => null,
1100 'evenement_id' => null,
1101 'signataire_description' => null,
1102 'nb_max_resultat' => 5,
1103 'codes_datd' => null,
1104 'combinaison_criteres' => null,
1105 'exclure_evenement_id' => null,
1106 'statut_dossier' => null,
1107 'tri_tab_widget' => null,
1108 );
1109
1110 // Vérification des arguments
1111 foreach ($arguments_default as $key => $value) {
1112 //
1113 if (isset($arguments[$key])) {
1114 //
1115 $elem = trim($arguments[$key]);
1116 if ($key === "filtre"
1117 && in_array($elem, array("instructeur", "division", "instructeur_secondaire", "aucun"))) {
1118 // La valeur doit être dans cette liste
1119 $arguments[$key] = $elem;
1120 continue;
1121 }
1122 if ($key === "statut_signature"
1123 && $elem != "") {
1124 $arguments[$key] = explode(';', $elem);
1125 continue;
1126 }
1127 if ($key === "evenement_type"
1128 && $elem != "") {
1129 $arguments[$key] = explode(';', $elem);
1130 continue;
1131 }
1132 if ($key === "evenement_id"
1133 && $elem != "") {
1134 $arguments[$key] = explode(';', $elem);
1135 continue;
1136 }
1137 if ($key === "exclure_evenement_id"
1138 && $elem != "") {
1139 $arguments[$key] = explode(';', $elem);
1140 continue;
1141 }
1142 if ($key === "statut_dossier"
1143 && $elem != "" && ($elem == "encours" || $elem == "cloture")) {
1144 $arguments[$key] = $elem;
1145 continue;
1146 }
1147 if ($key === "codes_datd"
1148 && $elem != "") {
1149 $arguments[$key] = explode(';', $elem);
1150 continue;
1151 }
1152 if ($key === "signataire_description"
1153 && $elem != "") {
1154 $arguments[$key] = explode(';', $elem);
1155 continue;
1156 }
1157 if ($key === "etat"
1158 && $elem != "") {
1159 $arguments[$key] = explode(';', $elem);
1160 continue;
1161 }
1162 if ($key === "combinaison_criteres"
1163 && $elem != "") {
1164 $arguments[$key] = explode('|', $elem);
1165 continue;
1166 }
1167 if ($key === "affichage_colonne"
1168 && $elem != "") {
1169 $arguments[$key] = $elem;
1170 continue;
1171 }
1172 if ($key === "affichage"
1173 && in_array($elem, array('liste', 'nombre'))) {
1174 // La valeur doit être dans cette liste
1175 $arguments[$key] = $elem;
1176 continue;
1177 }
1178 if ($key === "tri"
1179 && is_numeric(str_replace('-', '', $elem)) === true) {
1180 //
1181 $arguments[$key] = $elem;
1182 continue;
1183 }
1184 if ($key === "nb_max_resultat"
1185 && is_numeric(str_replace('-', '', $elem)) === true) {
1186 //
1187 $arguments[$key] = $elem;
1188 continue;
1189 }
1190 if ($key === "tri_tab_widget"
1191 && in_array($elem, array("dossier","statut_signature","date_limite","date_envoi_signature","date_retour_signature","signataire","petitionnaire","instruction"))
1192 || in_array($elem, array("-dossier","-statut_signature","-date_limite","-date_envoi_signature","-date_retour_signature","-signataire","-petitionnaire","-instruction"))) {
1193 //
1194 $arguments[$key] = $elem;
1195 continue;
1196 }
1197
1198 }
1199 //
1200 $arguments[$key] = $value;
1201 }
1202
1203 $query_limit = '';
1204 // Gestion de l'affichage
1205 if ($arguments['affichage'] == 'nombre') {
1206 $query_ct_select = "COUNT(*)";
1207 $query_ct_orderby = '';
1208 } else {
1209 $query_ct_select = "
1210 dossier.dossier,
1211 $select__dossier_libelle__column as dossier_libelle
1212 ";
1213
1214
1215 if ($arguments['affichage_colonne'] != '') {
1216 $arguments['affichage_colonne'] = explode(';', $arguments['affichage_colonne']);
1217 }
1218 // Si il y a plusieurs colonnes supplémentaires
1219 if (isset($arguments['affichage_colonne'])
1220 && is_array($arguments['affichage_colonne'])) {
1221
1222 $query_ct_select .= ', ';
1223 foreach ($arguments['affichage_colonne'] as $colonne) {
1224 // Champ nécessitant un traitement spécifique
1225 if ($colonne == 'date_limite') {
1226 $query_ct_select .= 'CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
1227 dossier.date_limite_incompletude ELSE
1228 dossier.date_limite END as date_limite ';
1229 }
1230 if ($colonne == 'date_envoi_signature') {
1231 $query_ct_select .= 'instruction.date_envoi_signature ';
1232 }
1233 if ($colonne == 'date_retour_signature') {
1234 $query_ct_select .= 'instruction.date_retour_signature ';
1235 }
1236 if ($colonne == 'date_evenement') {
1237 $query_ct_select .= 'instruction.date_evenement ';
1238 }
1239 if ($colonne == 'signataire') {
1240 $query_ct_select .= "TRIM(CONCAT(signataire_arrete.prenom, ' ', signataire_arrete.nom, ' ', signataire_arrete.description)) as signataire ";
1241 }
1242 if ($colonne == 'statut_signature') {
1243 $query_ct_select .= 'instruction.statut_signature ';
1244 }
1245 if ($colonne == 'petitionnaire') {
1246 $query_ct_select .= "CASE WHEN demandeur.qualite='particulier'
1247 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
1248 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
1249 END as petitionnaire ";
1250 }
1251 if ($colonne == 'instruction') {
1252 $query_ct_select .= 'evenement.libelle as evenement_libelle';
1253 }
1254 if ($colonne == 'alerte_5_jours') {
1255 $query_ct_select .= "CASE WHEN date_limite >= CURRENT_DATE AND CURRENT_DATE >= date_limite - 5 * interval '1 day'
1256 THEN true
1257 ELSE false
1258 END as alerte_5_jours";
1259 }
1260 if (end($arguments['affichage_colonne']) != $colonne) {
1261 $query_ct_select .= ', ';
1262 }
1263 }
1264 }
1265
1266 // On gère le cas où il n'y a qu'une seule colonne supplémentaire
1267 if (isset($arguments['affichage_colonne'])
1268 && is_array($arguments['affichage_colonne']) === false
1269 && $arguments['affichage_colonne'] != '') {
1270
1271 $query_ct_select .= ', '.$arguments['affichage_colonne'];
1272
1273 }
1274
1275 $query_ct_orderby = '';
1276
1277 // Correspondances SQL des colonnes possibles du widget
1278 $triMap = array(
1279 'dossier' => 'dossier.dossier',
1280 'signataire' => 'signataire_arrete.nom',
1281 'instruction' => 'evenement.libelle',
1282 'date_limite' => 'dossier.date_limite',
1283 'date_envoi_signature' => 'instruction.date_envoi_signature',
1284 'date_retour_signature' => 'instruction.date_retour_signature',
1285 'petitionnaire' => 'demandeur.particulier_nom',
1286 'statut_signature' => 'instruction.statut_signature'
1287 );
1288
1289 // Si l'argument permettant de choisir la colonne sur laquelle faire le tri : 'tri_tab_widget', est renseigné
1290 if ($arguments['tri_tab_widget'] !== null) {
1291 $argumentLocal = $arguments['tri_tab_widget'];
1292 $ordreTri = substr($argumentLocal, 0, 1) === '-' ? 'DESC' : '';
1293 $cleTri = ltrim($argumentLocal, '-');
1294 $champTri = $triMap[$cleTri] ?? '';
1295
1296 $query_ct_orderby = sprintf("ORDER BY %s %s", $champTri, $ordreTri);
1297 }
1298 else {
1299 // On trie sur le champ date_envoi_signature si il existe
1300 if ( is_array($arguments['affichage_colonne'])
1301 && in_array('date_envoi_signature', $arguments['affichage_colonne'])
1302 || $arguments['affichage_colonne'] == 'date_envoi_signature') {
1303
1304 $query_ct_orderby = sprintf("ORDER BY instruction.date_envoi_signature");
1305 } elseif ( is_array($arguments['affichage_colonne'])
1306 && in_array('date_limite', $arguments['affichage_colonne'])
1307 || $arguments['affichage_colonne'] == 'date_limite') {
1308
1309 $query_ct_orderby = sprintf("ORDER BY date_limite");
1310 }
1311
1312 if ( is_array($arguments['affichage_colonne'])
1313 && in_array('date_evenement', $arguments['affichage_colonne'])
1314 || $arguments['affichage_colonne'] == 'date_evenement') {
1315
1316 $query_ct_orderby = sprintf("ORDER BY instruction.date_evenement");
1317 }
1318 }
1319
1320 $query_limit = sprintf(
1321 "LIMIT %s",
1322 $arguments['nb_max_resultat']
1323 );
1324 }
1325
1326 $query_ct_from = sprintf(
1327 '%1$sdossier
1328 INNER JOIN %1$sdossier_instruction_type
1329 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
1330 INNER JOIN %1$sdossier_autorisation_type_detaille
1331 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1332 INNER JOIN %1$sinstruction
1333 ON instruction.dossier = dossier.dossier
1334 AND (instruction.date_envoi_signature is NULL
1335 AND instruction.instruction = (
1336 SELECT
1337 MAX(instruction.instruction)
1338 FROM
1339 %1$sinstruction
1340 WHERE
1341 instruction.dossier = dossier.dossier
1342 ) OR instruction.date_envoi_signature = (
1343 SELECT
1344 MAX(instruction.date_envoi_signature)
1345 FROM
1346 %1$sinstruction
1347 WHERE
1348 instruction.dossier = dossier.dossier
1349 )
1350 )
1351 LEFT JOIN %1$sinstructeur
1352 ON dossier.instructeur=instructeur.instructeur
1353 LEFT JOIN %1$som_utilisateur
1354 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
1355 LEFT JOIN %1$sdivision
1356 ON dossier.division=division.division',
1357 DB_PREFIXE
1358 );
1359
1360 // Filtre sur la collectivité en fonction du niveau
1361 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1362 $query_ct_join_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
1363 ON dossier.om_collectivite=om_collectivite.om_collectivite
1364 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
1365 ";
1366 } else {
1367 $query_ct_join_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
1368 ON dossier.om_collectivite=om_collectivite.om_collectivite
1369 ";
1370 }
1371
1372 // Type d'évènement jointure
1373 $query_ct_from_filtre_evenement_type = '';
1374 // Filtre sur l'évènement
1375 if ((isset($arguments["evenement_type"])
1376 && is_null($arguments["evenement_type"]) === false
1377 && $arguments["evenement_type"] !== "")
1378 || (isset($arguments["evenement_id"])
1379 && is_null($arguments["evenement_id"]) === false
1380 && $arguments["evenement_id"] !== "")
1381 || (isset($arguments["exclure_evenement_id"])
1382 && is_null($arguments["exclure_evenement_id"]) === false
1383 && $arguments["exclure_evenement_id"] !== "")
1384 || (isset($arguments["type_cl"])
1385 && is_null($arguments["type_cl"]) === false
1386 && $arguments["type_cl"] !== "")
1387 || (is_array($arguments['affichage_colonne'])
1388 && in_array('instruction', $arguments['affichage_colonne'])
1389 || $arguments['affichage_colonne'] == 'instruction')) {
1390 //
1391 $query_ct_from_filtre_evenement_type = " INNER JOIN ".DB_PREFIXE."evenement
1392 ON instruction.evenement=evenement.evenement";
1393 }
1394
1395
1396 // Filtre sur les demandeur
1397 $query_ct_from_filtre_petitionnaire = '';
1398 if (is_array($arguments['affichage_colonne'])
1399 && in_array('petitionnaire', $arguments['affichage_colonne'])
1400 || $arguments['affichage_colonne'] == 'petitionnaire') {
1401 //
1402 $query_ct_from_filtre_petitionnaire = " INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur
1403 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
1404 INNER JOIN ".DB_PREFIXE."demandeur
1405 ON lien_dossier_demandeur.demandeur = demandeur.demandeur";
1406 }
1407
1408 // Type d'évènement
1409 $query_ct_where_evenement_type_filter = '';
1410 if (isset($arguments["evenement_type"])
1411 && is_null($arguments["evenement_type"]) === false
1412 && is_array($arguments["evenement_type"])
1413 && count($arguments["evenement_type"]) != 0) {
1414 //
1415 $sql_evenement_type = '(';
1416 //
1417 foreach ($arguments["evenement_type"] as $evenement_type) {
1418 $sql_evenement_type .= " evenement.type = '".$this->f->db->escapesimple(strtolower($evenement_type))."' OR ";
1419 }
1420 $sql_evenement_type = substr($sql_evenement_type, 0, strlen($sql_evenement_type) - 4);
1421 //
1422 $query_ct_where_evenement_type_filter = $sql_evenement_type.') ';
1423 }
1424
1425 // Identifiant d'évènement
1426 $query_ct_where_evenement_id_filter = '';
1427 if (isset($arguments["evenement_id"])
1428 && is_null($arguments["evenement_id"]) === false
1429 && is_array($arguments["evenement_id"])
1430 && count($arguments["evenement_id"]) != 0) {
1431 //
1432 $sql_evenement_id = '(';
1433 //
1434 foreach ($arguments["evenement_id"] as $evenement_id) {
1435 $sql_evenement_id .= " evenement.evenement = '".$this->f->db->escapesimple(strtolower($evenement_id))."' OR ";
1436 }
1437 $sql_evenement_id = substr($sql_evenement_id, 0, strlen($sql_evenement_id) - 4);
1438 //
1439 $query_ct_where_evenement_id_filter = $sql_evenement_id.') ';
1440 }
1441
1442 // Exclusion des identifiants d'évènement
1443 $query_ct_where_exclure_evenement_id_filter = '';
1444 if (isset($arguments["exclure_evenement_id"])
1445 && is_null($arguments["exclure_evenement_id"]) === false
1446 && is_array($arguments["exclure_evenement_id"])
1447 && count($arguments["exclure_evenement_id"]) != 0) {
1448 //
1449 $sql_exclure_evenement_id = '(';
1450 //
1451 foreach ($arguments["exclure_evenement_id"] as $exclure_evenement_id) {
1452 $sql_exclure_evenement_id .= " evenement.evenement != '".$this->f->db->escapesimple(strtolower($exclure_evenement_id))."' AND ";
1453 }
1454 $sql_exclure_evenement_id = substr($sql_exclure_evenement_id, 0, strlen($sql_exclure_evenement_id) - 4);
1455 //
1456 $query_ct_where_exclure_evenement_id_filter = $sql_exclure_evenement_id.') ';
1457 }
1458
1459 // Statut de signature
1460 $query_ct_where_statut_signature_filter = '';
1461 if (isset($arguments["statut_signature"])
1462 && is_null($arguments["statut_signature"]) === false
1463 && is_array($arguments["statut_signature"])
1464 && count($arguments["statut_signature"]) != 0) {
1465 //
1466 $sql_statut_signature = '(';
1467 //
1468 foreach ($arguments["statut_signature"] as $statut) {
1469 $sql_statut_signature .= " instruction.statut_signature = '".$this->f->db->escapesimple(strtolower($statut))."' OR ";
1470 }
1471 $sql_statut_signature = substr($sql_statut_signature, 0, strlen($sql_statut_signature) - 4);
1472 //
1473 $query_ct_where_statut_signature_filter = $sql_statut_signature.') ';
1474 }
1475
1476 // Etat du dossier
1477 $query_ct_where_etat = '';
1478 if (isset($arguments["etat"])
1479 && is_null($arguments["etat"]) === false
1480 && is_array($arguments["etat"])
1481 && count($arguments["etat"]) != 0) {
1482 //
1483 $sql_etat = '(';
1484 //
1485 foreach ($arguments["etat"] as $etat) {
1486 $sql_etat .= " dossier.etat = '".$this->f->db->escapesimple(strtolower($etat))."' OR ";
1487 }
1488 $sql_etat = substr($sql_etat, 0, strlen($sql_etat) - 4);
1489 //
1490 $query_ct_where_etat = $sql_etat.') ';
1491 }
1492
1493 $query_ct_from_filtre_signataire_description = '';
1494 if (isset($arguments["signataire_description"])
1495 && is_null($arguments["signataire_description"]) === false
1496 && $arguments["signataire_description"] !== ""
1497 || (is_array($arguments['affichage_colonne'])
1498 && in_array('signataire', $arguments['affichage_colonne'])
1499 || $arguments['affichage_colonne'] == 'signataire')) {
1500 //
1501 $query_ct_from_filtre_signataire_description = " INNER JOIN ".DB_PREFIXE."signataire_arrete
1502 ON instruction.signataire_arrete=signataire_arrete.signataire_arrete";
1503 }
1504
1505 $query_ct_from_filtre_statut_dossier = '';
1506 if (isset($arguments["statut_dossier"])
1507 && is_null($arguments["statut_dossier"]) === false
1508 && $arguments["statut_dossier"] !== "") {
1509 //
1510 $query_ct_from_filtre_statut_dossier = " LEFT JOIN ".DB_PREFIXE."etat
1511 ON dossier.etat = etat.etat";
1512 }
1513
1514 $query_ct_where_statut_dossier_filter = '';
1515 if (isset($arguments["statut_dossier"])
1516 && is_null($arguments["statut_dossier"]) === false
1517 && ($arguments["statut_dossier"] == "encours" || $arguments["statut_dossier"] == "cloture")) {
1518 //
1519 $query_ct_where_statut_dossier_filter = " etat.statut = '".$this->f->db->escapesimple($arguments["statut_dossier"])."'";
1520 }
1521
1522 // Signataire description
1523 $query_ct_where_signataire_description_filter = '';
1524 if (isset($arguments["signataire_description"])
1525 && is_null($arguments["signataire_description"]) === false
1526 && is_array($arguments["signataire_description"])
1527 && count($arguments["signataire_description"]) != 0) {
1528 //
1529 $sql_signataire_description = '(';
1530 //
1531 foreach ($arguments["signataire_description"] as $signataire_description) {
1532 $sql_signataire_description .= " signataire_arrete.description = '".$this->f->db->escapesimple($signataire_description)."' OR ";
1533 }
1534 $sql_signataire_description = substr($sql_signataire_description, 0, strlen($sql_signataire_description) - 4);
1535 //
1536 $query_ct_where_signataire_description_filter = $sql_signataire_description.') ';
1537 }
1538
1539 // Nombre de jour date limite
1540 $query_ct_where_nb_jours_date_limite = '';
1541 if (isset($arguments["nb_jours_avant_date_limite"])
1542 && is_null($arguments["nb_jours_avant_date_limite"]) === false
1543 && $arguments["nb_jours_avant_date_limite"] > 0) {
1544
1545 $query_ct_where_nb_jours_date_limite = sprintf(
1546 "(dossier.incomplet_notifie IS FALSE
1547 AND date_limite >= CURRENT_DATE AND date_limite <= CURRENT_DATE + %s * interval '1 day') ",
1548 $this->f->db->escapesimple(strtolower($arguments['nb_jours_avant_date_limite']))
1549 );
1550 }
1551
1552 // Nombre de mois date limite
1553 $query_ct_where_nb_mois_date_limite = '';
1554 if (isset($arguments["nb_mois_avant_date_limite"])
1555 && is_null($arguments["nb_mois_avant_date_limite"]) === false
1556 && $arguments["nb_mois_avant_date_limite"] > 0) {
1557
1558 $query_ct_where_nb_mois_date_limite = sprintf(
1559 "(dossier.incomplet_notifie IS FALSE
1560 AND date_limite >= CURRENT_DATE AND date_limite <= CURRENT_DATE + %s * interval '1 months') ",
1561 $this->f->db->escapesimple(strtolower($arguments['nb_mois_avant_date_limite']))
1562 );
1563 }
1564
1565 // Nombre de jour max apres date d'évènement
1566 $query_ct_where_nb_jours_max_apres_date_evenement = '';
1567 if (isset($arguments["nb_jours_max_apres_date_evenement"])
1568 && is_null($arguments["nb_jours_max_apres_date_evenement"]) === false
1569 && $arguments["nb_jours_max_apres_date_evenement"] > 0) {
1570
1571 $query_ct_where_nb_jours_max_apres_date_evenement = sprintf(
1572 "CURRENT_DATE <= date_evenement + %s * interval '1 day' ",
1573 $this->f->db->escapesimple(strtolower($arguments['nb_jours_max_apres_date_evenement']))
1574 );
1575 }
1576
1577 // Nombre de mois max apres date d'évènement
1578 $query_ct_where_nb_mois_max_apres_date_evenement = '';
1579 if (isset($arguments["nb_mois_max_apres_date_evenement"])
1580 && is_null($arguments["nb_mois_max_apres_date_evenement"]) === false
1581 && $arguments["nb_mois_max_apres_date_evenement"] > 0) {
1582
1583 $query_ct_where_nb_mois_max_apres_date_evenement = sprintf(
1584 "CURRENT_DATE <= date_evenement + %s * interval '1 months' ",
1585 $this->f->db->escapesimple(strtolower($arguments['nb_mois_max_apres_date_evenement']))
1586 );
1587 }
1588
1589 // Envoyée au CL
1590 $query_ct_where_envoi_cl = '';
1591 if (!empty($arguments["envoi_cl"])){
1592 if (strtolower($arguments["envoi_cl"]) === 'true'){
1593 $query_ct_where_envoi_cl = "(instruction.envoye_cl_platau IS TRUE OR instruction.date_envoi_controle_legalite IS NOT NULL) ";
1594 }
1595 if (strtolower($arguments["envoi_cl"]) === 'false'){
1596 $query_ct_where_envoi_cl = "(instruction.envoye_cl_platau IS FALSE AND instruction.date_envoi_controle_legalite IS NULL) ";
1597 }
1598 }
1599
1600 // Type de contrôle de légalité
1601 $query_ct_where_type_cl = '';
1602 if (isset($arguments["type_cl"])
1603 && is_null($arguments["type_cl"]) === false
1604 && $arguments["type_cl"] == "Plat'AU") {
1605
1606 $query_ct_where_type_cl = "(instruction.envoye_cl_platau IS TRUE) ";
1607 } elseif (isset($arguments["type_cl"])
1608 && is_null($arguments["type_cl"]) === false
1609 && $arguments["type_cl"] == "Papier") {
1610 $query_ct_where_type_cl = "(instruction.envoye_cl_platau IS FALSE AND instruction.date_envoi_controle_legalite IS NOT NULL) ";
1611 }
1612
1613 // Instruction notifiée
1614 $query_ct_where_instruction_notifiee = '';
1615 if (isset($arguments["instruction_notifiee"])
1616 && is_null($arguments["instruction_notifiee"]) === false
1617 && $arguments["instruction_notifiee"] !== '') {
1618
1619 if ($arguments["instruction_notifiee"] === 'true') {
1620 $query_ct_where_instruction_notifiee = "instruction.date_retour_rar IS NOT NULL";
1621 } else {
1622 $query_ct_where_instruction_notifiee = "instruction.date_retour_rar IS NULL";
1623 }
1624 }
1625
1626 // Instruction finalisée
1627 $query_ct_where_instruction_finalisee = '';
1628 if (isset($arguments["instruction_finalisee"])
1629 && is_null($arguments["instruction_finalisee"]) === false
1630 && $arguments["instruction_finalisee"] !== '') {
1631
1632 $query_ct_where_instruction_finalisee = sprintf(
1633 "instruction.om_final_instruction IS %s",
1634 $this->f->db->escapesimple(strtolower($arguments['instruction_finalisee']))
1635 );
1636 }
1637
1638 // Code datd
1639 $query_ct_where_codes_datd_filter = '';
1640 if (isset($arguments["codes_datd"])
1641 && is_null($arguments["codes_datd"]) === false
1642 && is_array($arguments["codes_datd"])
1643 && count($arguments["codes_datd"]) != 0) {
1644 //
1645 $sql_codes_datd = '(';
1646 //
1647 foreach ($arguments["codes_datd"] as $codes_datd) {
1648 $sql_codes_datd .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($codes_datd))."' OR ";
1649 }
1650 $sql_codes_datd = substr($sql_codes_datd, 0, strlen($sql_codes_datd) - 4);
1651 //
1652 $query_ct_where_codes_datd_filter = $sql_codes_datd.') ';
1653 }
1654
1655 $query_ct_select_champaffiche = array(
1656 'dossier.dossier as "'.__("dossier").'"',
1657 $select__dossier_libelle__column_as,
1658 'to_char(instruction.date_envoi_signature ,\'DD/MM/YYYY\') as "'.__("date_envoi_signature").'"'
1659 );
1660
1661 $message_help = "";
1662 // Récupération du message d'aide
1663 if (isset($arguments["message_help"])
1664 && ! is_null($arguments["message_help"])
1665 && $arguments["message_help"] !== "") {
1666
1667 $message_help = $arguments["message_help"];
1668 }
1669
1670 // Filtrage sur l'instructeur ou la division
1671 $query_ct_where_filtre = $query_ct_from_filtre_evenement_type.
1672 $query_ct_from_filtre_signataire_description.
1673 $query_ct_from_filtre_petitionnaire.
1674 $query_ct_from_filtre_statut_dossier;
1675
1676 // Construction du FROM
1677 $query_ct_from = $query_ct_from.
1678 $query_ct_join_collectivite_filter.
1679 $query_ct_where_filtre;
1680
1681 $tab_criteres = array(
1682 'statut_signature' => $query_ct_where_statut_signature_filter,
1683 'etat' => $query_ct_where_etat,
1684 'evenement_type' => $query_ct_where_evenement_type_filter,
1685 'evenement_id' => $query_ct_where_evenement_id_filter,
1686 'nb_jours_avant_date_limite' => $query_ct_where_nb_jours_date_limite,
1687 'nb_jours_max_apres_date_evenement' => $query_ct_where_nb_jours_max_apres_date_evenement,
1688 'envoi_cl' => $query_ct_where_envoi_cl,
1689 'type_cl' => $query_ct_where_type_cl,
1690 'signataire_description' => $query_ct_where_signataire_description_filter,
1691 'instruction_notifiee' => $query_ct_where_instruction_notifiee,
1692 'instruction_finalisee' => $query_ct_where_instruction_finalisee,
1693 'codes_datd' => $query_ct_where_codes_datd_filter,
1694 'nb_mois_avant_date_limite' => $query_ct_where_nb_mois_date_limite,
1695 'nb_mois_max_apres_date_evenement' => $query_ct_where_nb_mois_max_apres_date_evenement,
1696 'exclure_evenement_id' => $query_ct_where_exclure_evenement_id_filter,
1697 'statut_dossier' => $query_ct_where_statut_dossier_filter,
1698 );
1699
1700 $query_ct_where_combi = '';
1701 if (isset($arguments["combinaison_criteres"])
1702 && is_null($arguments["combinaison_criteres"]) === false
1703 && is_array($arguments["combinaison_criteres"])
1704 && count($arguments["combinaison_criteres"]) != 0) {
1705 //
1706 $sql_where_combi = '(';
1707 //
1708 foreach ($arguments["combinaison_criteres"] as $critere) {
1709 $sql_where_combi .= $tab_criteres[$critere].' OR ';
1710 unset($tab_criteres[$critere]);
1711 }
1712 $sql_where_combi = substr($sql_where_combi, 0, strlen($sql_where_combi) - 4);
1713 //
1714 $query_ct_where_combi = $sql_where_combi.') ';
1715 }
1716
1717 // Construction du WHERE
1718 $sql_ct_where = ' dossier_instruction_type.sous_dossier IS NOT TRUE AND ';
1719 foreach ($tab_criteres as $condition) {
1720 if ($condition !== '') {
1721 $sql_ct_where .= $condition.' AND ';
1722 }
1723 }
1724 $query_ct_where = substr($sql_ct_where, 0, strlen($sql_ct_where) - 5);
1725
1726 if ($query_ct_where_combi != '') {
1727 if ($query_ct_where != '') {
1728 $query_ct_where .= ' AND ';
1729 }
1730 $query_ct_where .= $query_ct_where_combi;
1731 }
1732
1733 // Génération du widget recherche id
1734 if (isset($arguments['statut_signature']) && $arguments['statut_signature'] != null) {
1735 $arguments['statut_signature'] = implode(';', $arguments['statut_signature']);
1736 }
1737 if (isset($arguments['affichage_colonne']) && $arguments['affichage_colonne'] != null && is_array($arguments['affichage_colonne'])) {
1738 $arguments['affichage_colonne'] = implode(';', $arguments['affichage_colonne']);
1739 }
1740 if (isset($arguments['evenement_type']) && $arguments['evenement_type'] != null && is_array($arguments['evenement_type'])) {
1741 $arguments['evenement_type'] = implode(';', $arguments['evenement_type']);
1742 }
1743 if (isset($arguments['evenement_id']) && $arguments['evenement_id'] != null && is_array($arguments['evenement_id'])) {
1744 $arguments['evenement_id'] = implode(';', $arguments['evenement_id']);
1745 }
1746 if (isset($arguments['exclure_evenement_id']) && $arguments['exclure_evenement_id'] != null && is_array($arguments['exclure_evenement_id'])) {
1747 $arguments['exclure_evenement_id'] = implode(';', $arguments['exclure_evenement_id']);
1748 }
1749 if (isset($arguments['etat']) && $arguments['etat'] != null && is_array($arguments['etat'])) {
1750 $arguments['etat'] = implode(';', $arguments['etat']);
1751 }
1752 if (isset($arguments['signataire_description']) && $arguments['signataire_description'] != null && is_array($arguments['signataire_description'])) {
1753 $arguments['signataire_description'] = implode(';', $arguments['signataire_description']);
1754 }
1755 if (isset($arguments['codes_datd']) && $arguments['codes_datd'] != null && is_array($arguments['codes_datd'])) {
1756 $arguments['codes_datd'] = implode(';', $arguments['codes_datd']);
1757 }
1758 if (isset($arguments['combinaison_criteres']) && $arguments['combinaison_criteres'] != null && is_array($arguments['combinaison_criteres'])) {
1759 $arguments['combinaison_criteres'] = implode('|', $arguments['combinaison_criteres']);
1760 }
1761 $widget_recherche_id= str_replace(array('.',','), '', microtime(true));
1762 $_SESSION['widget_recherche_id'][$widget_recherche_id] = serialize($arguments);
1763
1764 return array(
1765 "arguments" => $arguments,
1766 "message_help" => $message_help,
1767 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
1768 "query_ct_select" => $query_ct_select,
1769 "query_ct_from" => $query_ct_from,
1770 "query_ct_where" => $query_ct_where,
1771 "query_ct_orderby" => $query_ct_orderby,
1772 "query_ct_limit" => $query_limit,
1773 "widget_recherche_id" => $widget_recherche_id
1774 );
1775 }
1776
1777
1778
1779 /**
1780 * WIDGET DASHBOARD - widget_recherche_dossier_par_type.
1781 *
1782 * Le widget de recherche accès direct par type est similaire au widget de recherche
1783 * accès direct classique. Il permet en plus de choisir la portée de la recherche par
1784 * le biais d'un select : ADS ou RE* ou IN.
1785 * Selon le type de dossier choisi, lors de la recherche la redirection se fera vers
1786 * le menu Instruction ou Contentieux.
1787 *
1788 * @return void
1789 */
1790 function view_widget_recherche_dossier_par_type($content = null) {
1791
1792 /**
1793 * Traitement de la validation du formulaire
1794 */
1795 if ($this->f->get_submitted_post_value("validation") != null
1796 && $this->f->get_submitted_post_value("dossier") !== null
1797 && $this->f->get_submitted_post_value("dossier") == '') {
1798
1799 // AUCUNE VALEUR SAISIE
1800 // Affiche un message d'erreur
1801 $erreur = __("Veuillez saisir un No de dossier.");
1802 }
1803 //
1804 if ($this->f->get_submitted_post_value("validation") != null
1805 && $this->f->get_submitted_post_value("dossier") !== null
1806 && $this->f->get_submitted_post_value("dossier") != '') {
1807 //
1808 $list_dossiers = $this->execute_recherche_dossier("type");
1809 $posted_type_dossier = $this->f->get_submitted_post_value("type_dossier_recherche");
1810 // Définition des objets sur lesquels la redirection se fera
1811 if ($posted_type_dossier === "ADS") {
1812 $obj = "dossier_instruction";
1813 }
1814 if ($posted_type_dossier === "RE*") {
1815 $obj = "dossier_contentieux_tous_recours";
1816 }
1817 if ($posted_type_dossier === "IN") {
1818 $obj = "dossier_contentieux_toutes_infractions";
1819 }
1820 $total_dossiers = count($list_dossiers);
1821 // Si on obtient un seul résultat
1822 if ($total_dossiers == 1) {
1823 // On reformate le dossier
1824 $dossier = strtoupper(str_replace(' ', '', $list_dossiers[0]));
1825 // On redirige vers le listing des DI
1826 echo '
1827 <script type="text/javascript" >
1828 widget_recherche_dossier(\'' . $dossier . '\', 1, \'' . $obj . '\');
1829 </script>
1830 ';
1831 // On arrête l'exécution du script car l'utilisateur a été
1832 // redirigé vers un autre script
1833 exit();
1834 }
1835 // Si on obtient plusieurs résultats
1836 if ($total_dossiers > 1) {
1837 // Mémorisation de la recherche
1838 $search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier"));
1839 // Ajout d'une étoile au début s'il n'y en n'a pas.
1840 // Par defaut * est toujours ajouté à la fin des recherches.
1841 if (substr($search, 0, 1) != '*') {
1842 $search = '*'.$search;
1843 }
1844 // On redirige vers le listing des DI
1845 //
1846 echo '
1847 <script type="text/javascript" >
1848 widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.', \'' . $obj . '\');
1849 </script>
1850 ';
1851 // On arrête l'exécution du script car l'utilisateur a été
1852 // redirigé vers un autre script
1853 exit();
1854 }
1855 // Si aucun dossier trouve
1856 // Affiche un message d'erreur
1857 $erreur = __("Aucun dossier trouvé.");
1858 }
1859
1860 /**
1861 * Affichage du widget
1862 */
1863 // Liste des paramètres
1864 $params = array("type_defaut", );
1865 // Initialisation du tableau des paramètres avec ses valeur par défaut
1866 $arguments_default = array(
1867 "type_defaut" => "ADS",
1868 );
1869 $arguments = $this->get_arguments($content, $params);
1870
1871 // Vérification des arguments
1872 foreach ($arguments_default as $key => $value) {
1873 //
1874 if (isset($arguments[$key])) {
1875 //
1876 $elem = trim($arguments[$key]);
1877 //
1878 if ($key === "type_defaut"
1879 && in_array($elem, array("ADS", "RE*", "IN"))) {
1880 // La valeur doit être dans cette liste
1881 $arguments[$key] = $elem;
1882 continue;
1883 }
1884 }
1885 //
1886 $arguments[$key] = $value;
1887 }
1888 //
1889 $type_defaut = $arguments["type_defaut"];
1890
1891 // Affichage du message d'informations
1892 printf(
1893 '<div class="widget-help"><span class="info-16" title="%s"></span></div>',
1894 __("Permet la recherche directe de dossiers d'instruction, avec choix de la portée de la recherche : ADS ou RE* ou IN.\n".
1895 "La sélection de la famille de dossier filtre les résultats et conditionne la redirection de l'utilisateur :\n".
1896 "- ADS : Instruction > Dossiers d'instruction > Recherche\n".
1897 "- RE* : Contentieux > Recours > Tous les Recours \n".
1898 "- IN : Contentieux > Infractions > Toutes les Infractions\n\n".
1899 "Deux modes de saisie sont possibles :\n".
1900 "- 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".
1901 "- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.")
1902 );
1903 // Ouverture du form
1904 echo "\t<form method=\"post\" id=\"widget_recherche_dossier_par_type_form\" action=\"".OM_ROUTE_DASHBOARD."\">\n";
1905 // Affichage d'un éventuel message d'erreur
1906 if (isset($erreur) && $erreur != "") {
1907 $class = "error";
1908 $this->f->displayMessage($class, $erreur);
1909 }
1910 // Configuration du formulaire de recherche
1911 $champs = array("dossier", "type_dossier_recherche");
1912 $form = $this->f->get_inst__om_formulaire(array(
1913 "validation" => 0,
1914 "maj" => 0,
1915 "champs" => $champs,
1916 ));
1917 $form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>');
1918 $form->setType("dossier", "text");
1919 $form->setTaille("dossier", 20);
1920 $form->setMax("dossier", 250);
1921
1922 // Définition des types de dossiers visibles dans le select
1923 $options[0] = array("ADS",
1924 "RE*",
1925 "IN");
1926 $options[1] = array(
1927 __("ADS"),
1928 __("RE*"),
1929 __("IN"));
1930
1931 $form->setType("type_dossier_recherche", "select");
1932 $form->setLib("om_profil", __("Tableau de bord pour le profil"));
1933 $form->setSelect('type_dossier_recherche', $options);
1934 $form->setVal('type_dossier_recherche', $type_defaut);
1935 $form->setLib('type_dossier_recherche', 'Type de dossier');
1936
1937 // Affichage du formulaire
1938 $form->entete();
1939 $form->afficher($champs, 0, false, false);
1940 $form->enpied();
1941 // Affichage des contrôles du formulaire
1942 echo "\t<div class=\"formControls\">\n";
1943 echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\"
1944 value=\"".__("Valider")."\" name=\"validation\" />\n";
1945 echo "\t</div>\n";
1946 // Fermeture du form
1947 echo "\t</form>\n";
1948 }
1949
1950
1951 /**
1952 * Méthode générique exécutant une recherche par numéro de dossier dans 2 contextes
1953 * différents :
1954 * - le widget de recherche classique
1955 * - le widget de recherche avec choix du type/groupe de dossier
1956 *
1957 * @param string $filtre Indique si un filtre supplémentaire doit être appliqué à la
1958 * recherche de dossier. Seule valeur possible : "type".
1959 *
1960 * @return string $error_message Le message d'erreur s'il y en a un, sinon chaîne vide
1961 */
1962 protected function execute_recherche_dossier($filtre = null) {
1963
1964 // Traitement des valeurs postées
1965 $posted_dossiers = $this->f->db->escapesimple(strtolower(str_replace("*", "%", $this->f->get_submitted_post_value("dossier"))));
1966 $posted_dossiers = str_replace(';', ',', $posted_dossiers);
1967
1968 //
1969 // UNE VALEUR SAISIE
1970 //
1971
1972 // WHERE - Filtre Collectivité
1973 $query_ct_where_collectivite = "";
1974 // Si collectivité utilisateur mono alors filtre sur celle-ci
1975 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
1976 //
1977 $query_ct_where_collectivite = " AND dossier.om_collectivite=".$_SESSION['collectivite'];
1978 }
1979
1980 // WHERE - Filtre par groupe
1981 $query_ct_where_groupe = "";
1982 $query_ct_where_type_da = "";
1983 $query_ct_from = "";
1984 $query_ct_where_common = "";
1985 $posted_type_dossier = $this->f->get_submitted_post_value("type_dossier_recherche");
1986 // La variable $posted_type_dossier vaut null si on est dans le contexte du widget
1987 // de recherche de dossier classique (sans choix du type)
1988 if ($posted_type_dossier === null || $posted_type_dossier === "ADS") {
1989 $query_ct_from = "
1990 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
1991 ON dossier.dossier_autorisation =
1992 dossier_autorisation.dossier_autorisation
1993 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
1994 ON dossier_autorisation.dossier_autorisation_type_detaille =
1995 dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
1996 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
1997 ON dossier_autorisation_type_detaille.dossier_autorisation_type =
1998 dossier_autorisation_type.dossier_autorisation_type
1999 LEFT JOIN ".DB_PREFIXE."groupe
2000 ON dossier_autorisation_type.groupe = groupe.groupe";
2001 //
2002 $query_ct_where_groupe = "
2003 AND groupe.code != 'CTX'
2004 ";
2005 }
2006 if ($posted_type_dossier === "RE*" || $posted_type_dossier === "IN") {
2007 $query_ct_from = "
2008 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2009 ON dossier.dossier_autorisation =
2010 dossier_autorisation.dossier_autorisation
2011 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
2012 ON dossier_autorisation.dossier_autorisation_type_detaille =
2013 dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2014 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
2015 ON dossier_autorisation_type_detaille.dossier_autorisation_type =
2016 dossier_autorisation_type.dossier_autorisation_type
2017 ";
2018 if ($posted_type_dossier === "RE*") {
2019 $posted_type_dossier = "RE";
2020 }
2021 $query_ct_where_type_da = "
2022 AND dossier_autorisation_type.code = '". $posted_type_dossier . "'
2023 ";
2024 }
2025
2026 // Gestion des groupes et confidentialité
2027 include('../sql/pgsql/filter_group_widgets.inc.php');
2028
2029 // Construction de la requête
2030 // Pour chaque dossier on cherche sur les deux champs du code du
2031 // dossier (un avec et un sans espaces)
2032 $posted_dossiers = explode(',', $posted_dossiers);
2033 $liste_dossiers = array();
2034 foreach ($posted_dossiers as $posted_dossier) {
2035 $sql = "
2036 SELECT
2037 dossier
2038 FROM
2039 " . DB_PREFIXE . "dossier
2040 " . $query_ct_from . "
2041 WHERE
2042 (LOWER(dossier.dossier) LIKE '%".$posted_dossier."%'
2043 OR LOWER(dossier.dossier_libelle) LIKE '%".$posted_dossier."%' )
2044 ";
2045 $sql .= $query_ct_where_collectivite . $query_ct_where_type_da . $query_ct_where_groupe;
2046 // Exécution de la requête
2047 $qres = $this->f->get_all_results_from_db_query(
2048 $sql,
2049 array(
2050 'origin' => __METHOD__
2051 )
2052 );
2053 // On récupère les numéros de dossier dans les résultats
2054 foreach ($qres['result'] as $row) {
2055 $liste_dossiers[] = $row['dossier'];
2056 }
2057 }
2058
2059 return $liste_dossiers;
2060 }
2061
2062
2063 /**
2064 * Cette méthode permet de récupérer la configuration du widget 'Dossiers
2065 * limites'.
2066 *
2067 * @return array
2068 */
2069 function get_config_dossiers_limites($arguments) {
2070 include "../sql/pgsql/app_om_tab_common_select.inc.php";
2071 // Initialisation du tableau des paramètres avec ses valeur par défaut
2072 $arguments_default = array(
2073 "nombre_de_jours" => 15,
2074 "codes_datd" => null,
2075 "filtre" => "instructeur",
2076 "restreindre_aux_tacites" => null,
2077 "affichage" => "liste"
2078 );
2079 // Vérification des arguments
2080 foreach ($arguments_default as $key => $value) {
2081 //
2082 if (isset($arguments[$key])) {
2083 //
2084 $elem = trim($arguments[$key]);
2085 //
2086 if ($key === "nombre_de_jours"
2087 && intval($elem) > 0) {
2088 // Ce doit être un entier
2089 $arguments[$key] = intval($elem);
2090 continue;
2091 } elseif ($key === "codes_datd"
2092 && $elem != "") {
2093 // Ce doit être un tableau
2094 $arguments[$key] = explode(";", $elem);
2095 continue;
2096 } elseif ($key === "filtre"
2097 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
2098 // La valeur doit être dans cette liste
2099 $arguments[$key] = $elem;
2100 continue;
2101 } elseif ($key === "restreindre_aux_tacites"
2102 && in_array($elem, array("true", "false"))) {
2103 // La valeur doit être dans cette liste
2104 $arguments[$key] = $elem;
2105 continue;
2106 } elseif ($key === "affichage"
2107 && in_array($elem, array('liste', 'nombre'))) {
2108 // La valeur doit être dans cette liste
2109 $arguments[$key] = $elem;
2110 continue;
2111 }
2112 }
2113 //
2114 $arguments[$key] = $value;
2115 }
2116 //
2117 $nombre_de_jours = $arguments["nombre_de_jours"];
2118 $codes_datd = $arguments["codes_datd"];
2119 $filtre = $arguments["filtre"];
2120 $restreindre_aux_tacites = $arguments["restreindre_aux_tacites"];
2121
2122 /**
2123 * Construction de la requête
2124 */
2125 // SELECT
2126 $query_ct_select = "
2127 dossier.dossier,
2128 $select__dossier_libelle__column as dossier_libelle,
2129 dossier.date_limite,
2130 dossier.date_limite_incompletude,
2131 CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
2132 dossier.date_limite_incompletude ELSE
2133 dossier.date_limite END as date_limite_na,
2134 COALESCE(
2135 demandeur.particulier_nom,
2136 demandeur.personne_morale_denomination
2137 ) AS nom_petitionnaire,
2138 $select_enjeux_dossier,
2139 etat.libelle as etat";
2140
2141 // SELECT - CHAMPAFFICHE
2142 $query_ct_select_champaffiche = array_merge(
2143 $array_base_ct_select_champaffiche,
2144 array(
2145 'COALESCE(
2146 demandeur.particulier_nom,
2147 demandeur.personne_morale_denomination
2148 ) AS "'.__("nom_petitionnaire").'"',
2149 'CASE
2150 WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE
2151 THEN to_char(dossier.date_limite_incompletude, \'DD/MM/YYYY\')
2152 ELSE
2153 to_char(dossier.date_limite, \'DD/MM/YYYY\')
2154 END as "'.__("date_limite").'"',
2155 $select_enjeux_dossier,
2156 'etat.libelle as "'.__("etat").'"',
2157 // XXX Attention cette colonne est cachée en css est doit donc rester la dernière du tableau
2158 'CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN
2159 dossier.date_limite_incompletude ELSE
2160 dossier.date_limite END as date_limite_na',
2161 ));
2162 // FROM
2163 $query_ct_from = "
2164 ".DB_PREFIXE."dossier
2165 LEFT JOIN ".DB_PREFIXE."etat
2166 ON dossier.etat = etat.etat
2167 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
2168 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
2169 LEFT JOIN ".DB_PREFIXE."demandeur
2170 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
2171 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2172 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2173 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
2174 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2175 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
2176 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
2177 LEFT JOIN (".DB_PREFIXE."demande
2178 JOIN ".DB_PREFIXE."demande_type
2179 ON demande.demande_type = demande_type.demande_type
2180 )
2181 ON demande.dossier_instruction = dossier.dossier
2182 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
2183 LEFT JOIN ".DB_PREFIXE."instructeur
2184 ON dossier.instructeur=instructeur.instructeur
2185 LEFT JOIN ".DB_PREFIXE."om_utilisateur
2186 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
2187 LEFT JOIN ".DB_PREFIXE."division
2188 ON dossier.division=division.division
2189 %s
2190 ";
2191
2192
2193 $query_ct_where_collectivite_filter = "";
2194 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
2195 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
2196 // collectivité
2197 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2198 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
2199 ON dossier.om_collectivite=om_collectivite.om_collectivite
2200 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
2201 ";
2202 } else {
2203 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
2204 ON dossier.om_collectivite=om_collectivite.om_collectivite
2205 ";
2206 }
2207
2208 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
2209 // WHERE - COMMON
2210 $query_ct_where_common = "
2211 groupe.code != 'CTX'
2212 AND
2213 (
2214 (
2215 dossier.incomplet_notifie IS FALSE
2216 AND date_limite >= CURRENT_DATE AND date_limite <= CURRENT_DATE + ".$nombre_de_jours." * interval '1 day'
2217 )
2218 OR
2219 (
2220 dossier.incomplet_notifie IS TRUE
2221 AND dossier.incompletude IS TRUE
2222 AND date_limite_incompletude >= CURRENT_DATE AND date_limite_incompletude <= CURRENT_DATE + ".$nombre_de_jours." * interval '1 day'
2223 )
2224 )
2225 AND etat.statut != 'cloture'
2226 AND dossier.avis_decision IS NULL
2227 ";
2228 // WHERE - TACITE
2229 // Filtre sur le caractère tacite
2230 $query_ct_where_tacite_filter = '';
2231 if (is_null($restreindre_aux_tacites) === false
2232 && $restreindre_aux_tacites === 'true') {
2233 //
2234 //
2235 $query_ct_where_tacite_filter = " AND LOWER(dossier.accord_tacite) = 'oui' ";
2236 }
2237 // WHERE - DATD
2238 // Filtre sur le type détaillé des dossiers
2239 $query_ct_where_datd_filter = "";
2240 if (!is_null($codes_datd)
2241 && is_array($codes_datd)
2242 && count($codes_datd) != 0) {
2243 //
2244 $sql_codes = "";
2245 //
2246 foreach ($codes_datd as $code) {
2247 $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
2248 }
2249 $sql_codes = substr($sql_codes, 0, strlen($sql_codes) - 4);
2250 //
2251 $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
2252 }
2253 // ORDER BY
2254 $query_ct_orderby = "
2255 date_limite_na
2256 ";
2257
2258 $query_ct_where_groupe = "";
2259 // Gestion des groupes et confidentialité
2260 include('../sql/pgsql/filter_group_widgets.inc.php');
2261
2262 /**
2263 * Message d'aide
2264 */
2265 //
2266 $message_restreindre_aux_tacites = '';
2267 //
2268 if (is_null($restreindre_aux_tacites) === false
2269 && $restreindre_aux_tacites === 'true') {
2270 //
2271 $message_restreindre_aux_tacites = " ".__("avec tacite automatique");
2272 }
2273 //
2274 $message_filtre = "";
2275 //
2276 switch($filtre) {
2277 case "instructeur" :
2278 $message_filtre = " ".__("(filtrés par instructeur)");
2279 break;
2280 case "instructeur_secondaire" :
2281 $message_filtre = " ".__("(filtrés par instructeur secondaire)");
2282 break;
2283 case "division" :
2284 $message_filtre = " ".__("(filtrés par division)");
2285 break;
2286 }
2287 //
2288 $message_help = sprintf(
2289 __("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."),
2290 (is_null($codes_datd) ? "": " (".implode(";",$codes_datd).")"),
2291 $message_restreindre_aux_tacites,
2292 $nombre_de_jours,
2293 $message_filtre
2294 );
2295
2296 /**
2297 * Return
2298 */
2299 //
2300 return array(
2301 "arguments" => $arguments,
2302 "message_help" => $message_help,
2303 "query_ct_select" => $query_ct_select,
2304 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
2305 "query_ct_from" => $query_ct_from,
2306 "query_ct_where_common" => $query_ct_where_common,
2307 "query_ct_where_tacite_filter" => $query_ct_where_tacite_filter,
2308 "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
2309 "query_ct_where_groupe" => $query_ct_where_groupe,
2310 "query_ct_orderby" => $query_ct_orderby,
2311 );
2312 }
2313
2314 /**
2315 * WIDGET DASHBOARD - Dossiers limites
2316 *
2317 * @return void
2318 */
2319 function view_widget_dossiers_limites($content = null) {
2320
2321 /**
2322 * Ce widget est configurable via l'interface Web. Lors de la création
2323 * du widget dans le paramétrage il est possible de spécifier la ou les
2324 * options suivantes :
2325 *
2326 * - nombre_de_jours : c'est le délai en jours avant la date limite à
2327 * partir duquel on souhaite voir apparaître les dossiers dans le
2328 * widget.
2329 * (default) Par défaut la valeur est 15 jours.
2330 *
2331 * - codes_datd : la liste des types de dossiers à afficher. exemple :
2332 * "PCI;PCA;DPS;CUa;CUb".
2333 * (default) Par défaut tous les types sont affichés. [null]
2334 *
2335 * - filtre :
2336 * = instructeur
2337 * = division
2338 * = aucun
2339 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
2340 *
2341 * - restreindre_aux_tacites : permet d'afficher seulement les dossiers
2342 * d'instruction dont le caractère tacite est actif.
2343 */
2344 // Liste des paramètres
2345 $params = array("nombre_de_jours", "codes_datd", "filtre", "restreindre_aux_tacites", "affichage");
2346 // Formatage des arguments reçus en paramètres
2347 $arguments = $this->get_arguments($content, $params);
2348 // Récupération de la configuration du widget
2349 $conf = $this->get_config_dossiers_limites($arguments);
2350 //
2351 $nombre_de_jours = $conf["arguments"]["nombre_de_jours"];
2352 $codes_datd = $conf["arguments"]["codes_datd"];
2353 $filtre = $conf["arguments"]["filtre"];
2354 $restreindre_aux_tacites = $conf['arguments']['restreindre_aux_tacites'];
2355
2356 /**
2357 * Composition de la requête
2358 */
2359 // Gestion de la requête selon le tye d'affichage
2360 $query_ct_orderby = sprintf(
2361 "ORDER BY
2362 %s
2363 LIMIT 10",
2364 $conf["query_ct_orderby"]
2365 );
2366 $query_ct_select = $conf["query_ct_select"];
2367 if ($conf["arguments"]["affichage"] === "nombre") {
2368 $query_ct_orderby = "";
2369 $query_ct_select = "COUNT(*)";
2370 }
2371
2372 $query = sprintf(
2373 "SELECT
2374 %s
2375 FROM
2376 %s
2377 %s
2378 WHERE
2379 %s
2380 %s
2381 %s
2382 %s
2383 %s
2384 %s",
2385 $query_ct_select,
2386 $conf["query_ct_from"],
2387 '%s', // emplacement pour les jointure du filtre
2388 $conf["query_ct_where_common"],
2389 $conf["query_ct_where_tacite_filter"],
2390 $conf["query_ct_where_datd_filter"],
2391 $conf["query_ct_where_groupe"],
2392 '%s', // emplacement pour les conditions du filtre
2393 $query_ct_orderby
2394 );
2395 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
2396 $sqlFilter = $this->get_query_filter(
2397 $query,
2398 $conf['arguments']['filtre']
2399 );
2400 $query = sprintf(
2401 $query,
2402 $sqlFilter["FROM"],
2403 $sqlFilter["WHERE"]
2404 );
2405
2406 /**
2407 * Templates nécessaires à l'affichage du widget
2408 */
2409 if ($conf["arguments"]["affichage"] === "nombre") {
2410 // Execution de la requête
2411 $qres = $this->f->get_one_result_from_db_query(
2412 $query,
2413 array(
2414 "origin" => __METHOD__
2415 )
2416 );
2417
2418 // Affichage du message d'informations
2419 printf(
2420 $this->template_help,
2421 $conf["message_help"]
2422 );
2423
2424 // Si il n'y a aucun dossier à afficher
2425 if (intval($qres['result']) == 0) {
2426 // Affichage du message d'informations
2427 echo __("Vous n'avez pas de dossiers limites pour le moment.");
2428 // Exit
2429 return;
2430 }
2431 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
2432 } else {
2433 // Exécution de la requête
2434 $qres = $this->f->get_all_results_from_db_query(
2435 $query,
2436 array(
2437 'origin' => __METHOD__
2438 )
2439 );
2440
2441 // Affichage du message d'informations
2442 printf(
2443 $this->template_help,
2444 $conf["message_help"]
2445 );
2446
2447 /**
2448 * Si il n'y a aucun dossier à afficher, alors on affiche un message
2449 * clair à l'utilisateur et on sort de la vue.
2450 */
2451 // Si il n'y a aucun dossier à afficher
2452 if ($qres['row_count'] === 0) {
2453 // Affichage du message d'informations
2454 echo __("Vous n'avez pas de dossiers limites pour le moment.");
2455 // Exit
2456 return;
2457 }
2458
2459 //
2460 $template_table = '
2461 <table class="tab-tab">
2462 <thead>
2463 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
2464 <th class="title col-0 firstcol">
2465 <span class="name">
2466 %s
2467 </span>
2468 </th>
2469 <th class="title col-1">
2470 <span class="name">
2471 %s
2472 </span>
2473 </th>
2474 <th class="title col-2">
2475 <span class="name">
2476 %s
2477 </span>
2478 </th>
2479 <th class="title col-3">
2480 <span class="name">
2481 %s
2482 </span>
2483 </th>
2484 <th class="title col-4 lastcol">
2485 <span class="name">
2486 %s
2487 </span>
2488 </th>
2489 </tr>
2490 </thead>
2491 <tbody>
2492 %s
2493 </tbody>
2494 </table>
2495 ';
2496 //
2497 $template_line = '
2498 <tr class="tab-data odd">
2499 <td class="col-1 firstcol">
2500 %s
2501 </td>
2502 <td class="col-1">
2503 %s
2504 </td>
2505 <td class="col-2">
2506 %s
2507 </td>
2508 <td class="col-3">
2509 %s
2510 </td>
2511 <td class="col-4 lastcol">
2512 %s
2513 </td>
2514 </tr>
2515 ';
2516 //
2517 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&amp;action=3&amp;idx=%s';
2518 //
2519 $template_link = '
2520 <a class="lienTable" href="%s">
2521 %s
2522 </a>
2523 ';
2524
2525 /**
2526 * Si il y a des dossiers à afficher, alors on affiche le widget.
2527 */
2528 // On construit le contenu du tableau
2529 $ct_tbody = '';
2530 foreach ($qres['result'] as $row) {
2531 // On construit l'attribut href du lien
2532 $ct_href = sprintf(
2533 $template_href,
2534 // idx
2535 $row["dossier"]
2536 );
2537 // On construit la ligne
2538 $ct_tbody .= sprintf(
2539 $template_line,
2540 // Colonne 1 - Numéro de dossier
2541 sprintf(
2542 $template_link,
2543 $ct_href,
2544 $row["dossier_libelle"]
2545 ),
2546 // Colonne 2 - Nom du pétitionnaire
2547 sprintf(
2548 $template_link,
2549 $ct_href,
2550 $row["nom_petitionnaire"]
2551 ),
2552 // Colonne 3 - Date limite
2553 sprintf(
2554 $template_link,
2555 $ct_href,
2556 $this->f->formatDate($row["date_limite_na"])
2557 ),
2558 // Colonne 4 - Enjeu
2559 sprintf(
2560 $template_link,
2561 $ct_href,
2562 $row["enjeu"]
2563 ),
2564 // Colonne 5 - Etat
2565 sprintf(
2566 $template_link,
2567 $ct_href,
2568 $row["etat"]
2569 )
2570 );
2571 }
2572 // Affichage du tableau listant les dossiers
2573 printf(
2574 $template_table,
2575 // Colonne 1 - Numéro de dossier
2576 __('dossier'),
2577 // Colonne 2 - Nom du pétitionnaire
2578 __('nom_petitionnaire'),
2579 // Colonne 3 - Date limite
2580 __('date_limite'),
2581 // Colonne 4 - Enjeu
2582 __('enjeu'),
2583 // Colonne 5 - Etat
2584 __('etat'),
2585 // Contenu du tableau
2586 $ct_tbody
2587 );
2588 }
2589 // Affichage du footer
2590 printf(
2591 $this->template_footer,
2592 // href (avec les paramètres du widget)
2593 sprintf(
2594 OM_ROUTE_TAB."&obj=dossiers_limites&nombre_de_jours=%s&codes_datd=%s&filtre=%s&restreindre_aux_tacites=%s",
2595 $nombre_de_jours,
2596 (is_null($codes_datd) ? "" : implode(";",$codes_datd)),
2597 $filtre,
2598 $restreindre_aux_tacites
2599 ),
2600 // titre
2601 __("Voir +")
2602 );
2603 }
2604
2605
2606 /**
2607 * Cette méthode permet de récupérer la configuration du widget 'Mes
2608 * recours'.
2609 *
2610 * @return array
2611 */
2612 function get_config_dossier_contentieux_recours($arguments) {
2613 include "../sql/pgsql/app_om_tab_common_select.inc.php";
2614 // Initialisation du tableau des paramètres avec ses valeur par défaut
2615 $arguments_default = array(
2616 "filtre" => "instructeur",
2617 "affichage" => "liste"
2618 );
2619 // Vérification des arguments
2620 foreach ($arguments_default as $key => $value) {
2621 //
2622 if (isset($arguments[$key])) {
2623 //
2624 $elem = trim($arguments[$key]);
2625 //
2626 if ($key === "filtre"
2627 && in_array($elem, array("instructeur", "aucun"))) {
2628 // La valeur doit être dans cette liste
2629 $arguments[$key] = $elem;
2630 continue;
2631 } elseif ($key === "affichage"
2632 && in_array($elem, array('liste', 'nombre'))) {
2633 // La valeur doit être dans cette liste
2634 $arguments[$key] = $elem;
2635 continue;
2636 }
2637 }
2638 //
2639 $arguments[$key] = $value;
2640 }
2641 // Utilisation du filtre instructeur dédié au contentieux si le filtre
2642 // paramétré est "instructeur"
2643 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
2644 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
2645 }
2646 $filtre = $arguments["filtre"];
2647
2648 // SELECT - CHAMPAFFICHE
2649 //
2650 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
2651 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
2652 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
2653 END";
2654
2655 //
2656 $case_requerant = "
2657 CASE WHEN demandeur_requerant.qualite = 'particulier'
2658 THEN TRIM(CONCAT(demandeur_requerant.particulier_nom, ' ', demandeur_requerant.particulier_prenom))
2659 ELSE TRIM(CONCAT(demandeur_requerant.personne_morale_raison_sociale, ' ', demandeur_requerant.personne_morale_denomination))
2660 END
2661 ";
2662
2663 // /!\Attention en cas d'ajout d'une nouvelle colonne dans le $champAffiche, adapter l'index en consequence dans le fichier dossier_contentieux_toutes_recours.export_csv.inc.php/!\
2664 $query_ct_select_champaffiche = array_merge(
2665 $array_base_ct_select_champaffiche,
2666 array(
2667 'dossier_autorisation_type_detaille.libelle as "'.__("type de dossier").'"',
2668 'dossier_autorisation_contestee.dossier_libelle as "'.__("autorisation").'"',
2669 $case_demandeur.' as "'.__("petitionnaire").'"',
2670 $trim_concat_terrain.'as "'.__("localisation").'"',
2671 $case_requerant.' as "'.__("requerant").'"',
2672 'donnees_techniques.ctx_reference_dsj as "'.__("ctx_reference_dsj").'"',
2673 'dossier.numero_versement_archive as "'.__('Numéro d\'archive').'"',
2674 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("date de recours").'"',
2675 'avis_decision.libelle as "'.__("decision").'"',
2676 'etat.libelle as "'.__("etat").'"',
2677 ));
2678
2679 /**
2680 * Construction de la requête
2681 */
2682 // SELECT
2683 $query_ct_select = "
2684 dossier.dossier,
2685 $select__dossier_libelle__column as dossier_libelle,
2686 dossier.date_depot
2687 ";
2688
2689 // FROM
2690 $query_ct_from =
2691 DB_PREFIXE."dossier
2692 LEFT JOIN (
2693 SELECT *
2694 FROM ".DB_PREFIXE."lien_dossier_demandeur
2695 INNER JOIN ".DB_PREFIXE."demandeur
2696 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
2697 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
2698 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
2699 ) as demandeur
2700 ON demandeur.dossier = dossier.dossier
2701 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2702 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
2703 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
2704 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_autorisation.dossier_autorisation_type_detaille
2705 LEFT JOIN ".DB_PREFIXE."etat
2706 ON dossier.etat = etat.etat
2707 LEFT JOIN ".DB_PREFIXE."division
2708 ON dossier.division = division.division
2709 LEFT JOIN ".DB_PREFIXE."avis_decision
2710 ON avis_decision.avis_decision=dossier.avis_decision
2711 LEFT OUTER JOIN ".DB_PREFIXE."arrondissement
2712 ON arrondissement.code_postal = dossier.terrain_adresse_code_postal
2713 LEFT JOIN (
2714 SELECT *
2715 FROM ".DB_PREFIXE."lien_dossier_demandeur
2716 INNER JOIN ".DB_PREFIXE."demandeur
2717 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
2718 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
2719 AND LOWER(demandeur.type_demandeur) = LOWER('requerant')
2720 ) as demandeur_requerant
2721 ON demandeur_requerant.dossier = dossier.dossier
2722 LEFT JOIN ".DB_PREFIXE."dossier as dossier_autorisation_contestee
2723 ON dossier.autorisation_contestee = dossier_autorisation_contestee.dossier
2724 INNER JOIN (
2725 SELECT
2726 ctx_reference_dsj,
2727 dossier_instruction
2728 FROM ".DB_PREFIXE."donnees_techniques
2729 ) as donnees_techniques
2730 ON donnees_techniques.dossier_instruction = dossier.dossier
2731 LEFT JOIN (".DB_PREFIXE."demande
2732 JOIN ".DB_PREFIXE."demande_type
2733 ON demande.demande_type = demande_type.demande_type
2734 )
2735 ON demande.dossier_instruction = dossier.dossier
2736 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
2737 LEFT JOIN ".DB_PREFIXE."instructeur
2738 ON dossier.instructeur = instructeur.instructeur
2739 LEFT JOIN ".DB_PREFIXE."om_utilisateur
2740 ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
2741 %s
2742 ";
2743
2744 $query_ct_from_collectivite_filter = "";
2745
2746 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
2747 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
2748 // collectivité
2749 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2750 $query_ct_from_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
2751 ON dossier.om_collectivite=om_collectivite.om_collectivite
2752 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
2753 ";
2754 }
2755 else {
2756 $query_ct_from_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
2757 ON dossier.om_collectivite=om_collectivite.om_collectivite
2758 ";
2759 }
2760
2761 $query_ct_from = sprintf($query_ct_from, $query_ct_from_collectivite_filter);
2762
2763 // WHERE - COMMON
2764 $query_ct_where_common = "
2765 LOWER(dossier_autorisation_type.code) = LOWER('RE')
2766 ";
2767
2768 // ORDER BY
2769 $query_ct_orderby = "
2770 dossier.date_depot DESC, dossier.dossier DESC
2771 ";
2772
2773 $query_ct_where_groupe = "";
2774 // Gestion des groupes et confidentialité
2775 include('../sql/pgsql/filter_group_widgets.inc.php');
2776
2777 /**
2778 * Message d'aide
2779 */
2780 //
2781 $message_filtre = "";
2782 //
2783 switch ($filtre) {
2784 case "instructeur_ou_instructeur_secondaire":
2785 $message_filtre = " ".__("dont je suis l'instructeur");
2786 break;
2787 case "aucun":
2788 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
2789 $message_filtre = " ".__("situés dans ma collectivité");
2790 } else {
2791 $message_filtre = " ".__("situés dans toutes les collectivités");
2792 }
2793 break;
2794 }
2795 //
2796 $message_help = sprintf(
2797 __("Les derniers recours%s."),
2798 $message_filtre
2799 );
2800
2801 /**
2802 * Return
2803 */
2804 //
2805 return array(
2806 "arguments" => $arguments,
2807 "message_help" => $message_help,
2808 "query_ct_select" => $query_ct_select,
2809 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
2810 "query_ct_from" => $query_ct_from,
2811 "query_ct_where" => $query_ct_where_common,
2812 "query_ct_where_groupe" => $query_ct_where_groupe,
2813 "query_ct_orderby" => $query_ct_orderby
2814 );
2815 }
2816
2817
2818 /**
2819 * WIDGET DASHBOARD - Mes recours
2820 * @return void
2821 */
2822 function view_widget_dossier_contentieux_recours($content = null) {
2823 /**
2824 * Ce widget est configurable via l'interface Web. Lors de la création
2825 * du widget dans le paramétrage il est possible de spécifier la ou les
2826 * options suivantes :
2827 * - filtre :
2828 * = instructeur
2829 * = aucun
2830 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
2831 */
2832 // Liste des paramètres
2833 $params = array("filtre", "affichage");
2834 // Formatage des arguments reçus en paramètres
2835 $arguments = $this->get_arguments($content, $params);
2836 // Récupération de la configuration du widget
2837 $conf = $this->get_config_dossier_contentieux_recours($arguments);
2838 // Récupération du filtre
2839 $filtre = $conf["arguments"]["filtre"];
2840 // Définit l'objet cible
2841 $obj = 'dossier_contentieux_tous_recours';
2842 if ($filtre === 'instructeur' || $filtre = 'instructeur_ou_instructeur_secondaire') {
2843 //
2844 $obj = 'dossier_contentieux_mes_recours';
2845 }
2846
2847 /**
2848 * Composition de la requête
2849 */
2850 //
2851 // Gestion de la requête selon le type d'affichage
2852 $query_ct_orderby = sprintf(
2853 "ORDER BY
2854 %s
2855 LIMIT 5",
2856 $conf["query_ct_orderby"]
2857 );
2858 $query_ct_select = $conf["query_ct_select"];
2859 if ($conf["arguments"]["affichage"] === "nombre") {
2860 $query_ct_orderby = "";
2861 $query_ct_select = "COUNT(*)";
2862 }
2863
2864 $query = sprintf("
2865 SELECT
2866 %s
2867 FROM
2868 %s
2869 %s
2870 WHERE
2871 %s
2872 %s
2873 %s
2874 %s",
2875 $query_ct_select,
2876 $conf["query_ct_from"],
2877 '%s', // emplacement pour les jointure du filtre
2878 $conf["query_ct_where"],
2879 $conf["query_ct_where_groupe"],
2880 '%s', // emplacement pour les conditions du filtre
2881 $query_ct_orderby
2882 );
2883 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
2884 $sqlFilter = $this->get_query_filter(
2885 $query,
2886 $conf['arguments']['filtre']
2887 );
2888 $query = sprintf(
2889 $query,
2890 $sqlFilter["FROM"],
2891 $sqlFilter["WHERE"]
2892 );
2893
2894 /**
2895 * Template nécessaires à l'affichage du widget
2896 */
2897 if ($conf["arguments"]["affichage"] === "nombre") {
2898 // Exécution de la requête
2899 $qres = $this->f->get_one_result_from_db_query(
2900 $query,
2901 array(
2902 "origin" => __METHOD__
2903 )
2904 );
2905
2906 // Affichage du message d'informations
2907 printf(
2908 $this->template_help,
2909 $conf["message_help"]
2910 );
2911 // Si il n'y a aucun dossier à afficher
2912 if (intval($qres['result']) == 0) {
2913 echo __("Vous n'avez pas de recours.");
2914 return;
2915 }
2916
2917 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
2918 } else {
2919 // Exécution de la requête
2920 $qres = $this->f->get_all_results_from_db_query(
2921 $query,
2922 array(
2923 'origin' => __METHOD__
2924 )
2925 );
2926
2927 // Affichage du message d'informations
2928 printf(
2929 $this->template_help,
2930 $conf["message_help"]
2931 );
2932 // Si il n'y a aucun dossier à afficher
2933 if ($qres['row_count'] === 0) {
2934 echo __("Vous n'avez pas de recours.");
2935 return;
2936 }
2937 //
2938 $template_table = '
2939 <table class="tab-tab">
2940 <thead>
2941 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
2942 <th class="title col-0 firstcol">
2943 <span class="name">
2944 %s
2945 </span>
2946 </th>
2947 <th class="title col-1">
2948 <span class="name">
2949 %s
2950 </span>
2951 </th>
2952 <th class="title col-2 lastcol">
2953 <span class="name">
2954 %s
2955 </span>
2956 </th>
2957 </tr>
2958 </thead>
2959 <tbody>
2960 %s
2961 </tbody>
2962 </table>
2963 ';
2964 //
2965 $template_line = '
2966 <tr class="tab-data odd">
2967 <td class="col-0 firstcol">
2968 %s
2969 </td>
2970 <td class="col-1 ">
2971 %s
2972 </td>
2973 <td class="col-2 lastcol">
2974 %s
2975 </td>
2976 </tr>
2977 ';
2978 //
2979 $template_href = OM_ROUTE_FORM.'&obj=%s&amp;action=3&amp;idx=%s';
2980 //
2981 $template_link = '
2982 <a class="lienTable" href="%s">
2983 %s
2984 </a>
2985 ';
2986 // Bouton consulter
2987 $template_btn_consulter = '
2988 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
2989 .__('Consulter')
2990 .'</span>
2991 ';
2992 //
2993
2994 /**
2995 * Si il y a des dossiers à afficher, alors on affiche le widget.
2996 */
2997 // On construit le contenu du tableau
2998 $ct_tbody = '';
2999 foreach ($qres['result'] as $row) {
3000 // On construit l'attribut href du lien
3001 $ct_href = sprintf(
3002 $template_href,
3003 // obj
3004 $obj,
3005 // idx
3006 $row["dossier"]
3007 );
3008 // On construit la ligne
3009 $ct_tbody .= sprintf(
3010 $template_line,
3011 // Colonne 1 - Numéro de dossier
3012 sprintf(
3013 $template_link,
3014 $ct_href,
3015 $template_btn_consulter
3016 ),
3017 // Colonne 2 - Numéro de dossier
3018 sprintf(
3019 $template_link,
3020 $ct_href,
3021 $row["dossier_libelle"]
3022 ),
3023 // Colonne 3 - Date de depot
3024 sprintf(
3025 $template_link,
3026 $ct_href,
3027 $this->f->formatDate($row["date_depot"])
3028 )
3029 );
3030 }
3031 // Affichage du tableau listant les dossiers
3032 printf(
3033 $template_table,
3034 // Colonne 1 - Consulter
3035 '',
3036 // Colonne 2 - Numéro de dossier
3037 __('dossier'),
3038 // Colonne 3 - Date de depot
3039 __("Date de recours"),
3040 // Le Contenu
3041 $ct_tbody
3042 );
3043 }
3044 /**
3045 * Affichage du footer
3046 */
3047 //
3048 $template_link_footer = OM_ROUTE_TAB.'&obj=%s';
3049 //
3050 $link_footer = sprintf(
3051 $template_link_footer,
3052 $obj
3053 );
3054 //
3055 printf(
3056 $this->template_footer,
3057 $link_footer,
3058 __("Voir +")
3059 );
3060 }
3061
3062
3063 /**
3064 * WIDGET DASHBOARD - RSS
3065 *
3066 * Cette fonction gère l'affichage du widget RSS.
3067 *
3068 * Elle récupère trois arguments :
3069 * - urls (l'urls des flux rss séparé par une virgule)
3070 * - mode (le mode utilisé par le widget, soit "server_side" donc uniquement
3071 * sur server, soit "client_side" avec une récuperation des informations en
3072 * javascript)
3073 * - max_item (le nombre d'information provenant du flux, à afficher)
3074 *
3075 * Si mode = "server_side" alors
3076 * le DOM est construit dans la méthode view_widget_rss() de cette classe
3077 *
3078 * Si mode = client_side alors
3079 * le DOM est construit en javascript dans script.js::bind_widget_rss()
3080 *
3081 * @param string $content Contenu du champ "texte" ou "arguments" du widget
3082 * @param string $id Identifiant de l'enregistrement "om_dashboard"
3083 *
3084 * @return void
3085 */
3086 function display_widget_rss($content = null, $id = null) {
3087 // Liste des paramètres
3088 $params = array("urls", "mode", "max_item");
3089 // Formatage des arguments reçus en paramètres
3090 $arguments = $this->get_arguments($content, $params);
3091
3092 // Requête SQL
3093 $dashboard = $this->f->get_inst__om_dbform(array(
3094 'obj' => 'om_dashboard',
3095 'idx' => $id
3096 ));
3097 $widget = $dashboard->getVal('om_widget');
3098 // Préparation du contenu du widget
3099 $htmlWidget = sprintf(
3100 '<div class="widget-rss-marker" data-id_widget="%d" data-mode="%s"/></div>',
3101 $widget,
3102 "server_side"
3103 );
3104 if ($arguments["mode"] === "client_side") {
3105 $htmlWidget = sprintf(
3106 '<div class="widget-rss-marker" data-id_widget="%d" data-mode="%s" data-urls="%s" data-max_item="%s"/></div>',
3107 $widget,
3108 "client_side",
3109 $arguments['urls'],
3110 $arguments['max_item']
3111 );
3112 }
3113 // Affichage du widget
3114 echo $htmlWidget;
3115 }
3116
3117
3118
3119 /**
3120 * WIDGET DASHBOARD
3121 *
3122 * Création du DOM du widget RSS dans le cas server_side.
3123 *
3124 * @return void
3125 */
3126 function view_widget_rss() {
3127 // Liste des paramètres
3128 $params = array("urls", "mode", "max_item");
3129 // Formatage des arguments reçus en paramètres
3130 $arguments = $this->get_arguments($this->getVal('arguments'), $params);
3131 // Récupère les URLs des différents flux dans un tableau
3132 $urls = explode(',', $arguments['urls']);
3133
3134 // On retire 1 à la valeur de max_item car nous bouclons à partir de 0
3135 $real_max_item = $arguments['max_item'] - 1;
3136
3137 //Pour chaque url
3138 foreach ($urls as $url) {
3139
3140 // Initialise le contenu vide
3141 $content = "";
3142
3143 // Template de l'affichage en liste
3144 $render = "
3145 <ul>
3146 <h4>%s</h4>
3147 %s
3148 </ul>
3149 ";
3150
3151 // Tempalte de l'affichage du contenu
3152 $content_flux_template = "
3153 <li>
3154 <a href=%s target=_blank>
3155 <h5>%s</h5>
3156 </a>
3157 <p>%s</>
3158 </li>
3159 ";
3160
3161 // Instanciation de la classe DOMDocument
3162 $xmlDoc = new DOMDocument();
3163 @$ret = $xmlDoc->load($url);
3164 if ($ret !== true) {
3165 printf(
3166 $render,
3167 "Erreur",
3168 "Erreur au chargement de l'URL. Contactez votre administrateur."
3169 );
3170 continue;
3171 }
3172
3173 // Récupération du nom du flux
3174 $channel_title = $xmlDoc->getElementsByTagName('channel')->item(0)->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
3175
3176 // Pour chaque item du flux
3177 $x = $xmlDoc->getElementsByTagName('item');
3178 if ($x->length > 0) {
3179 for ($i=0; $i<=$real_max_item; $i++) {
3180 $item_title = $x->item($i)->getElementsByTagName('title')->item(0)->childNodes->item(0)->nodeValue;
3181 $item_link = $x->item($i)->getElementsByTagName('link')->item(0)->childNodes->item(0)->nodeValue;
3182 $item_desc = $x->item($i)->getElementsByTagName('description')->item(0)->childNodes->item(0)->nodeValue;
3183 // Contenu
3184 $content .= sprintf($content_flux_template, $item_link, $item_title, $item_desc);
3185 }
3186 } else {
3187 $content = "Aucune donnée disponible";
3188 }
3189
3190 // Affiche le contenu du widget
3191 echo sprintf($render, $channel_title, $content);
3192 }
3193 }
3194
3195 /**
3196 * Définition des actions disponibles sur la classe.
3197 *
3198 * @return void
3199 */
3200 function init_class_actions() {
3201
3202 // On récupère les actions génériques définies dans la méthode
3203 // d'initialisation de la classe parente
3204 parent::init_class_actions();
3205
3206 // ACTION - 004 - view_widget_rss
3207 // Permet d'accéder au widget RSS "server_side" depuis une URL
3208 $this->class_actions[4] = array(
3209 "identifier" => "widget-rss",
3210 "view" => "view_widget_rss",
3211 "permission_suffix" => "widget_rss",
3212 );
3213
3214 }
3215
3216 /**
3217 * WIDGET DASHBOARD - Mes infractions
3218 * @return void
3219 */
3220 function view_widget_dossier_contentieux_infraction($content = null) {
3221 /**
3222 * Ce widget est configurable via l'interface Web. Lors de la création
3223 * du widget dans le paramétrage il est possible de spécifier la ou les
3224 * options suivantes :
3225 * - filtre :
3226 * = instructeur
3227 * = aucun
3228 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
3229 */
3230 // Liste des paramètres
3231 $params = array("filtre", "affichage");
3232 // Formatage des arguments reçus en paramètres
3233 $arguments = $this->get_arguments($content, $params);
3234 // Récupération de la configuration du widget
3235 $conf = $this->get_config_dossier_contentieux_infraction($arguments);
3236 // Récupération du filtre
3237 $filtre = $conf["arguments"]["filtre"];
3238 // Définit l'objet cible
3239 $obj = 'dossier_contentieux_toutes_infractions';
3240 if ($filtre === 'instructeur' || $filtre === 'instructeur_ou_instructeur_secondaire') {
3241 //
3242 $obj = 'dossier_contentieux_mes_infractions';
3243 }
3244
3245 /**
3246 * Composition de la requête
3247 */
3248 // Gestion de la requête selon le type d'affichage
3249 $query_ct_orderby = sprintf(
3250 "ORDER BY
3251 %s
3252 LIMIT 5",
3253 $conf["query_ct_orderby"]
3254 );
3255 $query_ct_select = $conf["query_ct_select"];
3256 if ($conf["arguments"]["affichage"] === "nombre") {
3257 $query_ct_orderby = "";
3258 $query_ct_select = "COUNT(*)";
3259 }
3260
3261 $query = sprintf("
3262 SELECT
3263 %s
3264 FROM
3265 %s
3266 %s
3267 WHERE
3268 %s
3269 %s
3270 %s",
3271 $query_ct_select,
3272 $conf["query_ct_from"],
3273 '%s', // emplacement pour les jointure du filtre
3274 $conf["query_ct_where"],
3275 '%s', // emplacement pour les conditions du filtre
3276 $query_ct_orderby
3277 );
3278 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
3279 $sqlFilter = $this->get_query_filter(
3280 $query,
3281 $conf['arguments']['filtre']
3282 );
3283 $query = sprintf(
3284 $query,
3285 $sqlFilter["FROM"],
3286 $sqlFilter["WHERE"]
3287 );
3288
3289 /**
3290 * Template nécessaires à l'affichage du widget
3291 */
3292 if ($conf["arguments"]["affichage"] === "nombre") {
3293 // Exécution de la requête
3294 $qres = $this->f->get_one_result_from_db_query(
3295 $query,
3296 array(
3297 "origin" => __METHOD__
3298 )
3299 );
3300
3301 // Affichage du message d'informations
3302 printf(
3303 $this->template_help,
3304 $conf["message_help"]
3305 );
3306 // Si il n'y a aucun dossier à afficher
3307 if (intval($qres['result']) == 0) {
3308 echo __("Vous n'avez pas d'infraction.");
3309 return;
3310 }
3311
3312 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
3313 } else {
3314 // Exécution de la requête
3315 $qres = $this->f->get_all_results_from_db_query(
3316 $query,
3317 array(
3318 'origin' => __METHOD__
3319 )
3320 );
3321
3322 // Affichage du message d'informations
3323 printf(
3324 $this->template_help,
3325 $conf["message_help"]
3326 );
3327 // Si il n'y a aucun dossier à afficher
3328 if ($qres['row_count'] === 0) {
3329 echo __("Vous n'avez pas d'infraction.");
3330 return;
3331 }
3332 //
3333 $template_table = '
3334 <table class="tab-tab">
3335 <thead>
3336 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
3337 <th class="title col-0 firstcol">
3338 <span class="name">
3339 %s
3340 </span>
3341 </th>
3342 <th class="title col-1">
3343 <span class="name">
3344 %s
3345 </span>
3346 </th>
3347 <th class="title col-2 lastcol">
3348 <span class="name">
3349 %s
3350 </span>
3351 </th>
3352 </tr>
3353 </thead>
3354 <tbody>
3355 %s
3356 </tbody>
3357 </table>
3358 ';
3359 //
3360 $template_line = '
3361 <tr class="tab-data odd">
3362 <td class="col-0 firstcol">
3363 %s
3364 </td>
3365 <td class="col-1 ">
3366 %s
3367 </td>
3368 <td class="col-2 lastcol">
3369 %s
3370 </td>
3371 </tr>
3372 ';
3373
3374 // Bouton consulter
3375 $template_btn_consulter = '
3376 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
3377 .__('Consulter')
3378 .'</span>
3379 ';
3380 //
3381 $template_href = OM_ROUTE_FORM.'&obj=%s&amp;action=3&amp;idx=%s';
3382 //
3383 $template_link = '
3384 <a class="lienTable" href="%s">
3385 %s
3386 </a>
3387 ';
3388
3389 /**
3390 * Si il y a des dossiers à afficher, alors on affiche le widget.
3391 */
3392 // On construit le contenu du tableau
3393 $ct_tbody = '';
3394 foreach ($qres['result'] as $row) {
3395 // On construit l'attribut href du lien
3396 $ct_href = sprintf(
3397 $template_href,
3398 // obj
3399 $obj,
3400 // idx
3401 $row["dossier"]
3402 );
3403 // On construit la ligne
3404 $ct_tbody .= sprintf(
3405 $template_line,
3406 // Colonne 1 - Numéro de dossier
3407 sprintf(
3408 $template_link,
3409 $ct_href,
3410 $template_btn_consulter
3411 ),
3412 // Colonne 2 - Numéro de dossier
3413 sprintf(
3414 $template_link,
3415 $ct_href,
3416 $row["dossier_libelle"]
3417 ),
3418 // Colonne 3 - Date de depot
3419 sprintf(
3420 $template_link,
3421 $ct_href,
3422 $this->f->formatDate($row["date_depot"])
3423 )
3424 );
3425 }
3426 // Affichage du tableau listant les dossiers
3427 printf(
3428 $template_table,
3429 // Colonne 1 - Consulter
3430 '',
3431 // Colonne 2 - Numéro de dossier
3432 __('dossier'),
3433 // Colonne 3 - Date de depot
3434 __("Date de réception"),
3435 // Le Contenu
3436 $ct_tbody
3437 );
3438 }
3439 /**
3440 * Affichage du footer
3441 */
3442 //
3443 $template_link_footer = OM_ROUTE_TAB.'&obj=%s';
3444 //
3445 $link_footer = sprintf(
3446 $template_link_footer,
3447 $obj
3448 );
3449 //
3450 printf(
3451 $this->template_footer,
3452 $link_footer,
3453 __("Voir +")
3454 );
3455 }
3456
3457
3458 /**
3459 * Cette méthode permet de récupérer la configuration du widget 'Mes
3460 * infractions'.
3461 *
3462 * @return array
3463 */
3464 function get_config_dossier_contentieux_infraction($arguments) {
3465 include "../sql/pgsql/app_om_tab_common_select.inc.php";
3466 // Initialisation du tableau des paramètres avec ses valeur par défaut
3467 $arguments_default = array(
3468 "filtre" => "instructeur",
3469 "affichage" => "liste"
3470 );
3471 // Vérification des arguments
3472 foreach ($arguments_default as $key => $value) {
3473 //
3474 if (isset($arguments[$key])) {
3475 //
3476 $elem = trim($arguments[$key]);
3477 //
3478 if ($key === "filtre"
3479 && in_array($elem, array("instructeur", "aucun"))) {
3480 // La valeur doit être dans cette liste
3481 $arguments[$key] = $elem;
3482 continue;
3483 } elseif ($key === "affichage"
3484 && in_array($elem, array('liste', 'nombre'))) {
3485 // La valeur doit être dans cette liste
3486 $arguments[$key] = $elem;
3487 continue;
3488 }
3489 }
3490 //
3491 $arguments[$key] = $value;
3492 }
3493 // Utilisation du filtre instructeur dédié au contentieux si le filtre
3494 // paramétré est "instructeur"
3495 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
3496 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
3497 }
3498 $filtre = $arguments["filtre"];
3499
3500 // SELECT - CHAMPAFFICHE
3501 //
3502 $case_contrevenant = "
3503 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
3504 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
3505 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
3506 END
3507 ";
3508 // /!\Attention en cas d'ajout d'une nouvelle colonne dans le $champAffiche, adapter l'index en consequence dans le fichier dossier_contentieux_toutes_infractions.export_csv.inc.php/!\
3509 $query_ct_select_champaffiche = array_merge(
3510 $array_base_ct_select_champaffiche,
3511 array(
3512 $trim_concat_terrain.'as "'.__("localisation").'"',
3513 $case_contrevenant.' as "'.__("contrevenant").'"',
3514 'donnees_techniques.ctx_reference_dsj as "'.__("ctx_reference_dsj").'"',
3515 'numero_versement_archive as "'.__('N° archive').'"',
3516 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
3517 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
3518 'etat.libelle as "'.__("etat").'"',
3519 ));
3520
3521 /**
3522 * Construction de la requête
3523 */
3524 // SELECT
3525 $query_ct_select = "
3526 dossier.dossier,
3527 $select__dossier_libelle__column as dossier_libelle,
3528 dossier.date_depot
3529 ";
3530
3531 // FROM
3532 $query_ct_from =
3533 DB_PREFIXE."dossier
3534 LEFT JOIN (
3535 SELECT *
3536 FROM ".DB_PREFIXE."lien_dossier_demandeur
3537 INNER JOIN ".DB_PREFIXE."demandeur
3538 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
3539 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
3540 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
3541 ) as demandeur
3542 ON demandeur.dossier = dossier.dossier
3543 INNER JOIN ".DB_PREFIXE."etat
3544 ON dossier.etat = etat.etat%s
3545 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
3546 ON dossier_autorisation.dossier_autorisation = dossier.dossier_autorisation
3547 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
3548 ON dossier_autorisation_type_detaille.dossier_autorisation_type_detaille = dossier_autorisation.dossier_autorisation_type_detaille
3549 LEFT JOIN ".DB_PREFIXE."division
3550 ON dossier.division = division.division
3551 LEFT JOIN ".DB_PREFIXE."avis_decision
3552 ON avis_decision.avis_decision=dossier.avis_decision
3553 LEFT OUTER JOIN ".DB_PREFIXE."arrondissement
3554 ON arrondissement.code_postal = dossier.terrain_adresse_code_postal
3555 LEFT JOIN (
3556 SELECT *
3557 FROM ".DB_PREFIXE."lien_dossier_demandeur
3558 INNER JOIN ".DB_PREFIXE."demandeur
3559 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
3560 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
3561 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
3562 ) as demandeur_contrevenant
3563 ON demandeur_contrevenant.dossier = dossier.dossier
3564 INNER JOIN (
3565 SELECT
3566 ctx_reference_dsj,
3567 ctx_infraction,
3568 dossier_instruction
3569 FROM ".DB_PREFIXE."donnees_techniques
3570 ) as donnees_techniques
3571 ON donnees_techniques.dossier_instruction = dossier.dossier
3572 LEFT JOIN (".DB_PREFIXE."demande
3573 JOIN ".DB_PREFIXE."demande_type
3574 ON demande.demande_type = demande_type.demande_type
3575 )
3576 ON demande.dossier_instruction = dossier.dossier
3577 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
3578 LEFT JOIN ".DB_PREFIXE."instructeur
3579 ON dossier.instructeur = instructeur.instructeur
3580 LEFT JOIN ".DB_PREFIXE."om_utilisateur
3581 ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
3582 LEFT JOIN ".DB_PREFIXE."instructeur as instructeur_secondaire
3583 ON dossier.instructeur_2 = instructeur_secondaire.instructeur
3584 LEFT JOIN ".DB_PREFIXE."om_utilisateur as utilisateur_2
3585 ON instructeur_secondaire.om_utilisateur = utilisateur_2.om_utilisateur
3586 %s
3587 ";
3588
3589 $query_ct_from_collectivite_filter = "";
3590
3591 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
3592 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
3593 // collectivité
3594 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3595 $query_ct_from_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
3596 ON dossier.om_collectivite=om_collectivite.om_collectivite
3597 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
3598 ";
3599 }
3600 else {
3601 $query_ct_from_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
3602 ON dossier.om_collectivite=om_collectivite.om_collectivite
3603 ";
3604 }
3605
3606 // Retourne seulement les dossiers en cours d'instruction, lorsque le
3607 // filtre sur instructeur est activé
3608 $query_ct_where_etat_ctx_filter = "" ;
3609 if ($filtre === "instructeur_ou_instructeur_secondaire") {
3610 $query_ct_where_etat_ctx_filter = " AND etat.statut = 'encours'";
3611 }
3612
3613 $query_ct_from = sprintf(
3614 $query_ct_from,
3615 $query_ct_where_etat_ctx_filter,
3616 $query_ct_from_collectivite_filter
3617 );
3618
3619 // WHERE - COMMON
3620 $query_ct_where_common = "
3621 LOWER(dossier_autorisation_type.code) = LOWER('IN')
3622 ";
3623
3624 // ORDER BY
3625 $query_ct_orderby = "
3626 dossier.date_depot DESC, dossier.dossier DESC
3627 ";
3628
3629 $query_ct_where_groupe = "";
3630 // Gestion des groupes et confidentialité
3631 include('../sql/pgsql/filter_group_widgets.inc.php');
3632
3633 /**
3634 * Message d'aide
3635 */
3636 //
3637 $message_filtre = "";
3638 //
3639 switch ($filtre) {
3640 case "instructeur_ou_instructeur_secondaire":
3641 $message_filtre = " ".__("en cours d'instruction")." ".__("dont je suis l'instructeur");
3642 break;
3643 case "instructeur_secondaire":
3644 $message_filtre = " ".__("en cours d'instruction")." ".__("dont je suis l'instructeur secondaire");
3645 break;
3646 case "aucun":
3647 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3648 $message_filtre = " ".__("situés dans ma collectivité");
3649 } else {
3650 $message_filtre = " ".__("situés dans toutes les collectivités");
3651 }
3652 break;
3653 }
3654 //
3655 $message_help = sprintf(
3656 __("Les dernières infractions%s."),
3657 $message_filtre
3658 );
3659
3660 /**
3661 * Return
3662 */
3663 //
3664 return array(
3665 "arguments" => $arguments,
3666 "message_help" => $message_help,
3667 "query_ct_select" => $query_ct_select,
3668 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
3669 "query_ct_from" => $query_ct_from,
3670 "query_ct_where" => $query_ct_where_common,
3671 "query_ct_orderby" => $query_ct_orderby
3672 );
3673 }
3674
3675 /**
3676 * Cet méthode permet de formater, la chaîne de caractères reçue du
3677 * paramétrage du widget en un tableau de valeurs dont les clés
3678 * correspondent aux clés passées en paramètre.
3679 *
3680 * @param string $content
3681 * @param array $params
3682 *
3683 * @return array
3684 */
3685 function get_arguments($content = null, $params = array()) {
3686 //
3687 $arguments = array();
3688 // On explose les paramètres reçus avec un élément par ligne
3689 $params_tmp1 = explode("\n", $content);
3690 // On boucle sur chaque ligne de paramètre
3691 foreach ($params_tmp1 as $key => $value) {
3692 // On explose le paramètre de sa valeur avec le séparateur '='
3693 $params_tmp2[] = explode("=", $value);
3694 }
3695 // On boucle sur chaque paramètre reçu pour vérifier si la valeur reçue
3696 // est acceptable ou non
3697 foreach ($params_tmp2 as $key => $value) {
3698 //
3699 if (!isset($value[0]) || !isset($value[1])) {
3700 continue;
3701 }
3702 //
3703 if (in_array(trim($value[0]), $params)) {
3704 $arguments[trim($value[0])] = trim($value[1]);
3705 }
3706 }
3707 //
3708 return $arguments;
3709 }
3710
3711 /**
3712 * WIDGET DASHBOARD - Retours de messages
3713 *
3714 * @return void
3715 */
3716 function view_widget_messages_retours($content = null) {
3717
3718 /**
3719 * Ce widget est configurable via l'interface Web. Lors de la création
3720 * du widget dans le paramétrage il est possible de spécifier la ou les
3721 * options suivantes :
3722 *
3723 * - filtre :
3724 * = instructeur
3725 * = division
3726 * = aucun
3727 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
3728 *
3729 * - contexte :
3730 * = standard
3731 * = contentieux
3732 * (defaut) Par défaut le contexte est standard.
3733 *
3734 * - dossier_cloture :
3735 * = true
3736 * = false
3737 * (default) false
3738 */
3739 // Liste des paramètres
3740 $params = array("filtre", "contexte", "dossier_cloture");
3741 // Formatage des arguments reçus en paramètres
3742 $arguments = $this->get_arguments($content, $params);
3743 // Récupération de la configuration du widget
3744 $conf = $this->get_config_messages_retours($arguments);
3745 //
3746 $filtre = $conf["arguments"]["filtre"];
3747 //
3748 $contexte = $conf["arguments"]["contexte"];
3749
3750 /**
3751 * Composition de la requête
3752 */
3753 $query = sprintf("
3754 SELECT
3755 COUNT(*)
3756 FROM
3757 %s
3758 %s
3759 WHERE
3760 %s
3761 %s
3762 %s",
3763 $conf["query_ct_from"],
3764 '%s', // emplacement pour les jointure du filtre
3765 $conf["query_ct_where_common"],
3766 $conf["query_ct_where_groupe"],
3767 '%s' // emplacement pour les conditions du filtre
3768 );
3769 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
3770 $sqlFilter = $this->get_query_filter(
3771 $query,
3772 $conf['arguments']['filtre']
3773 );
3774 // Pour les messages en plus du filtre ont souhaite récupérer tous les messages
3775 // à destination de la commune pour les collectivité mono
3776 if ($conf['arguments']['filtre'] != 'aucun') {
3777 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3778 // Modifie la condition du filtre pour récupérer les messages voulus (filtre
3779 // instructeur, instructeur_secondaire ou division) ainsi que les messages de
3780 // à destination de la commune.
3781 // Le filtre récupéré a un 'AND' devant la condition pour éviter une erreur de
3782 // base de donnée on le supprime pour ne récupérer que la condition et pouvoir
3783 // l'associer à la condition sur le destinataire
3784 $sqlFilter['WHERE'] = sprintf(
3785 ' AND (%s %s dossier_message.destinataire = \'commune\')',
3786 str_replace(' AND ', '', $sqlFilter['WHERE']),
3787 ! empty($sqlFilter['WHERE']) ? 'OR' : ''
3788 );
3789 } else {
3790 // Modifie la condition du filtre pour récupérer les messages voulus (filtre
3791 // instructeur, instructeur_secondaire ou division) qui sont à destination de
3792 // l'instructeur
3793 $sqlFilter['WHERE'] = sprintf(
3794 ' %s AND dossier_message.destinataire = \'instructeur\'',
3795 $sqlFilter['WHERE']
3796 );
3797 }
3798 }
3799 // Construction de la requête en intégrant les filtres
3800 $query = sprintf(
3801 $query,
3802 $sqlFilter["FROM"],
3803 $sqlFilter["WHERE"]
3804 );
3805
3806 /**
3807 * Exécution de la requête
3808 */
3809 //
3810 $qres = $this->f->get_one_result_from_db_query(
3811 $query,
3812 array(
3813 "origin" => __METHOD__
3814 )
3815 );
3816
3817 // Affichage du message d'informations
3818 printf(
3819 $this->template_help,
3820 $conf["message_help"]
3821 );
3822
3823 //
3824 if (intval($qres['result']) === 0) {
3825 //
3826 echo __("Aucun message non lu.");
3827 return;
3828 }
3829
3830
3831 /**
3832 *
3833 */
3834 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
3835
3836 // Définit le lien de redirection vers le listing en fonction du
3837 // contexte et du filtre
3838 if ($contexte === 'standard') {
3839 //
3840 switch ($filtre) {
3841 case 'instructeur':
3842 $obj_href_more_link = 'messages_mes_retours';
3843 break;
3844 case 'instructeur_ou_instructeur_secondaire':
3845 $obj_href_more_link = 'messages_mes_retours';
3846 break;
3847 case 'instructeur_secondaire':
3848 $obj_href_more_link = 'messages_mes_retours';
3849 break;
3850 case 'division':
3851 $obj_href_more_link = 'messages_retours_ma_division';
3852 break;
3853 case 'aucun':
3854 $obj_href_more_link = 'messages_tous_retours';
3855 break;
3856 }
3857 }
3858 //
3859 if ($contexte === 'contentieux') {
3860 //
3861 switch ($filtre) {
3862 case 'instructeur':
3863 $obj_href_more_link = 'messages_contentieux_mes_retours';
3864 break;
3865 case 'instructeur_ou_instructeur_secondaire':
3866 $obj_href_more_link = 'messages_contentieux_mes_retours';
3867 break;
3868 case 'division':
3869 $obj_href_more_link = 'messages_contentieux_retours_ma_division';
3870 break;
3871 case 'aucun':
3872 $obj_href_more_link = 'messages_contentieux_tous_retours';
3873 break;
3874 }
3875 }
3876
3877 //
3878 if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) {
3879 return;
3880 }
3881 // Affichage du footer
3882 printf(
3883 $this->template_footer,
3884 // href
3885 sprintf(
3886 OM_ROUTE_TAB.'&obj=%s&dossier_cloture=%s&filtre=%s',
3887 $obj_href_more_link,
3888 $conf["arguments"]["dossier_cloture"],
3889 $filtre
3890 ),
3891 // titre
3892 __("Voir +")
3893 );
3894 }
3895
3896
3897 /**
3898 * Cette méthode permet de récupérer la configuration du widget 'Retours de
3899 * messages'.
3900 *
3901 * @return array
3902 */
3903 function get_config_messages_retours($arguments) {
3904 // Initialisation du tableau des paramètres avec ses valeur par défaut
3905 $arguments_default = array(
3906 "filtre" => "instructeur",
3907 "contexte" => "standard",
3908 "dossier_cloture" => "false",
3909 );
3910 // Vérification des arguments
3911 foreach ($arguments_default as $key => $value) {
3912 //
3913 if (isset($arguments[$key])) {
3914 //
3915 $elem = trim($arguments[$key]);
3916 //
3917 if ($key === "filtre"
3918 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
3919 // La valeur doit être dans cette liste
3920 $arguments[$key] = $elem;
3921 continue;
3922 }
3923 //
3924 if ($key === "contexte"
3925 && in_array($elem, array("standard", "contentieux"))) {
3926 // La valeur doit être dans cette liste
3927 $arguments[$key] = $elem;
3928 continue;
3929 }
3930 if ($key === "dossier_cloture"
3931 && in_array($elem, array("true", "false"))) {
3932 // La valeur doit être dans cette liste
3933 $arguments[$key] = $elem;
3934 continue;
3935 }
3936 }
3937 //
3938 $arguments[$key] = $value;
3939 }
3940 //
3941 $filtreWidget = $arguments["filtre"];
3942 //
3943 $contexte = $arguments["contexte"];
3944 $filtre = $contexte == 'contentieux' &&
3945 (empty($filtre) || $filtre == 'instructeur' || $filtre == 'instructeur_secondaire') ?
3946 'instructeur_ou_instructeur_secondaire' :
3947 'instructeur';
3948 // Utilisation du filtre instructeur dédié au contentieux si le filtre
3949 // paramétré est "instructeur" ou "instructeur_secondaire" et que le
3950 // contexte est "contentieux"
3951 $filtre = $contexte == 'contentieux' &&
3952 (empty($filtre) ||
3953 $filtre == 'instructeur' ||
3954 $filtre == 'instructeur_secondaire') ?
3955 'instructeur_ou_instructeur_secondaire' :
3956 'instructeur';
3957
3958 /**
3959 * Construction de la requête
3960 */
3961 $query_ct_from_collectivite_filter = "";
3962 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
3963 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
3964 // collectivité
3965 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
3966 $query_ct_from_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
3967 ON dossier.om_collectivite=om_collectivite.om_collectivite
3968 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
3969 ";
3970 } else {
3971 $query_ct_from_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
3972 ON dossier.om_collectivite=om_collectivite.om_collectivite
3973 ";
3974 }
3975
3976 $query_ct_from_dossier_cloture_filter = "LEFT JOIN ".DB_PREFIXE."etat
3977 ON dossier.etat = etat.etat";
3978
3979 // FROM
3980 $query_ct_from = sprintf(
3981 '%1$sdossier_message
3982 LEFT JOIN %1$sdossier
3983 ON dossier_message.dossier=dossier.dossier
3984 LEFT JOIN %1$sdossier_instruction_type
3985 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
3986 LEFT JOIN %1$sinstructeur
3987 ON dossier.instructeur = instructeur.instructeur
3988 LEFT JOIN %1$som_utilisateur
3989 ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
3990 LEFT JOIN %1$sinstructeur as instructeur_secondaire
3991 ON dossier.instructeur_2 = instructeur_secondaire.instructeur
3992 LEFT JOIN %1$som_utilisateur as utilisateur_2
3993 ON instructeur_secondaire.om_utilisateur = utilisateur_2.om_utilisateur
3994 LEFT JOIN %1$sdivision
3995 ON dossier.division=division.division
3996 %2$s
3997 %3$s',
3998 DB_PREFIXE,
3999 $query_ct_from_collectivite_filter,
4000 $arguments["dossier_cloture"] == "false" ?
4001 $query_ct_from_dossier_cloture_filter :
4002 ""
4003 );
4004
4005
4006 // Filtre les dossiers par contexte
4007 $query_ct_where_groupe_filter = " AND LOWER(groupe.code) != 'ctx'";
4008 if ($contexte === 'contentieux') {
4009 //
4010 $query_ct_where_groupe_filter = " AND LOWER(groupe.code) = 'ctx'";
4011 }
4012
4013 $query_ct_where_dossier_cloture_filter = "AND etat.statut != 'cloture'";
4014
4015 // WHERE - COMMON
4016 $query_ct_where_common = sprintf(
4017 "dossier_message.lu IS FALSE AND
4018 dossier_instruction_type.sous_dossier IS NOT TRUE
4019 %s
4020 %s",
4021 $query_ct_where_groupe_filter,
4022 $arguments["dossier_cloture"] == "false" ?
4023 $query_ct_where_dossier_cloture_filter :
4024 ""
4025 );
4026
4027 // Filtre du groupe
4028 $query_ct_where_groupe = "";
4029 // Gestion des groupes et confidentialité
4030 include('../sql/pgsql/filter_group_widgets.inc.php');
4031
4032 /**
4033 * Message d'aide
4034 */
4035 //
4036 $message_filtre = "";
4037 switch ($arguments["dossier_cloture"]) {
4038 case 'true':
4039 $message_filtre .= " ".__("en cours et clôturé");
4040 break;
4041 default:
4042 $message_filtre .= " ".__("en cours");
4043 break;
4044 }
4045 //
4046 switch ($filtreWidget) {
4047 case "instructeur":
4048 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4049 $message_filtre .= " ".__("dont je suis l'instructeur ou dont le destinataire est 'commune'");
4050 } else {
4051 $message_filtre .= " ".__("dont je suis l'instructeur et dont le destinataire est 'instructeur'");
4052 }
4053 break;
4054 case "division":
4055 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4056 $message_filtre .= " ".__("situés dans ma division ou dont le destinataire est 'commune'");
4057 } else {
4058 $message_filtre .= " ".__("situés dans ma division et dont le destinataire est 'instructeur'");
4059 }
4060 break;
4061 case "aucun":
4062 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4063 $message_filtre .= " ".__("situés dans ma collectivité");
4064 } else {
4065 $message_filtre .= " ".__("situés dans toutes les collectivités");
4066 }
4067 break;
4068 }
4069 //
4070 $template_message_help = __("Les messages marqués comme 'non lu' qui concernent des dossiers d'instruction%s.");
4071 //
4072 if ($contexte === 'contentieux') {
4073 //
4074 $template_message_help = __("Les messages marqués comme 'non lu' qui concernent des dossiers contentieux%s.");
4075 }
4076 //
4077 $message_help = sprintf(
4078 $template_message_help,
4079 $message_filtre
4080 );
4081
4082 /**
4083 * Return
4084 */
4085 //
4086 return array(
4087 "arguments" => $arguments,
4088 "message_help" => $message_help,
4089 "query_ct_from" => $query_ct_from,
4090 "query_ct_where_common" => $query_ct_where_common,
4091 "query_ct_where_groupe" => $query_ct_where_groupe,
4092 );
4093 }
4094
4095 /**
4096 * WIDGET DASHBOARD - Retours de consultation
4097 *
4098 * @return void
4099 */
4100 function view_widget_consultation_retours($content = null) {
4101
4102 /**
4103 * Ce widget est configurable via l'interface Web. Lors de la création
4104 * du widget dans le paramétrage il est possible de spécifier la ou les
4105 * options suivantes :
4106 *
4107 * - filtre :
4108 * = instructeur
4109 * = division
4110 * = aucun
4111 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
4112 */
4113 // Liste des paramètres
4114 $params = array("filtre", );
4115 // Formatage des arguments reçus en paramètres
4116 $arguments = $this->get_arguments($content, $params);
4117 // Récupération de la configuration du widget
4118 $conf = $this->get_config_consultation_retours($arguments);
4119 //
4120 $filtre = $conf["arguments"]["filtre"];
4121
4122 /**
4123 * Composition de la requête
4124 */
4125
4126 $query = sprintf(
4127 "SELECT
4128 count(*)
4129 FROM
4130 %s
4131 %s
4132 WHERE
4133 %s
4134 %s",
4135 $conf["query_ct_from"],
4136 '%s', // emplacement pour les jointure du filtre
4137 $conf["query_ct_where_common"],
4138 '%s' // emplacement pour les conditions du filtre
4139 );
4140 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
4141 $sqlFilter = $this->get_query_filter(
4142 $query,
4143 $conf['arguments']['filtre']
4144 );
4145 $query = sprintf(
4146 $query,
4147 $sqlFilter["FROM"],
4148 $sqlFilter["WHERE"]
4149 );
4150
4151 /**
4152 * Exécution de la requête
4153 */
4154 //
4155 $qres = $this->f->get_one_result_from_db_query(
4156 $query,
4157 array(
4158 "origin" => __METHOD__
4159 )
4160 );
4161
4162 // Affichage du message d'informations
4163 printf(
4164 $this->template_help,
4165 $conf["message_help"]
4166 );
4167
4168 //
4169 if (intval($qres['result']) === 0) {
4170 //
4171 echo __("Aucun retour de consultation non lu.");
4172 return;
4173 }
4174
4175
4176 /**
4177 *
4178 */
4179 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
4180 /**
4181 *
4182 */
4183 if ($filtre === "aucun") {
4184 $obj_href_more_link = "consultation_tous_retours";
4185 } elseif ($filtre === "division") {
4186 $obj_href_more_link = "consultation_retours_ma_division";
4187 } else {
4188 $obj_href_more_link = "consultation_mes_retours";
4189 }
4190
4191 //
4192 if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) {
4193 return;
4194 }
4195 // Affichage du footer
4196 printf(
4197 $this->template_footer,
4198 // href
4199 sprintf(
4200 OM_ROUTE_TAB.'&obj=%s&filtre=%s',
4201 $obj_href_more_link,
4202 $filtre
4203 ),
4204 // titre
4205 __("Voir +")
4206 );
4207
4208 }
4209
4210
4211 /**
4212 * Cette méthode permet de récupérer la configuration du widget 'Retours de
4213 * consultation'.
4214 *
4215 * @return array
4216 */
4217 function get_config_consultation_retours($arguments) {
4218 // Initialisation du tableau des paramètres avec ses valeurs par défaut
4219 $arguments_default = array(
4220 "filtre" => "instructeur",
4221 );
4222 // Vérification des arguments
4223 foreach ($arguments_default as $key => $value) {
4224 //
4225 if (isset($arguments[$key])) {
4226 //
4227 $elem = trim($arguments[$key]);
4228 //
4229 if ($key === "filtre"
4230 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
4231 // La valeur doit être dans cette liste
4232 $arguments[$key] = $elem;
4233 continue;
4234 }
4235 }
4236 //
4237 $arguments[$key] = $value;
4238 }
4239 //
4240 $filtre = $arguments["filtre"];
4241
4242 /**
4243 * Construction de la requête
4244 */
4245 // FROM
4246 $query_ct_from = "
4247 ".DB_PREFIXE."consultation
4248 LEFT JOIN ".DB_PREFIXE."avis_consultation
4249 ON consultation.avis_consultation=avis_consultation.avis_consultation
4250 LEFT JOIN ".DB_PREFIXE."dossier
4251 ON consultation.dossier=dossier.dossier
4252 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
4253 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
4254 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
4255 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4256 LEFT JOIN ".DB_PREFIXE."service
4257 ON consultation.service=service.service
4258 LEFT JOIN ".DB_PREFIXE."tiers_consulte
4259 ON consultation.tiers_consulte=tiers_consulte.tiers_consulte
4260 LEFT JOIN ".DB_PREFIXE."motif_consultation
4261 ON consultation.motif_consultation=motif_consultation.motif_consultation
4262 LEFT JOIN ".DB_PREFIXE."instructeur
4263 ON dossier.instructeur=instructeur.instructeur
4264 LEFT JOIN ".DB_PREFIXE."om_utilisateur
4265 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
4266 LEFT JOIN ".DB_PREFIXE."division
4267 ON dossier.division=division.division
4268 %s";
4269
4270 $query_ct_where_collectivite_filter = "";
4271
4272 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
4273 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
4274 // collectivité
4275 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4276 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
4277 ON dossier.om_collectivite=om_collectivite.om_collectivite
4278 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
4279 ";
4280 } else {
4281 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
4282 ON dossier.om_collectivite=om_collectivite.om_collectivite
4283 ";
4284 }
4285
4286 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
4287
4288 // WHERE - COMMON
4289 $query_ct_where_common = "
4290 consultation.lu IS FALSE AND
4291 dossier_instruction_type.sous_dossier IS NOT TRUE
4292 ";
4293
4294 /**
4295 * Message d'aide
4296 */
4297 //
4298 $message_filtre = "";
4299 //
4300 switch ($filtre) {
4301 case "instructeur":
4302 $message_filtre = " ".__("dont je suis l'instructeur");
4303 break;
4304 case "instructeur_secondaire":
4305 $message_filtre = " ".__("dont je suis l'instructeur secondaire");
4306 break;
4307 case "division":
4308 $message_filtre = " ".__("situés dans ma division");
4309 break;
4310 case "aucun":
4311 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4312 $message_filtre = " ".__("situés dans ma collectivité");
4313 } else {
4314 $message_filtre = " ".__("situés dans toutes les collectivités");
4315 }
4316 break;
4317 }
4318 //
4319 $message_help = sprintf(
4320 __("Les consultations marquées comme 'non lu' qui concernent des ".
4321 "dossiers d'instruction%s."),
4322 $message_filtre
4323 );
4324
4325 /**
4326 * Return
4327 */
4328 //
4329 return array(
4330 "arguments" => $arguments,
4331 "message_help" => $message_help,
4332 "query_ct_from" => $query_ct_from,
4333 "query_ct_where_common" => $query_ct_where_common,
4334 );
4335 }
4336
4337
4338 /**
4339 * WIDGET DASHBOARD - widget_commission_retours
4340 *
4341 * Ce widget est configurable via l'interface Web. Lors de la création
4342 * du widget dans le paramétrage il est possible de spécifier la ou les
4343 * options suivantes :
4344 *
4345 * - filtre :
4346 * = instructeur
4347 * = division
4348 * = aucun
4349 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
4350 *
4351 * @param string $content Arguments pour le widget, ici les filtres.
4352 * @return void
4353 */
4354 function view_widget_commission_retours($content = null) {
4355 // Liste des paramètres
4356 $params = array("filtre", );
4357 // Formatage des arguments reçus en paramètres
4358 $arguments = $this->get_arguments($content, $params);
4359 // Récupération de la configuration du widget
4360 $conf = $this->get_config_commission_retours($arguments);
4361 //
4362 $filtre = $conf["arguments"]["filtre"];
4363
4364 /**
4365 * Composition de la requête
4366 */
4367
4368 $query = sprintf(
4369 "SELECT
4370 count(*)
4371 FROM
4372 %s
4373 %s
4374 WHERE
4375 %s
4376 %s",
4377 $conf["query_ct_from"],
4378 '%s', // emplacement pour les jointure du filtre
4379 $conf["query_ct_where_common"],
4380 '%s' // emplacement pour les conditions du filtre
4381 );
4382 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
4383 $sqlFilter = $this->get_query_filter(
4384 $query,
4385 $conf['arguments']['filtre']
4386 );
4387 $query = sprintf(
4388 $query,
4389 $sqlFilter["FROM"],
4390 $sqlFilter["WHERE"]
4391 );
4392
4393 /**
4394 * Exécution de la requête
4395 */
4396 //
4397 $qres = $this->f->get_one_result_from_db_query(
4398 $query,
4399 array(
4400 "origin" => __METHOD__
4401 )
4402 );
4403
4404 // Affichage du message d'informations
4405 printf(
4406 $this->template_help,
4407 $conf["message_help"]
4408 );
4409
4410 if (intval($qres['result']) === 0) {
4411 //
4412 echo __("Aucun retour de commission non lu.");
4413 return;
4414 }
4415
4416
4417 /**
4418 * Panel
4419 */
4420 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
4421
4422 /**
4423 * Widget footer
4424 */
4425 if ($filtre === "aucun") {
4426 $obj_href_more_link = "commission_tous_retours";
4427 } elseif ($filtre === "division") {
4428 $obj_href_more_link = "commission_retours_ma_division";
4429 } else {
4430 $obj_href_more_link = "commission_mes_retours";
4431 }
4432
4433 //
4434 if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link . "_tab"), "OR")) {
4435 return;
4436 }
4437 // Affichage du footer
4438 printf(
4439 $this->template_footer,
4440 // href
4441 sprintf(
4442 '%s&obj=%s&filtre=%s',
4443 OM_ROUTE_TAB,
4444 $obj_href_more_link,
4445 $filtre
4446 ),
4447 // titre
4448 __("Voir +")
4449 );
4450 }
4451
4452 /**
4453 * Cette méthode permet de récupérer la configuration du widget 'Retours de
4454 * consultation'.
4455 *
4456 * @return array
4457 */
4458 function get_config_commission_retours($arguments) {
4459 // Initialisation du tableau des paramètres avec ses valeurs par défaut
4460 $arguments_default = array(
4461 "filtre" => "instructeur",
4462 );
4463 // Vérification des arguments
4464 foreach ($arguments_default as $key => $value) {
4465 //
4466 if (isset($arguments[$key])) {
4467 //
4468 $elem = trim($arguments[$key]);
4469 //
4470 if ($key === "filtre"
4471 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
4472 // La valeur doit être dans cette liste
4473 $arguments[$key] = $elem;
4474 continue;
4475 }
4476 }
4477 //
4478 $arguments[$key] = $value;
4479 }
4480 //
4481 $filtre = $arguments["filtre"];
4482
4483 /**
4484 * Construction de la requête
4485 */
4486 // FROM
4487 $query_ct_from ="
4488 " . DB_PREFIXE . "dossier_commission
4489 LEFT JOIN " . DB_PREFIXE . "dossier
4490 ON dossier_commission.dossier=dossier.dossier
4491 LEFT JOIN " . DB_PREFIXE . "dossier_instruction_type
4492 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
4493 LEFT JOIN " . DB_PREFIXE . "commission
4494 ON dossier_commission.commission=commission.commission
4495 LEFT JOIN " . DB_PREFIXE . "commission_type
4496 ON commission_type.commission_type=commission.commission_type
4497 LEFT JOIN ".DB_PREFIXE."instructeur
4498 ON dossier.instructeur=instructeur.instructeur
4499 LEFT JOIN ".DB_PREFIXE."om_utilisateur
4500 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
4501 LEFT JOIN ".DB_PREFIXE."division
4502 ON dossier.division=division.division
4503 %s";
4504
4505 $query_ct_where_collectivite_filter = "";
4506
4507 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
4508 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
4509 // collectivité
4510 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4511 $query_ct_where_collectivite_filter = " JOIN " . DB_PREFIXE . "om_collectivite
4512 ON dossier.om_collectivite=om_collectivite.om_collectivite
4513 AND om_collectivite.om_collectivite=" . $_SESSION['collectivite'] . "
4514 ";
4515 } else {
4516 $query_ct_where_collectivite_filter = " LEFT JOIN " . DB_PREFIXE . "om_collectivite
4517 ON dossier.om_collectivite=om_collectivite.om_collectivite
4518 ";
4519 }
4520
4521 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
4522
4523 // WHERE - COMMON
4524 $query_ct_where_common = "
4525 dossier_commission.lu IS FALSE AND
4526 dossier_instruction_type.sous_dossier IS NOT TRUE
4527 ";
4528
4529 /**
4530 * Message d'aide
4531 */
4532 //
4533 $message_filtre = "";
4534 //
4535 switch ($filtre) {
4536 case "instructeur":
4537 $message_filtre = " " . __("dont je suis l'instructeur");
4538 break;
4539 case "instructeur_secondaire":
4540 $message_filtre = " " . __("dont je suis l'instructeur secondaire");
4541 break;
4542 case "division":
4543 $message_filtre = " " . __("situés dans ma division");
4544 break;
4545 case "aucun":
4546 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4547 $message_filtre = " " . __("situés dans ma collectivité");
4548 } else {
4549 $message_filtre = " " . __("situés dans toutes les collectivités");
4550 }
4551 break;
4552 }
4553 //
4554 $message_help = sprintf(
4555 __("Les retours de commission marqués comme 'non lu' qui concernent des " .
4556 "dossiers d'instruction%s."),
4557 $message_filtre
4558 );
4559
4560 return array(
4561 "arguments" => $arguments,
4562 "message_help" => $message_help,
4563 "query_ct_from" => $query_ct_from,
4564 "query_ct_where_common" => $query_ct_where_common,
4565 );
4566
4567 }
4568
4569
4570 /**
4571 * WIDGET DASHBOARD - Dossiers incomplets ou majorés sans date de notification
4572 *
4573 * @return void
4574 */
4575 function view_widget_dossiers_evenement_incomplet_majoration($content = null) {
4576
4577 /**
4578 * Ce widget est configurable via l'interface Web. Lors de la création
4579 * du widget dans le paramétrage il est possible de spécifier la ou les
4580 * options suivantes :
4581 *
4582 * - filtre :
4583 * = instructeur
4584 * = division
4585 * = aucun
4586 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
4587 */
4588 // Liste des paramètres
4589 $params = array("filtre", "affichage");
4590 // Formatage des arguments reçus en paramètres
4591 $arguments = $this->get_arguments($content, $params);
4592 // Récupération de la configuration du widget
4593 $conf = $this->get_config_dossiers_evenement_incomplet_majoration($arguments);
4594 //
4595 $filtre = $conf["arguments"]["filtre"];
4596
4597 /**
4598 * Composition de la requête
4599 */
4600 // Gestion de la requête selon le type d'affichage
4601 $query_ct_orderby = sprintf(
4602 "ORDER BY
4603 %s
4604 LIMIT 10",
4605 $conf["query_ct_orderby"]
4606 );
4607 $query_ct_select = $conf["query_ct_select"];
4608 if ($conf["arguments"]["affichage"] === "nombre") {
4609 $query_ct_orderby = "";
4610 $query_ct_select = "COUNT(*)";
4611 }
4612
4613 $query = sprintf(
4614 "SELECT
4615 %s
4616 FROM
4617 %s
4618 %s
4619 WHERE
4620 %s
4621 %s
4622 %s
4623 %s",
4624 $query_ct_select,
4625 $conf["query_ct_from"],
4626 '%s', // emplacement pour les jointure du filtre
4627 $conf["query_ct_where_common"],
4628 $conf["query_ct_where_groupe"],
4629 '%s', // emplacement pour les conditions du filtre
4630 $query_ct_orderby
4631 );
4632 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
4633 $sqlFilter = $this->get_query_filter(
4634 $query,
4635 $conf['arguments']['filtre']
4636 );
4637 $query = sprintf(
4638 $query,
4639 $sqlFilter["FROM"],
4640 $sqlFilter["WHERE"]
4641 );
4642
4643 /**
4644 * Template nécessaires à l'affichage du widget
4645 */
4646 if ($conf["arguments"]["affichage"] === "nombre") {
4647 // Exécution de la requête
4648 $qres = $this->f->get_one_result_from_db_query(
4649 $query,
4650 array(
4651 "origin" => __METHOD__
4652 )
4653 );
4654
4655 // Affichage du message d'informations
4656 printf(
4657 $this->template_help,
4658 $conf["message_help"]
4659 );
4660 // Si il n'y a aucun dossier à afficher
4661 if (intval($qres['result']) == 0) {
4662 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.");
4663 return;
4664 }
4665
4666 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
4667 } else {
4668 // Exécution de la requête
4669 $qres = $this->f->get_all_results_from_db_query(
4670 $query,
4671 array(
4672 'origin' => __METHOD__
4673 )
4674 );
4675
4676 // Affichage du message d'informations
4677 printf(
4678 $this->template_help,
4679 $conf["message_help"]
4680 );
4681 // Si il n'y a aucun dossier à afficher
4682 if ($qres['row_count'] === 0) {
4683 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.");
4684 return;
4685 }
4686
4687 // Bouton consulter
4688 $template_btn_consulter = '
4689 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
4690 .__('Consulter')
4691 .'</span>
4692 ';
4693
4694 $template_table = '
4695 <table class="tab-tab">
4696 <thead>
4697 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
4698 <th class="title col-0 firstcol">
4699 <span class="name">
4700 %s
4701 </span>
4702 </th>
4703 <th class="title col-1">
4704 <span class="name">
4705 %s
4706 </span>
4707 </th>
4708 <th class="title col-2 lastcol">
4709 <span class="name">
4710 %s
4711 </span>
4712 </th>
4713 </tr>
4714 </thead>
4715 <tbody>
4716 %s
4717 </tbody>
4718 </table>
4719 ';
4720
4721 // Données dans le tableau
4722 //
4723 $template_line = '
4724 <tr class="tab-data odd">
4725 <td class="col-1 firstcol">
4726 %s
4727 </td>
4728 <td class="col-1">
4729 %s
4730 </td>
4731 <td class="col-2 lastcol">
4732 %s
4733 </td>
4734 </tr>
4735 ';
4736 //
4737 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&amp;action=3&amp;idx=%s';
4738 //
4739 $template_link = '
4740 <a class="lienTable" href="%s">
4741 %s
4742 </a>
4743 ';
4744
4745 /**
4746 * Si il y a des dossiers à afficher, alors on affiche le widget.
4747 */
4748 // On construit le contenu du tableau
4749 $ct_tbody = '';
4750 foreach ($qres['result'] as $row) {
4751 // On construit l'attribut href du lien
4752 $ct_href = sprintf(
4753 $template_href,
4754 // idx
4755 $row["dossier"]
4756 );
4757 // On construit la ligne
4758 $ct_tbody .= sprintf(
4759 $template_line,
4760 // Colonne 1 - Bouton consulter
4761 sprintf(
4762 $template_link,
4763 $ct_href,
4764 $template_btn_consulter
4765 ),
4766 // Colonne 2 - Numéro de dossier
4767 sprintf(
4768 $template_link,
4769 $ct_href,
4770 $row["dossier_libelle"]
4771 ),
4772 // Colonne 3 - Date de dépôt
4773 sprintf(
4774 $template_link,
4775 $ct_href,
4776 $this->f->formatDate($row["date_depot"])
4777 )
4778 );
4779 }
4780 // Affichage du tableau listant les dossiers
4781 printf(
4782 $template_table,
4783 // Colonne 1 - Bouton consulter
4784 '',
4785 // Colonne 2 - Numéro de dossier
4786 __('dossier'),
4787 // Colonne 3 - Date de dépôt du dossier
4788 __('date_depot'),
4789 // Contenu du tableau
4790 $ct_tbody
4791 );
4792 }
4793
4794 // Affichage du footer
4795 printf(
4796 $this->template_footer,
4797 // href (avec les paramètres du widget)
4798 sprintf(
4799 OM_ROUTE_TAB."&obj=dossiers_evenement_incomplet_majoration&filtre=%s",
4800 $filtre
4801 ),
4802 // titre
4803 __("Voir tous les dossiers d'instruction avec un événement d'incomplétude ou de majoration de délai sans date de notification")
4804 );
4805 }
4806
4807
4808 /**
4809 * Cette méthode permet de récupérer la configuration du widget 'Retours de
4810 * consultation'.
4811 *
4812 * @return array
4813 */
4814 function get_config_dossiers_evenement_incomplet_majoration($arguments) {
4815 include "../sql/pgsql/app_om_tab_common_select.inc.php";
4816 // Initialisation du tableau des paramètres avec ses valeur par défaut
4817 $arguments_default = array(
4818 "filtre" => "instructeur",
4819 "affichage" => "liste"
4820 );
4821 // Vérification des arguments
4822 foreach ($arguments_default as $key => $value) {
4823 //
4824 if (isset($arguments[$key])) {
4825 //
4826 $elem = trim($arguments[$key]);
4827 //
4828 if ($key === "filtre"
4829 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
4830 // La valeur doit être dans cette liste
4831 $arguments[$key] = $elem;
4832 continue;
4833 } elseif ($key === "affichage"
4834 && in_array($elem, array('liste', 'nombre'))) {
4835 // La valeur doit être dans cette liste
4836 $arguments[$key] = $elem;
4837 continue;
4838 }
4839 }
4840 //
4841 $arguments[$key] = $value;
4842 }
4843 //
4844 $filtre = $arguments["filtre"];
4845
4846 /**
4847 * Construction de la requête
4848 */
4849 // SELECT
4850 $query_ct_select = "
4851 dossier.dossier,
4852 $select__dossier_libelle__column as dossier_libelle,
4853 dossier.date_depot
4854 ";
4855 // SELECT - CHAMPAFFICHE
4856 $query_ct_select_champaffiche = array_merge(
4857 $array_base_ct_select_champaffiche,
4858 array(
4859 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("date_depot").'"'
4860 ));
4861 // FROM
4862 $query_ct_from = "
4863 ".DB_PREFIXE."dossier
4864 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
4865 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
4866 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
4867 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
4868 LEFT JOIN
4869 ".DB_PREFIXE."instruction
4870 ON
4871 dossier.dossier = instruction.dossier
4872 LEFT JOIN
4873 ".DB_PREFIXE."evenement
4874 ON
4875 instruction.evenement = evenement.evenement
4876 LEFT JOIN (".DB_PREFIXE."demande
4877 JOIN ".DB_PREFIXE."demande_type
4878 ON demande.demande_type = demande_type.demande_type
4879 )
4880 ON demande.dossier_instruction = dossier.dossier
4881 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
4882 LEFT JOIN ".DB_PREFIXE."instructeur
4883 ON dossier.instructeur=instructeur.instructeur
4884 LEFT JOIN ".DB_PREFIXE."om_utilisateur
4885 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
4886 LEFT JOIN ".DB_PREFIXE."division
4887 ON dossier.division=division.division
4888 %s
4889 ";
4890
4891 $query_ct_where_collectivite_filter = "";
4892
4893 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
4894 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
4895 // collectivité
4896 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4897 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
4898 ON dossier.om_collectivite=om_collectivite.om_collectivite
4899 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
4900 ";
4901 } else {
4902 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
4903 ON dossier.om_collectivite=om_collectivite.om_collectivite
4904 ";
4905 }
4906
4907 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
4908
4909 // WHERE - COMMON
4910 $query_ct_where_common = "
4911 (
4912 LOWER(evenement.type) = 'incompletude' OR
4913 LOWER(evenement.type) = 'majoration_delai'
4914 ) AND
4915 (
4916 instruction.date_envoi_rar > CURRENT_TIMESTAMP - interval '1 month' AND
4917 instruction.date_envoi_rar <= CURRENT_TIMESTAMP
4918 ) AND
4919 instruction.date_retour_rar IS NULL AND
4920 evenement.retour = 'f'
4921 ";
4922
4923 // ORDER BY
4924 $query_ct_orderby = "
4925 dossier.date_depot desc
4926 ";
4927
4928 $query_ct_where_groupe = "";
4929 // Gestion des groupes et confidentialité
4930 include('../sql/pgsql/filter_group_widgets.inc.php');
4931
4932 /**
4933 * Message d'aide
4934 */
4935 //
4936 $message_filtre = "";
4937 //
4938 switch ($filtre) {
4939 case "instructeur":
4940 $message_filtre = " ".__("dont je suis l'instructeur");
4941 break;
4942 case "instructeur_secondaire":
4943 $message_filtre = " ".__("dont je suis l'instructeur secondaire");
4944 break;
4945 case "division":
4946 $message_filtre = " ".__("situés dans ma division");
4947 break;
4948 case "aucun":
4949 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
4950 $message_filtre = " ".__("situés dans ma collectivité");
4951 } else {
4952 $message_filtre = " ".__("situés dans toutes les collectivités");
4953 }
4954 break;
4955 }
4956 //
4957 $message_help = sprintf(
4958 __("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."),
4959 $message_filtre
4960 );
4961
4962 /**
4963 * Return
4964 */
4965 //
4966 return array(
4967 "arguments" => $arguments,
4968 "message_help" => $message_help,
4969 "query_ct_select" => $query_ct_select,
4970 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
4971 "query_ct_from" => $query_ct_from,
4972 "query_ct_where_common" => $query_ct_where_common,
4973 "query_ct_where_groupe" => $query_ct_where_groupe,
4974 "query_ct_orderby" => $query_ct_orderby,
4975 );
4976 }
4977
4978
4979 /**
4980 * WIDGET DASHBOARD - widget_infos_profil.
4981 */
4982 function view_widget_infos_profil($content = null) {
4983
4984 /**
4985 * Template nécessaires à l'affichage du widget
4986 */
4987 //
4988 $template_table = '
4989 </br>
4990 <h4>Liste des accès</h4>
4991 <table class="tab-tab">
4992 <thead>
4993 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
4994 <th class="title col-0 firstcol">
4995 <span class="name">
4996 %s
4997 </span>
4998 </th>
4999 <th class="title col-1">
5000 <span class="name">
5001 %s
5002 </span>
5003 </th>
5004 <th class="title col-2 lastcol">
5005 <span class="name">
5006 %s
5007 </span>
5008 </th>
5009 </tr>
5010 </thead>
5011 <tbody>
5012 %s
5013 </tbody>
5014 </table>
5015 ';
5016 //
5017 $template_line = '
5018 <tr class="tab-data odd">
5019 <td class="col-1 firstcol">
5020 %s
5021 </td>
5022 <td class="col-1">
5023 %s
5024 </td>
5025 <td class="col-2 lastcol">
5026 %s
5027 </td>
5028 </tr>
5029 ';
5030
5031
5032 // Récupère les informations sur l'utilisateur
5033 $this->f->getUserInfos();
5034
5035 // Si l'utilisateur est loggé $_SESSION existe
5036 if(isset($_SESSION['login']) && !empty($_SESSION['login'])) {
5037
5038 // On compose le bloc html d'affichage des informations de l'utilisateur
5039 $bloc_infos_profil = "
5040 %s
5041 <div class=\"profil-infos\">
5042 <h4>Utilisateur</h4>
5043 <div class=\"profil-infos-profil\">
5044 <span class=\"libelle\">%s</span> : <span class=\"value\">%s</span>
5045 </div>
5046 <div class=\"profil-infos-nom\">
5047 <span class=\"libelle\">%s</span> : <span class=\"value\">%s</span>
5048 </div>
5049 ";
5050
5051 // Si l'utilisateur connecté est un instructeur
5052 if ($this->f->isUserInstructeur() === true) {
5053
5054 // On compose le bloc html d'affichage des informations de l'utilisateur
5055 $bloc_infos_profil .= "
5056 <div class=\"profil-infos-division\">
5057 <span class=\"libelle\">%s</span> : <span class=\"value\">%s</span>
5058 </div>
5059 ";
5060
5061 // Requête de récupération de la qualité de l'instructeur
5062 $qres = $this->f->get_one_result_from_db_query(
5063 sprintf(
5064 'SELECT
5065 instructeur_qualite.libelle
5066 FROM
5067 %1$sinstructeur
5068 INNER JOIN %1$sinstructeur_qualite
5069 ON instructeur.instructeur_qualite=instructeur_qualite.instructeur_qualite
5070 WHERE
5071 instructeur.om_utilisateur = %2$s',
5072 DB_PREFIXE,
5073 intval($this->f->om_utilisateur["om_utilisateur"])
5074 ),
5075 array(
5076 "origin" => __METHOD__
5077 )
5078 );
5079 // S'il y a un résultat
5080 if ($qres['result'] !== null) {
5081 $bloc_infos_profil .= sprintf(
5082 '<div class="profil-infos-instructeur_qualite">
5083 <span class="libelle">
5084 %1$s
5085 </span>
5086 :
5087 <span class="value">
5088 %2$s
5089 </span>
5090 </div>',
5091 __("Qualité"),
5092 $qres['result']
5093 );
5094 }
5095 } else {
5096 // Pour éviter une NOTICE
5097 $this->f->om_utilisateur["code"] = '';
5098 }
5099 //
5100 $bloc_infos_profil .= "</div>";
5101
5102 // Ajout d'un tableau listant les groupes de l'utilisateur ainsi que ses
5103 // accès aux groupes
5104 $msg_erreur_groupe = '';
5105 $bloc_tableau_droits = '';
5106 // Si le profil et l'utilisateur n'ont pas de groupe défini
5107 if (isset($_SESSION['groupe']) === false) {
5108 $msg_erreur_groupe = '
5109 <div class="message ui-widget ui-corner-all ui-state-highlight ui-state-error borderless">
5110 <p>
5111 <span class="ui-icon ui-icon-info"></span>
5112 <span class="text">Problème de paramétrage : vous n\'avez pas de groupe associé.</span>
5113 </p>
5114 </div>
5115 ';
5116 } else {
5117 $ct_tbody = '';
5118 // On construit le contenu du tableau
5119 foreach ($_SESSION['groupe'] as $key => $value) {
5120 if ($value['confidentiel'] === true) {
5121 $value['confidentiel'] = __('Oui');
5122 }
5123 else {
5124 $value['confidentiel'] = __('Non');
5125 }
5126 if ($value['enregistrement_demande'] === true) {
5127 $value['enregistrement_demande'] = __('Oui');
5128 }
5129 else {
5130 $value['enregistrement_demande'] = __('Non');
5131 }
5132 // On construit la ligne
5133 $ct_tbody .= sprintf(
5134 $template_line,
5135 // Colonne 1 - Libellé du groupe
5136 $value["libelle"],
5137 // Colonne 2 - A accès aux dossiers confidentiels
5138 $value["confidentiel"],
5139 // Colonne 3 - Peut créer une demande
5140 $value["enregistrement_demande"]
5141 );
5142 }
5143 // Affichage du tableau listant les dossiers
5144 $bloc_infos_profil .= sprintf(
5145 $template_table,
5146 // Colonne 1 - Libellé du groupe
5147 __('groupe'),
5148 // Colonne 2 - A accès aux dossiers confidentiels
5149 __('dossiers confidentiels'),
5150 // Colonne 3 - Peut créer une demande
5151 __('enregistrement demande'),
5152 // Contenu du tableau
5153 $ct_tbody
5154 );
5155 }
5156 // Affichage du bloc html avec les variables associées
5157 printf(
5158 $bloc_infos_profil,
5159 $msg_erreur_groupe,
5160 __('Profil'), $this->f->om_utilisateur["libelle_profil"],
5161 __('Nom'), $this->f->om_utilisateur["nom"],
5162 __('Division'), $this->f->om_utilisateur["code"]
5163 );
5164 }
5165 }
5166
5167
5168 /**
5169 * Cette méthode permet de récupérer la configuration du widget
5170 * 'Mes contradictoires' ou 'Les contradictoires'.
5171 *
5172 * @return array
5173 */
5174 function get_config_dossier_contentieux_contradictoire($arguments) {
5175 include "../sql/pgsql/app_om_tab_common_select.inc.php";
5176 // Initialisation du tableau des paramètres avec ses valeur par défaut
5177 $arguments_default = array(
5178 "filtre" => "instructeur",
5179 "affichage" => "liste"
5180 );
5181 // Vérification des arguments
5182 foreach ($arguments_default as $key => $value) {
5183 //
5184 if (isset($arguments[$key])) {
5185 //
5186 $elem = trim($arguments[$key]);
5187 //
5188 if ($key === "filtre"
5189 && in_array($elem, array("instructeur", "division", "aucun"))) {
5190 // La valeur doit être dans cette liste
5191 $arguments[$key] = $elem;
5192 continue;
5193 } elseif ($key === "affichage"
5194 && in_array($elem, array('liste', 'nombre'))) {
5195 // La valeur doit être dans cette liste
5196 $arguments[$key] = $elem;
5197 continue;
5198 }
5199 }
5200 //
5201 $arguments[$key] = $value;
5202 }
5203 // Utilisation du filtre instructeur dédié au contentieux si le filtre
5204 // paramétré est "instructeur"
5205 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
5206 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
5207 }
5208 $filtre = $arguments["filtre"];
5209
5210 // SELECT - CHAMPAFFICHE
5211 $case_contrevenant = "
5212 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
5213 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
5214 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
5215 END
5216 ";
5217 //
5218 $query_ct_select_champaffiche = array_merge(
5219 $array_base_ct_select_champaffiche,
5220 array(
5221 $trim_concat_terrain.'as "'.__("localisation").'"',
5222 $case_contrevenant.' as "'.__("contrevenant").'"',
5223 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
5224 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
5225 'etat.libelle as "'.__("etat").'"',
5226 'to_char(dossier.date_contradictoire, \'DD/MM/YYYY\') as "'.__("date_contradictoire").'"',
5227 'to_char(dossier.date_retour_contradictoire, \'DD/MM/YYYY\') as "'.__("date_retour_contradictoire").'"',
5228 ));
5229
5230 /**
5231 * Construction de la requête
5232 */
5233 // SELECT
5234 $query_ct_select = "
5235 dossier.dossier,
5236 $select__dossier_libelle__column as dossier_libelle,
5237 dossier.date_contradictoire,
5238 dossier.date_retour_contradictoire
5239 ";
5240
5241 // FROM
5242 $query_ct_from = "
5243 ".DB_PREFIXE."dossier
5244 LEFT JOIN ".DB_PREFIXE."etat
5245 ON dossier.etat = etat.etat
5246 LEFT JOIN (
5247 SELECT *
5248 FROM ".DB_PREFIXE."lien_dossier_demandeur
5249 INNER JOIN ".DB_PREFIXE."demandeur
5250 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5251 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
5252 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
5253 ) as demandeur_contrevenant
5254 ON demandeur_contrevenant.dossier = dossier.dossier
5255 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5256 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5257 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5258 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5259 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5260 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5261 LEFT JOIN ".DB_PREFIXE."avis_decision
5262 ON avis_decision.avis_decision=dossier.avis_decision
5263 LEFT JOIN (".DB_PREFIXE."demande
5264 JOIN ".DB_PREFIXE."demande_type
5265 ON demande.demande_type = demande_type.demande_type
5266 )
5267 ON demande.dossier_instruction = dossier.dossier
5268 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
5269 %s
5270 ";
5271
5272 $query_ct_where_collectivite_filter = "";
5273
5274 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
5275 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
5276 // collectivité
5277 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5278 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
5279 ON dossier.om_collectivite=om_collectivite.om_collectivite
5280 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
5281 ";
5282 } else {
5283 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
5284 ON dossier.om_collectivite=om_collectivite.om_collectivite
5285 ";
5286 }
5287
5288 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
5289
5290 // WHERE - COMMON
5291 $query_ct_where_common = "
5292 LOWER(dossier_autorisation_type.code) = LOWER('IN')
5293 AND NOT EXISTS
5294 (SELECT NULL
5295 FROM ".DB_PREFIXE."instruction
5296 INNER JOIN ".DB_PREFIXE."evenement
5297 ON instruction.evenement = evenement.evenement
5298 WHERE instruction.dossier = dossier.dossier
5299 AND evenement.type = 'annul_contradictoire')
5300 AND (dossier.date_contradictoire >= CURRENT_DATE + interval '3 weeks'
5301 OR (dossier.date_contradictoire IS NOT NULL
5302 AND dossier.date_retour_contradictoire IS NULL))
5303 AND date_ait IS NULL
5304 ";
5305
5306 // ORDER BY
5307 $query_ct_orderby = "
5308 dossier.date_depot ASC
5309 ";
5310
5311 $query_ct_where_groupe = "";
5312 // Gestion des groupes et confidentialité
5313 include('../sql/pgsql/filter_group_widgets.inc.php');
5314
5315 /**
5316 * Message d'aide
5317 */
5318 //
5319 $message_filtre = "";
5320 //
5321 switch ($filtre) {
5322 case "instructeur_ou_instructeur_secondaire":
5323 $message_filtre = " ".__("dont je suis l'instructeur");
5324 break;
5325 case "instructeur_secondaire":
5326 $message_filtre = " ".__("dont je suis l'instructeur secondaire");
5327 break;
5328 case "division":
5329 $message_filtre = " ".__("situés dans ma division");
5330 break;
5331 case "aucun":
5332 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5333 $message_filtre = " ".__("situés dans ma collectivité");
5334 } else {
5335 $message_filtre = " ".__("situés dans toutes les collectivités");
5336 }
5337 break;
5338 }
5339 //
5340 $message_help = sprintf(
5341 __("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éé."),
5342 $message_filtre
5343 );
5344
5345 /**
5346 * Return
5347 */
5348 //
5349 return array(
5350 "arguments" => $arguments,
5351 "message_help" => $message_help,
5352 "query_ct_select" => $query_ct_select,
5353 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
5354 "query_ct_from" => $query_ct_from,
5355 "query_ct_where" => $query_ct_where_common,
5356 "query_ct_where_groupe" => $query_ct_where_groupe,
5357 "query_ct_orderby" => $query_ct_orderby,
5358 );
5359 }
5360
5361 /**
5362 * WIDGET DASHBOARD - Les ou Mes dossiers contradictoires
5363 * @return void
5364 */
5365 function view_widget_dossier_contentieux_contradictoire($content = null) {
5366 /**
5367 * Ce widget est configurable via l'interface Web. Lors de la création
5368 * du widget dans le paramétrage il est possible de spécifier la ou les
5369 * options suivantes :
5370 * - filtre :
5371 * = instructeur
5372 * = division
5373 * = aucun
5374 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
5375 */
5376 // Liste des paramètres
5377 $params = array("filtre", "affichage");
5378 // Formatage des arguments reçus en paramètres
5379 $arguments = $this->get_arguments($content, $params);
5380 // Récupération de la configuration du widget
5381 $conf = $this->get_config_dossier_contentieux_contradictoire($arguments);
5382
5383 $filtre = $conf["arguments"]["filtre"];
5384 //
5385
5386
5387 /**
5388 * Composition de la requête
5389 */
5390 // Gestion de la requête selon le type d'affichage
5391 $query_ct_orderby = sprintf(
5392 "ORDER BY
5393 %s
5394 LIMIT 10",
5395 $conf["query_ct_orderby"]
5396 );
5397 $query_ct_select = $conf["query_ct_select"];
5398 if ($conf["arguments"]["affichage"] === "nombre") {
5399 $query_ct_orderby = "";
5400 $query_ct_select = "COUNT(*)";
5401 }
5402
5403 $query = sprintf(
5404 "SELECT
5405 %s
5406 FROM
5407 %s
5408 %s
5409 WHERE
5410 %s
5411 %s
5412 %s
5413 %s",
5414 $query_ct_select,
5415 $conf["query_ct_from"],
5416 '%s', // emplacement pour les jointure du filtre
5417 $conf["query_ct_where"],
5418 $conf["query_ct_where_groupe"],
5419 '%s', // emplacement pour les conditions du filtre
5420 $query_ct_orderby
5421 );
5422 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
5423 $sqlFilter = $this->get_query_filter(
5424 $query,
5425 $conf['arguments']['filtre']
5426 );
5427 $query = sprintf(
5428 $query,
5429 $sqlFilter["FROM"],
5430 $sqlFilter["WHERE"]
5431 );
5432
5433 /**
5434 * Template nécessaires à l'affichage du widget
5435 */
5436 if ($conf["arguments"]["affichage"] === "nombre") {
5437 // Exécution de la requête
5438 $qres = $this->f->get_one_result_from_db_query(
5439 $query,
5440 array(
5441 "origin" => __METHOD__
5442 )
5443 );
5444
5445 // Affichage du message d'informations
5446 printf(
5447 $this->template_help,
5448 $conf["message_help"]
5449 );
5450 // Si il n'y a aucun dossier à afficher
5451 if (intval($qres['result']) == 0) {
5452 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éé.");
5453 return;
5454 }
5455
5456 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
5457 } else {
5458 // Exécution de la requête
5459 $qres = $this->f->get_all_results_from_db_query(
5460 $query,
5461 array(
5462 'origin' => __METHOD__
5463 )
5464 );
5465
5466 // Affichage du message d'informations
5467 printf(
5468 $this->template_help,
5469 $conf["message_help"]
5470 );
5471 // Si il n'y a aucun dossier à afficher
5472 if ($qres['row_count'] === 0) {
5473 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éé.");
5474 return;
5475 }
5476 //
5477 $template_table = '
5478 <table class="tab-tab">
5479 <thead>
5480 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
5481 <th class="title col-0 firstcol">
5482 <span class="name">
5483 %s
5484 </span>
5485 </th>
5486 <th class="title col-1">
5487 <span class="name">
5488 %s
5489 </span>
5490 </th>
5491 <th class="title col-2">
5492 <span class="name">
5493 %s
5494 </span>
5495 </th>
5496 <th class="title col-3 lastcol">
5497 <span class="name">
5498 %s
5499 </span>
5500 </th>
5501 </tr>
5502 </thead>
5503 <tbody>
5504 %s
5505 </tbody>
5506 </table>
5507 ';
5508 //
5509 $template_line = '
5510 <tr class="tab-data odd">
5511 <td class="col-0 firstcol">
5512 %s
5513 </td>
5514 <td class="col-1 ">
5515 %s
5516 </td>
5517 <td class="col-2">
5518 %s
5519 </td>
5520 <td class="col-3 lastcol">
5521 %s
5522 </td>
5523 </tr>
5524 ';
5525 //
5526 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
5527 //
5528 $template_link = '
5529 <a class="lienTable" href="%s">
5530 %s
5531 </a>
5532 ';
5533 // Bouton consulter
5534 $template_btn_consulter = '
5535 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
5536 .__('Consulter')
5537 .'</span>
5538 ';
5539 //
5540
5541 /**
5542 * Si il y a des dossiers à afficher, alors on affiche le widget.
5543 */
5544 // On construit le contenu du tableau
5545 $ct_tbody = '';
5546 foreach ($qres['result'] as $row) {
5547 // On construit l'attribut href du lien
5548 $ct_href = sprintf(
5549 $template_href,
5550 // idx
5551 $row["dossier"]
5552 );
5553 // On construit la ligne
5554 $ct_tbody .= sprintf(
5555 $template_line,
5556 // Colonne 1 - Numéro de dossier
5557 sprintf(
5558 $template_link,
5559 $ct_href,
5560 $template_btn_consulter
5561 ),
5562 // Colonne 2 - Numéro de dossier
5563 sprintf(
5564 $template_link,
5565 $ct_href,
5566 $row["dossier_libelle"]
5567 ),
5568 // Colonne 3 - Date contradictoire
5569 sprintf(
5570 $template_link,
5571 $ct_href,
5572 $this->f->formatDate($row["date_contradictoire"])
5573 ),
5574 // Colonne 4 - Date retour contradictoire
5575 sprintf(
5576 $template_link,
5577 $ct_href,
5578 $this->f->formatDate($row["date_retour_contradictoire"])
5579 )
5580 );
5581 }
5582 // Affichage du tableau listant les dossiers
5583 printf(
5584 $template_table,
5585 // Colonne 1 - Consulter
5586 '',
5587 // Colonne 2 - Numéro de dossier
5588 __('dossier'),
5589 // Colonne 3 - Date contradictoire
5590 __('date_contradictoire'),
5591 // Colonne 4 - Date retour contradictoire
5592 __('date_retour_contradictoire'),
5593 // Le Contenu
5594 $ct_tbody
5595 );
5596 }
5597 // Affichage du footer
5598 printf(
5599 $this->template_footer,
5600 OM_ROUTE_TAB."&obj=dossier_contentieux_contradictoire&filtre=" . $filtre,
5601 __("Voir +")
5602 );
5603 }
5604
5605
5606 /**
5607 * Cette méthode permet de récupérer la configuration du widget 'Mes AIT'
5608 * ou 'Les AIT'.
5609 *
5610 * @return array
5611 */
5612 function get_config_dossier_contentieux_ait($arguments) {
5613 include "../sql/pgsql/app_om_tab_common_select.inc.php";
5614 // Initialisation du tableau des paramètres avec ses valeur par défaut
5615 $arguments_default = array(
5616 "filtre" => "instructeur",
5617 "affichage" => "liste"
5618 );
5619 // Vérification des arguments
5620 foreach ($arguments_default as $key => $value) {
5621 //
5622 if (isset($arguments[$key])) {
5623 //
5624 $elem = trim($arguments[$key]);
5625 //
5626 if ($key === "filtre"
5627 && in_array($elem, array("instructeur", "division", "aucun"))) {
5628 // La valeur doit être dans cette liste
5629 $arguments[$key] = $elem;
5630 continue;
5631 } elseif ($key === "affichage"
5632 && in_array($elem, array('liste', 'nombre'))) {
5633 // La valeur doit être dans cette liste
5634 $arguments[$key] = $elem;
5635 continue;
5636 }
5637 }
5638 //
5639 $arguments[$key] = $value;
5640 }
5641 // Utilisation du filtre instructeur dédié au contentieux si le filtre
5642 // paramétré est "instructeur"
5643 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
5644 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
5645 }
5646 $filtre = $arguments["filtre"];
5647
5648 // SELECT - CHAMPAFFICHE
5649 $case_contrevenant = "
5650 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
5651 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
5652 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
5653 END
5654 ";
5655 //
5656 $query_ct_select_champaffiche = array_merge(
5657 $array_base_ct_select_champaffiche,
5658 array(
5659 $trim_concat_terrain.'as "'.__("localisation").'"',
5660 $case_contrevenant.' as "'.__("contrevenant").'"',
5661 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
5662 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
5663 'etat.libelle as "'.__("etat").'"',
5664 'to_char(dossier.date_ait, \'DD/MM/YYYY\') as "'.__("date_ait").'"',
5665 'to_char(instruction.date_retour_signature, \'DD/MM/YYYY\') as "'.__("date_retour_signature").'"',
5666 ));
5667
5668 /**
5669 * Construction de la requête
5670 */
5671 // SELECT
5672 $query_ct_select = "
5673 dossier.dossier,
5674 $select__dossier_libelle__column as dossier_libelle,
5675 dossier.date_ait,
5676 instruction.date_retour_signature
5677 ";
5678
5679 // FROM
5680 $query_ct_from = "
5681 ".DB_PREFIXE."dossier
5682 LEFT JOIN ".DB_PREFIXE."etat
5683 ON dossier.etat = etat.etat
5684 LEFT JOIN (
5685 SELECT *
5686 FROM ".DB_PREFIXE."lien_dossier_demandeur
5687 INNER JOIN ".DB_PREFIXE."demandeur
5688 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5689 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
5690 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
5691 ) as demandeur_contrevenant
5692 ON demandeur_contrevenant.dossier = dossier.dossier
5693 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5694 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5695 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5696 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5697 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5698 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5699 LEFT JOIN ".DB_PREFIXE."avis_decision
5700 ON avis_decision.avis_decision=dossier.avis_decision
5701 INNER JOIN ".DB_PREFIXE."instruction
5702 ON dossier.dossier = instruction.dossier
5703 AND date_retour_signature IS NOT NULL
5704 INNER JOIN ".DB_PREFIXE."evenement
5705 ON instruction.evenement = evenement.evenement
5706 AND LOWER(evenement.type) LIKE 'ait'
5707 LEFT JOIN (".DB_PREFIXE."demande
5708 JOIN ".DB_PREFIXE."demande_type
5709 ON demande.demande_type = demande_type.demande_type
5710 )
5711 ON demande.dossier_instruction = dossier.dossier
5712 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
5713 %s
5714 ";
5715
5716 $query_ct_where_collectivite_filter = "";
5717
5718 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
5719 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
5720 // collectivité
5721 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5722 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
5723 ON dossier.om_collectivite=om_collectivite.om_collectivite
5724 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
5725 ";
5726 } else {
5727 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
5728 ON dossier.om_collectivite=om_collectivite.om_collectivite
5729 ";
5730 }
5731
5732 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
5733
5734 // WHERE
5735 $query_ct_where_common = "
5736 LOWER(dossier_autorisation_type.code) = LOWER('IN')
5737 ";
5738
5739 // ORDER BY
5740 $query_ct_orderby = "
5741 dossier.date_depot DESC
5742 ";
5743
5744 $query_ct_where_groupe = "";
5745 // Gestion des groupes et confidentialité
5746 include('../sql/pgsql/filter_group_widgets.inc.php');
5747
5748 /**
5749 * Message d'aide
5750 */
5751 //
5752 $message_filtre = "";
5753 //
5754 switch ($filtre) {
5755 case "instructeur_ou_instructeur_secondaire":
5756 $message_filtre = " ".__("dont je suis l'instructeur");
5757 break;
5758 case "division":
5759 $message_filtre = " ".__("situés dans ma division");
5760 break;
5761 case "aucun":
5762 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5763 $message_filtre = " ".__("situés dans ma collectivité");
5764 } else {
5765 $message_filtre = " ".__("situés dans toutes les collectivités");
5766 }
5767 break;
5768 }
5769 //
5770 $message_help = sprintf(
5771 __("Les infractions%s les plus récentes pour lesquelles il y a un AIT signé."),
5772 $message_filtre
5773 );
5774
5775 /**
5776 * Return
5777 */
5778 //
5779 return array(
5780 "arguments" => $arguments,
5781 "message_help" => $message_help,
5782 "query_ct_select" => $query_ct_select,
5783 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
5784 "query_ct_from" => $query_ct_from,
5785 "query_ct_where" => $query_ct_where_common,
5786 "query_ct_where_groupe" => $query_ct_where_groupe,
5787 "query_ct_orderby" => $query_ct_orderby
5788 );
5789 }
5790
5791
5792 /**
5793 * WIDGET DASHBOARD - Les ou Mes dossiers AIT
5794 * @return void
5795 */
5796 function view_widget_dossier_contentieux_ait($content = null) {
5797 /**
5798 * Ce widget est configurable via l'interface Web. Lors de la création
5799 * du widget dans le paramétrage il est possible de spécifier la ou les
5800 * options suivantes :
5801 * - filtre :
5802 * = instructeur
5803 * = division
5804 * = aucun
5805 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
5806 */
5807 // Liste des paramètres
5808 $params = array("filtre", "affichage");
5809 // Formatage des arguments reçus en paramètres
5810 $arguments = $this->get_arguments($content, $params);
5811 // Récupération de la configuration du widget
5812 $conf = $this->get_config_dossier_contentieux_ait($arguments);
5813 $filtre = $conf["arguments"]["filtre"];
5814
5815
5816 /**
5817 * Composition de la requête
5818 */
5819 // Gestion de la requête selon le type d'affichage
5820 $query_ct_orderby = sprintf(
5821 "ORDER BY
5822 %s
5823 LIMIT 5",
5824 $conf["query_ct_orderby"]
5825 );
5826 $query_ct_select = $conf["query_ct_select"];
5827 if ($conf["arguments"]["affichage"] === "nombre") {
5828 $query_ct_orderby = "";
5829 $query_ct_select = "COUNT(*)";
5830 }
5831
5832 $query = sprintf(
5833 "SELECT
5834 %s
5835 FROM
5836 %s
5837 %s
5838 WHERE
5839 %s
5840 %s
5841 %s
5842 %s",
5843 $query_ct_select,
5844 $conf["query_ct_from"],
5845 '%s', // emplacement pour les jointure du filtre
5846 $conf["query_ct_where"],
5847 $conf["query_ct_where_groupe"],
5848 '%s', // emplacement pour les conditions du filtre
5849 $query_ct_orderby
5850 );
5851 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
5852 $sqlFilter = $this->get_query_filter(
5853 $query,
5854 $conf['arguments']['filtre']
5855 );
5856 $query = sprintf(
5857 $query,
5858 $sqlFilter["FROM"],
5859 $sqlFilter["WHERE"]
5860 );
5861
5862 /**
5863 * Template nécessaires à l'affichage du widget
5864 */
5865 if ($conf["arguments"]["affichage"] === "nombre") {
5866 // Exécution de la requête
5867 $qres = $this->f->get_one_result_from_db_query(
5868 $query,
5869 array(
5870 "origin" => __METHOD__
5871 )
5872 );
5873
5874 // Affichage du message d'informations
5875 printf(
5876 $this->template_help,
5877 $conf["message_help"]
5878 );
5879 // Si il n'y a aucun dossier à afficher
5880 if (intval($qres['result']) == 0) {
5881 echo __("Il n'y a pas d'infractions pour lesquelles il y a un AIT signé.");
5882 return;
5883 }
5884
5885 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
5886 } else {
5887 // Exécution de la requête
5888 $qres = $this->f->get_all_results_from_db_query(
5889 $query,
5890 array(
5891 'origin' => __METHOD__
5892 )
5893 );
5894
5895 // Affichage du message d'informations
5896 printf(
5897 $this->template_help,
5898 $conf["message_help"]
5899 );
5900 // Si il n'y a aucun dossier à afficher
5901 if ($qres['row_count'] === 0) {
5902 echo __("Il n'y a pas d'infractions pour lesquelles il y a un AIT signé.");
5903 return;
5904 }
5905 //
5906 $template_table = '
5907 <table class="tab-tab">
5908 <thead>
5909 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
5910 <th class="title col-0 firstcol">
5911 <span class="name">
5912 %s
5913 </span>
5914 </th>
5915 <th class="title col-1">
5916 <span class="name">
5917 %s
5918 </span>
5919 </th>
5920 <th class="title col-2">
5921 <span class="name">
5922 %s
5923 </span>
5924 </th>
5925 <th class="title col-3 lastcol">
5926 <span class="name">
5927 %s
5928 </span>
5929 </th>
5930 </tr>
5931 </thead>
5932 <tbody>
5933 %s
5934 </tbody>
5935 </table>
5936 ';
5937 //
5938 $template_line = '
5939 <tr class="tab-data odd">
5940 <td class="col-0 firstcol">
5941 %s
5942 </td>
5943 <td class="col-1 ">
5944 %s
5945 </td>
5946 <td class="col-2">
5947 %s
5948 </td>
5949 <td class="col-3 lastcol">
5950 %s
5951 </td>
5952 </tr>
5953 ';
5954 //
5955 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
5956 //
5957 $template_link = '
5958 <a class="lienTable" href="%s">
5959 %s
5960 </a>
5961 ';
5962 // Bouton consulter
5963 $template_btn_consulter = '
5964 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
5965 .__('Consulter')
5966 .'</span>
5967 ';
5968 //
5969
5970 /**
5971 * Si il y a des dossiers à afficher, alors on affiche le widget.
5972 */
5973 // On construit le contenu du tableau
5974 $ct_tbody = '';
5975 foreach ($qres['result'] as $row) {
5976 // On construit l'attribut href du lien
5977 $ct_href = sprintf(
5978 $template_href,
5979 // idx
5980 $row["dossier"]
5981 );
5982 // On construit la ligne
5983 $ct_tbody .= sprintf(
5984 $template_line,
5985 // Colonne 1 - Numéro de dossier
5986 sprintf(
5987 $template_link,
5988 $ct_href,
5989 $template_btn_consulter
5990 ),
5991 // Colonne 2 - Numéro de dossier
5992 sprintf(
5993 $template_link,
5994 $ct_href,
5995 $row["dossier_libelle"]
5996 ),
5997 // Colonne 3 - Date AIT
5998 sprintf(
5999 $template_link,
6000 $ct_href,
6001 $this->f->formatDate($row["date_ait"])
6002 ),
6003 // Colonne 4 - Date retour signature
6004 sprintf(
6005 $template_link,
6006 $ct_href,
6007 $this->f->formatDate($row["date_retour_signature"])
6008 )
6009 );
6010 }
6011 // Affichage du tableau listant les dossiers
6012 printf(
6013 $template_table,
6014 // Colonne 1 - Consulter
6015 '',
6016 // Colonne 2 - Numéro de dossier
6017 __('dossier'),
6018 // Colonne 3 - Date AIT
6019 __('date_ait'),
6020 // Colonne 4 - Date retour signature
6021 __('date_retour_signature'),
6022 // Le Contenu
6023 $ct_tbody
6024 );
6025 }
6026 // Affichage du footer
6027 printf(
6028 $this->template_footer,
6029 OM_ROUTE_TAB."&obj=dossier_contentieux_ait&filtre=" . $filtre,
6030 __("Voir +")
6031 );
6032 }
6033
6034
6035 /**
6036 * Cette méthode permet de récupérer la configuration du widget 'Les infractions
6037 * non affectées'.
6038 *
6039 * @return array
6040 */
6041 function get_config_dossier_contentieux_inaffectes($arguments) {
6042 include "../sql/pgsql/app_om_tab_common_select.inc.php";
6043 // Initialisation du tableau des paramètres avec ses valeur par défaut
6044 $arguments_default = array(
6045 "filtre" => "division",
6046 "dossier_encours" => "true",
6047 "affichage" => "liste"
6048 );
6049 // Vérification des arguments
6050 foreach ($arguments_default as $key => $value) {
6051 //
6052 if (isset($arguments[$key])) {
6053 //
6054 $elem = trim($arguments[$key]);
6055 //
6056 if ($key === "filtre"
6057 && in_array($elem, array("division", "aucun"))) {
6058 // La valeur doit être dans cette liste
6059 $arguments[$key] = $elem;
6060 continue;
6061 } elseif ($key === "dossier_encours"
6062 && in_array($elem, array("true", "false"))) {
6063 // La valeur doit être dans cette liste
6064 $arguments[$key] = $elem;
6065 continue;
6066 } elseif ($key === "affichage"
6067 && in_array($elem, array('liste', 'nombre'))) {
6068 // La valeur doit être dans cette liste
6069 $arguments[$key] = $elem;
6070 continue;
6071 }
6072 }
6073 //
6074 $arguments[$key] = $value;
6075 }
6076 $filtre = $arguments["filtre"];
6077 $d_encours = $arguments["dossier_encours"];
6078
6079 // SELECT - CHAMPAFFICHE
6080 $case_contrevenant = "
6081 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
6082 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
6083 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
6084 END
6085 ";
6086 //
6087 $query_ct_select_champaffiche = array_merge(
6088 $array_base_ct_select_champaffiche,
6089 array(
6090 $trim_concat_terrain.'as "'.__("localisation").'"',
6091 $case_contrevenant.' as "'.__("contrevenant").'"',
6092 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
6093 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
6094 'etat.libelle as "'.__("etat").'"',
6095 'to_char(dossier.date_depot, \'DD/MM/YYYY\') as "'.__("Date de réception").'"',
6096 ));
6097
6098 /**
6099 * Construction de la requête
6100 */
6101 // SELECT
6102 $query_ct_select = "
6103 dossier.dossier,
6104 $select__dossier_libelle__column as dossier_libelle,
6105 dossier.date_depot
6106 ";
6107
6108 // FROM
6109 $query_ct_from = "
6110 ".DB_PREFIXE."dossier
6111 INNER JOIN ".DB_PREFIXE."etat
6112 ON dossier.etat = etat.etat%s
6113 LEFT JOIN (
6114 SELECT *
6115 FROM ".DB_PREFIXE."lien_dossier_demandeur
6116 INNER JOIN ".DB_PREFIXE."demandeur
6117 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
6118 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
6119 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
6120 ) as demandeur_contrevenant
6121 ON demandeur_contrevenant.dossier = dossier.dossier
6122 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
6123 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6124 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6125 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6126 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
6127 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6128 LEFT JOIN ".DB_PREFIXE."avis_decision
6129 ON avis_decision.avis_decision=dossier.avis_decision
6130 LEFT JOIN (".DB_PREFIXE."demande
6131 JOIN ".DB_PREFIXE."demande_type
6132 ON demande.demande_type = demande_type.demande_type
6133 )
6134 ON demande.dossier_instruction = dossier.dossier
6135 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
6136 LEFT JOIN ".DB_PREFIXE."division
6137 ON dossier.division=division.division
6138 %s
6139 ";
6140
6141 $query_ct_where_collectivite_filter = "";
6142 $query_ct_where_statut_filter = "";
6143
6144 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
6145 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
6146 // collectivité
6147 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6148 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
6149 ON dossier.om_collectivite=om_collectivite.om_collectivite
6150 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
6151 ";
6152 } else {
6153 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
6154 ON dossier.om_collectivite=om_collectivite.om_collectivite
6155 ";
6156 }
6157
6158 // Permet de filtrer les dossiers d'instruction pour n'afficher
6159 // seulement ceux dont l'état est considéré comme 'encours'
6160 if ($d_encours === 'true') {
6161 $query_ct_where_statut_filter = " AND etat.statut = 'encours' ";
6162 }
6163
6164 $query_ct_from = sprintf($query_ct_from,
6165 $query_ct_where_statut_filter,
6166 $query_ct_where_collectivite_filter
6167 );
6168
6169 // WHERE - COMMON
6170 $query_ct_where_common = "
6171 LOWER(dossier_autorisation_type.code) = LOWER('IN')
6172 AND dossier.instructeur_2 IS NULL
6173 ";
6174
6175 // ORDER BY
6176
6177 $query_ct_orderby = "
6178 dossier.date_depot ASC
6179 ";
6180
6181 $query_ct_where_groupe = "";
6182 // Gestion des groupes et confidentialité
6183 include('../sql/pgsql/filter_group_widgets.inc.php');
6184
6185 /**
6186 * Message d'aide
6187 */
6188 //
6189 $message_filtre = "";
6190 //
6191 switch ($filtre) {
6192 case "division":
6193 $message_filtre = " ".__("situés dans ma division");
6194 break;
6195 case "aucun":
6196 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6197 $message_filtre = " ".__("situés dans ma collectivité");
6198 } else {
6199 $message_filtre = " ".__("situés dans toutes les collectivités");
6200 }
6201 break;
6202 }
6203
6204 // Complète le message d'aide pour préciser que les dossiers
6205 // d'instruction sont seulement ceux considérés comme 'encours'
6206 if ($d_encours === 'true') {
6207 $message_filtre = " ".__("en cours d'instruction").$message_filtre;
6208 }
6209 //
6210 $message_help = sprintf(
6211 __("Les infractions%s les plus anciennes non-affectées à un technicien."),
6212 $message_filtre
6213 );
6214
6215 /**
6216 * Return
6217 */
6218 //
6219 return array(
6220 "arguments" => $arguments,
6221 "message_help" => $message_help,
6222 "query_ct_select" => $query_ct_select,
6223 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
6224 "query_ct_from" => $query_ct_from,
6225 "query_ct_where" => $query_ct_where_common,
6226 "query_ct_where_groupe" => $query_ct_where_groupe,
6227 "query_ct_orderby" => $query_ct_orderby
6228 );
6229 }
6230
6231 /**
6232 * WIDGET DASHBOARD - Les infractions non affectées
6233 * @return void
6234 */
6235 function view_widget_dossier_contentieux_inaffectes($content = null) {
6236 /**
6237 * Ce widget est configurable via l'interface Web. Lors de la création
6238 * du widget dans le paramétrage il est possible de spécifier la ou les
6239 * options suivantes :
6240 * - filtre :
6241 * = instructeur
6242 * = division
6243 * = aucun
6244 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
6245 * - dossier_encours (permet d'afficher seulement les DI en cours) :
6246 * = true (affiche seulement les DI en cours)
6247 * = false (affiche tous les DI)
6248 * (default) true
6249 */
6250 // Liste des paramètres
6251 $params = array("filtre", "dossier_encours", "affichage");
6252 // Formatage des arguments reçus en paramètres
6253 $arguments = $this->get_arguments($content, $params);
6254 // Récupération de la configuration du widget
6255 $conf = $this->get_config_dossier_contentieux_inaffectes($arguments);
6256
6257 $filtre = $conf["arguments"]["filtre"];
6258 $d_encours = $conf["arguments"]["dossier_encours"];
6259 //
6260
6261
6262 /**
6263 * Composition de la requête
6264 */
6265 // Gestion de la requête selon le type d'affichage
6266 $query_ct_orderby = sprintf(
6267 "ORDER BY
6268 %s
6269 LIMIT 5",
6270 $conf["query_ct_orderby"]
6271 );
6272 $query_ct_select = $conf["query_ct_select"];
6273 if ($conf["arguments"]["affichage"] === "nombre") {
6274 $query_ct_orderby = "";
6275 $query_ct_select = "COUNT(*)";
6276 }
6277
6278 $query = sprintf(
6279 "SELECT
6280 %s
6281 FROM
6282 %s
6283 %s
6284 WHERE
6285 %s
6286 %s
6287 %s
6288 %s",
6289 $query_ct_select,
6290 $conf["query_ct_from"],
6291 '%s', // emplacement pour les jointure du filtre
6292 $conf["query_ct_where"],
6293 $conf["query_ct_where_groupe"],
6294 '%s', // emplacement pour les conditions du filtre
6295 $query_ct_orderby
6296 );
6297 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
6298 $sqlFilter = $this->get_query_filter(
6299 $query,
6300 $conf['arguments']['filtre']
6301 );
6302 $query = sprintf(
6303 $query,
6304 $sqlFilter["FROM"],
6305 $sqlFilter["WHERE"]
6306 );
6307
6308 /**
6309 * Template nécessaires à l'affichage du widget
6310 */
6311 if ($conf["arguments"]["affichage"] === "nombre") {
6312 // Exécution de la requête
6313 $qres = $this->f->get_one_result_from_db_query(
6314 $query,
6315 array(
6316 "origin" => __METHOD__
6317 )
6318 );
6319
6320 // Affichage du message d'informations
6321 printf(
6322 $this->template_help,
6323 $conf["message_help"]
6324 );
6325 // Si il n'y a aucun dossier à afficher
6326 if (intval($qres['result']) == 0) {
6327 echo __("Il n'y a pas d'infractions non-affectées à un technicien.");
6328 return;
6329 }
6330
6331 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
6332 } else {
6333 // Exécution de la requête
6334 $qres = $this->f->get_all_results_from_db_query(
6335 $query,
6336 array(
6337 'origin' => __METHOD__
6338 )
6339 );
6340
6341 // Affichage du message d'informations
6342 printf(
6343 $this->template_help,
6344 $conf["message_help"]
6345 );
6346 // Si il n'y a aucun dossier à afficher
6347 if ($qres['row_count'] === 0) {
6348 echo __("Il n'y a pas d'infractions non-affectées à un technicien.");
6349 return;
6350 }
6351 //
6352 $template_table = '
6353 <table class="tab-tab">
6354 <thead>
6355 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
6356 <th class="title col-0 firstcol">
6357 <span class="name">
6358 %s
6359 </span>
6360 </th>
6361 <th class="title col-1">
6362 <span class="name">
6363 %s
6364 </span>
6365 </th>
6366 <th class="title col-2 lastcol">
6367 <span class="name">
6368 %s
6369 </span>
6370 </th>
6371 </tr>
6372 </thead>
6373 <tbody>
6374 %s
6375 </tbody>
6376 </table>
6377 ';
6378 //
6379 $template_line = '
6380 <tr class="tab-data odd">
6381 <td class="col-0 firstcol">
6382 %s
6383 </td>
6384 <td class="col-1 ">
6385 %s
6386 </td>
6387 <td class="col-2 lastcol">
6388 %s
6389 </td>
6390 </tr>
6391 ';
6392 //
6393 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
6394 //
6395 $template_link = '
6396 <a class="lienTable" href="%s">
6397 %s
6398 </a>
6399 ';
6400 // Bouton consulter
6401 $template_btn_consulter = '
6402 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
6403 .__('Consulter')
6404 .'</span>
6405 ';
6406 //
6407
6408 /**
6409 * Si il y a des dossiers à afficher, alors on affiche le widget.
6410 */
6411 // On construit le contenu du tableau
6412 $ct_tbody = '';
6413 foreach ($qres['result'] as $row) {
6414 // On construit l'attribut href du lien
6415 $ct_href = sprintf(
6416 $template_href,
6417 // idx
6418 $row["dossier"]
6419 );
6420 // On construit la ligne
6421 $ct_tbody .= sprintf(
6422 $template_line,
6423 // Colonne 1 - Numéro de dossier
6424 sprintf(
6425 $template_link,
6426 $ct_href,
6427 $template_btn_consulter
6428 ),
6429 // Colonne 2 - Numéro de dossier
6430 sprintf(
6431 $template_link,
6432 $ct_href,
6433 $row["dossier_libelle"]
6434 ),
6435 // Colonne 3 - Date de réception
6436 sprintf(
6437 $template_link,
6438 $ct_href,
6439 $this->f->formatDate($row["date_depot"])
6440 )
6441 );
6442 }
6443 // Affichage du tableau listant les dossiers
6444 printf(
6445 $template_table,
6446 // Colonne 1 - Consulter
6447 '',
6448 // Colonne 2 - Numéro de dossier
6449 __('dossier'),
6450 // Colonne 3 - Date de réception
6451 __('Date de réception'),
6452 // Le Contenu
6453 $ct_tbody
6454 );
6455 }
6456 // Affichage du footer
6457 printf(
6458 $this->template_footer,
6459 OM_ROUTE_TAB."&obj=dossier_contentieux_inaffectes&filtre=" . $filtre."&dossier_encours=".$d_encours,
6460 __("Voir +")
6461 );
6462 }
6463
6464
6465 /**
6466 * Cette méthode permet de récupérer la configuration du widget 'Alerte Visite'.
6467 *
6468 * @return array
6469 */
6470 function get_config_dossier_contentieux_alerte_visite($arguments) {
6471 include "../sql/pgsql/app_om_tab_common_select.inc.php";
6472 // Initialisation du tableau des paramètres avec ses valeur par défaut
6473 $arguments_default = array(
6474 "filtre" => "instructeur",
6475 "dossier_encours" => "true",
6476 "affichage" => "liste"
6477 );
6478 // Vérification des arguments
6479 foreach ($arguments_default as $key => $value) {
6480 //
6481 if (isset($arguments[$key])) {
6482 //
6483 $elem = trim($arguments[$key]);
6484 //
6485 if ($key === "filtre"
6486 && in_array($elem, array("instructeur", "division", "aucun"))) {
6487 // La valeur doit être dans cette liste
6488 $arguments[$key] = $elem;
6489 continue;
6490 } elseif ($key === "dossier_encours"
6491 && in_array($elem, array("true", "false"))) {
6492 // La valeur doit être dans cette liste
6493 $arguments[$key] = $elem;
6494 continue;
6495 } elseif ($key === "affichage"
6496 && in_array($elem, array('liste', 'nombre'))) {
6497 // La valeur doit être dans cette liste
6498 $arguments[$key] = $elem;
6499 continue;
6500 }
6501 }
6502 //
6503 $arguments[$key] = $value;
6504 }
6505 // Utilisation du filtre instructeur dédié au contentieux si le filtre
6506 // paramétré est "instructeur"
6507 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
6508 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
6509 }
6510 $filtre = $arguments["filtre"];
6511 $d_encours = $arguments["dossier_encours"];
6512
6513 // SELECT - CHAMPAFFICHE
6514 $case_contrevenant = "
6515 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
6516 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
6517 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
6518 END
6519 ";
6520 //
6521 $query_ct_select_champaffiche = array_merge(
6522 $array_base_ct_select_champaffiche,
6523 array(
6524 $trim_concat_terrain.'as "'.__("localisation").'"',
6525 $case_contrevenant.' as "'.__("contrevenant").'"',
6526 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
6527 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
6528 'etat.libelle as "'.__("etat").'"',
6529 'to_char(dossier.date_depot, \'DD/MM/YYYY\') as "'.__("Date de réception").'"',
6530 ));
6531
6532 /**
6533 * Construction de la requête
6534 */
6535 // SELECT
6536 $query_ct_select = "
6537 dossier.dossier,
6538 $select__dossier_libelle__column as dossier_libelle,
6539 dossier.date_depot
6540 ";
6541
6542 // FROM
6543 $query_ct_from = "
6544 ".DB_PREFIXE."dossier
6545 INNER JOIN ".DB_PREFIXE."etat
6546 ON dossier.etat = etat.etat%s
6547 LEFT JOIN (
6548 SELECT *
6549 FROM ".DB_PREFIXE."lien_dossier_demandeur
6550 INNER JOIN ".DB_PREFIXE."demandeur
6551 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
6552 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
6553 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
6554 ) as demandeur_contrevenant
6555 ON demandeur_contrevenant.dossier = dossier.dossier
6556 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
6557 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6558 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6559 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6560 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
6561 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6562 LEFT JOIN ".DB_PREFIXE."avis_decision
6563 ON avis_decision.avis_decision=dossier.avis_decision
6564 LEFT JOIN (".DB_PREFIXE."demande
6565 JOIN ".DB_PREFIXE."demande_type
6566 ON demande.demande_type = demande_type.demande_type
6567 )
6568 ON demande.dossier_instruction = dossier.dossier
6569 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
6570 %s
6571 ";
6572
6573 $query_ct_where_collectivite_filter = "";
6574 $query_ct_where_statut_filter = "";
6575
6576 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
6577 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
6578 // collectivité
6579 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6580 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
6581 ON dossier.om_collectivite=om_collectivite.om_collectivite
6582 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
6583 ";
6584 } else {
6585 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
6586 ON dossier.om_collectivite=om_collectivite.om_collectivite
6587 ";
6588 }
6589
6590 //
6591 if ($d_encours === 'true') {
6592 $query_ct_where_statut_filter = " AND etat.statut = 'encours' ";
6593 }
6594
6595 $query_ct_from = sprintf(
6596 $query_ct_from,
6597 $query_ct_where_statut_filter,
6598 $query_ct_where_collectivite_filter
6599 );
6600
6601 // WHERE - COMMON
6602 $query_ct_where_common = "
6603 LOWER(dossier_autorisation_type.code) = LOWER('IN')
6604 AND dossier.date_depot < CURRENT_TIMESTAMP - interval '3 months'
6605 AND dossier.date_premiere_visite IS NULL
6606 ";
6607
6608 // ORDER BY
6609 $query_ct_orderby = "
6610 dossier.date_depot ASC
6611 ";
6612
6613 $query_ct_where_groupe = "";
6614 // Gestion des groupes et confidentialité
6615 include('../sql/pgsql/filter_group_widgets.inc.php');
6616
6617 /**
6618 * Message d'aide
6619 */
6620 //
6621 $message_filtre = "";
6622 //
6623 switch ($filtre) {
6624 case "instructeur_ou_instructeur_secondaire":
6625 $message_filtre = " ".__("dont je suis l'instructeur");
6626 break;
6627 case "instructeur_secondaire":
6628 $message_filtre = " ".__("dont je suis l'instructeur secondaire");
6629 break;
6630 case "division":
6631 $message_filtre = " ".__("situés dans ma division");
6632 break;
6633 case "aucun":
6634 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6635 $message_filtre = " ".__("situés dans ma collectivité");
6636 } else {
6637 $message_filtre = " ".__("situés dans toutes les collectivités");
6638 }
6639 break;
6640 }
6641 // Complète le message d'aide pour préciser que les dossiers
6642 // d'instruction sont seulement ceux considérés comme 'encours'
6643 if ($d_encours === 'true') {
6644 $message_filtre = " ".__("en cours d'instruction").$message_filtre;
6645 }
6646 //
6647 $message_help = sprintf(
6648 __("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."),
6649 $message_filtre
6650 );
6651
6652 /**
6653 * Return
6654 */
6655 //
6656 return array(
6657 "arguments" => $arguments,
6658 "message_help" => $message_help,
6659 "query_ct_select" => $query_ct_select,
6660 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
6661 "query_ct_from" => $query_ct_from,
6662 "query_ct_where" => $query_ct_where_common,
6663 "query_ct_where_groupe" => $query_ct_where_groupe,
6664 "query_ct_orderby" => $query_ct_orderby
6665 );
6666 }
6667
6668 /**
6669 * WIDGET DASHBOARD - Alerte Visite
6670 * @return void
6671 */
6672 function view_widget_dossier_contentieux_alerte_visite($content = null) {
6673 /**
6674 * Ce widget est configurable via l'interface Web. Lors de la création
6675 * du widget dans le paramétrage il est possible de spécifier la ou les
6676 * options suivantes :
6677 * - filtre :
6678 * = instructeur
6679 * = division
6680 * = aucun
6681 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
6682 * - dossier_encours (permet d'afficher seulement les DI en cours) :
6683 * = true (affiche seulement les DI en cours)
6684 * = false (affiche tous les DI)
6685 * (default) true
6686 */
6687 // Liste des paramètres
6688 $params = array("filtre", "dossier_encours", "affichage");
6689 // Formatage des arguments reçus en paramètres
6690 $arguments = $this->get_arguments($content, $params);
6691 // Récupération de la configuration du widget
6692 $conf = $this->get_config_dossier_contentieux_alerte_visite($arguments);
6693
6694 //
6695 $filtre = $conf["arguments"]["filtre"];
6696 $d_encours = $conf["arguments"]["dossier_encours"];
6697
6698 /**
6699 * Composition de la requête
6700 */
6701 // Gestion de la requête selon le type d'affichage
6702 $query_ct_orderby = sprintf(
6703 "ORDER BY
6704 %s
6705 LIMIT 5",
6706 $conf["query_ct_orderby"]
6707 );
6708 $query_ct_select = $conf["query_ct_select"];
6709 if ($conf["arguments"]["affichage"] === "nombre") {
6710 $query_ct_orderby = "";
6711 $query_ct_select = "COUNT(*)";
6712 }
6713 $query = sprintf(
6714 "SELECT
6715 %s
6716 FROM
6717 %s
6718 %s
6719 WHERE
6720 %s
6721 %s
6722 %s
6723 %s",
6724 $query_ct_select,
6725 $conf["query_ct_from"],
6726 '%s', // emplacement pour les jointure du filtre
6727 $conf["query_ct_where"],
6728 $conf["query_ct_where_groupe"],
6729 '%s', // emplacement pour les conditions du filtre
6730 $query_ct_orderby
6731 );
6732 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
6733 $sqlFilter = $this->get_query_filter(
6734 $query,
6735 $conf['arguments']['filtre']
6736 );
6737 $query = sprintf(
6738 $query,
6739 $sqlFilter["FROM"],
6740 $sqlFilter["WHERE"]
6741 );
6742
6743
6744 /**
6745 * Template nécessaires à l'affichage du widget
6746 */
6747 if ($conf["arguments"]["affichage"] === "nombre") {
6748 // Exécution de la requête
6749 $qres = $this->f->get_one_result_from_db_query(
6750 $query,
6751 array(
6752 "origin" => __METHOD__
6753 )
6754 );
6755
6756 // Affichage du message d'informations
6757 printf(
6758 $this->template_help,
6759 $conf["message_help"]
6760 );
6761 // Si il n'y a aucun dossier à afficher
6762 if (intval($qres['result']) == 0) {
6763 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.");
6764 return;
6765 }
6766
6767 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
6768 } else {
6769 // Exécution de la requête
6770 $qres = $this->f->get_all_results_from_db_query(
6771 $query,
6772 array(
6773 'origin' => __METHOD__
6774 )
6775 );
6776
6777 // Affichage du message d'informations
6778 printf(
6779 $this->template_help,
6780 $conf["message_help"]
6781 );
6782 // Si il n'y a aucun dossier à afficher
6783 if ($qres['row_count'] === 0) {
6784 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.");
6785 return;
6786 }
6787 //
6788 $template_table = '
6789 <table class="tab-tab">
6790 <thead>
6791 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
6792 <th class="title col-0 firstcol">
6793 <span class="name">
6794 %s
6795 </span>
6796 </th>
6797 <th class="title col-1">
6798 <span class="name">
6799 %s
6800 </span>
6801 </th>
6802 <th class="title col-2 lastcol">
6803 <span class="name">
6804 %s
6805 </span>
6806 </th>
6807 </tr>
6808 </thead>
6809 <tbody>
6810 %s
6811 </tbody>
6812 </table>
6813 ';
6814 //
6815 $template_line = '
6816 <tr class="tab-data odd">
6817 <td class="col-0 firstcol">
6818 %s
6819 </td>
6820 <td class="col-1 ">
6821 %s
6822 </td>
6823 <td class="col-2 lastcol">
6824 %s
6825 </td>
6826 </tr>
6827 ';
6828 //
6829 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
6830 //
6831 $template_link = '
6832 <a class="lienTable" href="%s">
6833 %s
6834 </a>
6835 ';
6836 // Bouton consulter
6837 $template_btn_consulter = '
6838 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
6839 .__('Consulter')
6840 .'</span>
6841 ';
6842 //
6843
6844 /**
6845 * Si il y a des dossiers à afficher, alors on affiche le widget.
6846 */
6847 // On construit le contenu du tableau
6848 $ct_tbody = '';
6849 foreach ($qres['result'] as $row) {
6850 // On construit l'attribut href du lien
6851 $ct_href = sprintf(
6852 $template_href,
6853 // idx
6854 $row["dossier"]
6855 );
6856 // On construit la ligne
6857 $ct_tbody .= sprintf(
6858 $template_line,
6859 // Colonne 1 - Numéro de dossier
6860 sprintf(
6861 $template_link,
6862 $ct_href,
6863 $template_btn_consulter
6864 ),
6865 // Colonne 2 - Numéro de dossier
6866 sprintf(
6867 $template_link,
6868 $ct_href,
6869 $row["dossier_libelle"]
6870 ),
6871 // Colonne 3 - Date de réception
6872 sprintf(
6873 $template_link,
6874 $ct_href,
6875 $this->f->formatDate($row["date_depot"])
6876 )
6877 );
6878 }
6879 // Affichage du tableau listant les dossiers
6880 printf(
6881 $template_table,
6882 // Colonne 1 - Consulter
6883 '',
6884 // Colonne 2 - Numéro de dossier
6885 __('dossier'),
6886 // Colonne 3 - Date de réception
6887 __('Date de réception'),
6888 // Le Contenu
6889 $ct_tbody
6890 );
6891 }
6892 // Affichage du footer
6893 printf(
6894 $this->template_footer,
6895 OM_ROUTE_TAB."&obj=dossier_contentieux_alerte_visite&filtre=".$filtre."&dossier_encours=".$d_encours,
6896 __("Voir +")
6897 );
6898 }
6899
6900 /**
6901 * Cette méthode permet de récupérer la configuration du widget 'Alerte Parquet'.
6902 *
6903 * @return array
6904 */
6905 function get_config_dossier_contentieux_alerte_parquet($arguments) {
6906 include "../sql/pgsql/app_om_tab_common_select.inc.php";
6907 // Initialisation du tableau des paramètres avec ses valeur par défaut
6908 $arguments_default = array(
6909 "filtre" => "instructeur",
6910 "dossier_encours" => "true",
6911 "affichage" => "liste"
6912 );
6913 // Vérification des arguments
6914 foreach ($arguments_default as $key => $value) {
6915 //
6916 if (isset($arguments[$key])) {
6917 //
6918 $elem = trim($arguments[$key]);
6919 //
6920 if ($key === "filtre"
6921 && in_array($elem, array("instructeur", "division", "aucun"))) {
6922 // La valeur doit être dans cette liste
6923 $arguments[$key] = $elem;
6924 continue;
6925 } elseif ($key === "dossier_encours"
6926 && in_array($elem, array("true", "false"))) {
6927 // La valeur doit être dans cette liste
6928 $arguments[$key] = $elem;
6929 continue;
6930 } elseif ($key === "affichage"
6931 && in_array($elem, array('liste', 'nombre'))) {
6932 // La valeur doit être dans cette liste
6933 $arguments[$key] = $elem;
6934 continue;
6935 }
6936 }
6937 //
6938 $arguments[$key] = $value;
6939 }
6940 // Utilisation du filtre instructeur dédié au contentieux si le filtre
6941 // paramétré est "instructeur"
6942 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
6943 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
6944 }
6945 $filtre = $arguments["filtre"];
6946 $d_encours = $arguments["dossier_encours"];
6947
6948 // SELECT - CHAMPAFFICHE
6949 $case_contrevenant = "
6950 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
6951 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
6952 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
6953 END
6954 ";
6955 //
6956 $query_ct_select_champaffiche = array_merge(
6957 $array_base_ct_select_champaffiche,
6958 array(
6959 $trim_concat_terrain.'as "'.__("localisation").'"',
6960 $case_contrevenant.' as "'.__("contrevenant").'"',
6961 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
6962 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
6963 'etat.libelle as "'.__("etat").'"',
6964 'to_char(dossier.date_depot, \'DD/MM/YYYY\') as "'.__("Date de réception").'"',
6965 ));
6966
6967 /**
6968 * Construction de la requête
6969 */
6970 // SELECT
6971 $query_ct_select = "
6972 dossier.dossier,
6973 $select__dossier_libelle__column as dossier_libelle,
6974 dossier.date_depot
6975 ";
6976
6977 // FROM
6978 $query_ct_from = "
6979 ".DB_PREFIXE."dossier
6980 INNER JOIN ".DB_PREFIXE."etat
6981 ON dossier.etat = etat.etat%s
6982 LEFT JOIN (
6983 SELECT *
6984 FROM ".DB_PREFIXE."lien_dossier_demandeur
6985 INNER JOIN ".DB_PREFIXE."demandeur
6986 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
6987 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
6988 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
6989 ) as demandeur_contrevenant
6990 ON demandeur_contrevenant.dossier = dossier.dossier
6991 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
6992 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6993 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6994 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6995 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
6996 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6997 LEFT JOIN ".DB_PREFIXE."avis_decision
6998 ON avis_decision.avis_decision=dossier.avis_decision
6999 LEFT JOIN (".DB_PREFIXE."demande
7000 JOIN ".DB_PREFIXE."demande_type
7001 ON demande.demande_type = demande_type.demande_type
7002 )
7003 ON demande.dossier_instruction = dossier.dossier
7004 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
7005 %s
7006 ";
7007
7008 $query_ct_where_collectivite_filter = "";
7009 $query_ct_where_statut_filter = "";
7010
7011 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
7012 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
7013 // collectivité
7014 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7015 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
7016 ON dossier.om_collectivite=om_collectivite.om_collectivite
7017 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
7018 ";
7019 } else {
7020 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
7021 ON dossier.om_collectivite=om_collectivite.om_collectivite
7022 ";
7023 }
7024
7025 // Permet de filtrer les dossiers d'instruction pour n'afficher
7026 // seulement ceux dont l'état est considéré comme 'encours'
7027 if ($d_encours === 'true') {
7028 $query_ct_where_statut_filter = " AND etat.statut = 'encours' ";
7029 }
7030
7031 $query_ct_from = sprintf(
7032 $query_ct_from,
7033 $query_ct_where_statut_filter,
7034 $query_ct_where_collectivite_filter
7035 );
7036
7037 // WHERE - COMMON
7038 $query_ct_where_common = "
7039 LOWER(dossier_autorisation_type.code) = LOWER('IN')
7040 AND dossier.date_depot < CURRENT_TIMESTAMP - interval '9 months'
7041 AND dossier.date_transmission_parquet IS NULL
7042 ";
7043
7044 // ORDER BY
7045 $query_ct_orderby = "
7046 dossier.date_depot ASC
7047 ";
7048
7049 $query_ct_where_groupe = "";
7050 // Gestion des groupes et confidentialité
7051 include('../sql/pgsql/filter_group_widgets.inc.php');
7052
7053 /**
7054 * Message d'aide
7055 */
7056 //
7057 $message_filtre = "";
7058 //
7059 switch ($filtre) {
7060 case "instructeur_ou_instructeur_secondaire":
7061 $message_filtre = " ".__("dont je suis l'instructeur");
7062 break;
7063 case "division":
7064 $message_filtre = " ".__("situés dans ma division");
7065 break;
7066 case "aucun":
7067 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7068 $message_filtre = " ".__("situés dans ma collectivité");
7069 } else {
7070 $message_filtre = " ".__("situés dans toutes les collectivités");
7071 }
7072 break;
7073 }
7074 // Complète le message d'aide pour préciser que les dossiers
7075 // d'instruction sont seulement ceux considérés comme 'encours'
7076 if ($d_encours === 'true') {
7077 $message_filtre = " ".__("en cours d'instruction").$message_filtre;
7078 }
7079 //
7080 $message_help = sprintf(
7081 __("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."),
7082 $message_filtre
7083 );
7084
7085 /**
7086 * Return
7087 */
7088 //
7089 return array(
7090 "arguments" => $arguments,
7091 "message_help" => $message_help,
7092 "query_ct_select" => $query_ct_select,
7093 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
7094 "query_ct_from" => $query_ct_from,
7095 "query_ct_where" => $query_ct_where_common,
7096 "query_ct_where_groupe" => $query_ct_where_groupe,
7097 "query_ct_orderby" => $query_ct_orderby
7098 );
7099 }
7100
7101 /**
7102 * WIDGET DASHBOARD - Alerte Parquet
7103 * @return void
7104 */
7105 function view_widget_dossier_contentieux_alerte_parquet($content = null) {
7106 /**
7107 * Ce widget est configurable via l'interface Web. Lors de la création
7108 * du widget dans le paramétrage il est possible de spécifier la ou les
7109 * options suivantes :
7110 * - filtre :
7111 * = instructeur
7112 * = division
7113 * = aucun
7114 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
7115 * - dossier_encours (permet d'afficher seulement les DI en cours) :
7116 * = true (affiche seulement les DI en cours)
7117 * = false (affiche tous les DI)
7118 * (default) true
7119 */
7120 // Liste des paramètres
7121 $params = array("filtre", "dossier_encours", "affichage");
7122 // Formatage des arguments reçus en paramètres
7123 $arguments = $this->get_arguments($content, $params);
7124 // Récupération de la configuration du widget
7125 $conf = $this->get_config_dossier_contentieux_alerte_parquet($arguments);
7126
7127 //
7128 $filtre = $conf["arguments"]["filtre"];
7129 $d_encours = $conf["arguments"]["dossier_encours"];
7130
7131 /**
7132 * Composition de la requête
7133 */
7134 // Gestion de la requête selon le type d'affichage
7135 $query_ct_orderby = sprintf(
7136 "ORDER BY
7137 %s
7138 LIMIT 5",
7139 $conf["query_ct_orderby"]
7140 );
7141 $query_ct_select = $conf["query_ct_select"];
7142 if ($conf["arguments"]["affichage"] === "nombre") {
7143 $query_ct_orderby = "";
7144 $query_ct_select = "COUNT(*)";
7145 }
7146 $query = sprintf(
7147 "SELECT
7148 %s
7149 FROM
7150 %s
7151 %s
7152 WHERE
7153 %s
7154 %s
7155 %s
7156 %s",
7157 $query_ct_select,
7158 $conf["query_ct_from"],
7159 '%s', // emplacement pour les jointure du filtre
7160 $conf["query_ct_where"],
7161 $conf["query_ct_where_groupe"],
7162 '%s', // emplacement pour les conditions du filtre
7163 $query_ct_orderby
7164 );
7165 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
7166 $sqlFilter = $this->get_query_filter(
7167 $query,
7168 $conf['arguments']['filtre']
7169 );
7170 $query = sprintf(
7171 $query,
7172 $sqlFilter["FROM"],
7173 $sqlFilter["WHERE"]
7174 );
7175
7176 /**
7177 * Template nécessaires à l'affichage du widget
7178 */
7179 if ($conf["arguments"]["affichage"] === "nombre") {
7180 // Exécution de la requête
7181 $qres = $this->f->get_one_result_from_db_query(
7182 $query,
7183 array(
7184 "origin" => __METHOD__
7185 )
7186 );
7187
7188 // Affichage du message d'informations
7189 printf(
7190 $this->template_help,
7191 $conf["message_help"]
7192 );
7193 // Si il n'y a aucun dossier à afficher
7194 if (intval($qres['result']) == 0) {
7195 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.");
7196 return;
7197 }
7198
7199 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
7200 } else {
7201 // Exécution de la requête
7202 $qres = $this->f->get_all_results_from_db_query(
7203 $query,
7204 array(
7205 'origin' => __METHOD__
7206 )
7207 );
7208
7209 // Affichage du message d'informations
7210 printf(
7211 $this->template_help,
7212 $conf["message_help"]
7213 );
7214 // Si il n'y a aucun dossier à afficher
7215 if ($qres['row_count'] === 0) {
7216 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.");
7217 return;
7218 }
7219 //
7220 $template_table = '
7221 <table class="tab-tab">
7222 <thead>
7223 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
7224 <th class="title col-0 firstcol">
7225 <span class="name">
7226 %s
7227 </span>
7228 </th>
7229 <th class="title col-1">
7230 <span class="name">
7231 %s
7232 </span>
7233 </th>
7234 <th class="title col-2 lastcol">
7235 <span class="name">
7236 %s
7237 </span>
7238 </th>
7239 </tr>
7240 </thead>
7241 <tbody>
7242 %s
7243 </tbody>
7244 </table>
7245 ';
7246 //
7247 $template_line = '
7248 <tr class="tab-data odd">
7249 <td class="col-0 firstcol">
7250 %s
7251 </td>
7252 <td class="col-1 ">
7253 %s
7254 </td>
7255 <td class="col-2 lastcol">
7256 %s
7257 </td>
7258 </tr>
7259 ';
7260 //
7261 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
7262 //
7263 $template_link = '
7264 <a class="lienTable" href="%s">
7265 %s
7266 </a>
7267 ';
7268 // Bouton consulter
7269 $template_btn_consulter = '
7270 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
7271 .__('Consulter')
7272 .'</span>
7273 ';
7274 //
7275
7276 /**
7277 * Si il y a des dossiers à afficher, alors on affiche le widget.
7278 */
7279 // On construit le contenu du tableau
7280 $ct_tbody = '';
7281 foreach ($qres['result'] as $row) {
7282 // On construit l'attribut href du lien
7283 $ct_href = sprintf(
7284 $template_href,
7285 // idx
7286 $row["dossier"]
7287 );
7288 // On construit la ligne
7289 $ct_tbody .= sprintf(
7290 $template_line,
7291 // Colonne 1 - Numéro de dossier
7292 sprintf(
7293 $template_link,
7294 $ct_href,
7295 $template_btn_consulter
7296 ),
7297 // Colonne 2 - Numéro de dossier
7298 sprintf(
7299 $template_link,
7300 $ct_href,
7301 $row["dossier_libelle"]
7302 ),
7303 // Colonne 3 - Date de réception
7304 sprintf(
7305 $template_link,
7306 $ct_href,
7307 $this->f->formatDate($row["date_depot"])
7308 )
7309 );
7310 }
7311 // Affichage du tableau listant les dossiers
7312 printf(
7313 $template_table,
7314 // Colonne 1 - Consulter
7315 '',
7316 // Colonne 2 - Numéro de dossier
7317 __('dossier'),
7318 // Colonne 3 - Date de réception
7319 __('Date de réception'),
7320 // Le Contenu
7321 $ct_tbody
7322 );
7323 }
7324 // Affichage du footer
7325 printf(
7326 $this->template_footer,
7327 OM_ROUTE_TAB."&obj=dossier_contentieux_alerte_parquet&filtre=".$filtre."&dossier_encours=".$d_encours,
7328 __("Voir +")
7329 );
7330 }
7331
7332 /**
7333 * Cette méthode permet de récupérer la configuration du widget 'Mes clôtures'.
7334 *
7335 * @return array
7336 */
7337 function get_config_dossier_contentieux_clotures($arguments) {
7338 include "../sql/pgsql/app_om_tab_common_select.inc.php";
7339 // Initialisation du tableau des paramètres avec ses valeur par défaut
7340 $arguments_default = array(
7341 "filtre" => "instructeur",
7342 "affichage" => "liste"
7343 );
7344 // Vérification des arguments
7345 foreach ($arguments_default as $key => $value) {
7346 //
7347 if (isset($arguments[$key])) {
7348 //
7349 $elem = trim($arguments[$key]);
7350 //
7351 if ($key === "filtre"
7352 && in_array($elem, array("instructeur", "division", "aucun"))) {
7353 // La valeur doit être dans cette liste
7354 $arguments[$key] = $elem;
7355 continue;
7356 } elseif ($key === "affichage"
7357 && in_array($elem, array('liste', 'nombre'))) {
7358 // La valeur doit être dans cette liste
7359 $arguments[$key] = $elem;
7360 continue;
7361 }
7362 }
7363 //
7364 $arguments[$key] = $value;
7365 }
7366 // Utilisation du filtre instructeur dédié au contentieux si le filtre
7367 // paramétré est "instructeur"
7368 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
7369 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
7370 }
7371 $filtre = $arguments["filtre"];
7372
7373 // SELECT - CHAMPAFFICHE
7374 $case_requerant = "
7375 CASE WHEN demandeur_requerant.qualite = 'particulier'
7376 THEN TRIM(CONCAT(demandeur_requerant.particulier_nom, ' ', demandeur_requerant.particulier_prenom))
7377 ELSE TRIM(CONCAT(demandeur_requerant.personne_morale_raison_sociale, ' ', demandeur_requerant.personne_morale_denomination))
7378 END
7379 ";
7380 //
7381 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
7382 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
7383 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
7384 END";
7385 //
7386 $query_ct_select_champaffiche = array_merge(
7387 $array_base_ct_select_champaffiche,
7388 array(
7389 'dossier_autorisation_type_detaille.libelle as "'.__("type de dossier").'"',
7390 'dossier_autorisation_contestee.dossier_libelle as "'.__("autorisation").'"',
7391 $case_demandeur.' as "'.__("petitionnaire").'"',
7392 $trim_concat_terrain.'as "'.__("localisation").'"',
7393 $case_requerant.' as "'.__("requerant").'"',
7394 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("date_depot").'"',
7395 'avis_decision.libelle as "'.__("decision").'"',
7396 'etat.libelle as "'.__("etat").'"',
7397 'to_char(dossier.date_cloture_instruction, \'DD/MM/YYYY\') as "'.__("date_cloture_instruction").'"',
7398 ));
7399
7400 /**
7401 * Construction de la requête
7402 */
7403 // SELECT
7404 $query_ct_select = "
7405 dossier.dossier,
7406 $select__dossier_libelle__column as dossier_libelle,
7407 dossier.date_cloture_instruction
7408 ";
7409
7410 // FROM
7411 $query_ct_from = "
7412 ".DB_PREFIXE."dossier
7413 LEFT JOIN ".DB_PREFIXE."etat
7414 ON dossier.etat = etat.etat
7415 LEFT JOIN (
7416 SELECT *
7417 FROM ".DB_PREFIXE."lien_dossier_demandeur
7418 INNER JOIN ".DB_PREFIXE."demandeur
7419 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
7420 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
7421 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
7422 ) as demandeur
7423 ON demandeur.dossier = dossier.dossier
7424 LEFT JOIN (
7425 SELECT *
7426 FROM ".DB_PREFIXE."lien_dossier_demandeur
7427 INNER JOIN ".DB_PREFIXE."demandeur
7428 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
7429 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
7430 AND LOWER(demandeur.type_demandeur) = LOWER('requerant')
7431 ) as demandeur_requerant
7432 ON demandeur_requerant.dossier = dossier.dossier
7433 LEFT JOIN ".DB_PREFIXE."dossier as dossier_autorisation_contestee
7434 ON dossier.autorisation_contestee = dossier_autorisation_contestee.dossier
7435 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7436 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
7437 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7438 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7439 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
7440 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7441 LEFT JOIN ".DB_PREFIXE."avis_decision
7442 ON avis_decision.avis_decision=dossier.avis_decision
7443 LEFT JOIN (".DB_PREFIXE."demande
7444 JOIN ".DB_PREFIXE."demande_type
7445 ON demande.demande_type = demande_type.demande_type
7446 )
7447 ON demande.dossier_instruction = dossier.dossier
7448 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
7449 %s
7450 ";
7451
7452 $query_ct_where_collectivite_filter = "";
7453
7454 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
7455 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
7456 // collectivité
7457 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7458 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
7459 ON dossier.om_collectivite=om_collectivite.om_collectivite
7460 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
7461 ";
7462 } else {
7463 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
7464 ON dossier.om_collectivite=om_collectivite.om_collectivite
7465 ";
7466 }
7467
7468 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
7469
7470 // WHERE - COMMON
7471 $query_ct_where_common = "
7472 LOWER(dossier_autorisation_type.code) = LOWER('RE')
7473 AND dossier.date_cloture_instruction >= CURRENT_TIMESTAMP
7474 AND dossier.date_cloture_instruction <= CURRENT_TIMESTAMP + interval '1 month'
7475 ";
7476
7477 // ORDER BY
7478
7479 $query_ct_orderby = "
7480 dossier.date_cloture_instruction ASC
7481 ";
7482
7483 $query_ct_where_groupe = "";
7484 // Gestion des groupes et confidentialité
7485 include('../sql/pgsql/filter_group_widgets.inc.php');
7486
7487 /**
7488 * Message d'aide
7489 */
7490 //
7491 $message_filtre = "";
7492 //
7493 switch ($filtre) {
7494 case "instructeur_ou_instructeur_secondaire":
7495 $message_filtre = " ".__("dont je suis l'instructeur");
7496 break;
7497 case "division":
7498 $message_filtre = " ".__("situés dans ma division");
7499 break;
7500 case "aucun":
7501 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7502 $message_filtre = " ".__("situés dans ma collectivité");
7503 } else {
7504 $message_filtre = " ".__("situés dans toutes les collectivités");
7505 }
7506 break;
7507 }
7508 //
7509 $message_help = sprintf(
7510 __("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."),
7511 $message_filtre
7512 );
7513
7514 /**
7515 * Return
7516 */
7517 //
7518 return array(
7519 "arguments" => $arguments,
7520 "message_help" => $message_help,
7521 "query_ct_select" => $query_ct_select,
7522 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
7523 "query_ct_from" => $query_ct_from,
7524 "query_ct_where" => $query_ct_where_common,
7525 "query_ct_where_groupe" => $query_ct_where_groupe,
7526 "query_ct_orderby" => $query_ct_orderby
7527 );
7528 }
7529
7530 /**
7531 * WIDGET DASHBOARD - Les clôtures
7532 * @return void
7533 */
7534 function view_widget_dossier_contentieux_clotures($content = null) {
7535
7536 /**
7537 * Ce widget est configurable via l'interface Web. Lors de la création
7538 * du widget dans le paramétrage il est possible de spécifier la ou les
7539 * options suivantes :
7540 * - filtre :
7541 * = instructeur
7542 * = division
7543 * = aucun
7544 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
7545 */
7546 // Liste des paramètres
7547 $params = array("filtre", "affichage");
7548 // Formatage des arguments reçus en paramètres
7549 $arguments = $this->get_arguments($content, $params);
7550 // Récupération de la configuration du widget
7551 $conf = $this->get_config_dossier_contentieux_clotures($arguments);
7552
7553 $filtre = $conf["arguments"]["filtre"];
7554 //
7555
7556
7557 /**
7558 * Composition de la requête
7559 */
7560 // Gestion de la requête selon le type d'affichage
7561 $query_ct_orderby = sprintf(
7562 "ORDER BY
7563 %s
7564 LIMIT 5",
7565 $conf["query_ct_orderby"]
7566 );
7567 $query_ct_select = $conf["query_ct_select"];
7568 if ($conf["arguments"]["affichage"] === "nombre") {
7569 $query_ct_orderby = "";
7570 $query_ct_select = "COUNT(*)";
7571 }
7572 $query = sprintf(
7573 "SELECT
7574 %s
7575 FROM
7576 %s
7577 %s
7578 WHERE
7579 %s
7580 %s
7581 %s
7582 %s",
7583 $query_ct_select,
7584 $conf["query_ct_from"],
7585 '%s', // emplacement pour les jointure du filtre
7586 $conf["query_ct_where"],
7587 $conf["query_ct_where_groupe"],
7588 '%s', // emplacement pour les conditions du filtre
7589 $query_ct_orderby
7590 );
7591 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
7592 $sqlFilter = $this->get_query_filter(
7593 $query,
7594 $conf['arguments']['filtre']
7595 );
7596 $query = sprintf(
7597 $query,
7598 $sqlFilter["FROM"],
7599 $sqlFilter["WHERE"]
7600 );
7601
7602 /**
7603 * Template nécessaires à l'affichage du widget
7604 */
7605 if ($conf["arguments"]["affichage"] === "nombre") {
7606 // Exécution de la requête
7607 $qres = $this->f->get_one_result_from_db_query(
7608 $query,
7609 array(
7610 "origin" => __METHOD__
7611 )
7612 );
7613
7614 // Affichage du message d'informations
7615 printf(
7616 $this->template_help,
7617 $conf["message_help"]
7618 );
7619 // Si il n'y a aucun dossier à afficher
7620 if (intval($qres['result']) == 0) {
7621 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.");
7622 return;
7623 }
7624
7625 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
7626 } else {
7627 // Exécution de la requête
7628 $qres = $this->f->get_all_results_from_db_query(
7629 $query,
7630 array(
7631 'origin' => __METHOD__
7632 )
7633 );
7634
7635 // Affichage du message d'informations
7636 printf(
7637 $this->template_help,
7638 $conf["message_help"]
7639 );
7640 // Si il n'y a aucun dossier à afficher
7641 if ($qres['row_count'] === 0) {
7642 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.");
7643 return;
7644 }
7645 //
7646 $template_table = '
7647 <table class="tab-tab">
7648 <thead>
7649 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
7650 <th class="title col-0 firstcol">
7651 <span class="name">
7652 %s
7653 </span>
7654 </th>
7655 <th class="title col-1">
7656 <span class="name">
7657 %s
7658 </span>
7659 </th>
7660 <th class="title col-2 lastcol">
7661 <span class="name">
7662 %s
7663 </span>
7664 </th>
7665 </tr>
7666 </thead>
7667 <tbody>
7668 %s
7669 </tbody>
7670 </table>
7671 ';
7672 //
7673 $template_line = '
7674 <tr class="tab-data odd">
7675 <td class="col-0 firstcol">
7676 %s
7677 </td>
7678 <td class="col-1 ">
7679 %s
7680 </td>
7681 <td class="col-2 lastcol">
7682 %s
7683 </td>
7684 </tr>
7685 ';
7686 //
7687 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_tous_recours&amp;action=3&amp;idx=%s';
7688 //
7689 $template_link = '
7690 <a class="lienTable" href="%s">
7691 %s
7692 </a>
7693 ';
7694 // Bouton consulter
7695 $template_btn_consulter = '
7696 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
7697 .__('Consulter')
7698 .'</span>
7699 ';
7700 //
7701
7702 /**
7703 * Si il y a des dossiers à afficher, alors on affiche le widget.
7704 */
7705 // On construit le contenu du tableau
7706 $ct_tbody = '';
7707 foreach ($qres['result'] as $row) {
7708 // On construit l'attribut href du lien
7709 $ct_href = sprintf(
7710 $template_href,
7711 // idx
7712 $row["dossier"]
7713 );
7714 // On construit la ligne
7715 $ct_tbody .= sprintf(
7716 $template_line,
7717 // Colonne 1 - Numéro de dossier
7718 sprintf(
7719 $template_link,
7720 $ct_href,
7721 $template_btn_consulter
7722 ),
7723 // Colonne 2 - Numéro de dossier
7724 sprintf(
7725 $template_link,
7726 $ct_href,
7727 $row["dossier_libelle"]
7728 ),
7729 // Colonne 3 - Date de clôture d'instruction
7730 sprintf(
7731 $template_link,
7732 $ct_href,
7733 $this->f->formatDate($row["date_cloture_instruction"])
7734 )
7735 );
7736 }
7737 // Affichage du tableau listant les dossiers
7738 printf(
7739 $template_table,
7740 // Colonne 1 - Consulter
7741 '',
7742 // Colonne 2 - Numéro de dossier
7743 __('dossier'),
7744 // Colonne 3 - Date de clôture d'instruction
7745 __("date_cloture_instruction"),
7746 // Le Contenu
7747 $ct_tbody
7748 );
7749 }
7750 // Affichage du footer
7751 printf(
7752 $this->template_footer,
7753 OM_ROUTE_TAB."&obj=dossier_contentieux_clotures&filtre=" . $filtre,
7754 __("Voir +")
7755 );
7756 }
7757
7758 /**
7759 * Cette méthode permet de récupérer la configuration du widget 'Les audience'.
7760 *
7761 * @return array
7762 */
7763 function get_config_dossier_contentieux_audience($arguments) {
7764 include "../sql/pgsql/app_om_tab_common_select.inc.php";
7765 // Initialisation du tableau des paramètres avec ses valeur par défaut
7766 $arguments_default = array(
7767 "filtre" => "instructeur",
7768 "affichage" => "liste"
7769 );
7770 // Vérification des arguments
7771 foreach ($arguments_default as $key => $value) {
7772 //
7773 if (isset($arguments[$key])) {
7774 //
7775 $elem = trim($arguments[$key]);
7776 //
7777 if ($key === "filtre"
7778 && in_array($elem, array("instructeur", "division", "aucun"))) {
7779 // La valeur doit être dans cette liste
7780 $arguments[$key] = $elem;
7781 continue;
7782 } elseif ($key === "affichage"
7783 && in_array($elem, array('liste', 'nombre'))) {
7784 // La valeur doit être dans cette liste
7785 $arguments[$key] = $elem;
7786 continue;
7787 }
7788 }
7789 //
7790 $arguments[$key] = $value;
7791 }
7792 // Utilisation du filtre instructeur dédié au contentieux si le filtre
7793 // paramétré est "instructeur"
7794 if (! empty($arguments["filtre"]) && $arguments["filtre"] === 'instructeur') {
7795 $arguments["filtre"] = 'instructeur_ou_instructeur_secondaire';
7796 }
7797 $filtre = $arguments["filtre"];
7798
7799 // SELECT - CHAMPAFFICHE
7800 $case_contrevenant = "
7801 CASE WHEN demandeur_contrevenant.qualite = 'particulier'
7802 THEN TRIM(CONCAT(demandeur_contrevenant.particulier_nom, ' ', demandeur_contrevenant.particulier_prenom))
7803 ELSE TRIM(CONCAT(demandeur_contrevenant.personne_morale_raison_sociale, ' ', demandeur_contrevenant.personne_morale_denomination))
7804 END
7805 ";
7806 //
7807 $query_ct_select_champaffiche = array_merge(
7808 $array_base_ct_select_champaffiche,
7809 array(
7810 $trim_concat_terrain.'as "'.__("localisation").'"',
7811 $case_contrevenant.' as "'.__("contrevenant").'"',
7812 'to_char(dossier.date_premiere_visite ,\'DD/MM/YYYY\') as "'.__("date_premiere_visite").'"',
7813 'to_char(dossier.date_derniere_visite ,\'DD/MM/YYYY\') as "'.__("date_derniere_visite").'"',
7814 'etat.libelle as "'.__("etat").'"',
7815 'to_char(donnees_techniques.ctx_date_audience, \'DD/MM/YYYY\') as "'.__("ctx_date_audience").'"',
7816 ));
7817
7818 /**
7819 * Construction de la requête
7820 */
7821 // SELECT
7822 $query_ct_select = "
7823 dossier.dossier,
7824 $select__dossier_libelle__column as dossier_libelle,
7825 donnees_techniques.ctx_date_audience
7826 ";
7827
7828 // FROM
7829 $query_ct_from = "
7830 ".DB_PREFIXE."dossier
7831 LEFT JOIN ".DB_PREFIXE."etat
7832 ON dossier.etat = etat.etat
7833 LEFT JOIN (
7834 SELECT *
7835 FROM ".DB_PREFIXE."lien_dossier_demandeur
7836 INNER JOIN ".DB_PREFIXE."demandeur
7837 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
7838 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
7839 AND LOWER(demandeur.type_demandeur) = LOWER('contrevenant')
7840 ) as demandeur_contrevenant
7841 ON demandeur_contrevenant.dossier = dossier.dossier
7842 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
7843 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
7844 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7845 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7846 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
7847 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7848 LEFT JOIN ".DB_PREFIXE."avis_decision
7849 ON avis_decision.avis_decision=dossier.avis_decision
7850 LEFT JOIN ".DB_PREFIXE."donnees_techniques
7851 ON donnees_techniques.dossier_instruction = dossier.dossier
7852 LEFT JOIN (".DB_PREFIXE."demande
7853 JOIN ".DB_PREFIXE."demande_type
7854 ON demande.demande_type = demande_type.demande_type
7855 )
7856 ON demande.dossier_instruction = dossier.dossier
7857 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
7858 %s
7859 ";
7860
7861 $query_ct_where_collectivite_filter = "";
7862
7863 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
7864 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
7865 // collectivité
7866 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7867 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
7868 ON dossier.om_collectivite=om_collectivite.om_collectivite
7869 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
7870 ";
7871 } else {
7872 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
7873 ON dossier.om_collectivite=om_collectivite.om_collectivite
7874 ";
7875 }
7876
7877 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
7878
7879 // WHERE - COMMON
7880 $query_ct_where_common = "
7881 LOWER(dossier_autorisation_type.code) = LOWER('IN')
7882 AND donnees_techniques.ctx_date_audience IS NOT NULL
7883 AND donnees_techniques.ctx_date_audience >= CURRENT_TIMESTAMP
7884 AND donnees_techniques.ctx_date_audience <= CURRENT_TIMESTAMP + interval '1 month'
7885 ";
7886 // ORDER BY
7887
7888 $query_ct_orderby = "
7889 donnees_techniques.ctx_date_audience ASC
7890 ";
7891
7892 $query_ct_where_groupe = "";
7893 // Gestion des groupes et confidentialité
7894 include('../sql/pgsql/filter_group_widgets.inc.php');
7895
7896 /**
7897 * Message d'aide
7898 */
7899 //
7900 $message_filtre = "";
7901 //
7902 switch ($filtre) {
7903 case "instructeur_ou_instructeur_secondaire":
7904 $message_filtre = " ".__("dont je suis l'instructeur");
7905 break;
7906 case "division":
7907 $message_filtre = " ".__("situés dans ma division");
7908 break;
7909 case "aucun":
7910 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7911 $message_filtre = " ".__("situés dans ma collectivité");
7912 } else {
7913 $message_filtre = " ".__("situés dans toutes les collectivités");
7914 }
7915 break;
7916 }
7917 //
7918 $message_help = sprintf(
7919 __("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."),
7920 $message_filtre
7921 );
7922
7923 /**
7924 * Return
7925 */
7926 //
7927 return array(
7928 "arguments" => $arguments,
7929 "message_help" => $message_help,
7930 "query_ct_select" => $query_ct_select,
7931 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
7932 "query_ct_from" => $query_ct_from,
7933 "query_ct_where" => $query_ct_where_common,
7934 "query_ct_where_groupe" => $query_ct_where_groupe,
7935 "query_ct_orderby" => $query_ct_orderby,
7936 );
7937 }
7938
7939 /**
7940 * WIDGET DASHBOARD - Les audiences
7941 * @return void
7942 */
7943 function view_widget_dossier_contentieux_audience($content = null) {
7944 /**
7945 * Ce widget est configurable via l'interface Web. Lors de la création
7946 * du widget dans le paramétrage il est possible de spécifier la ou les
7947 * options suivantes :
7948 * - filtre :
7949 * = instructeur
7950 * = division
7951 * = aucun
7952 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
7953 */
7954 // Liste des paramètres
7955 $params = array("filtre", "affichage");
7956 // Formatage des arguments reçus en paramètres
7957 $arguments = $this->get_arguments($content, $params);
7958 // Récupération de la configuration du widget
7959 $conf = $this->get_config_dossier_contentieux_audience($arguments);
7960
7961 //
7962 $filtre = $conf["arguments"]["filtre"];
7963 //
7964
7965 /**
7966 * Composition de la requête
7967 */
7968 // Gestion de la requête selon le type d'affichage
7969 $query_ct_orderby = sprintf(
7970 "ORDER BY
7971 %s
7972 LIMIT 5",
7973 $conf["query_ct_orderby"]
7974 );
7975 $query_ct_select = $conf["query_ct_select"];
7976 if ($conf["arguments"]["affichage"] === "nombre") {
7977 $query_ct_orderby = "";
7978 $query_ct_select = "COUNT(*)";
7979 }
7980 $query = sprintf(
7981 "SELECT
7982 %s
7983 FROM
7984 %s
7985 %s
7986 WHERE
7987 %s
7988 %s
7989 %s
7990 %s",
7991 $query_ct_select,
7992 $conf["query_ct_from"],
7993 '%s', // emplacement pour les jointure du filtre
7994 $conf["query_ct_where"],
7995 $conf["query_ct_where_groupe"],
7996 '%s', // emplacement pour les conditions du filtre
7997 $query_ct_orderby
7998 );
7999 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
8000 $sqlFilter = $this->get_query_filter(
8001 $query,
8002 $conf['arguments']['filtre']
8003 );
8004 $query = sprintf(
8005 $query,
8006 $sqlFilter["FROM"],
8007 $sqlFilter["WHERE"]
8008 );
8009
8010 /**
8011 * Template nécessaires à l'affichage du widget
8012 */
8013 if ($conf["arguments"]["affichage"] === "nombre") {
8014 // Exécution de la requête
8015 $qres = $this->f->get_one_result_from_db_query(
8016 $query,
8017 array(
8018 "origin" => __METHOD__
8019 )
8020 );
8021
8022 // Affichage du message d'informations
8023 printf(
8024 $this->template_help,
8025 $conf["message_help"]
8026 );
8027 // Si il n'y a aucun dossier à afficher
8028 if (intval($qres['result']) == 0) {
8029 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.");
8030 return;
8031 }
8032
8033 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
8034 } else {
8035 // Exécution de la requête
8036 $qres = $this->f->get_all_results_from_db_query(
8037 $query,
8038 array(
8039 'origin' => __METHOD__
8040 )
8041 );
8042
8043 // Affichage du message d'informations
8044 printf(
8045 $this->template_help,
8046 $conf["message_help"]
8047 );
8048 // Si il n'y a aucun dossier à afficher
8049 if ($qres['row_count'] === 0) {
8050 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.");
8051 return;
8052 }
8053 //
8054 $template_table = '
8055 <table class="tab-tab">
8056 <thead>
8057 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
8058 <th class="title col-0 firstcol">
8059 <span class="name">
8060 %s
8061 </span>
8062 </th>
8063 <th class="title col-1">
8064 <span class="name">
8065 %s
8066 </span>
8067 </th>
8068 <th class="title col-2 lastcol">
8069 <span class="name">
8070 %s
8071 </span>
8072 </th>
8073 </tr>
8074 </thead>
8075 <tbody>
8076 %s
8077 </tbody>
8078 </table>
8079 ';
8080 //
8081 $template_line = '
8082 <tr class="tab-data odd">
8083 <td class="col-0 firstcol">
8084 %s
8085 </td>
8086 <td class="col-1 ">
8087 %s
8088 </td>
8089 <td class="col-2 lastcol">
8090 %s
8091 </td>
8092 </tr>
8093 ';
8094 //
8095 $template_href = OM_ROUTE_FORM.'&obj=dossier_contentieux_toutes_infractions&amp;action=3&amp;idx=%s';
8096 //
8097 $template_link = '
8098 <a class="lienTable" href="%s">
8099 %s
8100 </a>
8101 ';
8102 // Bouton consulter
8103 $template_btn_consulter = '
8104 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
8105 .__('Consulter')
8106 .'</span>
8107 ';
8108 //
8109
8110 /**
8111 * Si il y a des dossiers à afficher, alors on affiche le widget.
8112 */
8113 // On construit le contenu du tableau
8114 $ct_tbody = '';
8115 foreach ($qres['result'] as $row) {
8116 // On construit l'attribut href du lien
8117 $ct_href = sprintf(
8118 $template_href,
8119 // idx
8120 $row["dossier"]
8121 );
8122 // On construit la ligne
8123 $ct_tbody .= sprintf(
8124 $template_line,
8125 // Colonne 1 - Numéro de dossier
8126 sprintf(
8127 $template_link,
8128 $ct_href,
8129 $template_btn_consulter
8130 ),
8131 // Colonne 2 - Numéro de dossier
8132 sprintf(
8133 $template_link,
8134 $ct_href,
8135 $row["dossier_libelle"]
8136 ),
8137 // Colonne 3 - Date d'audience
8138 sprintf(
8139 $template_link,
8140 $ct_href,
8141 $this->f->formatDate($row["ctx_date_audience"])
8142 )
8143 );
8144 }
8145 // Affichage du tableau listant les dossiers
8146 printf(
8147 $template_table,
8148 // Colonne 1 - Consulter
8149 '',
8150 // Colonne 2 - Numéro de dossier
8151 __('dossier'),
8152 // Colonne 3 - Date d'audience
8153 __('ctx_date_audience'),
8154 // Le Contenu
8155 $ct_tbody
8156 );
8157 }
8158 // Affichage du footer
8159 printf(
8160 $this->template_footer,
8161 OM_ROUTE_TAB."&obj=dossier_contentieux_audience&filtre=" . $filtre,
8162 __("Voir +")
8163 );
8164 }
8165
8166 /**
8167 * WIDGET DASHBOARD - Derniers dossiers déposés
8168 *
8169 * @return void
8170 */
8171 function view_widget_derniers_dossiers_deposes($content = null) {
8172
8173 /**
8174 * Ce widget est configurable via l'interface Web. Lors de la création
8175 * du widget dans le paramétrage il est possible de spécifier la ou les
8176 * options suivantes :
8177 *
8178 * - filtre :
8179 * = instructeur
8180 * = division
8181 * = aucun
8182 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
8183 *
8184 * - nombre_de_jours : c'est le délai en jours avant la date limite à
8185 * partir duquel on souhaite voir apparaître les dossiers dans le
8186 * widget.
8187 * (default) Par défaut la valeur est 15 jours.
8188 *
8189 * - codes_datd : la liste des types de dossiers à afficher. exemple :
8190 * "PCI;PCA;DPS;CUa;CUb".
8191 * (default) Par défaut tous les types sont affichés. [null]
8192 *
8193 * - restreindre_msg_non_lus : dans le listing associé, la colonne "message
8194 * manuel" affiche un indicateur
8195 * = true : que si le dossier comporte au moins un message
8196 * manuel NON LU.
8197 * = (default)false :si le dossier comporte au moins un message
8198 * manuel.
8199 *
8200 * - filtre_depot :
8201 * = depot_electronique
8202 * = guichet
8203 * = (default) aucun
8204 * Par défaut le filtre de dépôt est aucun,
8205 * donc autorise tous les types de dépôt.
8206 */
8207 // Liste des paramètres
8208 $params = array("filtre", "nombre_de_jours", "codes_datd", "filtre_depot", "restreindre_msg_non_lus");
8209 // Formatage des arguments reçus en paramètres
8210 $arguments = $this->get_arguments($content, $params);
8211 // Récupération de la configuration du widget
8212 $conf = $this->get_config_derniers_dossiers_deposes($arguments);
8213 //
8214 $filtre = $conf["arguments"]["filtre"];
8215 $nombre_de_jours = $conf["arguments"]["nombre_de_jours"];
8216 $codes_datd = $conf["arguments"]["codes_datd"];
8217 $filtre_depot = $conf["arguments"]["filtre_depot"];
8218 $restreindre_msg_non_lus = $conf["arguments"]["restreindre_msg_non_lus"];
8219
8220 /**
8221 * Composition de la requête
8222 */
8223 $query = sprintf(
8224 "SELECT
8225 COUNT(DISTINCT(dossier.dossier))
8226 FROM
8227 %s
8228 %s
8229 WHERE
8230 %s
8231 %s
8232 %s
8233 %s
8234 %s
8235 %s",
8236 $conf["query_ct_from"],
8237 '%s', // emplacement pour les jointure du filtre
8238 $conf["query_ct_where_common"],
8239 $conf["query_ct_where_date_filter"],
8240 $conf["query_ct_where_groupe"],
8241 $conf["query_ct_where_depot_filter"],
8242 $conf["query_ct_where_datd_filter"],
8243 '%s' // emplacement pour les conditions du filtre
8244 );
8245 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
8246 $sqlFilter = $this->get_query_filter(
8247 $query,
8248 $conf['arguments']['filtre']
8249 );
8250 $query = sprintf(
8251 $query,
8252 $sqlFilter["FROM"],
8253 $sqlFilter["WHERE"]
8254 );
8255
8256 /**
8257 * Exécution de la requête
8258 */
8259 //
8260 $qres = $this->f->get_one_result_from_db_query(
8261 $query,
8262 array(
8263 "origin" => __METHOD__
8264 )
8265 );
8266
8267 // Affichage du message d'informations
8268 printf(
8269 $this->template_help,
8270 $conf["message_help"]
8271 );
8272
8273 //
8274 if (intval($qres['result']) === 0) {
8275 //
8276 echo __("Aucun dossier déposé dernièrement.");
8277 return;
8278 }
8279
8280
8281 /**
8282 *
8283 */
8284 $this->display_resultat_bulle($qres['result'], __("Déposés dernièrement"), "bg-info", "");
8285
8286 // Affichage du footer
8287 printf(
8288 $this->template_footer,
8289 // href (avec les paramètres du widget)
8290 sprintf(
8291 OM_ROUTE_TAB."&obj=derniers_dossiers_deposes&filtre=%s&nombre_de_jours=%s&codes_datd=%s&filtre_depot=%s&restreindre_msg_non_lus=%s",
8292 $filtre,
8293 $nombre_de_jours,
8294 (is_null($codes_datd) ? "" : implode(";",$codes_datd)),
8295 $filtre_depot,
8296 $restreindre_msg_non_lus
8297 ),
8298 // titre
8299 __("Voir +")
8300 );
8301
8302 }
8303
8304 /**
8305 * Cette méthode permet de récupérer la configuration du widget 'Dossiers
8306 * limites'.
8307 *
8308 * @return array
8309 */
8310 function get_config_derniers_dossiers_deposes($arguments) {
8311 include "../sql/pgsql/app_om_tab_common_select.inc.php";
8312 // Initialisation du tableau des paramètres avec ses valeur par défaut
8313 $arguments_default = array(
8314 "nombre_de_jours" => 15,
8315 "codes_datd" => null,
8316 "filtre" => "division",
8317 "filtre_depot"=> "aucun",
8318 "restreindre_msg_non_lus" => "false"
8319 );
8320 // Vérification des arguments
8321 foreach ($arguments_default as $key => $value) {
8322 //
8323 if (isset($arguments[$key])) {
8324 //
8325 $elem = trim($arguments[$key]);
8326 //
8327 if ($key === "nombre_de_jours"
8328 && intval($elem) > 0) {
8329 // Ce doit être un entier
8330 $arguments[$key] = intval($elem);
8331 continue;
8332 } elseif ($key === "codes_datd"
8333 && $elem != "") {
8334 // Ce doit être un tableau
8335 $arguments[$key] = explode(";", $elem);
8336 continue;
8337 } elseif ($key === "filtre"
8338 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
8339 // La valeur doit être dans cette liste
8340 $arguments[$key] = $elem;
8341 continue;
8342 } elseif ($key === "filtre_depot"
8343 && in_array($elem, array("depot_electronique", "guichet", "aucun"))) {
8344 // La valeur doit être dans cette liste
8345 $arguments[$key] = $elem;
8346 continue;
8347 } elseif ($key === "restreindre_msg_non_lus"
8348 && in_array($elem, array("true", "false"))) {
8349 // La valeur doit être dans cette liste
8350 $arguments[$key] = $elem;
8351 continue;
8352 }
8353 }
8354 //
8355 $arguments[$key] = $value;
8356 }
8357 //
8358 $nombre_de_jours = $arguments["nombre_de_jours"];
8359 $codes_datd = $arguments["codes_datd"];
8360 $filtre = $arguments["filtre"];
8361 $filtre_depot = $arguments["filtre_depot"];
8362 $restreindre_msg_non_lus = $arguments["restreindre_msg_non_lus"];
8363
8364 // SELECT - CHAMPAFFICHE - pour le listing
8365 // On distingue par dossier_libelle car la jointure à la table message
8366 // provoque des doublons lorsqu'un dossier a plusieurs messages
8367 // On distingue par date de dépot car les arguments du "DISTINCT ON"
8368 // doivent être ceux de "ORDER BY"
8369 $case_demandeur = "CASE WHEN demandeur.qualite = 'particulier'
8370 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
8371 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
8372 END";
8373 $query_ct_select_champrecherche = array(
8374 'dossier.dossier as "'.__("dossier").'"',
8375 $select__dossier_libelle__column_as,
8376 );
8377 $query_ct_select_champaffiche = array_merge(
8378 $array_base_ct_select_champaffiche,
8379 array(
8380 $case_demandeur.' AS "'.__("petitionnaire").'"',
8381 'to_char(dossier.date_depot, \'DD/MM/YYYY\') AS "'.__("date_depot").'"',
8382 "CASE WHEN dossier.a_qualifier IS TRUE
8383 THEN 'Oui'
8384 ELSE 'Non'
8385 END".' as "'.__("a_qualifier").'"',
8386 'donnees_techniques.co_tot_log_nb as "'.__("nombre total de logements").'"',
8387 'CASE WHEN su2_avt_shon1 IS NOT NULL
8388 OR su2_avt_shon2 IS NOT NULL
8389 OR su2_avt_shon3 IS NOT NULL
8390 OR su2_avt_shon4 IS NOT NULL
8391 OR su2_avt_shon5 IS NOT NULL
8392 OR su2_avt_shon6 IS NOT NULL
8393 OR su2_avt_shon7 IS NOT NULL
8394 OR su2_avt_shon8 IS NOT NULL
8395 OR su2_avt_shon9 IS NOT NULL
8396 OR su2_avt_shon10 IS NOT NULL
8397 OR su2_avt_shon11 IS NOT NULL
8398 OR su2_avt_shon12 IS NOT NULL
8399 OR su2_avt_shon13 IS NOT NULL
8400 OR su2_avt_shon14 IS NOT NULL
8401 OR su2_avt_shon15 IS NOT NULL
8402 OR su2_avt_shon16 IS NOT NULL
8403 OR su2_avt_shon17 IS NOT NULL
8404 OR su2_avt_shon18 IS NOT NULL
8405 OR su2_avt_shon19 IS NOT NULL
8406 OR su2_avt_shon20 IS NOT NULL
8407 OR su2_avt_shon21 IS NOT NULL
8408 OR su2_avt_shon22 IS NOT NULL
8409 OR su2_avt_shon23 IS NOT NULL
8410 OR su2_avt_shon24 IS NOT NULL
8411 OR su2_cstr_shon1 IS NOT NULL
8412 OR su2_cstr_shon2 IS NOT NULL
8413 OR su2_cstr_shon3 IS NOT NULL
8414 OR su2_cstr_shon4 IS NOT NULL
8415 OR su2_cstr_shon5 IS NOT NULL
8416 OR su2_cstr_shon6 IS NOT NULL
8417 OR su2_cstr_shon7 IS NOT NULL
8418 OR su2_cstr_shon8 IS NOT NULL
8419 OR su2_cstr_shon9 IS NOT NULL
8420 OR su2_cstr_shon10 IS NOT NULL
8421 OR su2_cstr_shon11 IS NOT NULL
8422 OR su2_cstr_shon12 IS NOT NULL
8423 OR su2_cstr_shon13 IS NOT NULL
8424 OR su2_cstr_shon14 IS NOT NULL
8425 OR su2_cstr_shon15 IS NOT NULL
8426 OR su2_cstr_shon16 IS NOT NULL
8427 OR su2_cstr_shon17 IS NOT NULL
8428 OR su2_cstr_shon18 IS NOT NULL
8429 OR su2_cstr_shon19 IS NOT NULL
8430 OR su2_cstr_shon20 IS NOT NULL
8431 OR su2_cstr_shon21 IS NOT NULL
8432 OR su2_cstr_shon22 IS NOT NULL
8433 OR su2_cstr_shon23 IS NOT NULL
8434 OR su2_cstr_shon24 IS NOT NULL
8435 OR su2_chge_shon1 IS NOT NULL
8436 OR su2_chge_shon2 IS NOT NULL
8437 OR su2_chge_shon3 IS NOT NULL
8438 OR su2_chge_shon4 IS NOT NULL
8439 OR su2_chge_shon5 IS NOT NULL
8440 OR su2_chge_shon6 IS NOT NULL
8441 OR su2_chge_shon7 IS NOT NULL
8442 OR su2_chge_shon8 IS NOT NULL
8443 OR su2_chge_shon9 IS NOT NULL
8444 OR su2_chge_shon10 IS NOT NULL
8445 OR su2_chge_shon11 IS NOT NULL
8446 OR su2_chge_shon12 IS NOT NULL
8447 OR su2_chge_shon13 IS NOT NULL
8448 OR su2_chge_shon14 IS NOT NULL
8449 OR su2_chge_shon15 IS NOT NULL
8450 OR su2_chge_shon16 IS NOT NULL
8451 OR su2_chge_shon17 IS NOT NULL
8452 OR su2_chge_shon18 IS NOT NULL
8453 OR su2_chge_shon19 IS NOT NULL
8454 OR su2_chge_shon20 IS NOT NULL
8455 OR su2_chge_shon21 IS NOT NULL
8456 OR su2_chge_shon22 IS NOT NULL
8457 OR su2_chge_shon23 IS NOT NULL
8458 OR su2_chge_shon24 IS NOT NULL
8459 OR su2_demo_shon1 IS NOT NULL
8460 OR su2_demo_shon2 IS NOT NULL
8461 OR su2_demo_shon3 IS NOT NULL
8462 OR su2_demo_shon4 IS NOT NULL
8463 OR su2_demo_shon5 IS NOT NULL
8464 OR su2_demo_shon6 IS NOT NULL
8465 OR su2_demo_shon7 IS NOT NULL
8466 OR su2_demo_shon8 IS NOT NULL
8467 OR su2_demo_shon9 IS NOT NULL
8468 OR su2_demo_shon10 IS NOT NULL
8469 OR su2_demo_shon11 IS NOT NULL
8470 OR su2_demo_shon12 IS NOT NULL
8471 OR su2_demo_shon13 IS NOT NULL
8472 OR su2_demo_shon14 IS NOT NULL
8473 OR su2_demo_shon15 IS NOT NULL
8474 OR su2_demo_shon16 IS NOT NULL
8475 OR su2_demo_shon17 IS NOT NULL
8476 OR su2_demo_shon18 IS NOT NULL
8477 OR su2_demo_shon19 IS NOT NULL
8478 OR su2_demo_shon20 IS NOT NULL
8479 OR su2_demo_shon21 IS NOT NULL
8480 OR su2_demo_shon22 IS NOT NULL
8481 OR su2_demo_shon23 IS NOT NULL
8482 OR su2_demo_shon24 IS NOT NULL
8483 OR su2_sup_shon1 IS NOT NULL
8484 OR su2_sup_shon2 IS NOT NULL
8485 OR su2_sup_shon3 IS NOT NULL
8486 OR su2_sup_shon4 IS NOT NULL
8487 OR su2_sup_shon5 IS NOT NULL
8488 OR su2_sup_shon6 IS NOT NULL
8489 OR su2_sup_shon7 IS NOT NULL
8490 OR su2_sup_shon8 IS NOT NULL
8491 OR su2_sup_shon9 IS NOT NULL
8492 OR su2_sup_shon10 IS NOT NULL
8493 OR su2_sup_shon11 IS NOT NULL
8494 OR su2_sup_shon12 IS NOT NULL
8495 OR su2_sup_shon13 IS NOT NULL
8496 OR su2_sup_shon14 IS NOT NULL
8497 OR su2_sup_shon15 IS NOT NULL
8498 OR su2_sup_shon16 IS NOT NULL
8499 OR su2_sup_shon17 IS NOT NULL
8500 OR su2_sup_shon18 IS NOT NULL
8501 OR su2_sup_shon19 IS NOT NULL
8502 OR su2_sup_shon20 IS NOT NULL
8503 OR su2_sup_shon21 IS NOT NULL
8504 OR su2_sup_shon22 IS NOT NULL
8505 OR su2_sup_shon23 IS NOT NULL
8506 OR su2_sup_shon24 IS NOT NULL
8507 THEN
8508 donnees_techniques.su2_cstr_shon_tot
8509 ELSE
8510 donnees_techniques.su_cstr_shon_tot
8511 END as "'.__("surface de plancher construite totale").'"',
8512 "CASE WHEN su2_avt_shon1 IS NOT NULL
8513 OR su2_avt_shon2 IS NOT NULL
8514 OR su2_avt_shon3 IS NOT NULL
8515 OR su2_avt_shon4 IS NOT NULL
8516 OR su2_avt_shon5 IS NOT NULL
8517 OR su2_avt_shon6 IS NOT NULL
8518 OR su2_avt_shon7 IS NOT NULL
8519 OR su2_avt_shon8 IS NOT NULL
8520 OR su2_avt_shon9 IS NOT NULL
8521 OR su2_avt_shon10 IS NOT NULL
8522 OR su2_avt_shon11 IS NOT NULL
8523 OR su2_avt_shon12 IS NOT NULL
8524 OR su2_avt_shon13 IS NOT NULL
8525 OR su2_avt_shon14 IS NOT NULL
8526 OR su2_avt_shon15 IS NOT NULL
8527 OR su2_avt_shon16 IS NOT NULL
8528 OR su2_avt_shon17 IS NOT NULL
8529 OR su2_avt_shon18 IS NOT NULL
8530 OR su2_avt_shon19 IS NOT NULL
8531 OR su2_avt_shon20 IS NOT NULL
8532 OR su2_avt_shon21 IS NOT NULL
8533 OR su2_avt_shon22 IS NOT NULL
8534 OR su2_avt_shon23 IS NOT NULL
8535 OR su2_avt_shon24 IS NOT NULL
8536 OR su2_cstr_shon1 IS NOT NULL
8537 OR su2_cstr_shon2 IS NOT NULL
8538 OR su2_cstr_shon3 IS NOT NULL
8539 OR su2_cstr_shon4 IS NOT NULL
8540 OR su2_cstr_shon5 IS NOT NULL
8541 OR su2_cstr_shon6 IS NOT NULL
8542 OR su2_cstr_shon7 IS NOT NULL
8543 OR su2_cstr_shon8 IS NOT NULL
8544 OR su2_cstr_shon9 IS NOT NULL
8545 OR su2_cstr_shon10 IS NOT NULL
8546 OR su2_cstr_shon11 IS NOT NULL
8547 OR su2_cstr_shon12 IS NOT NULL
8548 OR su2_cstr_shon13 IS NOT NULL
8549 OR su2_cstr_shon14 IS NOT NULL
8550 OR su2_cstr_shon15 IS NOT NULL
8551 OR su2_cstr_shon16 IS NOT NULL
8552 OR su2_cstr_shon17 IS NOT NULL
8553 OR su2_cstr_shon18 IS NOT NULL
8554 OR su2_cstr_shon19 IS NOT NULL
8555 OR su2_cstr_shon20 IS NOT NULL
8556 OR su2_cstr_shon21 IS NOT NULL
8557 OR su2_cstr_shon22 IS NOT NULL
8558 OR su2_cstr_shon23 IS NOT NULL
8559 OR su2_cstr_shon24 IS NOT NULL
8560 OR su2_chge_shon1 IS NOT NULL
8561 OR su2_chge_shon2 IS NOT NULL
8562 OR su2_chge_shon3 IS NOT NULL
8563 OR su2_chge_shon4 IS NOT NULL
8564 OR su2_chge_shon5 IS NOT NULL
8565 OR su2_chge_shon6 IS NOT NULL
8566 OR su2_chge_shon7 IS NOT NULL
8567 OR su2_chge_shon8 IS NOT NULL
8568 OR su2_chge_shon9 IS NOT NULL
8569 OR su2_chge_shon10 IS NOT NULL
8570 OR su2_chge_shon11 IS NOT NULL
8571 OR su2_chge_shon12 IS NOT NULL
8572 OR su2_chge_shon13 IS NOT NULL
8573 OR su2_chge_shon14 IS NOT NULL
8574 OR su2_chge_shon15 IS NOT NULL
8575 OR su2_chge_shon16 IS NOT NULL
8576 OR su2_chge_shon17 IS NOT NULL
8577 OR su2_chge_shon18 IS NOT NULL
8578 OR su2_chge_shon19 IS NOT NULL
8579 OR su2_chge_shon20 IS NOT NULL
8580 OR su2_chge_shon21 IS NOT NULL
8581 OR su2_chge_shon22 IS NOT NULL
8582 OR su2_chge_shon23 IS NOT NULL
8583 OR su2_chge_shon24 IS NOT NULL
8584 OR su2_demo_shon1 IS NOT NULL
8585 OR su2_demo_shon2 IS NOT NULL
8586 OR su2_demo_shon3 IS NOT NULL
8587 OR su2_demo_shon4 IS NOT NULL
8588 OR su2_demo_shon5 IS NOT NULL
8589 OR su2_demo_shon6 IS NOT NULL
8590 OR su2_demo_shon7 IS NOT NULL
8591 OR su2_demo_shon8 IS NOT NULL
8592 OR su2_demo_shon9 IS NOT NULL
8593 OR su2_demo_shon10 IS NOT NULL
8594 OR su2_demo_shon11 IS NOT NULL
8595 OR su2_demo_shon12 IS NOT NULL
8596 OR su2_demo_shon13 IS NOT NULL
8597 OR su2_demo_shon14 IS NOT NULL
8598 OR su2_demo_shon15 IS NOT NULL
8599 OR su2_demo_shon16 IS NOT NULL
8600 OR su2_demo_shon17 IS NOT NULL
8601 OR su2_demo_shon18 IS NOT NULL
8602 OR su2_demo_shon19 IS NOT NULL
8603 OR su2_demo_shon20 IS NOT NULL
8604 OR su2_demo_shon21 IS NOT NULL
8605 OR su2_demo_shon22 IS NOT NULL
8606 OR su2_demo_shon23 IS NOT NULL
8607 OR su2_demo_shon24 IS NOT NULL
8608 OR su2_sup_shon1 IS NOT NULL
8609 OR su2_sup_shon2 IS NOT NULL
8610 OR su2_sup_shon3 IS NOT NULL
8611 OR su2_sup_shon4 IS NOT NULL
8612 OR su2_sup_shon5 IS NOT NULL
8613 OR su2_sup_shon6 IS NOT NULL
8614 OR su2_sup_shon7 IS NOT NULL
8615 OR su2_sup_shon8 IS NOT NULL
8616 OR su2_sup_shon9 IS NOT NULL
8617 OR su2_sup_shon10 IS NOT NULL
8618 OR su2_sup_shon11 IS NOT NULL
8619 OR su2_sup_shon12 IS NOT NULL
8620 OR su2_sup_shon13 IS NOT NULL
8621 OR su2_sup_shon14 IS NOT NULL
8622 OR su2_sup_shon15 IS NOT NULL
8623 OR su2_sup_shon16 IS NOT NULL
8624 OR su2_sup_shon17 IS NOT NULL
8625 OR su2_sup_shon18 IS NOT NULL
8626 OR su2_sup_shon19 IS NOT NULL
8627 OR su2_sup_shon20 IS NOT NULL
8628 OR su2_sup_shon21 IS NOT NULL
8629 OR su2_sup_shon22 IS NOT NULL
8630 OR su2_sup_shon23 IS NOT NULL
8631 OR su2_sup_shon24 IS NOT NULL
8632 THEN
8633 REGEXP_REPLACE(CONCAT(
8634 CASE WHEN donnees_techniques.su2_cstr_shon1 IS NULL
8635 THEN ''
8636 ELSE CONCAT ('Exploitation agricole - ', donnees_techniques.su2_cstr_shon1, ' m² / ')
8637 END,
8638 CASE WHEN donnees_techniques.su2_cstr_shon2 IS NULL
8639 THEN ''
8640 ELSE CONCAT ('Exploitation forestière - ', donnees_techniques.su2_cstr_shon2, ' m² / ')
8641 END,
8642 CASE WHEN donnees_techniques.su2_cstr_shon3 IS NULL
8643 THEN ''
8644 ELSE CONCAT ('Logement - ', donnees_techniques.su2_cstr_shon3, ' m² / ')
8645 END,
8646 CASE WHEN donnees_techniques.su2_cstr_shon4 IS NULL
8647 THEN ''
8648 ELSE CONCAT ('Hébergement - ', donnees_techniques.su2_cstr_shon4, ' m² / ')
8649 END,
8650 CASE WHEN donnees_techniques.su2_cstr_shon5 IS NULL
8651 THEN ''
8652 ELSE CONCAT ('Artisanat et commerce de détail - ', donnees_techniques.su2_cstr_shon5, ' m² / ')
8653 END,
8654 CASE WHEN donnees_techniques.su2_cstr_shon6 IS NULL
8655 THEN ''
8656 ELSE CONCAT ('Restauration - ', donnees_techniques.su2_cstr_shon6, ' m² / ')
8657 END,
8658 CASE WHEN donnees_techniques.su2_cstr_shon7 IS NULL
8659 THEN ''
8660 ELSE CONCAT ('Commerce de gros - ', donnees_techniques.su2_cstr_shon7, ' m² / ')
8661 END,
8662 CASE WHEN donnees_techniques.su2_cstr_shon8 IS NULL
8663 THEN ''
8664 ELSE CONCAT ('Activités de services où s''effectue l''accueil d''une clientèle - ', donnees_techniques.su2_cstr_shon8, ' m² / ')
8665 END,
8666 CASE WHEN donnees_techniques.su2_cstr_shon9 IS NULL
8667 THEN ''
8668 ELSE CONCAT ('Hébergement hôtelier et touristique - ', donnees_techniques.su2_cstr_shon9, ' m² / ')
8669 END,
8670 CASE WHEN donnees_techniques.su2_cstr_shon10 IS NULL
8671 THEN ''
8672 ELSE CONCAT ('Cinéma - ', donnees_techniques.su2_cstr_shon10, ' m² / ')
8673 END,
8674 CASE WHEN donnees_techniques.su2_cstr_shon21 IS NULL
8675 THEN ''
8676 ELSE CONCAT ('Hôtels - ', donnees_techniques.su2_cstr_shon21, ' m² / ')
8677 END,
8678 CASE WHEN donnees_techniques.su2_cstr_shon22 IS NULL
8679 THEN ''
8680 ELSE CONCAT ('Autres hébergements touristiques - ', donnees_techniques.su2_cstr_shon22, ' m² / ')
8681 END,
8682 CASE WHEN donnees_techniques.su2_cstr_shon11 IS NULL
8683 THEN ''
8684 ELSE CONCAT ('Locaux et bureaux accueillant du public des administrations publiques et assimilés - ', donnees_techniques.su2_cstr_shon11, ' m² / ')
8685 END,
8686 CASE WHEN donnees_techniques.su2_cstr_shon12 IS NULL
8687 THEN ''
8688 ELSE CONCAT ('Locaux techniques et industriels des administrations publiques et assimilés - ', donnees_techniques.su2_cstr_shon12, ' m² / ')
8689 END,
8690 CASE WHEN donnees_techniques.su2_cstr_shon13 IS NULL
8691 THEN ''
8692 ELSE CONCAT ('Établissements d''enseignement, de santé et d''action sociale - ', donnees_techniques.su2_cstr_shon13, ' m² / ')
8693 END,
8694 CASE WHEN donnees_techniques.su2_cstr_shon14 IS NULL
8695 THEN ''
8696 ELSE CONCAT ('Salles d''art et de spectacles - ', donnees_techniques.su2_cstr_shon14, ' m² / ')
8697 END,
8698 CASE WHEN donnees_techniques.su2_cstr_shon15 IS NULL
8699 THEN ''
8700 ELSE CONCAT ('Équipements sportifs - ', donnees_techniques.su2_cstr_shon15, ' m² / ')
8701 END,
8702 CASE WHEN donnees_techniques.su2_cstr_shon23 IS NULL
8703 THEN ''
8704 ELSE CONCAT ('Lieux de culte - ', donnees_techniques.su2_cstr_shon23, ' m² / ')
8705 END,
8706 CASE WHEN donnees_techniques.su2_cstr_shon16 IS NULL
8707 THEN ''
8708 ELSE CONCAT ('Autres équipements recevant du public - ', donnees_techniques.su2_cstr_shon16, ' m² / ')
8709 END,
8710 CASE WHEN donnees_techniques.su2_cstr_shon17 IS NULL
8711 THEN ''
8712 ELSE CONCAT ('Industrie - ', donnees_techniques.su2_cstr_shon17, ' m² / ')
8713 END,
8714 CASE WHEN donnees_techniques.su2_cstr_shon18 IS NULL
8715 THEN ''
8716 ELSE CONCAT ('Entrepôt - ', donnees_techniques.su2_cstr_shon18, ' m² / ')
8717 END,
8718 CASE WHEN donnees_techniques.su2_cstr_shon19 IS NULL
8719 THEN ''
8720 ELSE CONCAT ('Bureau - ', donnees_techniques.su2_cstr_shon19, ' m² / ')
8721 END,
8722 CASE WHEN donnees_techniques.su2_cstr_shon20 IS NULL
8723 THEN ''
8724 ELSE CONCAT ('Centre de congrès et d''exposition - ', donnees_techniques.su2_cstr_shon20, ' m²')
8725 END,
8726 CASE WHEN donnees_techniques.su2_cstr_shon24 IS NULL
8727 THEN ''
8728 ELSE CONCAT ('Cuisine dédiée à la vente en ligne - ', donnees_techniques.su2_cstr_shon24, ' m²')
8729 END
8730 ), ' / $', '')
8731 ELSE
8732 REGEXP_REPLACE(CONCAT(
8733 CASE
8734 WHEN donnees_techniques.su_cstr_shon1 IS NULL
8735 THEN ''
8736 ELSE CONCAT('Habitation - ', donnees_techniques.su_cstr_shon1, ' m² / ')
8737 END,
8738 CASE
8739 WHEN donnees_techniques.su_cstr_shon2 IS NULL
8740 THEN ''
8741 ELSE CONCAT('Hébergement hôtelier - ', donnees_techniques.su_cstr_shon2, ' m² / ')
8742 END,
8743 CASE
8744 WHEN donnees_techniques.su_cstr_shon3 IS NULL
8745 THEN ''
8746 ELSE CONCAT('Bureaux - ', donnees_techniques.su_cstr_shon3, ' m² / ')
8747 END,
8748 CASE
8749 WHEN donnees_techniques.su_cstr_shon4 IS NULL
8750 THEN ''
8751 ELSE CONCAT('Commerce - ', donnees_techniques.su_cstr_shon4, ' m² / ')
8752 END,
8753 CASE
8754 WHEN donnees_techniques.su_cstr_shon5 IS NULL
8755 THEN ''
8756 ELSE CONCAT('Artisanat - ', donnees_techniques.su_cstr_shon5, ' m² / ')
8757 END,
8758 CASE
8759 WHEN donnees_techniques.su_cstr_shon6 IS NULL
8760 THEN ''
8761 ELSE CONCAT('Industrie - ', donnees_techniques.su_cstr_shon6, ' m² / ')
8762 END,
8763 CASE
8764 WHEN donnees_techniques.su_cstr_shon7 IS NULL
8765 THEN ''
8766 ELSE CONCAT('Exploitation agricole ou forestière - ', donnees_techniques.su_cstr_shon7, ' m² / ')
8767 END,
8768 CASE
8769 WHEN donnees_techniques.su_cstr_shon8 IS NULL
8770 THEN ''
8771 ELSE CONCAT('Entrepôt - ', donnees_techniques.su_cstr_shon8, ' m² / ')
8772 END,
8773 CASE
8774 WHEN donnees_techniques.su_cstr_shon9 IS NULL
8775 THEN ''
8776 ELSE CONCAT('Service public ou d''intérêt collectif - ', donnees_techniques.su_cstr_shon9, ' m²')
8777 END
8778 ), ' / $', '')
8779 END".' as "'.__("destination").'"'
8780 ));
8781
8782 //SELECT DEPOT ELECTRONIQUE (LISTING)
8783 // Si le filtre_depot précise le type de dépot il est inutile de faire apparaitre cette colonne
8784 if ($filtre_depot == "aucun") {
8785 //
8786 $query_ct_select_depot_electronique="CASE WHEN dossier.depot_electronique IS TRUE
8787 THEN 'Oui'
8788 ELSE 'Non'
8789 END".' as "'.__("depot_electronique").'"';
8790 // On l'ajoute aux champs affichés
8791 $query_ct_select_champaffiche[] = $query_ct_select_depot_electronique;
8792 }
8793
8794 // SELECT COLONNE MESSAGE (LISTING)
8795 $query_ct_select_message ="";
8796 $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.");
8797 switch($restreindre_msg_non_lus) {
8798 case "false" :
8799 $query_ct_select_message =
8800 "CASE
8801 WHEN dossier.dossier IN (
8802 SELECT dossier.dossier
8803 FROM ".DB_PREFIXE."dossier
8804 LEFT JOIN ".DB_PREFIXE."dossier_message ON dossier.dossier=dossier_message.dossier
8805 WHERE dossier_message.lu IS NOT NULL
8806 AND dossier_message.type ='".__("message manuel")."'
8807 )
8808 THEN %s
8809 ELSE %s
8810 END as message";
8811 $title_icon_message = sprintf($title_icon_message, "");
8812 break;
8813 case "true" :
8814 $query_ct_select_message =
8815 "CASE
8816 WHEN dossier.dossier IN (
8817 SELECT dossier.dossier
8818 FROM ".DB_PREFIXE."dossier
8819 LEFT JOIN ".DB_PREFIXE."dossier_message ON dossier.dossier=dossier_message.dossier
8820 WHERE dossier_message.lu IS NOT NULL
8821 AND dossier_message.type ='".__("message manuel")."'
8822 AND dossier_message.lu IS FALSE
8823 )
8824 THEN %s
8825 ELSE %s
8826 END as message";
8827 $title_icon_message = sprintf($title_icon_message, " ".__('qui soit non lu'));
8828 break;
8829 }
8830 //Selon le paramétrage, une icone de notification message s'affiche à l'utilisateur. Cliquer dessus redirige vers l'onglet des messages.
8831 $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>'."')";
8832 // Sans message (ou message non lu selon paramétrage) rien ne s'affiche dans la colonne
8833 $icone_no_msg = "''";
8834 $query_ct_select_message = sprintf($query_ct_select_message, $icone_msg, $icone_no_msg);
8835 //Les requêtes de la colonne message sont ajoutées aux requêtes des champs affichés pour le listing
8836 $query_ct_select_champaffiche[] = $query_ct_select_message;
8837
8838 // FROM
8839 $query_ct_from = "
8840 ".DB_PREFIXE."dossier
8841 LEFT JOIN (
8842 SELECT *
8843 FROM ".DB_PREFIXE."lien_dossier_demandeur
8844 INNER JOIN ".DB_PREFIXE."demandeur
8845 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
8846 WHERE lien_dossier_demandeur.petitionnaire_principal IS TRUE
8847 AND LOWER(demandeur.type_demandeur) = LOWER('petitionnaire')
8848 ) AS demandeur
8849 ON demandeur.dossier = dossier.dossier
8850 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
8851 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
8852 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8853 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8854 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
8855 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8856 LEFT JOIN ".DB_PREFIXE."donnees_techniques
8857 ON dossier.dossier = donnees_techniques.dossier_instruction
8858 LEFT JOIN (".DB_PREFIXE."demande
8859 JOIN ".DB_PREFIXE."demande_type
8860 ON demande.demande_type = demande_type.demande_type
8861 )
8862 ON demande.dossier_instruction = dossier.dossier
8863 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
8864 LEFT JOIN ".DB_PREFIXE."instructeur
8865 ON dossier.instructeur=instructeur.instructeur
8866 LEFT JOIN ".DB_PREFIXE."om_utilisateur
8867 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
8868 LEFT JOIN ".DB_PREFIXE."division
8869 ON dossier.division=division.division
8870 %s
8871 ";
8872
8873 $query_ct_where_collectivite_filter = "";
8874 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
8875 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
8876 // collectivité
8877 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
8878 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
8879 ON dossier.om_collectivite=om_collectivite.om_collectivite
8880 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
8881 ";
8882 } else {
8883 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
8884 ON dossier.om_collectivite=om_collectivite.om_collectivite
8885 ";
8886 }
8887
8888 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
8889 // WHERE - COMMON
8890 $query_ct_where_common = "
8891 groupe.code != 'CTX'
8892 ";
8893 // WHERE - nombre_de_jours
8894 // Filtre sur l'intervalle pour la date de dépôt
8895 $query_ct_where_date_filter = "
8896 AND dossier.date_depot >= CURRENT_TIMESTAMP - ".$nombre_de_jours." * interval '1 day'
8897 ";
8898 // WHERE - DATD
8899 // Filtre sur le type détaillé des dossiers
8900 $query_ct_where_datd_filter = "";
8901 if (!is_null($codes_datd)
8902 && is_array($codes_datd)
8903 && count($codes_datd) != 0) {
8904 //
8905 $sql_codes = "";
8906 //
8907 foreach ($codes_datd as $code) {
8908 $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
8909 }
8910 $sql_codes = substr($sql_codes, 0, strlen($sql_codes) - 4);
8911 //
8912 $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
8913 }
8914 //WHERE - filtre_depot
8915 // Filtre sur le type de dépôt des dossiers
8916 $query_ct_where_depot_filter = "";
8917 if ($filtre_depot == "depot_electronique") {
8918 //
8919 $query_ct_where_depot_filter = "
8920 AND dossier.depot_electronique IS TRUE
8921 ";
8922 }
8923 if ($filtre_depot == "guichet") {
8924
8925 $query_ct_where_depot_filter = "
8926 AND dossier.depot_electronique IS FALSE
8927 ";
8928 }
8929
8930 // ORDER BY
8931 $query_ct_orderby = "
8932 dossier.date_depot DESC,
8933 dossier.dossier
8934 ";
8935
8936 $query_ct_where_groupe = "";
8937 // Gestion des groupes et confidentialité
8938 include('../sql/pgsql/filter_group_widgets.inc.php');
8939
8940 /**
8941 * Message d'aide
8942 */
8943 //
8944 $message_filtre_depot = '';
8945 //
8946 switch ($filtre_depot) {
8947 case "depot_electronique" :
8948 $message_filtre_depot = " ".__("déposés électroniquement uniquement");
8949 break;
8950 case "guichet" :
8951 $message_filtre_depot = " ".__("déposés uniquement via le guichet");
8952 break;
8953 case "aucun" :
8954 $message_filtre_depot = " ".__("déposés");
8955 break;
8956 }
8957 //
8958 $message_filtre = "";
8959 //
8960 switch ($filtre) {
8961 case "instructeur" :
8962 $message_filtre = " ".__("(filtrés par instructeur)");
8963 break;
8964 case "instructeur_secondaire" :
8965 $message_filtre = " ".__("(filtrés par instructeur secondaire)");
8966 break;
8967 case "division" :
8968 $message_filtre = " ".__("(filtrés par division)");
8969 break;
8970 }
8971 //
8972 $message_restreindre_msg_non_lus = "";
8973 //
8974 if ($restreindre_msg_non_lus === "true") {
8975 $message_restreindre_msg_non_lus =" ".__("et dont l'indicateur des messages manuels est restreint aux messages non lus");
8976 }
8977 //
8978 $message_help = sprintf(
8979 __("Les dossiers%s%s dans les %s derniers jours%s%s."),
8980 (is_null($codes_datd) ? "": " (".implode(", ",$codes_datd).")"),
8981 $message_filtre_depot,
8982 $nombre_de_jours,
8983 $message_filtre,
8984 $message_restreindre_msg_non_lus
8985 );
8986
8987 /**
8988 * Return
8989 */
8990 //
8991 return array(
8992 "arguments" => $arguments,
8993 "message_help" => $message_help,
8994 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
8995 "query_ct_select_champrecherche" => $query_ct_select_champrecherche,
8996 "query_ct_from" => $query_ct_from,
8997 "query_ct_where_common" => $query_ct_where_common,
8998 "query_ct_where_date_filter" => $query_ct_where_date_filter,
8999 "query_ct_where_depot_filter" => $query_ct_where_depot_filter,
9000 "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
9001 "query_ct_where_groupe" => $query_ct_where_groupe,
9002 "query_ct_orderby" => $query_ct_orderby,
9003 );
9004 }
9005
9006
9007 /**
9008 * Cette méthode permet de récupérer la configuration du widget 'Dossier consulter'.
9009 *
9010 * @return array
9011 */
9012 function get_config_dossier_consulter($idx) {
9013 include "../sql/pgsql/app_om_tab_common_select.inc.php";
9014 /**
9015 * Construction de la requête
9016 */
9017 //
9018 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
9019 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
9020 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
9021 END";
9022 // SELECT
9023 $query_ct_select = "
9024 dossier.dossier,
9025 $select__dossier_libelle__column as dossier_libelle,
9026 $case_demandeur as nom_petitionnaire,
9027 dossier.date_depot,
9028 dossier_autorisation_type.code
9029 ";
9030
9031 // FROM
9032 $query_ct_from = "
9033 ".DB_PREFIXE."dossier
9034 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
9035 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
9036 LEFT JOIN ".DB_PREFIXE."demandeur
9037 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9038 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
9039 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
9040 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
9041 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9042 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
9043 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9044 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
9045 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9046 ";
9047
9048 $query_ct_where ="
9049 dossier_instruction_type.sous_dossier IS NOT TRUE AND
9050 dossier.dossier ='".$idx."'
9051 ";
9052
9053 /**
9054 * Return
9055 */
9056 //
9057 return array(
9058 "query_ct_select" => $query_ct_select,
9059 "query_ct_from" => $query_ct_from,
9060 "query_ct_where" => $query_ct_where,
9061 );
9062 }
9063
9064 /**
9065 * WIDGET DASHBOARD - widget_dossier_consulter
9066 * @return void
9067 */
9068 function view_widget_dossier_consulter($content = null) {
9069 /**
9070 * Ce widget est configurable via l'interface Web. Lors de la création
9071 * du widget dans le paramétrage il est possible de spécifier l'options suivantes :
9072 *
9073 * - nb_dossiers : le nombre de dossiers récemment consultés visibile dans le
9074 * widget.
9075 * (default) Par défaut la valeur est 5 derniers dossiers.
9076 **/
9077
9078 // Liste des paramètres
9079 $params = array("nb_dossiers");
9080 // Formatage des arguments reçus en paramètres
9081 $arguments = $this->get_arguments($content, $params);
9082
9083 //On retire 1 à la valeur de nb_dossiers car $i boucle à partir de 0
9084 if(isset($arguments['nb_dossiers']) == false) {
9085 $nb_dossiers = 4;
9086 } else {
9087 $nb_dossiers = $arguments['nb_dossiers']-1;
9088 }
9089
9090
9091 $dossier_brut = null;
9092 if (isset($_SESSION['dossiers_consulte']) === false) {
9093 $dossiers_consulte = array();
9094 } else {
9095 $dossier_brut = $_SESSION['dossiers_consulte'];
9096 $dossiers_consulte = array_reverse($dossier_brut);
9097 }
9098
9099 /**
9100 * Template nécessaires à l'affichage du widget
9101 */
9102 //
9103 $template_table = '
9104 <table class="tab-tab widget_dossier_consulter">
9105 <thead>
9106 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
9107 <th class="title col-0 firstcol">
9108 <span class="name">
9109 %s
9110 </span>
9111 </th>
9112 <th class="title col-1">
9113 <span class="name">
9114 %s
9115 </span>
9116 </th>
9117 <th class="title col-2">
9118 <span class="name">
9119 %s
9120 </span>
9121 </th>
9122 </tr>
9123 </thead>
9124 <tbody>
9125 %s
9126 </tbody>
9127 </table>
9128 ';
9129 //
9130 $template_line = '
9131 <tr class="tab-data odd">
9132 <td class="col-1 firstcol">
9133 %s
9134 </td>
9135 <td class="col-1">
9136 %s
9137 </td>
9138 <td class="col-2">
9139 %s
9140 </td>
9141 </tr>
9142 ';
9143
9144 //
9145 $template_line_hidden = '
9146 <tr class="tab-data odd" hidden>
9147 <td class="col-1 firstcol">
9148 %s
9149 </td>
9150 <td class="col-1">
9151 %s
9152 </td>
9153 <td class="col-2">
9154 %s
9155 </td>
9156 </tr>
9157 ';
9158 // Récupererle type du dossier pour bien rediriger et son id.
9159 $template_href = OM_ROUTE_FORM.'&obj=%s&action=3&idx=%s';
9160
9161 $template_link = '
9162 <a class="lienTable" href="%s">
9163 %s
9164 </a>
9165 ';
9166 //
9167 $template_footer_consulter = '
9168 <div class="widget-footer">
9169 <a class="simple-btn" onClick="%s">
9170 %s
9171 </a>
9172 </div>
9173 ';
9174
9175 $ct_tbody = '';
9176
9177 $i = 0;
9178 // On construit le contenu du tableau
9179 foreach ($dossiers_consulte as $key => $value) {
9180
9181 // Récupération en bdd des données necessaire par idx
9182 $conf = $this->get_config_dossier_consulter($value);
9183
9184 // Composition de la requête
9185 $query = sprintf("
9186 SELECT
9187 %s
9188 FROM
9189 %s
9190 WHERE
9191 %s",
9192 $conf["query_ct_select"],
9193 $conf["query_ct_from"],
9194 $conf["query_ct_where"]
9195 );
9196
9197 // Exécution de la requête
9198 $qres = $this->f->get_all_results_from_db_query(
9199 $query,
9200 array(
9201 'origin' => __METHOD__
9202 )
9203 );
9204
9205 $row = array_shift($qres['result']);
9206
9207 // La requête est faite pour récupérer les infos du dossier uniquement
9208 // si ce n'est pas un sous-dossier. Si c'est un sous-dossier la requête ne
9209 // renverra rien, dans ce cas on peut passer à l'itération suivante.
9210 if (empty($row)) {
9211 continue;
9212 }
9213
9214 // Determination de la route à utiliser.
9215 switch ($row['code']) {
9216 case 'IN':
9217 $route="dossier_contentieux_toutes_infractions";
9218 break;
9219 case 'RE':
9220 $route="dossier_contentieux_tous_recours";
9221 break;
9222 default: $route="dossier_instruction";
9223 }
9224
9225 // On construit l'attribut href du lien
9226 $ct_href = sprintf(
9227 $template_href,
9228 $route,
9229 // idx
9230 $row['dossier']
9231 );
9232
9233 if ($i > $nb_dossiers){
9234 $good_template_line = $template_line_hidden;
9235 } else {
9236 $good_template_line = $template_line;
9237 }
9238 // Construction d'une ligne
9239 $ct_tbody .= sprintf(
9240 $good_template_line,
9241 // Colonne 1 - Numéro de dossier
9242 sprintf(
9243 $template_link,
9244 $ct_href,
9245 $row['dossier_libelle']
9246 ),
9247 // Colonne 2 - Nom du pétitionnaire
9248 sprintf(
9249 $template_link,
9250 $ct_href,
9251 $row["nom_petitionnaire"]
9252 ),
9253 // Colonne 3 - Date depot
9254 sprintf(
9255 $template_link,
9256 $ct_href,
9257 $this->f->formatDate($row["date_depot"])
9258 )
9259 );
9260
9261 $i++;
9262 }
9263
9264 // Les sous-dossiers sont comptés comme des dossiers consultés mais ne sont pas
9265 // affichés. Si un dossier est un sous-dossier le nombre de dossier affiché
9266 // ($i) ne sera pas incrementé. Dans les cas, où seuls des sous-dossiers ont été
9267 // consultés ou si aucun dossier n'a été consulté, le nombre de dossier affiché
9268 // sera de 0.
9269 if ($i === 0) {
9270 // Affichage du message d'information
9271 echo __("Vous n'avez pas consulté de dossier pour le moment.");
9272 // Exit
9273 return;
9274 }
9275
9276 // Affichage du tableau listant les dossiers
9277 printf(
9278 $template_table,
9279 // Colonne 1 - Numéro de dossier
9280 __('dossier'),
9281 // Colonne 2 - petitionnaire
9282 __('demandeur'),
9283 // Colonne 3 - date depot
9284 __('date_depot'),
9285 // Contenu du tableau
9286 $ct_tbody
9287 );
9288
9289 // On affiche le footer seulement si l'utilisateur à consulté plus de
9290 // dossier que le nombre de dossier affiché par défaut (paramétrage)
9291 if ($i > $nb_dossiers) {
9292 // Affichage du footer
9293 printf(
9294 $template_footer_consulter,
9295 "get_all_dossier_consulte($(this).parent().parent().parent().parent().attr('id'))",
9296 __("Afficher +")
9297 );
9298 }
9299 }
9300
9301 /**
9302 * WIDGET DASHBOARD - Dossiers à qualifier (limite de la notification du délai)
9303 * @return void
9304 */
9305 function view_widget_dossiers_pre_instruction($content = null) {
9306 /**
9307 * Ce widget est configurable via l'interface Web. Lors de la création
9308 * du widget dans le paramétrage il est possible de spécifier la ou les
9309 * options suivantes :
9310 * - filtre :
9311 * = instructeur
9312 * = aucun
9313 * (default) Par défaut les dossiers sont filtrés sur l'instructeur.
9314 */
9315 // Liste des paramètres
9316 $params = array("filtre", "codes_datd", "affichage");
9317 // Formatage des arguments reçus en paramètres
9318 $arguments = $this->get_arguments($content, $params);
9319 // Récupération de la configuration du widget
9320 $conf = $this->get_config_dossiers_pre_instruction($arguments);
9321 // Récupération du filtre
9322 $filtre = $conf["arguments"]["filtre"];
9323 //Récupération du code datd
9324 $codes_datd = $conf["arguments"]["codes_datd"];
9325 // Définit l'objet cible
9326 $obj = 'dossier_instruction';
9327
9328 /**
9329 * Composition de la requête
9330 */
9331 // Gestion de la requête selon le type d'affichage
9332 $query_ct_orderby = sprintf(
9333 "ORDER BY
9334 %s
9335 LIMIT 5",
9336 $conf["query_ct_orderby"]
9337 );
9338 $query_ct_select = $conf["query_ct_select"];
9339 if ($conf["arguments"]["affichage"] === "nombre") {
9340 $query_ct_orderby = "";
9341 $query_ct_select = "COUNT(*)";
9342 }
9343 $query = sprintf("
9344 SELECT
9345 %s
9346 FROM
9347 %s
9348 %s
9349 WHERE
9350 %s
9351 %s
9352 %s
9353 %s
9354 %s",
9355 $query_ct_select,
9356 $conf["query_ct_from"],
9357 '%s', // emplacement pour les jointure du filtre
9358 $conf["query_ct_where"],
9359 $conf["query_ct_where_datd_filter"],
9360 $conf["query_ct_where_groupe"],
9361 '%s', // emplacement pour les conditions du filtre
9362 $query_ct_orderby
9363 );
9364 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
9365 $sqlFilter = $this->get_query_filter(
9366 $query,
9367 $conf['arguments']['filtre']
9368 );
9369 $query = sprintf(
9370 $query,
9371 $sqlFilter["FROM"],
9372 $sqlFilter["WHERE"]
9373 );
9374
9375 /**
9376 * Template nécessaires à l'affichage du widget
9377 */
9378 if ($conf["arguments"]["affichage"] === "nombre") {
9379 // Exécution de la requête
9380 $qres = $this->f->get_one_result_from_db_query(
9381 $query,
9382 array(
9383 "origin" => __METHOD__
9384 )
9385 );
9386
9387 // Affichage du message d'informations
9388 printf(
9389 $this->template_help,
9390 $conf["message_help"]
9391 );
9392 // Si il n'y a aucun dossier à afficher
9393 if (intval($qres['result']) == 0) {
9394 // Affichage du message d'informations
9395 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.");
9396 // Exit
9397 return;
9398 }
9399
9400 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
9401 } else {
9402 // Exécution de la requête
9403 $qres = $this->f->get_all_results_from_db_query(
9404 $query,
9405 array(
9406 'origin' => __METHOD__
9407 )
9408 );
9409
9410 // Affichage du message d'informations
9411 printf(
9412 $this->template_help,
9413 $conf["message_help"]
9414 );
9415 // Si il n'y a aucun dossier à afficher
9416 if ($qres['row_count'] === 0) {
9417 // Affichage du message d'informations
9418 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.");
9419 // Exit
9420 return;
9421 }
9422 //
9423 $template_table = '
9424 <table class="tab-tab">
9425 <thead>
9426 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
9427 <th class="title col-0 firstcol">
9428 <span class="name">
9429 %s
9430 </span>
9431 </th>
9432 <th class="title col-1">
9433 <span class="name">
9434 %s
9435 </span>
9436 </th>
9437 <th class="title col-2">
9438 <span class="name">
9439 %s
9440 </span>
9441 </th>
9442 <th class="title col-3 lastcol">
9443 <span class="name">
9444 %s
9445 </span>
9446 </th>
9447 </tr>
9448 </thead>
9449 <tbody>
9450 %s
9451 </tbody>
9452 </table>
9453 ';
9454 //
9455 $template_line = '
9456 <tr id="dossier_dossiers_pre_instruction_%s" class="tab-data odd">
9457 <td class="col-0 firstcol">
9458 %s
9459 </td>
9460 <td class="col-1 ">
9461 %s
9462 </td>
9463 <td class="col-2">
9464 %s
9465 </td>
9466 <td class="col-3 lastcol">
9467 %s
9468 </td>
9469 </tr>
9470 ';
9471
9472 // Bouton consulter
9473 $template_btn_consulter = '
9474 <span class="om-icon om-icon-16 om-icon-fix consult-16" title="'.__('Consulter').'">'
9475 .__('Consulter')
9476 .'</span>
9477 ';
9478 //
9479 $template_href = OM_ROUTE_FORM.'&obj=%s&amp;action=3&amp;idx=%s';
9480 //
9481 $template_link = '
9482 <a class="lienTable" href="%s">
9483 %s
9484 </a>
9485 ';
9486
9487 /**
9488 * Si il y a des dossiers à afficher, alors on affiche le widget.
9489 */
9490 // On construit le contenu du tableau
9491 $ct_tbody = '';
9492 $compteur = 0;
9493 foreach ($qres['result'] as $row) {
9494 // On construit l'attribut href du lien
9495 $ct_href = sprintf(
9496 $template_href,
9497 // obj
9498 $obj,
9499 // idx
9500 $row["dossier"]
9501 );
9502 // On construit la ligne
9503 $ct_tbody .= sprintf(
9504 $template_line,
9505 //Numero des id html
9506 $compteur,
9507 // Colonne 1 - Numéro de dossier
9508 sprintf(
9509 $template_link,
9510 $ct_href,
9511 $template_btn_consulter
9512 ),
9513 // Colonne 2 - Numéro de dossier
9514 sprintf(
9515 $template_link,
9516 $ct_href,
9517 $row["dossier_libelle"]
9518 ),
9519 // Colonne 3 - Demandeur
9520 sprintf(
9521 $template_link,
9522 $ct_href,
9523 $row["nom_petitionnaire"]
9524 ),
9525 // Colonne 4 - Date de Notification de délai
9526 sprintf(
9527 $template_link,
9528 $ct_href,
9529 $this->f->formatDate($row["date_notification_delai"])
9530 )
9531 );
9532 $compteur++;
9533 }
9534 // Affichage du tableau listant les dossiers
9535 printf(
9536 $template_table,
9537 // Colonne 1 - Consulter
9538 '',
9539 // Colonne 2 - Libellé du dossier
9540 __('dossier'),
9541 // Colonne 3 - Demandeur
9542 __('nom_petitionnaire'),
9543 // Colonne 4 - Date de notification de delai
9544 __("date de notification limite"),
9545 // Le Contenu
9546 $ct_tbody
9547 );
9548 }
9549 /**
9550 * Affichage du footer
9551 */
9552 //
9553 $template_link_footer = OM_ROUTE_TAB.'&obj=%s';
9554 //
9555 $link_footer = sprintf(
9556 $template_link_footer,
9557 "dossiers_pre_instruction"
9558 );
9559 //
9560 printf(
9561 $this->template_footer,
9562 // href (avec les paramètres du widget)
9563 sprintf(
9564 "%s&filtre=%s&codes_datd=%s",
9565 $link_footer,
9566 $filtre,
9567 (is_null($codes_datd) ? "" : implode(";",$codes_datd))
9568 ),
9569 // titre
9570 __("Voir +")
9571 );
9572 }
9573
9574 /**
9575 * Cette méthode permet de récupérer la configuration du widget
9576 * 'Dossiers à qualifier (limite de la notification du délai)'.
9577 *
9578 * @return array
9579 */
9580 function get_config_dossiers_pre_instruction($arguments) {
9581 include "../sql/pgsql/app_om_tab_common_select.inc.php";
9582 // Initialisation du tableau des paramètres avec ses valeur par défaut
9583 $arguments_default = array(
9584 "filtre" => "instructeur",
9585 "codes_datd" => null,
9586 "affichage" => "liste"
9587 );
9588 // Vérification des arguments
9589 foreach ($arguments_default as $key => $value) {
9590 //
9591 if (isset($arguments[$key])) {
9592 //
9593 $elem = trim($arguments[$key]);
9594 //
9595 if ($key === "filtre"
9596 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
9597 // La valeur doit être dans cette liste
9598 $arguments[$key] = $elem;
9599 continue;
9600 } elseif ($key === "codes_datd"
9601 && $elem != "") {
9602 // Ce doit être un tableau
9603 $arguments[$key] = explode(";", $elem);
9604 continue;
9605 } elseif ($key === "affichage"
9606 && in_array($elem, array('liste', 'nombre'))) {
9607 // La valeur doit être dans cette liste
9608 $arguments[$key] = $elem;
9609 continue;
9610 }
9611 }
9612 //
9613 $arguments[$key] = $value;
9614 }
9615
9616 $filtre = $arguments["filtre"];
9617 $codes_datd = $arguments["codes_datd"];
9618 /**
9619 * Construction de la requête
9620 */
9621 //
9622 $case_demandeur = "CASE WHEN demandeur.qualite='particulier'
9623 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
9624 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
9625 END";
9626 // SELECT
9627 $query_ct_select = "
9628 dossier.dossier,
9629 $select__dossier_libelle__column as dossier_libelle,
9630 $case_demandeur as nom_petitionnaire,
9631 dossier.date_notification_delai
9632 ";
9633
9634 // SELECT - CHAMPAFFICHE
9635 $query_ct_select_champaffiche = array_merge(
9636 $array_base_ct_select_champaffiche,
9637 array(
9638 $case_demandeur.' as "'.__("nom_petitionnaire").'"',
9639 'to_char(dossier.date_notification_delai ,\'DD/MM/YYYY\') as "'.__("date de notification limite").'"',
9640 ));
9641
9642 // FROM
9643 $query_ct_from = "
9644 ".DB_PREFIXE."dossier
9645 LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur
9646 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
9647 LEFT JOIN ".DB_PREFIXE."demandeur
9648 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9649 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
9650 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
9651 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
9652 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9653 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
9654 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9655 LEFT JOIN ".DB_PREFIXE."etat
9656 ON dossier.etat = etat.etat
9657 LEFT JOIN (".DB_PREFIXE."demande
9658 JOIN ".DB_PREFIXE."demande_type
9659 ON demande.demande_type = demande_type.demande_type
9660 )
9661 ON demande.dossier_instruction = dossier.dossier
9662 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
9663 LEFT JOIN ".DB_PREFIXE."instructeur
9664 ON dossier.instructeur=instructeur.instructeur
9665 LEFT JOIN ".DB_PREFIXE."om_utilisateur
9666 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
9667 LEFT JOIN ".DB_PREFIXE."division
9668 ON dossier.division=division.division
9669 %s
9670 ";
9671
9672 $query_ct_where_collectivite_filter = "";
9673 // Filtre sur les dossiers qui concernent l'utilisateur
9674 /*
9675 $query_ct_where_instructeur_filter = "";
9676 $query_ct_where_division_filter = "";
9677 if ($filtre == "instructeur") {
9678 //
9679 $query_ct_where_instructeur_filter = " JOIN ".DB_PREFIXE."instructeur
9680 ON dossier.instructeur=instructeur.instructeur
9681 OR dossier.instructeur_2=instructeur.instructeur
9682 JOIN ".DB_PREFIXE."om_utilisateur
9683 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
9684 AND om_utilisateur.login='".$_SESSION['login']."'
9685 ";
9686 } else {
9687 $query_ct_where_instructeur_filter = " LEFT JOIN ".DB_PREFIXE."instructeur
9688 ON dossier.instructeur=instructeur.instructeur
9689 LEFT JOIN ".DB_PREFIXE."om_utilisateur
9690 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur ";
9691 }
9692 // Filtre sur les dossier de la division
9693 if ($filtre == "division") {
9694 //
9695 $query_ct_where_division_filter = " JOIN ".DB_PREFIXE."division
9696 ON dossier.division=division.division
9697 AND division.division = ".$_SESSION['division']."
9698 ";
9699 } else {
9700 $query_ct_where_division_filter = " LEFT JOIN ".DB_PREFIXE."division
9701 ON dossier.division=division.division";
9702 }*/
9703
9704 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
9705 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
9706 // collectivité
9707 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
9708 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
9709 ON dossier.om_collectivite=om_collectivite.om_collectivite
9710 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
9711 ";
9712 } else {
9713 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
9714 ON dossier.om_collectivite=om_collectivite.om_collectivite
9715 ";
9716 }
9717
9718 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
9719
9720 $query_ct_where ="
9721 dossier.a_qualifier IS TRUE
9722 AND dossier.date_notification_delai >= DATE(NOW())
9723 AND etat.statut = 'encours'
9724 ";
9725
9726 $query_ct_where_datd_filter = "";
9727 if (!is_null($codes_datd)
9728 && is_array($codes_datd)
9729 && count($codes_datd) != 0) {
9730 //
9731 $sql_codes = "";
9732 //
9733 foreach ($codes_datd as $code) {
9734 $sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR ";
9735 }
9736 $sql_codes = substr($sql_codes, 0, strlen($sql_codes) - 4);
9737 //
9738 $query_ct_where_datd_filter = " AND ( ".$sql_codes." ) ";
9739 }
9740
9741 $query_ct_orderby ="
9742 dossier.date_notification_delai ASC NULLS LAST, dossier.dossier ASC NULLS LAST
9743 ";
9744
9745 $query_ct_where_groupe = "";
9746 // Gestion des groupes et confidentialité
9747 include('../sql/pgsql/filter_group_widgets.inc.php');
9748
9749 /**
9750 * Message d'aide
9751 */
9752 // Filtre
9753 $message_filtre = "";
9754 //
9755 switch ($filtre) {
9756 case "instructeur":
9757 $message_filtre = " ".__("dont je suis l'instructeur");
9758 break;
9759 case "instructeur_secondaire":
9760 $message_filtre = " ".__("dont je suis l'instructeur secondaire");
9761 break;
9762 case "aucun":
9763 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
9764 $message_filtre = " ".__("situés dans ma collectivité");
9765 } else {
9766 $message_filtre = " ".__("situés dans toutes les collectivités");
9767 }
9768 break;
9769 }
9770 //
9771 $message_help = sprintf(
9772 __("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."),
9773 (is_null($codes_datd) ? "": " (".implode(", ",$codes_datd).")"),
9774 $message_filtre
9775 );
9776
9777 /**
9778 * Return
9779 */
9780 //
9781 return array(
9782 "arguments" => $arguments,
9783 "message_help" => $message_help,
9784 "query_ct_select" => $query_ct_select,
9785 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
9786 "query_ct_where_datd_filter" => $query_ct_where_datd_filter,
9787 "query_ct_from" => $query_ct_from,
9788 "query_ct_where" => $query_ct_where,
9789 "query_ct_where_groupe" => $query_ct_where_groupe,
9790 "query_ct_orderby" => $query_ct_orderby
9791 );
9792 }
9793
9794 protected function display_resultat_bulle($resultat, $legende, $classe, $autre = "") {
9795 // Panel
9796 $template_panel = '
9797 <div class="panel panel-box">
9798 <div class="list-justified-container">
9799 <ul class="list-justified text-center">
9800 %s
9801 </ul>
9802 </div>
9803 </div>';
9804 $panel = "";
9805 // Bulle
9806 $template_elem = '
9807 <li>
9808 <span class="size-h3 box-icon rounded %s">%s</span>
9809 <p class="text-muted">%s %s</p>
9810 </li>
9811 ';
9812 // Remplissage de la bulle
9813 $panel_elem = sprintf(
9814 $template_elem,
9815 $classe,
9816 intval($resultat),
9817 __($legende),
9818 $autre
9819 );
9820 // Remplissage du panel
9821 $panel .= sprintf(
9822 $template_panel,
9823 $panel_elem
9824 );
9825 // Affichage du panel
9826 echo $panel;
9827
9828 }
9829
9830 /**
9831 * Cette méthode permet de récupérer la configuration du widget 'Dossiers
9832 * limites'.
9833 *
9834 * @return array
9835 */
9836 function get_config_dossier_non_transmis_platau($arguments) {
9837 include "../sql/pgsql/app_om_tab_common_select.inc.php";
9838 // Initialisation du tableau des paramètres avec ses valeur par défaut
9839 $arguments_default = array(
9840 "filtre" => "instructeur",
9841 "affichage" => "liste",
9842 "date_depot_debut" => null,
9843 );
9844 // Vérification des arguments
9845 foreach ($arguments_default as $key => $value) {
9846 if (isset($arguments[$key])) {
9847 $elem = trim($arguments[$key]);
9848 if ($key === "filtre"
9849 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
9850 // La valeur doit être dans cette liste
9851 $arguments[$key] = $elem;
9852 continue;
9853 } elseif ($key === "affichage"
9854 && in_array($elem, array('liste', 'nombre'))) {
9855 // La valeur doit être dans cette liste
9856 $arguments[$key] = $elem;
9857 continue;
9858 } elseif ($key === "date_depot_debut"
9859 && $elem !== null
9860 && $elem !== ''
9861 && $this->f->check_date($elem) === true) {
9862 //
9863 $arguments[$key] = $elem;
9864 continue;
9865 }
9866 }
9867 //
9868 $arguments[$key] = $value;
9869 }
9870
9871 if ($arguments['affichage'] == 'nombre') {
9872 $query_ct_select = "COUNT(*)";
9873 $query_ct_orderby = '';
9874 $query_limit = '';
9875 } else {
9876 $query_ct_select = sprintf(
9877 "dossier.dossier,
9878 $select__dossier_libelle__column as dossier_libelle,
9879 dossier.date_depot,
9880 CASE
9881 WHEN demandeur.qualite='particulier'
9882 THEN TRIM(CONCAT(demandeur.particulier_nom, ' ', demandeur.particulier_prenom))
9883 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, ' ', demandeur.personne_morale_denomination))
9884 END AS demandeur
9885 ");
9886
9887 $query_ct_orderby = sprintf("ORDER BY dossier.dossier");
9888 $query_limit = "LIMIT 5";
9889 }
9890
9891 $query_ct_from = sprintf(
9892 '%1$sdossier
9893 INNER JOIN %1$slien_dossier_demandeur
9894 ON dossier.dossier=lien_dossier_demandeur.dossier
9895 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
9896 INNER JOIN %1$sdemandeur
9897 ON lien_dossier_demandeur.demandeur=demandeur.demandeur
9898 INNER JOIN %1$sdossier_autorisation
9899 ON dossier.dossier_autorisation=dossier_autorisation.dossier_autorisation
9900 INNER JOIN %1$sdossier_autorisation_type_detaille
9901 ON dossier_autorisation.dossier_autorisation_type_detaille=dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9902 LEFT JOIN (%1$sdemande
9903 JOIN %1$sdemande_type
9904 ON demande.demande_type = demande_type.demande_type
9905 )
9906 ON demande.dossier_instruction = dossier.dossier
9907 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
9908 LEFT JOIN %1$sinstructeur
9909 ON dossier.instructeur=instructeur.instructeur
9910 LEFT JOIN %1$som_utilisateur
9911 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
9912 LEFT JOIN %1$sdivision
9913 ON dossier.division=division.division',
9914 DB_PREFIXE
9915 );
9916
9917 $query_ct_where = sprintf(
9918 " dossier_autorisation_type_detaille.dossier_platau = TRUE AND
9919 (etat_transmission_platau='non_transmissible' OR
9920 etat_transmission_platau='transmis_mais_non_transmissible') "
9921 );
9922
9923 //
9924 $date_depot_debut = $arguments["date_depot_debut"];
9925 if ($date_depot_debut !== null
9926 && $date_depot_debut !== '') {
9927 //
9928 // $date_depot = $this->f->is_option_date_depot_mairie_enabled() === true ? 'dossier.date_depot_mairie' : 'dossier.date_depot';
9929 $date_depot = 'dossier.date_depot';
9930 $query_ct_where .= sprintf(
9931 " AND %s >= '%s' ",
9932 $date_depot,
9933 $date_depot_debut
9934 );
9935 }
9936
9937 // Champ à afficher dans le listing
9938 $query_ct_select_champaffiche = array_merge(
9939 $array_base_ct_select_champaffiche,
9940 array(
9941 'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'.__("date_depot").'"',
9942 'CASE
9943 WHEN demandeur.qualite=\'particulier\'
9944 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom))
9945 ELSE TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination))
9946 END AS "'.__("demandeur").'"'
9947 ));
9948
9949 $message_help = "Dossier non transmis à Plat'Au car ayant des élements manquants.";
9950
9951 return array(
9952 "arguments" => $arguments,
9953 "message_help" => $message_help,
9954 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
9955 "query_ct_select" => $query_ct_select,
9956 "query_ct_from" => $query_ct_from,
9957 "query_ct_where" => $query_ct_where,
9958 "query_ct_orderby" => $query_ct_orderby,
9959 "query_ct_limit" => $query_limit,
9960 );
9961 }
9962
9963 /**
9964 * Méthode servant à afficher le contenu du widget servant
9965 * à afficher la liste ou le nombre de dossier non transmis à plat'Au
9966 *
9967 * @param array content
9968 */
9969 function view_widget_dossier_non_transmis_platau($content = null) {
9970 // Liste des paramètres
9971 $params = array("affichage", "filtre", "date_depot_debut", );
9972 // Formatage des arguments reçus en paramètres
9973 $arguments = $this->get_arguments($content, $params);
9974 // Récupération de la configuration du widget
9975 $conf = $this->get_config_dossier_non_transmis_platau($arguments);
9976 $query = sprintf("
9977 SELECT
9978 %s
9979 FROM
9980 %s
9981 %s
9982 WHERE
9983 %s
9984 %s
9985 %s
9986 %s",
9987 $conf["query_ct_select"],
9988 $conf["query_ct_from"],
9989 '%s', // emplacement pour les jointure du filtre
9990 $conf["query_ct_where"],
9991 '%s', // emplacement pour les conditions du filtre
9992 $conf["query_ct_orderby"],
9993 $conf["query_ct_limit"]
9994 );
9995 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
9996 $sqlFilter = $this->get_query_filter(
9997 $query,
9998 $conf['arguments']['filtre']
9999 );
10000 $query = sprintf(
10001 $query,
10002 $sqlFilter["FROM"],
10003 $sqlFilter["WHERE"]
10004 );
10005
10006 $template_table = '
10007 <table class="tab-tab">
10008 <thead>
10009 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
10010 <th class="title col-0 firstcol">
10011 <span class="name">
10012 %s
10013 </span>
10014 </th>
10015 <th class="title col-1">
10016 <span class="name">
10017 %s
10018 </span>
10019 </th>
10020 <th class="title col-2">
10021 <span class="name">
10022 %s
10023 </span>
10024 </th>
10025 </tr>
10026 </thead>
10027 <tbody>
10028 %s
10029 </tbody>
10030 </table>
10031 ';
10032 //
10033 $template_line = '
10034 <tr class="tab-data odd">
10035 <td class="col-1 firstcol">
10036 %s
10037 </td>
10038 <td class="col-1">
10039 %s
10040 </td>
10041 <td class="col-2">
10042 %s
10043 </td>
10044 </tr>
10045 ';
10046 //
10047 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&amp;action=3&amp;idx=%s';
10048 //
10049 $template_link = '
10050 <a class="lienTable" href="%s">
10051 %s
10052 </a>
10053 ';
10054
10055 // Affichage du widget avec une bulle
10056 if ($conf["arguments"]["affichage"] === "nombre") {
10057 // Execution de la requête
10058 $qres = $this->f->get_one_result_from_db_query(
10059 $query,
10060 array(
10061 "origin" => __METHOD__
10062 )
10063 );
10064
10065 // Affichage du message d'informations
10066 printf(
10067 $this->template_help,
10068 $conf["message_help"]
10069 );
10070
10071 // Si il n'y a aucun dossier à afficher
10072 if (intval($qres['result']) == 0) {
10073 // Affichage du message d'informations
10074 echo __("Aucun dossier non transmis pour le moment.");
10075 // Exit
10076 return;
10077 }
10078 $this->display_resultat_bulle($qres['result'], "Non transmis", "bg-info", "");
10079 // Affichage du footer
10080 printf(
10081 $this->template_footer,
10082 sprintf(
10083 OM_ROUTE_TAB."&obj=dossier_non_transmis&filtre=%s&date_depot_debut=%s",
10084 $conf["arguments"]["filtre"],
10085 $conf["arguments"]["date_depot_debut"]
10086 ),
10087
10088 // titre
10089 __("Voir +")
10090 );
10091 } else {
10092 // Affichage du widget avec un listing de 5 éléments
10093 $qres = $this->f->get_all_results_from_db_query(
10094 $query,
10095 array(
10096 'origin' => __METHOD__
10097 )
10098 );
10099
10100 if ($qres['row_count'] === 0) {
10101 echo __("Aucun dossier non transmis pour le moment.");
10102 } else {
10103
10104 // Affichage du message d'informations
10105 printf(
10106 $this->template_help,
10107 $conf["message_help"]
10108 );
10109
10110 $contenu_tableau="";
10111 foreach($qres['result'] as $row) {
10112 $href_dossier=sprintf(
10113 $template_href,
10114 $row['dossier']
10115
10116 );
10117
10118 $contenu_case_dossier=sprintf($template_link,
10119 $href_dossier,
10120 $row['dossier_libelle']
10121 );
10122
10123 $contenu_case_nom=sprintf($template_link,
10124 $href_dossier,
10125 $row['demandeur']
10126 );
10127 $contenu_case_date=sprintf($template_link,
10128 $href_dossier,
10129 $row['date_depot']
10130 );
10131 $contenu_tableau.=sprintf(
10132 $template_line,
10133 $contenu_case_dossier,
10134 $contenu_case_nom,
10135 $contenu_case_date
10136 );
10137 }
10138
10139 $contenu_widget=sprintf(
10140 $template_table,
10141 "dossier",
10142 "demandeur",
10143 "date de dépôt",
10144 $contenu_tableau
10145 );
10146
10147 echo $contenu_widget;
10148 // Affichage du footer
10149 printf(
10150 $this->template_footer,
10151 sprintf(
10152 OM_ROUTE_TAB."&obj=dossier_non_transmis&filtre=%s&date_depot_debut=%s",
10153 $conf["arguments"]["filtre"],
10154 $conf["arguments"]["date_depot_debut"]
10155 ),
10156 // titre
10157 __("Voir +")
10158 );
10159 }
10160 }
10161 }
10162
10163 /**
10164 * Cette méthode permet de récupérer la configuration du widget "Suivi
10165 * tâche Plat'AU".
10166 *
10167 * @return array
10168 */
10169 function get_config_suivi_tache($arguments) {
10170 include "../sql/pgsql/app_om_tab_common_select.inc.php";
10171 // Initialisation du tableau des paramètres avec ses valeur par défaut
10172 $arguments_default = array(
10173 "type_tache" => null,
10174 "etat_tache" => null,
10175 "filtre" => "instructeur",
10176 "affichage" => "liste",
10177 "ordre_tri" => null,
10178 "categorie_tache" => null,
10179 "flux_tache" => null,
10180 "message_help" => null,
10181 "nb_max_resultat" => 10,
10182 );
10183 // Vérification des arguments
10184 foreach ($arguments_default as $key => $value) {
10185 //
10186 if (isset($arguments[$key])) {
10187 //
10188 $elem = trim($arguments[$key]);
10189 //
10190 if ($key === "type_tache"
10191 && $elem != "") {
10192 // Ce doit être un tableau
10193 $arguments[$key] = explode(";", $elem);
10194 continue;
10195 }
10196 if ($key === "filtre"
10197 && in_array($elem, array("instructeur", "instructeur_secondaire", "division", "aucun"))) {
10198 // La valeur doit être dans cette liste
10199 $arguments[$key] = $elem;
10200 continue;
10201 }
10202 if ($key === "etat_tache"
10203 && $elem != "") {
10204 // Ce doit être un tableau
10205 $arguments[$key] = explode(";", $elem);
10206 continue;
10207 }
10208 if ($key === "categorie_tache"
10209 && in_array($elem, array(PORTAL, PLATAU))) {
10210 // Ce doit être un tableau
10211 $arguments[$key] = $elem;
10212 continue;
10213 }
10214 if ($key === "flux_tache"
10215 && in_array($elem, array("input", "output"))) {
10216 // Ce doit être un tableau
10217 $arguments[$key] = $elem;
10218 continue;
10219 }
10220 if ($key === "message_help"
10221 && $elem != "") {
10222 // Ce doit être un tableau
10223 $arguments[$key] = $elem;
10224 continue;
10225 }
10226 if ($key === "ordre_tri"
10227 && in_array($elem, array("croissant", "décroissant"))) {
10228 // Ce doit être un tableau
10229 $arguments[$key] = $elem;
10230 continue;
10231 }
10232 if ($key === "nb_max_resultat"
10233 && is_numeric(str_replace('-', '', $elem)) === true) {
10234 //
10235 $arguments[$key] = $elem;
10236 continue;
10237 }
10238 if ($key === "affichage"
10239 && in_array($elem, array('liste', 'nombre'))) {
10240 // La valeur doit être dans cette liste
10241 $arguments[$key] = $elem;
10242 continue;
10243 }
10244 }
10245 //
10246 $arguments[$key] = $value;
10247 }
10248 //
10249 $type_task = $arguments["type_tache"];
10250 $etat_task = $arguments["etat_tache"];
10251 $filtre = $arguments["filtre"];
10252 $affichage = $arguments["affichage"];
10253 $message_help = $arguments["message_help"];
10254
10255 include ("../sql/pgsql/task.inc.php");
10256
10257 /**
10258 * Construction de la requête
10259 */
10260 // SELECT
10261 $query_ct_select = "
10262 dossier.dossier,
10263 $select__dossier_libelle__column as dossier_libelle,
10264 $template_case_traduction_type as type,
10265 $template_case_traduction_etat as state
10266 ";
10267 // SELECT - CHAMPAFFICHE
10268 $query_ct_select_champaffiche = array(
10269 'dossier.dossier as "'.__("dossier").'"',
10270 'dossier.geom as "geom_picto"',
10271 'demande.source_depot as "demat_picto"',
10272 $select__dossier_libelle__column_as,
10273 $template_case_traduction_type.' as "'.__("type").'"',
10274 $template_case_traduction_etat.' as "'.__("state").'"',
10275 );
10276 // FROM
10277 $query_ct_from = "
10278 ".DB_PREFIXE."dossier
10279 LEFT JOIN ".DB_PREFIXE."etat
10280 ON dossier.etat = etat.etat
10281 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
10282 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
10283 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
10284 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
10285 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
10286 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
10287 LEFT JOIN ".DB_PREFIXE."task
10288 ON task.dossier = dossier.dossier
10289 OR task.dossier = dossier_autorisation.dossier_autorisation
10290 LEFT JOIN (".DB_PREFIXE."demande
10291 JOIN ".DB_PREFIXE."demande_type
10292 ON demande.demande_type = demande_type.demande_type
10293 )
10294 ON demande.dossier_instruction = dossier.dossier
10295 AND demande_type.dossier_instruction_type = dossier.dossier_instruction_type
10296 LEFT JOIN ".DB_PREFIXE."instructeur
10297 ON dossier.instructeur=instructeur.instructeur
10298 LEFT JOIN ".DB_PREFIXE."om_utilisateur
10299 ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur
10300 LEFT JOIN ".DB_PREFIXE."division
10301 ON dossier.division=division.division
10302 %s
10303 ";
10304
10305 $query_ct_limit = sprintf(
10306 "LIMIT %s",
10307 $arguments['nb_max_resultat']
10308 );
10309
10310 $query_ct_where_collectivite_filter = "";
10311 // Dans tous les cas si l'utilisateur fait partie d'une collectivité
10312 // de niveau 1 (mono), on restreint le listing sur les dossiers de sa
10313 // collectivité
10314 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
10315 $query_ct_where_collectivite_filter = " JOIN ".DB_PREFIXE."om_collectivite
10316 ON dossier.om_collectivite=om_collectivite.om_collectivite
10317 AND om_collectivite.om_collectivite=".$_SESSION['collectivite']."
10318 ";
10319 } else {
10320 $query_ct_where_collectivite_filter = " LEFT JOIN ".DB_PREFIXE."om_collectivite
10321 ON dossier.om_collectivite=om_collectivite.om_collectivite
10322 ";
10323 }
10324
10325 $query_ct_from = sprintf($query_ct_from, $query_ct_where_collectivite_filter);
10326
10327
10328 // WHERE - TASK ETAT
10329 // Filtre sur l'état de la tâche
10330 $query_ct_where_etat_task_filter = "";
10331 if (!is_null($etat_task)
10332 && is_array($etat_task)
10333 && count($etat_task) != 0) {
10334 //
10335 $sql_etat_task = "";
10336 //
10337 foreach ($etat_task as $etat) {
10338 $sql_etat_task .= " LOWER(task.state) = '".$this->f->db->escapesimple(strtolower($etat))."' OR ";
10339 }
10340 $sql_etat_task = substr($sql_etat_task, 0, strlen($sql_etat_task) - 4);
10341 //
10342 $query_ct_where_etat_task_filter = " ( ".$sql_etat_task." ) ";
10343 }
10344
10345 // WHERE - TASK TYPE
10346 // Filtre sur le type de tâche
10347 $query_ct_where_type_task_filter = "";
10348 if (!is_null($type_task)
10349 && is_array($type_task)
10350 && count($type_task) != 0) {
10351 //
10352 $sql_type_task = "";
10353 //
10354 foreach ($type_task as $type) {
10355 $sql_type_task .= " LOWER(task.type) = '".$this->f->db->escapesimple(strtolower($type))."' OR ";
10356 }
10357 $sql_type_task = substr($sql_type_task, 0, strlen($sql_type_task) - 4);
10358 //
10359 $query_ct_where_type_task_filter = " ( ".$sql_type_task." ) ";
10360 }
10361
10362 // WHERE - TASK CATEGORY
10363 // Filtre sur la catégorie de la tache (portal ou platau),
10364 // si pas spécifié alors pas de filtrage
10365 $query_ct_where_category_task_filter = "";
10366 if (isset($arguments["categorie_tache"])
10367 && is_null($arguments["categorie_tache"]) === false) {
10368
10369 $query_ct_where_category_task_filter = sprintf(
10370 "task.category = '%s' ",
10371 $arguments["categorie_tache"]
10372 );
10373 }
10374
10375 // WHERE - TASK STREAM
10376 // Filtre sur le flux des tâches (input ou output)
10377 $query_ct_where_stream_task_filter = "";
10378 if (isset($arguments["flux_tache"])
10379 && is_null($arguments["flux_tache"]) === false) {
10380
10381 $query_ct_where_category_task_filter = sprintf(
10382 "task.stream = '%s' ",
10383 $arguments["flux_tache"]
10384 );
10385 }
10386
10387 $ordre_tri ="";
10388 if ($arguments['ordre_tri'] == "décroissant") {
10389 $ordre_tri = "DESC";
10390 }
10391 if ($arguments['ordre_tri'] == "croissant") {
10392 $ordre_tri = "ASC";
10393 }
10394
10395 // ORDER BY
10396 $query_ct_orderby = "dossier.date_depot ".$ordre_tri;
10397
10398 $tab_criteres = array(
10399 'etat_tache' => $query_ct_where_etat_task_filter,
10400 'type_tache' => $query_ct_where_type_task_filter,
10401 'categorie_tache' => $query_ct_where_category_task_filter,
10402 'flux_tache' => $query_ct_where_stream_task_filter,
10403 );
10404
10405 $query_ct_where = "";
10406 $sql_ct_where = "";
10407 foreach ($tab_criteres as $condition) {
10408 if ($condition !== '') {
10409 $sql_ct_where .= $condition.' AND ';
10410 }
10411 }
10412 $query_ct_where = substr($sql_ct_where, 0, strlen($sql_ct_where) - 5);
10413
10414 if (isset($arguments['etat_tache']) && $arguments['etat_tache'] != null && is_array($arguments['etat_tache'])) {
10415 $arguments['etat_tache'] = implode(';', $arguments['etat_tache']);
10416 }
10417 if (isset($arguments['type_tache']) && $arguments['type_tache'] != null && is_array($arguments['type_tache'])) {
10418 $arguments['type_tache'] = implode(';', $arguments['type_tache']);
10419 }
10420 $widget_recherche_id= str_replace(array('.',','), '', microtime(true));
10421 $_SESSION['widget_recherche_id'][$widget_recherche_id] = serialize($arguments);
10422
10423 /**
10424 * Return
10425 */
10426 //
10427 return array(
10428 "arguments" => $arguments,
10429 "message_help" => $message_help,
10430 "query_ct_select" => $query_ct_select,
10431 "query_ct_select_champaffiche" => $query_ct_select_champaffiche,
10432 "query_ct_from" => $query_ct_from,
10433 "query_ct_where" => $query_ct_where,
10434 "query_ct_orderby" => $query_ct_orderby,
10435 "query_ct_limit" => $query_ct_limit,
10436 "widget_recherche_id" => $widget_recherche_id
10437 );
10438 }
10439
10440 /**
10441 * WIDGET DASHBOARD - Dossiers limites
10442 *
10443 * @return void
10444 */
10445 function view_widget_suivi_tache($content = null) {
10446
10447 // Liste des paramètres
10448 $params = array(
10449 "type_tache",
10450 "etat_tache",
10451 "categorie_tache",
10452 "flux_tache",
10453 "filtre",
10454 "affichage",
10455 "message_help",
10456 "nb_max_resultat",
10457 "ordre_tri",
10458 );
10459 // Formatage des arguments reçus en paramètres
10460 $arguments = $this->get_arguments($content, $params);
10461 // Récupération de la configuration du widget
10462 $conf = $this->get_config_suivi_tache($arguments);
10463
10464 /**
10465 * Composition de la requête
10466 */
10467 // Gestion de la requête selon le tye d'affichage
10468 $query_ct_orderby = sprintf(
10469 "ORDER BY
10470 %s",
10471 $conf["query_ct_orderby"]
10472 );
10473
10474 // Gestion de la requête selon le tye d'affichage
10475 $query_ct_limit = $conf["query_ct_limit"];
10476
10477 $query_ct_select = $conf["query_ct_select"];
10478 if ($conf["arguments"]["affichage"] === "nombre") {
10479 $query_ct_orderby = "";
10480 $query_ct_select = "COUNT(*)";
10481 }
10482 $query = sprintf("
10483 SELECT
10484 %s
10485 FROM
10486 %s
10487 %s
10488 %s
10489 %s
10490 %s
10491 %s",
10492 $query_ct_select,
10493 $conf["query_ct_from"],
10494 '%s', // emplacement pour les jointure du filtre
10495 ! empty($conf["query_ct_where"]) ?
10496 'WHERE '.$conf["query_ct_where"] :
10497 "",
10498 '%s', // emplacement pour les conditions du filtre
10499 $query_ct_orderby,
10500 $query_ct_limit
10501 );
10502 // Récupération des éléments à ajouter à la requête pour y intégrer le filtre
10503 $sqlFilter = $this->get_query_filter(
10504 $query,
10505 $conf['arguments']['filtre']
10506 );
10507 $query = sprintf(
10508 $query,
10509 $sqlFilter["FROM"],
10510 $sqlFilter["WHERE"]
10511 );
10512
10513 /**
10514 * Templates nécessaires à l'affichage du widget
10515 */
10516 if ($conf["arguments"]["affichage"] === "nombre") {
10517 // Execution de la requête
10518 $qres = $this->f->get_one_result_from_db_query(
10519 $query,
10520 array(
10521 "origin" => __METHOD__
10522 )
10523 );
10524
10525 // Affichage du message d'informations
10526 printf(
10527 $this->template_help,
10528 $conf["message_help"]
10529 );
10530
10531 // Si il n'y a aucun dossier à afficher
10532 if (intval($qres['result']) == 0) {
10533 // Affichage du message d'informations
10534 echo __("Aucun dossier répondant aux critères.");
10535 // Exit
10536 return;
10537 }
10538 $this->display_resultat_bulle($qres['result'], "Non lu", "bg-info", "");
10539 } else {
10540 // Exécution de la requête
10541 $qres = $this->f->get_all_results_from_db_query(
10542 $query,
10543 array(
10544 'origin' => __METHOD__
10545 )
10546 );
10547
10548 // Affichage du message d'informations
10549 printf(
10550 $this->template_help,
10551 $conf["message_help"]
10552 );
10553
10554 /**
10555 * Si il n'y a aucun dossier à afficher, alors on affiche un message
10556 * clair à l'utilisateur et on sort de la vue.
10557 */
10558 // Si il n'y a aucun dossier à afficher
10559 if ($qres['row_count'] === 0) {
10560 // Affichage du message d'informations
10561 echo __("Aucun dossier répondant aux critères.");
10562 // Exit
10563 return;
10564 }
10565
10566 //
10567 $template_table = '
10568 <table class="tab-tab">
10569 <thead>
10570 <tr class="ui-tabs-nav ui-accordion ui-state-default tab-title">
10571 <th class="title col-0 firstcol">
10572 <span class="name">
10573 %s
10574 </span>
10575 </th>
10576 <th class="title col-1">
10577 <span class="name">
10578 %s
10579 </span>
10580 </th>
10581 <th class="title col-2 lastcol">
10582 <span class="name">
10583 %s
10584 </span>
10585 </th>
10586 </tr>
10587 </thead>
10588 <tbody>
10589 %s
10590 </tbody>
10591 </table>
10592 ';
10593 //
10594 $template_line = '
10595 <tr class="tab-data odd">
10596 <td class="col-1 firstcol">
10597 %s
10598 </td>
10599 <td class="col-2">
10600 %s
10601 </td>
10602 <td class="col-3 lastcol">
10603 %s
10604 </td>
10605 </tr>
10606 ';
10607 //
10608 $template_href = OM_ROUTE_FORM.'&obj=dossier_instruction&retour_widget=suivi_tache&widget_recherche_id='.$conf['widget_recherche_id'].'&amp;action=3&amp;idx=%s';
10609 //
10610 $template_link = '
10611 <a class="lienTable" href="%s">
10612 %s
10613 </a>
10614 ';
10615
10616 /**
10617 * Si il y a des dossiers à afficher, alors on affiche le widget.
10618 */
10619 // On construit le contenu du tableau
10620 $ct_tbody = '';
10621 foreach ($qres['result'] as $row) {
10622 // On construit l'attribut href du lien
10623 $ct_href = sprintf(
10624 $template_href,
10625 // idx
10626 $row["dossier"]
10627 );
10628 // On construit la ligne
10629 $ct_tbody .= sprintf(
10630 $template_line,
10631 // Colonne 1 - Numéro de dossier
10632 sprintf(
10633 $template_link,
10634 $ct_href,
10635 $row["dossier_libelle"]
10636 ),
10637 // Colonne 2 - Type de tâche
10638 sprintf(
10639 $template_link,
10640 $ct_href,
10641 __($row["type"])
10642 ),
10643 // Colonne 3 - Etat
10644 sprintf(
10645 $template_link,
10646 $ct_href,
10647 __($row["state"])
10648 )
10649 );
10650 }
10651 // Affichage du tableau listant les dossiers
10652 printf(
10653 $template_table,
10654 // Colonne 1 - Numéro de dossier
10655 __('dossier'),
10656 // Colonne 2 - Nom du pétitionnaire
10657 __('type'),
10658 // Colonne 3 - Date limite
10659 __('état'),
10660 // Contenu du tableau
10661 $ct_tbody
10662 );
10663 }
10664 // Affichage du footer
10665 printf(
10666 $this->template_footer,
10667 // href (avec les paramètres du widget)
10668 sprintf(
10669 OM_ROUTE_TAB."&obj=suivi_tache&widget_recherche_id=%s",
10670 $conf['widget_recherche_id']
10671 ),
10672 // titre
10673 __("Voir +")
10674 );
10675 }
10676
10677 /**
10678 * Récupère une requête sql et un filtre et renvoie sous la forme
10679 * d'un tableau les jointures et les conditions nécessaire pour
10680 * mettre en place le filtre.
10681 * Si il n'y a pas de filtre, que la méthode de récupération du filtre
10682 * n'est pas configuré ou qu'aucune requête n'est passée en paramètre
10683 * le tableau sera renvoyé mais ses entrées seront vide.
10684 *
10685 * @param string query
10686 * @param string filter
10687 * @return string requête sql avec les filtres
10688 */
10689 public function get_query_filter(string $query, string $filter = '') {
10690 $sqlFilter = array(
10691 'FROM' => '',
10692 'WHERE' => ''
10693 );
10694 // Vérifie si le paramétrage est correct. Renvoie la requête sans modification
10695 // si ce n'est pas le cas
10696 if (! empty($query) &&
10697 ! empty($filter) &&
10698 in_array($filter, $this->existing_filters)) {
10699 // Fait appel à la méthode permettant de récupérer le sql du filtre
10700 $methodName = 'add_filter_'.$filter.'_to_query';
10701 if (method_exists($this, $methodName)) {
10702 $sqlFilter = $this->$methodName($query);
10703 }
10704 }
10705 // Renvoie les jointures et les conditions nécessaire à l'intégration
10706 // du filtre
10707 return $sqlFilter;
10708 }
10709
10710 protected function add_filter_instructeur_to_query(string $query) {
10711 $sqlFilter = array(
10712 'FROM' => '',
10713 'WHERE' => ''
10714 );
10715 // Vérifie si le lien entre la table instructeur et l'instructeur
10716 // du dossier existe. Si ce n'est pas le cas on ajoute une jointure.
10717 if (preg_match("/".DB_PREFIXE."instructeur(?!_)/i", $query) === 0) {
10718 $sqlFilter['FROM'] .= sprintf(
10719 '
10720 LEFT JOIN %1$sinstructeur
10721 ON dossier.instructeur = instructeur.instructeur
10722 LEFT JOIN %1$som_utilisateur
10723 ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
10724 ',
10725 DB_PREFIXE
10726 );
10727 }
10728
10729 // Ajout du filtre dans le where.
10730 $sqlFilter['WHERE'] .= sprintf(
10731 ' %1$s om_utilisateur.login = \'%2$s\' ',
10732 preg_match("/\bWHERE\b/i", $query) === 0 ? 'WHERE' : 'AND',
10733 $_SESSION['login']
10734 );
10735 // Renvoie la requête
10736 return $sqlFilter;
10737 }
10738
10739 protected function add_filter_instructeur_ou_instructeur_secondaire_to_query(string $query) {
10740 $sqlFilter = array(
10741 'FROM' => '',
10742 'WHERE' => ''
10743 );
10744 // Vérifie si le lien entre la table instructeur et l'instructeur
10745 // du dossier existe. Si ce n'est pas le cas on ajoute une jointure.
10746 if (preg_match("/".DB_PREFIXE."instructeur(?!_)/i", $query) === 0) {
10747 $sqlFilter['FROM'] .= sprintf(
10748 '
10749 LEFT JOIN %1$sinstructeur
10750 ON dossier.instructeur = instructeur.instructeur
10751 LEFT JOIN %1$som_utilisateur
10752 ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur
10753 ',
10754 DB_PREFIXE
10755 );
10756 }
10757 // Vérifie si le lien entre la table instructeur et l'instructeur secondaire
10758 // du dossier existe. Si ce n'est pas le cas on ajoute une jointure.
10759 if (preg_match("/dossier.instructeur_2(?!_)/i", $query) === 0) {
10760 $sqlFilter['FROM'] .= sprintf(
10761 '
10762 LEFT JOIN %1$sinstructeur as instructeur_secondaire
10763 ON dossier.instructeur_2 = instructeur_secondaire.instructeur
10764 LEFT JOIN %1$som_utilisateur as utilisateur_2
10765 ON instructeur_secondaire.om_utilisateur = utilisateur_2.om_utilisateur
10766 ',
10767 DB_PREFIXE
10768 );
10769 }
10770
10771 // Ajout du filtre dans le where.
10772 $sqlFilter['WHERE'] .= sprintf(
10773 ' %1$s (om_utilisateur.login = \'%2$s\'
10774 OR utilisateur_2.login = \'%2$s\') ',
10775 preg_match("/\bWHERE\b/i", $query) === 0 ? 'WHERE' : 'AND',
10776 $_SESSION['login']
10777 );
10778 // Renvoie la requête
10779 return $sqlFilter;
10780 }
10781
10782 protected function add_filter_instructeur_secondaire_to_query(string $query) {
10783 $sqlFilter = array(
10784 'FROM' => '',
10785 'WHERE' => ''
10786 );
10787 // Vérifie si le lien entre la table instructeur et l'instructeur secondaire
10788 // du dossier existe. Si ce n'est pas le cas on ajoute une jointure.
10789 if (preg_match("/dossier.instructeur_2(?!_)/i", $query) === 0) {
10790 $sqlFilter['FROM'] = sprintf(
10791 '
10792 LEFT JOIN %1$sinstructeur as instructeur_secondaire
10793 ON dossier.instructeur_2 = instructeur_secondaire.instructeur
10794 LEFT JOIN %1$som_utilisateur as utilisateur_2
10795 ON instructeur_secondaire.om_utilisateur = utilisateur_2.om_utilisateur
10796 ',
10797 DB_PREFIXE
10798 );
10799 }
10800
10801 // Ajout du filtre dans le where.
10802 $sqlFilter['WHERE'] .= sprintf(
10803 ' %1$s utilisateur_2.login = \'%2$s\' ',
10804 preg_match("/\bWHERE\b/i", $query) === 0 ? 'WHERE' : 'AND',
10805 $_SESSION['login']
10806 );
10807 // Renvoie la requête
10808 return $sqlFilter;
10809 }
10810
10811 public function add_filter_division_to_query(string $query) {
10812 $sqlFilter = array(
10813 'FROM' => '',
10814 'WHERE' => ''
10815 );
10816 // Vérifie si le lien entre la table division et la division
10817 // du dossier existe. Si ce n'est pas le cas on ajoute une jointure.
10818 if (preg_match("/".DB_PREFIXE."division(?!_)/i", $query) === 0) {
10819 $sqlFilter['FROM'] =
10820 '
10821 LEFT JOIN %1$sdivision
10822 ON dossier.division=division.division
10823 ';
10824 }
10825
10826 // Ajout du filtre dans le where.
10827 $sqlFilter['WHERE'] .= sprintf(
10828 ' %1$s division.division = \'%2$s\' ',
10829 preg_match("/\bWHERE\b/i", $query) === 0 ? 'WHERE' : 'AND',
10830 $_SESSION['division']
10831 );
10832
10833 // Renvoie la requête
10834 return $sqlFilter;
10835 }
10836
10837 public function view_widget_compteur_signatures(string $content = null) {
10838
10839 $params = array('om_collectivite', 'service', 'url_renouvellement');
10840 $arguments = $this->get_arguments($content, $params);
10841
10842 $collectivite_id = null;
10843 if (isset($arguments['om_collectivite']) && ! empty($arguments['om_collectivite'])) {
10844 $collectivite_id = $arguments['om_collectivite'];
10845 }
10846 if (empty($collectivite_id) && $this->f->is_option_renommer_collectivite_enabled()
10847 && isset($arguments['service']) && ! empty($arguments['service'])) {
10848 $collectivite_id = $arguments['service'];
10849 }
10850 if (empty($collectivite_id)) {
10851 // récupère l'identifiant de la collectivité de l'utilisateur courant
10852 $collectivite_params = $this->f->getCollectivite();
10853 if (isset($collectivite_params['om_collectivite_idx'])
10854 && ! empty($collectivite_params['om_collectivite_idx'])) {
10855 $collectivite_id = $collectivite_params['om_collectivite_idx'];
10856 }
10857 }
10858 if (empty($collectivite_id)) {
10859 // erreur
10860 $message = $this->f->layout->display_message(
10861 'error',
10862 __("Échec de la récupération de la collectivité"));
10863 return false;
10864 }
10865
10866 // date courante
10867 $now_datetime = new Datetime();
10868 $now_date_text = $now_datetime->format('Y-m-d');
10869
10870 // récupère le nombre de signatures et le quota pour l'utilisateur en cours (ou paramétré)
10871 $sql = sprintf(
10872 "SELECT
10873 quantite, quota, unite, alerte
10874 FROM
10875 %1\$scompteur
10876 WHERE
10877 code = '%2\$s'
10878 AND om_collectivite = %3\$s
10879 AND (
10880 om_validite_debut IS NULL
10881 OR om_validite_debut <= TO_DATE('%4\$s', 'YYYY-MM-DD')
10882 )
10883 AND (
10884 om_validite_fin IS NULL
10885 OR om_validite_fin > TO_DATE('%4\$s', 'YYYY-MM-DD')
10886 )
10887 ORDER BY
10888 date_modification DESC
10889 LIMIT
10890 1",
10891 DB_PREFIXE,
10892 'signatures',
10893 $collectivite_id,
10894 $this->f->db->escapeSimple($now_date_text)
10895 );
10896 $qres = $this->f->get_all_results_from_db_query($sql, array(
10897 'origin' => __METHOD__,
10898 'force_return' => true));
10899
10900 if ($qres['code'] != 'OK' || ! isset($qres['result'])) {
10901 $message = $this->f->layout->display_message(
10902 'error',
10903 __("Erreur de base de données"));
10904 return false;
10905 }
10906 if (empty($qres['result'])) {
10907 $message = $this->f->layout->display_message(
10908 'error',
10909 sprintf(
10910 __("Aucun compteur '%s' valide pour la collectivité %d"),
10911 'signatures',
10912 $collectivite_id));
10913 return false;
10914 }
10915 if ($qres['row_count'] > 1) {
10916 $message = $this->f->layout->display_message(
10917 'error',
10918 sprintf(
10919 __("Erreur: plus d'un compteur '%s' valide pour la collectivité %d"),
10920 'signatures',
10921 $collectivite_id));
10922 return false;
10923 }
10924 $count = floatval($qres['result'][0]['quantite']);
10925 $quota = floatval($qres['result'][0]['quota']);
10926 $unite = $qres['result'][0]['unite'];
10927 $alerte = floatval($qres['result'][0]['alerte']);
10928
10929 if (empty($quota)) {
10930 return $this->display_resultat_bulle(
10931 $count.(! empty($unite) ? ' '.$unite : ''),
10932 __("Signatures"),
10933 'bg-info');
10934 }
10935
10936 // détermine le nombre de signatures restantes/en dépassement à partir du quota, ainsi qu'un pourcentage
10937 $left_or_over = abs($quota - $count);
10938 $left_or_over_label = __("restantes");
10939 $consumed_percent = round($count * 100 / $quota);
10940
10941 // génère le message à afficher à l'utilisateur, ainsi qu'un niveau de criticité INFO|WARNING|CRITICAL
10942 $css_class = 'info';
10943 $message = '';
10944 $url_renouvellement = isset($arguments['url_renouvellement']) ? $arguments['url_renouvellement'] : '#';
10945 if ($consumed_percent > 100) {
10946 $css_class = 'error';
10947 $message = $this->f->layout->display_message(
10948 $css_class,
10949 sprintf(
10950 __("Vous avez atteint la limite de votre quota de signatures. Afin de l'augmenter, %s"),
10951 '<a class="link" href="'.$url_renouvellement.'">'.__("cliquez ici").'</a>'));
10952 $left_or_over_label = __("en dépassement");
10953 }
10954 elseif (! empty($alerte) && $consumed_percent > $alerte) {
10955 $css_class = 'warning';
10956 $message = $this->f->layout->display_message(
10957 $css_class,
10958 sprintf(
10959 __("Attention vous approchez de la limite de votre quota de signatures. Afin de l'augmenter, %s"),
10960 '<a class="link" href="'.$url_renouvellement.'">'.__("cliquez ici").'</a>'));
10961 }
10962
10963 // envoie/affiche la réponse HTTP en remplaçant les valeurs dans le template de réponse du widget
10964 echo str_replace(
10965 array('{{count}}', '{{quota}}', '{{left_or_over}}', '{{left_or_over_label}}', '{{consumed_percent}}', '{{message}}', '{{class}}'),
10966 array($count, $quota, $left_or_over, $left_or_over_label, $consumed_percent, $message, $css_class),
10967 self::WIDGET_COMPTEUR_SIGNATURE_TPL);
10968 }
10969 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26