/[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 12847 - (show annotations)
Thu Sep 15 19:43:25 2022 UTC (2 years, 4 months ago) by softime
File size: 415410 byte(s)
* Fusion de la branche d'intégration 5.13.0-develop dans le trunk

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

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26