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 "../core/obj/om_widget.class.php"; |
13 |
|
14 |
class om_widget extends om_widget_core { |
15 |
|
16 |
/** |
17 |
* Constructeur. |
18 |
*/ |
19 |
function __construct($id, &$dnu1 = null, $dnu2 = null) { |
20 |
$this->constructeur($id); |
21 |
} |
22 |
|
23 |
/** |
24 |
* |
25 |
*/ |
26 |
var $template_help = '<div class="widget-help"><span class="info-16" title="%s"></span></div>'; |
27 |
|
28 |
/** |
29 |
* |
30 |
*/ |
31 |
var $template_footer = ' |
32 |
<div class="widget-footer"> |
33 |
<a href="%s"> |
34 |
%s |
35 |
</a> |
36 |
</div> |
37 |
'; |
38 |
|
39 |
/** |
40 |
* Cette méthode retourne un arbre html représentant un raccourci. |
41 |
* |
42 |
* Un raccourci est composé d'un lien, d'une image et d'une description. |
43 |
* Voir les widgets : |
44 |
* - widget_nouvelle_demande_autre_dossier |
45 |
* - widget_nouvelle_demande_dossier_encours |
46 |
* - widget_nouvelle_demande_nouveau_dossier |
47 |
*/ |
48 |
function get_display_widget_shortlink($config) { |
49 |
return sprintf ( |
50 |
'<a href="%s"><span><img src="%s" align="left" alt="%s" />%s</span></a>', |
51 |
$config["a_href"], |
52 |
$config["img_src"], |
53 |
$config["img_alt"], |
54 |
$config["a_content"] |
55 |
); |
56 |
} |
57 |
|
58 |
/** |
59 |
* WIDGET DASHBOARD - widget_nouvelle_demande_autre_dossier. |
60 |
*/ |
61 |
function view_widget_nouvelle_demande_autre_dossier($content = null) { |
62 |
echo $this->get_display_widget_shortlink(array( |
63 |
"a_href" => "../scr/tab.php?obj=demande_autre_dossier", |
64 |
"img_src" => "../app/img/dossier-existant.png", |
65 |
"img_alt" => _("Autres dossiers"), |
66 |
"a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours ou une autorisation existante"), |
67 |
)); |
68 |
} |
69 |
|
70 |
/** |
71 |
* WIDGET DASHBOARD - widget_nouvelle_demande_dossier_encours. |
72 |
*/ |
73 |
function view_widget_nouvelle_demande_dossier_encours($content = null) { |
74 |
echo $this->get_display_widget_shortlink(array( |
75 |
"a_href" => "../scr/tab.php?obj=demande_dossier_encours", |
76 |
"img_src" => "../app/img/dossier-existant.png", |
77 |
"img_alt" => _("Dossier en cours"), |
78 |
"a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant un dossier en cours"), |
79 |
)); |
80 |
} |
81 |
|
82 |
/** |
83 |
* WIDGET DASHBOARD - widget_nouvelle_demande_nouveau_dossier. |
84 |
*/ |
85 |
function view_widget_nouvelle_demande_nouveau_dossier($content = null) { |
86 |
echo $this->get_display_widget_shortlink(array( |
87 |
"a_href" => "../scr/form.php?obj=demande_nouveau_dossier&action=0&advs_id=&tricol=&valide=&retour=tab&new=", |
88 |
"img_src" => "../app/img/dossier-nouveau.png", |
89 |
"img_alt" => _("Nouveau dossier"), |
90 |
"a_content" => _("Cliquer ici pour saisir une nouvelle demande concernant le depot d'un nouveau dossier"), |
91 |
)); |
92 |
} |
93 |
|
94 |
/** |
95 |
* WIDGET DASHBOARD - widget_recherche_dossier. |
96 |
* |
97 |
* Quatre cas d'utilisation : |
98 |
* - 1 - La valeur recherchée correspond exactement au code d'un DI, |
99 |
* alors on accède directement à la fiche de visualisation du DI. |
100 |
* - 2 - La valeur recherchée renvoi plusieurs DI, alors on accède au |
101 |
* listing des dossiers d'instruction avec le formulaire de |
102 |
* recherche avancée pré-rempli avec la valeur saisie. |
103 |
* - 3 - La valeur recherchée renvoi aucun enregistrement, alors on |
104 |
* affiche un message en ce sens directement dans le widget. |
105 |
* - 4 - Aucune valeur n'est saisie, alors on affiche un message en ce |
106 |
* sens directement dans le widget. |
107 |
* |
108 |
* @return void |
109 |
*/ |
110 |
function view_widget_recherche_dossier($content = null) { |
111 |
|
112 |
/** |
113 |
* Traitement de la validation du formulaire |
114 |
*/ |
115 |
// |
116 |
if ($this->f->get_submitted_post_value("validation") != null |
117 |
&& $this->f->get_submitted_post_value("dossier") !== null |
118 |
&& $this->f->get_submitted_post_value("dossier") != "") { |
119 |
// Mémorisation de la recherche |
120 |
$search = $this->f->db->escapesimple($this->f->get_submitted_post_value("dossier")); |
121 |
// Ajout d'une étoile au début s'il n'y en n'a pas. |
122 |
// Par defaut * est toujours ajouté à la fin des recherches. |
123 |
if (substr($search, 0, 1) != '*') { |
124 |
$search = '*'.$search; |
125 |
} |
126 |
// Traitement des valeurs postées |
127 |
$posted_dossiers = $this->f->db->escapesimple(strtolower(str_replace("*", "%", $this->f->get_submitted_post_value("dossier")))); |
128 |
$posted_dossiers = str_replace(';', ',', $posted_dossiers); |
129 |
|
130 |
// |
131 |
// UNE VALEUR SAISIE |
132 |
// |
133 |
|
134 |
// WHERE - Filtre Collectivité |
135 |
$where_collectivite = ""; |
136 |
// Si collectivité utilisateur mono alors filtre sur celle-ci |
137 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
138 |
// |
139 |
$where_collectivite = " |
140 |
AND dossier.om_collectivite=".$_SESSION['collectivite']." |
141 |
"; |
142 |
} |
143 |
|
144 |
// Construction de la requête |
145 |
// Pour chaque dossier on cherche sur les deux champs du code du |
146 |
// dossier (un avec et un sans espaces) |
147 |
$posted_dossiers = explode(',', $posted_dossiers); |
148 |
$liste_dossiers = array(); |
149 |
foreach ($posted_dossiers as $posted_dossier) { |
150 |
$sql = " |
151 |
SELECT |
152 |
dossier |
153 |
FROM |
154 |
".DB_PREFIXE."dossier |
155 |
WHERE |
156 |
(LOWER(dossier.dossier) LIKE '%".$posted_dossier."%' |
157 |
OR LOWER(dossier.dossier_libelle) LIKE '%".$posted_dossier."%' ) |
158 |
"; |
159 |
$sql .= $where_collectivite; |
160 |
// Exécution de la requête |
161 |
$res = $this->f->db->query($sql); |
162 |
$this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE); |
163 |
$this->f->isDatabaseError($res); |
164 |
// On récupère les numéros de dossier dans les résultats |
165 |
while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { |
166 |
$liste_dossiers[] = $row['dossier']; |
167 |
} |
168 |
} |
169 |
$total_dossiers = count($liste_dossiers); |
170 |
// Si on obtient un seul résultat |
171 |
if ($total_dossiers == 1) { |
172 |
// On reformate le dossier |
173 |
$dossier = strtoupper(str_replace(' ', '', $liste_dossiers[0])); |
174 |
// On redirige vers le listing des DI |
175 |
echo ' |
176 |
<script type="text/javascript" > |
177 |
widget_recherche_dossier(\''.$dossier.'\', 1); |
178 |
</script> |
179 |
'; |
180 |
// On arrête l'exécution du script car l'utilisateur a été |
181 |
// redirigé vers un autre script |
182 |
exit(); |
183 |
} |
184 |
// Si on obtient plusieurs résultats |
185 |
if ($total_dossiers > 1) { |
186 |
// On redirige vers le listing des DI |
187 |
echo ' |
188 |
<script type="text/javascript" > |
189 |
widget_recherche_dossier(\''.$search.'\', '.$total_dossiers.'); |
190 |
</script> |
191 |
'; |
192 |
// On arrête l'exécution du script car l'utilisateur a été |
193 |
// redirigé vers un autre script |
194 |
exit(); |
195 |
} |
196 |
// Cas d'utilisation n°3 |
197 |
// Si aucun dossier trouve |
198 |
// Affiche un message d'erreur |
199 |
$erreur = _("Aucun dossier trouve"); |
200 |
|
201 |
} elseif ($this->f->get_submitted_post_value("validation") != null |
202 |
&& $this->f->get_submitted_post_value("dossier") !== null |
203 |
&& $this->f->get_submitted_post_value("dossier") == '') { |
204 |
|
205 |
// |
206 |
// AUCUNE VALEUR SAISIE |
207 |
// |
208 |
|
209 |
// Cas d'utilisation n°4 |
210 |
// Affiche un message d'erreur |
211 |
$erreur = _("Veuillez saisir un No de dossier."); |
212 |
|
213 |
} |
214 |
|
215 |
/** |
216 |
* Affichage du widget |
217 |
*/ |
218 |
// Affichage du message d'informations |
219 |
printf( |
220 |
'<div class="widget-help"><span class="info-16" title="%s"></span></div>', |
221 |
_("Permet la recherche directe de dossiers d'instruction.\n\n". |
222 |
"Deux modes de saisie sont possibles :\n". |
223 |
"- 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". |
224 |
"- Code de dossier partiel 'DP' ou 'PC*P0' ou '*013055*' pour un accès au formulaire de recherche avancée des dossiers d'instruction.") |
225 |
); |
226 |
// Ouverture du form |
227 |
echo "\t<form method=\"post\" id=\"widget_recherche_dossier_form\" action=\"../scr/dashboard.php\">\n"; |
228 |
// Affichage d'un éventuel message d'erreur |
229 |
if (isset($erreur) && $erreur != "") { |
230 |
$class = "error"; |
231 |
$this->f->displayMessage($class, $erreur); |
232 |
} |
233 |
// Configuration du formulaire de recherche |
234 |
$champs = array("dossier"); |
235 |
$form = new $this->om_formulaire(null, 0, 0, $champs); |
236 |
$form->setLib("dossier", '<span class="om-icon om-icon-16 om-icon-fix loupe-16">Recherche</span>'); |
237 |
$form->setType("dossier", "text"); |
238 |
$form->setTaille("dossier", 20); |
239 |
$form->setMax("dossier", 250); |
240 |
// Affichage du formulaire |
241 |
$form->entete(); |
242 |
$form->afficher($champs, 0, false, false); |
243 |
$form->enpied(); |
244 |
// Affichage des contrôles du formulaire |
245 |
echo "\t<div class=\"formControls\">\n"; |
246 |
echo "\t\t<input type=\"submit\" class=\"om-button ui-button ui-widget ui-state-default ui-corner-all\" |
247 |
value=\""._("Valider")."\" name=\"validation\" />\n"; |
248 |
echo "\t</div>\n"; |
249 |
// Fermeture du form |
250 |
echo "\t</form>\n"; |
251 |
} |
252 |
|
253 |
/** |
254 |
* Cette méthode permet de récupérer la configuration du widget 'Dossiers |
255 |
* limites'. |
256 |
* |
257 |
* @return array |
258 |
*/ |
259 |
function get_config_dossiers_limites($arguments) { |
260 |
// Initialisation du tableau des paramètres avec ses valeur par défaut |
261 |
$arguments_default = array( |
262 |
"nombre_de_jours" => 15, |
263 |
"codes_datd" => null, |
264 |
"filtre" => "instructeur", |
265 |
); |
266 |
// Vérification des arguments |
267 |
foreach ($arguments_default as $key => $value) { |
268 |
// |
269 |
if (isset($arguments[$key])) { |
270 |
// |
271 |
$elem = trim($arguments[$key]); |
272 |
// |
273 |
if ($key === "nombre_de_jours" |
274 |
&& intval($elem) > 0) { |
275 |
// Ce doit être un entier |
276 |
$arguments[$key] = intval($elem); |
277 |
continue; |
278 |
} elseif ($key === "codes_datd" |
279 |
&& $elem != "") { |
280 |
// Ce doit être un tableau |
281 |
$arguments[$key] = explode(";", $elem); |
282 |
continue; |
283 |
} elseif ($key === "filtre" |
284 |
&& in_array($elem, array("instructeur", "division", "aucun"))) { |
285 |
// La valeur doit être dans cette liste |
286 |
$arguments[$key] = $elem; |
287 |
continue; |
288 |
} |
289 |
} |
290 |
// |
291 |
$arguments[$key] = $value; |
292 |
} |
293 |
// |
294 |
$nombre_de_jours = $arguments["nombre_de_jours"]; |
295 |
$codes_datd = $arguments["codes_datd"]; |
296 |
$filtre = $arguments["filtre"]; |
297 |
|
298 |
/** |
299 |
* Construction de la requête |
300 |
*/ |
301 |
// SELECT |
302 |
$query_ct_select = " |
303 |
dossier.dossier, |
304 |
dossier.dossier_libelle, |
305 |
dossier.date_limite, |
306 |
dossier.date_limite_incompletude, |
307 |
CASE |
308 |
WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE |
309 |
THEN to_char(dossier.date_limite_incompletude, 'DD/MM/YYYY') |
310 |
ELSE |
311 |
to_char(dossier.date_limite, 'DD/MM/YYYY') |
312 |
END as date_limite_na, |
313 |
COALESCE( |
314 |
demandeur.particulier_nom, |
315 |
demandeur.personne_morale_denomination |
316 |
) AS nom_petitionnaire, |
317 |
CASE |
318 |
WHEN dossier.enjeu_erp is TRUE |
319 |
THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_erp-16'' title=''"._('Enjeu ERP')."''>ERP</span>' |
320 |
ELSE |
321 |
'' |
322 |
END |
323 |
|| |
324 |
CASE |
325 |
WHEN dossier.enjeu_urba is TRUE |
326 |
THEN '<span class=''om-icon om-icon-16 om-icon-fix enjeu_urba-16'' title=''"._('Enjeu Urba')."''>URBA</span>' |
327 |
ELSE |
328 |
'' |
329 |
END AS enjeu |
330 |
"; |
331 |
// SELECT - CHAMPAFFICHE |
332 |
$query_ct_select_champaffiche = array( |
333 |
'dossier.dossier as "'._("dossier").'"', |
334 |
'dossier.dossier_libelle as "'._("dossier").'"', |
335 |
'COALESCE( |
336 |
demandeur.particulier_nom, |
337 |
demandeur.personne_morale_denomination |
338 |
) AS "'._("nom_petitionnaire").'"', |
339 |
'CASE |
340 |
WHEN dossier.incomplet_notifie IS TRUE AND dossier.incompletude IS TRUE |
341 |
THEN to_char(dossier.date_limite_incompletude, \'DD/MM/YYYY\') |
342 |
ELSE |
343 |
to_char(dossier.date_limite, \'DD/MM/YYYY\') |
344 |
END as "'._("date_limite").'"', |
345 |
'CASE |
346 |
WHEN dossier.enjeu_erp is TRUE |
347 |
THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_erp-16" title="'._('Enjeu ERP').'">ERP</span>\' |
348 |
ELSE |
349 |
\'\' |
350 |
END |
351 |
|| |
352 |
CASE |
353 |
WHEN dossier.enjeu_urba is TRUE |
354 |
THEN \'<span class="om-icon om-icon-16 om-icon-fix enjeu_urba-16" title="'._('Enjeu Urba').'">URBA</span>\' |
355 |
ELSE |
356 |
\'\' |
357 |
END AS "'._("enjeu").'"', |
358 |
// XXX Attention cette colonne est cachée en css est doit donc restée la dernière du tableau |
359 |
'CASE WHEN incomplet_notifie IS TRUE AND incompletude IS TRUE THEN |
360 |
dossier.date_limite_incompletude ELSE |
361 |
dossier.date_limite END as date_limite_na', |
362 |
); |
363 |
// FROM |
364 |
$query_ct_from = " |
365 |
".DB_PREFIXE."dossier |
366 |
LEFT JOIN ".DB_PREFIXE."etat |
367 |
ON dossier.etat = etat.etat |
368 |
LEFT JOIN ".DB_PREFIXE."lien_dossier_demandeur |
369 |
ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE |
370 |
LEFT JOIN ".DB_PREFIXE."demandeur |
371 |
ON lien_dossier_demandeur.demandeur = demandeur.demandeur |
372 |
LEFT JOIN ".DB_PREFIXE."dossier_autorisation |
373 |
ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation |
374 |
LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille |
375 |
ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille |
376 |
LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type |
377 |
ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type |
378 |
LEFT JOIN ".DB_PREFIXE."instructeur |
379 |
ON dossier.instructeur=instructeur.instructeur |
380 |
LEFT JOIN ".DB_PREFIXE."om_utilisateur |
381 |
ON instructeur.om_utilisateur=om_utilisateur.om_utilisateur |
382 |
"; |
383 |
// WHERE - COMMON |
384 |
$query_ct_where_common = " |
385 |
( |
386 |
( |
387 |
dossier.incomplet_notifie IS FALSE |
388 |
AND date_limite <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day' |
389 |
) |
390 |
OR |
391 |
( |
392 |
dossier.incomplet_notifie IS TRUE |
393 |
AND dossier.incompletude IS TRUE |
394 |
AND date_limite_incompletude <= CURRENT_TIMESTAMP + ".$nombre_de_jours." * interval '1 day' |
395 |
) |
396 |
) |
397 |
AND etat.statut != 'cloture' |
398 |
AND dossier.avis_decision IS NULL |
399 |
AND LOWER(dossier.accord_tacite) = 'oui' |
400 |
"; |
401 |
// WHERE - DATD |
402 |
// Filtre sur le type détaillé des dossiers |
403 |
$query_ct_where_datd_filter = ""; |
404 |
if (!is_null($codes_datd) |
405 |
&& is_array($codes_datd) |
406 |
&& count($codes_datd) != 0) { |
407 |
// |
408 |
$sql_codes = ""; |
409 |
// |
410 |
foreach ($codes_datd as $code) { |
411 |
$sql_codes .= " LOWER(dossier_autorisation_type_detaille.code) = '".$this->f->db->escapesimple(strtolower($code))."' OR "; |
412 |
} |
413 |
$sql_codes = substr($sql_codes, 0, count($sql_codes) - 4); |
414 |
// |
415 |
$query_ct_where_datd_filter = " AND ( ".$sql_codes." ) "; |
416 |
} |
417 |
// WHERE - USER |
418 |
// Filtre sur les dossiers qui concernent l'utilisateur |
419 |
$query_ct_where_user_filter = ""; |
420 |
// |
421 |
if ($filtre == "instructeur") { |
422 |
// |
423 |
$query_ct_where_user_filter = " |
424 |
AND om_utilisateur.login='".$_SESSION['login']."' |
425 |
"; |
426 |
} elseif ($filtre == "division") { |
427 |
// |
428 |
$query_ct_where_user_filter .= " |
429 |
AND dossier.division = ".$_SESSION['division']." |
430 |
"; |
431 |
} elseif ($filtre == "aucun") { |
432 |
// |
433 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
434 |
$query_ct_where_user_filter = " |
435 |
AND dossier.om_collectivite=".$_SESSION['collectivite']." |
436 |
"; |
437 |
} |
438 |
} |
439 |
// ORDER BY |
440 |
$query_ct_orderby = " |
441 |
date_limite_na |
442 |
"; |
443 |
|
444 |
/** |
445 |
* Message d'aide |
446 |
*/ |
447 |
// |
448 |
$message_filtre = ""; |
449 |
// |
450 |
switch($filtre) { |
451 |
case "instructeur" : |
452 |
$message_filtre = " "._("(filtrés par instructeur)"); |
453 |
break; |
454 |
case "division" : |
455 |
$message_filtre = " "._("(filtrés par division)"); |
456 |
break; |
457 |
} |
458 |
// |
459 |
$message_help = sprintf( |
460 |
_("Les dossiers%s avec acceptation tacite sur lesquels aucune décision n'a été prise et dont la date limite est dans moins de %s jours%s."), |
461 |
(is_null($codes_datd) ? "": " (".implode(";",$codes_datd).")"), |
462 |
$nombre_de_jours, |
463 |
$message_filtre |
464 |
); |
465 |
|
466 |
/** |
467 |
* Return |
468 |
*/ |
469 |
// |
470 |
return array( |
471 |
"arguments" => $arguments, |
472 |
"message_help" => $message_help, |
473 |
"query_ct_select" => $query_ct_select, |
474 |
"query_ct_select_champaffiche" => $query_ct_select_champaffiche, |
475 |
"query_ct_from" => $query_ct_from, |
476 |
"query_ct_where_common" => $query_ct_where_common, |
477 |
"query_ct_where_datd_filter" => $query_ct_where_datd_filter, |
478 |
"query_ct_where_user_filter" => $query_ct_where_user_filter, |
479 |
"query_ct_orderby" => $query_ct_orderby, |
480 |
); |
481 |
} |
482 |
|
483 |
/** |
484 |
* WIDGET DASHBOARD - Dossiers limites |
485 |
* |
486 |
* @return void |
487 |
*/ |
488 |
function view_widget_dossiers_limites($content = null) { |
489 |
|
490 |
/** |
491 |
* Ce widget est configurable via l'interface Web. Lors de la création |
492 |
* du widget dans le paramétrage il est possible de spécifier la ou les |
493 |
* options suivantes : |
494 |
* |
495 |
* - nombre_de_jours : c'est le délai en jours avant la date limite à |
496 |
* partir duquel on souhaite voir apparaître les dossiers dans le |
497 |
* widget. |
498 |
* (default) Par défaut la valeur est 15 jours. |
499 |
* |
500 |
* - codes_datd : la liste des types de dossiers à afficher. exemple : |
501 |
* "PCI;PCA;DPS;CUa;CUb". |
502 |
* (default) Par défaut tous les types sont affichés. [null] |
503 |
* |
504 |
* - filtre : |
505 |
* = instructeur |
506 |
* = division |
507 |
* = aucun |
508 |
* (default) Par défaut les dossiers sont filtrés sur l'instructeur. |
509 |
*/ |
510 |
// Liste des paramètres |
511 |
$params = array("nombre_de_jours", "codes_datd", "filtre", ); |
512 |
// Formatage des arguments reçus en paramètres |
513 |
$arguments = $this->get_arguments($content, $params); |
514 |
// Récupération de la configuration du widget |
515 |
$conf = $this->get_config_dossiers_limites($arguments); |
516 |
// |
517 |
$nombre_de_jours = $conf["arguments"]["nombre_de_jours"]; |
518 |
$codes_datd = $conf["arguments"]["codes_datd"]; |
519 |
$filtre = $conf["arguments"]["filtre"]; |
520 |
|
521 |
/** |
522 |
* Composition de la requête |
523 |
*/ |
524 |
// |
525 |
$query = sprintf(" |
526 |
SELECT |
527 |
%s |
528 |
FROM |
529 |
%s |
530 |
WHERE |
531 |
%s |
532 |
%s |
533 |
%s |
534 |
ORDER BY |
535 |
%s |
536 |
LIMIT 10", |
537 |
$conf["query_ct_select"], |
538 |
$conf["query_ct_from"], |
539 |
$conf["query_ct_where_common"], |
540 |
$conf["query_ct_where_datd_filter"], |
541 |
$conf["query_ct_where_user_filter"], |
542 |
$conf["query_ct_orderby"] |
543 |
); |
544 |
|
545 |
/** |
546 |
* Exécution de la requête |
547 |
*/ |
548 |
// |
549 |
$res = $this->f->db->query($query); |
550 |
$this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE); |
551 |
$this->f->isDatabaseError($res); |
552 |
|
553 |
// Affichage du message d'informations |
554 |
printf( |
555 |
$this->template_help, |
556 |
$conf["message_help"] |
557 |
); |
558 |
|
559 |
/** |
560 |
* Si il n'y a aucun dossier à afficher, alors on affiche un message |
561 |
* clair à l'utilisateur et on sort de la vue. |
562 |
*/ |
563 |
// Si il n'y a aucun dossier à afficher |
564 |
if ($res->numrows() == 0) { |
565 |
// Affichage du message d'informations |
566 |
echo _("Vous n'avez pas de dossiers limites pour le moment."); |
567 |
// Exit |
568 |
return; |
569 |
} |
570 |
|
571 |
/** |
572 |
* Template nécessaires à l'affichage du widget |
573 |
*/ |
574 |
// |
575 |
$template_table = ' |
576 |
<table class="tab-tab"> |
577 |
<thead> |
578 |
<tr class="ui-tabs-nav ui-accordion ui-state-default tab-title"> |
579 |
<th class="title col-0 firstcol"> |
580 |
<span class="name"> |
581 |
%s |
582 |
</span> |
583 |
</th> |
584 |
<th class="title col-1"> |
585 |
<span class="name"> |
586 |
%s |
587 |
</span> |
588 |
</th> |
589 |
<th class="title col-2"> |
590 |
<span class="name"> |
591 |
%s |
592 |
</span> |
593 |
</th> |
594 |
<th class="title col-3 lastcol"> |
595 |
<span class="name"> |
596 |
%s |
597 |
</span> |
598 |
</th> |
599 |
</tr> |
600 |
</thead> |
601 |
<tbody> |
602 |
%s |
603 |
</tbody> |
604 |
</table> |
605 |
'; |
606 |
// |
607 |
$template_line = ' |
608 |
<tr class="tab-data odd"> |
609 |
<td class="col-1 firstcol"> |
610 |
%s |
611 |
</td> |
612 |
<td class="col-1"> |
613 |
%s |
614 |
</td> |
615 |
<td class="col-2"> |
616 |
%s |
617 |
</td> |
618 |
<td class="col-3 lastcol"> |
619 |
%s |
620 |
</td> |
621 |
</tr> |
622 |
'; |
623 |
// |
624 |
$template_href = '../scr/form.php?obj=dossier_instruction&action=3&idx=%s'; |
625 |
// |
626 |
$template_link = ' |
627 |
<a class="lienTable" href="%s"> |
628 |
%s |
629 |
</a> |
630 |
'; |
631 |
|
632 |
/** |
633 |
* Si il y a des dossiers à afficher, alors on affiche le widget. |
634 |
*/ |
635 |
// On construit le contenu du tableau |
636 |
$ct_tbody = ''; |
637 |
while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { |
638 |
// On construit l'attribut href du lien |
639 |
$ct_href = sprintf( |
640 |
$template_href, |
641 |
// idx |
642 |
$row["dossier"] |
643 |
); |
644 |
// On construit la ligne |
645 |
$ct_tbody .= sprintf( |
646 |
$template_line, |
647 |
// Colonne 1 - Numéro de dossier |
648 |
sprintf( |
649 |
$template_link, |
650 |
$ct_href, |
651 |
$row["dossier_libelle"] |
652 |
), |
653 |
// Colonne 2 - Nom du pétitionnaire |
654 |
sprintf( |
655 |
$template_link, |
656 |
$ct_href, |
657 |
$row["nom_petitionnaire"] |
658 |
), |
659 |
// Colonne 3 - Date limite |
660 |
sprintf( |
661 |
$template_link, |
662 |
$ct_href, |
663 |
$this->f->formatDate($row["date_limite_na"]) |
664 |
), |
665 |
// Colonne 4 - Enjeu |
666 |
sprintf( |
667 |
$template_link, |
668 |
$ct_href, |
669 |
$row["enjeu"] |
670 |
) |
671 |
); |
672 |
} |
673 |
// Affichage du tableau listant les dossiers |
674 |
printf( |
675 |
$template_table, |
676 |
// Colonne 1 - Numéro de dossier |
677 |
_('dossier'), |
678 |
// Colonne 2 - Nom du pétitionnaire |
679 |
_('nom_petitionnaire'), |
680 |
// Colonne 3 - Date limite |
681 |
_('date_limite'), |
682 |
// Colonne 4 - Enjeu |
683 |
_('enjeu'), |
684 |
// Contenu du tableau |
685 |
$ct_tbody |
686 |
); |
687 |
// Affichage du footer |
688 |
printf( |
689 |
$this->template_footer, |
690 |
// href (avec les paramètres du widget) |
691 |
sprintf( |
692 |
"../scr/tab.php?obj=dossiers_limites&nombre_de_jours=%s&codes_datd=%s&filtre=%s", |
693 |
$nombre_de_jours, |
694 |
(is_null($codes_datd) ? "" : implode(";",$codes_datd)), |
695 |
$filtre |
696 |
), |
697 |
// titre |
698 |
_("Voir +") |
699 |
); |
700 |
} |
701 |
|
702 |
/** |
703 |
* Cet méthode permet de formater, la chaîne de caractères reçue du |
704 |
* paramétrage du widget en un tableau de valeurs dont les clés |
705 |
* correspondent aux clés passées en paramètre. |
706 |
* |
707 |
* @param string $content |
708 |
* @param array $params |
709 |
* |
710 |
* @return array |
711 |
*/ |
712 |
function get_arguments($content = null, $params = array()) { |
713 |
// |
714 |
$arguments = array(); |
715 |
// On explose les paramètres reçus avec un élément par ligne |
716 |
$params_tmp1 = explode("\n", $content); |
717 |
// On boucle sur chaque ligne de paramètre |
718 |
foreach ($params_tmp1 as $key => $value) { |
719 |
// On explose le paramètre de sa valeur avec le séparateur '=' |
720 |
$params_tmp2[] = explode("=", $value); |
721 |
} |
722 |
// On boucle sur chaque paramètre reçu pour vérifier si la valeur reçue |
723 |
// est acceptable ou non |
724 |
foreach ($params_tmp2 as $key => $value) { |
725 |
// |
726 |
if (!isset($value[0]) || !isset($value[1])) { |
727 |
continue; |
728 |
} |
729 |
// |
730 |
if (in_array(trim($value[0]), $params)) { |
731 |
$arguments[trim($value[0])] = trim($value[1]); |
732 |
} |
733 |
} |
734 |
// |
735 |
return $arguments; |
736 |
} |
737 |
|
738 |
/** |
739 |
* WIDGET DASHBOARD - Retours de messages |
740 |
* |
741 |
* @return void |
742 |
*/ |
743 |
function view_widget_messages_retours($content = null) { |
744 |
|
745 |
/** |
746 |
* Ce widget est configurable via l'interface Web. Lors de la création |
747 |
* du widget dans le paramétrage il est possible de spécifier la ou les |
748 |
* options suivantes : |
749 |
* |
750 |
* - filtre : |
751 |
* = instructeur |
752 |
* = division |
753 |
* = aucun |
754 |
* (default) Par défaut les dossiers sont filtrés sur l'instructeur. |
755 |
*/ |
756 |
// Liste des paramètres |
757 |
$params = array("filtre", ); |
758 |
// Formatage des arguments reçus en paramètres |
759 |
$arguments = $this->get_arguments($content, $params); |
760 |
// Récupération de la configuration du widget |
761 |
$conf = $this->get_config_messages_retours($arguments); |
762 |
// |
763 |
$filtre = $conf["arguments"]["filtre"]; |
764 |
|
765 |
/** |
766 |
* Composition de la requête |
767 |
*/ |
768 |
// |
769 |
$query = sprintf( |
770 |
"SELECT |
771 |
count(*) |
772 |
FROM |
773 |
%s |
774 |
WHERE |
775 |
%s |
776 |
%s", |
777 |
$conf["query_ct_from"], |
778 |
$conf["query_ct_where_common"], |
779 |
$conf["query_ct_where_user_filter"] |
780 |
); |
781 |
|
782 |
/** |
783 |
* Exécution de la requête |
784 |
*/ |
785 |
// |
786 |
$res = $this->f->db->getone($query); |
787 |
$this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE); |
788 |
$this->f->isDatabaseError($res); |
789 |
|
790 |
// Affichage du message d'informations |
791 |
printf( |
792 |
$this->template_help, |
793 |
$conf["message_help"] |
794 |
); |
795 |
|
796 |
// |
797 |
if (intval($res) === 0) { |
798 |
// |
799 |
echo _("Aucun message non lu."); |
800 |
return; |
801 |
} |
802 |
|
803 |
|
804 |
/** |
805 |
* |
806 |
*/ |
807 |
$template_panel = ' |
808 |
<div class="panel panel-box"> |
809 |
<div class="list-justified-container"> |
810 |
<ul class="list-justified text-center"> |
811 |
%s |
812 |
</ul> |
813 |
</div> |
814 |
</div>'; |
815 |
/** |
816 |
* |
817 |
*/ |
818 |
// |
819 |
$panel = ""; |
820 |
// |
821 |
$template_elem = ' |
822 |
<li> |
823 |
<span class="size-h3 box-icon rounded %s">%s</span> |
824 |
<p class="text-muted">%s %s</p> |
825 |
</li> |
826 |
'; |
827 |
$panel_elem = sprintf( |
828 |
$template_elem, |
829 |
"bg-info", |
830 |
intval($res), |
831 |
_("Non lu"), |
832 |
"" |
833 |
); |
834 |
// |
835 |
$panel .= sprintf( |
836 |
$template_panel, |
837 |
$panel_elem |
838 |
); |
839 |
echo $panel; |
840 |
|
841 |
/** |
842 |
* |
843 |
*/ |
844 |
if ($filtre === "aucun") { |
845 |
$obj_href_more_link = "messages_tous_retours"; |
846 |
} elseif ($filtre === "division") { |
847 |
$obj_href_more_link = "messages_retours_ma_division"; |
848 |
} else { |
849 |
$obj_href_more_link = "messages_mes_retours"; |
850 |
} |
851 |
|
852 |
// |
853 |
if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) { |
854 |
return; |
855 |
} |
856 |
// Affichage du footer |
857 |
printf( |
858 |
$this->template_footer, |
859 |
// href |
860 |
sprintf( |
861 |
'../scr/tab.php?obj=%s', |
862 |
$obj_href_more_link |
863 |
), |
864 |
// titre |
865 |
_("Voir +") |
866 |
); |
867 |
|
868 |
} |
869 |
|
870 |
|
871 |
/** |
872 |
* Cette méthode permet de récupérer la configuration du widget 'Retours de |
873 |
* messages'. |
874 |
* |
875 |
* @return array |
876 |
*/ |
877 |
function get_config_messages_retours($arguments) { |
878 |
// Initialisation du tableau des paramètres avec ses valeur par défaut |
879 |
$arguments_default = array( |
880 |
"filtre" => "instructeur", |
881 |
); |
882 |
// Vérification des arguments |
883 |
foreach ($arguments_default as $key => $value) { |
884 |
// |
885 |
if (isset($arguments[$key])) { |
886 |
// |
887 |
$elem = trim($arguments[$key]); |
888 |
// |
889 |
if ($key === "filtre" |
890 |
&& in_array($elem, array("instructeur", "division", "aucun"))) { |
891 |
// La valeur doit être dans cette liste |
892 |
$arguments[$key] = $elem; |
893 |
continue; |
894 |
} |
895 |
} |
896 |
// |
897 |
$arguments[$key] = $value; |
898 |
} |
899 |
// |
900 |
$filtre = $arguments["filtre"]; |
901 |
|
902 |
/** |
903 |
* Construction de la requête |
904 |
*/ |
905 |
// FROM |
906 |
$query_ct_from = " |
907 |
".DB_PREFIXE."dossier_message |
908 |
LEFT JOIN ".DB_PREFIXE."dossier |
909 |
ON dossier_message.dossier=dossier.dossier |
910 |
INNER JOIN ".DB_PREFIXE."instructeur |
911 |
ON instructeur.instructeur=dossier.instructeur |
912 |
INNER JOIN ".DB_PREFIXE."om_utilisateur |
913 |
ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur |
914 |
LEFT JOIN ".DB_PREFIXE."division |
915 |
ON dossier.division=division.division |
916 |
LEFT JOIN ".DB_PREFIXE."om_collectivite |
917 |
ON dossier.om_collectivite=om_collectivite.om_collectivite"; |
918 |
// WHERE - COMMON |
919 |
$query_ct_where_common = " |
920 |
dossier_message.lu IS FALSE |
921 |
"; |
922 |
// WHERE - USER |
923 |
// Filtre sur les dossiers qui concernent l'utilisateur |
924 |
$query_ct_where_user_filter = ""; |
925 |
// |
926 |
if ($filtre == "instructeur") { |
927 |
// |
928 |
$query_ct_where_user_filter .= " |
929 |
AND om_utilisateur.login='".$_SESSION['login']."' |
930 |
"; |
931 |
} elseif ($filtre == "division") { |
932 |
// |
933 |
$query_ct_where_user_filter .= " |
934 |
AND dossier.division = ".$_SESSION['division']." |
935 |
"; |
936 |
} |
937 |
// Dans tous les cas si l'utilisateur fait partie d'une collectivité |
938 |
// de niveau 1 (mono), on restreint le listing sur les dossiers de sa |
939 |
// collectivité |
940 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
941 |
$query_ct_where_user_filter .= " |
942 |
AND dossier.om_collectivite=".$_SESSION['collectivite']." |
943 |
"; |
944 |
} |
945 |
|
946 |
/** |
947 |
* Message d'aide |
948 |
*/ |
949 |
// |
950 |
$message_filtre = ""; |
951 |
// |
952 |
switch ($filtre) { |
953 |
case "instructeur": |
954 |
$message_filtre = " "._("dont je suis l'instructeur"); |
955 |
break; |
956 |
case "division": |
957 |
$message_filtre = " "._("situés dans ma division"); |
958 |
break; |
959 |
case "aucun": |
960 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
961 |
$message_filtre = " "._("situés dans ma collectivité"); |
962 |
} else { |
963 |
$message_filtre = " "._("situés dans toutes les collectivités"); |
964 |
} |
965 |
break; |
966 |
} |
967 |
// |
968 |
$message_help = sprintf( |
969 |
_("Les messages marqués comme 'non lu' qui concernent des ". |
970 |
"dossiers d'instruction%s."), |
971 |
$message_filtre |
972 |
); |
973 |
|
974 |
/** |
975 |
* Return |
976 |
*/ |
977 |
// |
978 |
return array( |
979 |
"arguments" => $arguments, |
980 |
"message_help" => $message_help, |
981 |
"query_ct_from" => $query_ct_from, |
982 |
"query_ct_where_common" => $query_ct_where_common, |
983 |
"query_ct_where_user_filter" => $query_ct_where_user_filter, |
984 |
); |
985 |
} |
986 |
|
987 |
/** |
988 |
* WIDGET DASHBOARD - Retours de consultation |
989 |
* |
990 |
* @return void |
991 |
*/ |
992 |
function view_widget_consultation_retours($content = null) { |
993 |
|
994 |
/** |
995 |
* Ce widget est configurable via l'interface Web. Lors de la création |
996 |
* du widget dans le paramétrage il est possible de spécifier la ou les |
997 |
* options suivantes : |
998 |
* |
999 |
* - filtre : |
1000 |
* = instructeur |
1001 |
* = division |
1002 |
* = aucun |
1003 |
* (default) Par défaut les dossiers sont filtrés sur l'instructeur. |
1004 |
*/ |
1005 |
// Liste des paramètres |
1006 |
$params = array("filtre", ); |
1007 |
// Formatage des arguments reçus en paramètres |
1008 |
$arguments = $this->get_arguments($content, $params); |
1009 |
// Récupération de la configuration du widget |
1010 |
$conf = $this->get_config_consultation_retours($arguments); |
1011 |
// |
1012 |
$filtre = $conf["arguments"]["filtre"]; |
1013 |
|
1014 |
/** |
1015 |
* Composition de la requête |
1016 |
*/ |
1017 |
// |
1018 |
$query = sprintf( |
1019 |
"SELECT |
1020 |
count(*) |
1021 |
FROM |
1022 |
%s |
1023 |
WHERE |
1024 |
%s |
1025 |
%s", |
1026 |
$conf["query_ct_from"], |
1027 |
$conf["query_ct_where_common"], |
1028 |
$conf["query_ct_where_user_filter"] |
1029 |
); |
1030 |
|
1031 |
/** |
1032 |
* Exécution de la requête |
1033 |
*/ |
1034 |
// |
1035 |
$res = $this->f->db->getone($query); |
1036 |
$this->addToLog(__METHOD__."(): db->getone(\"".$query."\");", VERBOSE_MODE); |
1037 |
$this->f->isDatabaseError($res); |
1038 |
|
1039 |
// Affichage du message d'informations |
1040 |
printf( |
1041 |
$this->template_help, |
1042 |
$conf["message_help"] |
1043 |
); |
1044 |
|
1045 |
// |
1046 |
if (intval($res) === 0) { |
1047 |
// |
1048 |
echo _("Aucun retour de consultation non lu."); |
1049 |
return; |
1050 |
} |
1051 |
|
1052 |
|
1053 |
/** |
1054 |
* |
1055 |
*/ |
1056 |
$template_panel = ' |
1057 |
<div class="panel panel-box"> |
1058 |
<div class="list-justified-container"> |
1059 |
<ul class="list-justified text-center"> |
1060 |
%s |
1061 |
</ul> |
1062 |
</div> |
1063 |
</div>'; |
1064 |
/** |
1065 |
* |
1066 |
*/ |
1067 |
// |
1068 |
$panel = ""; |
1069 |
// |
1070 |
$template_elem = ' |
1071 |
<li> |
1072 |
<span class="size-h3 box-icon rounded %s">%s</span> |
1073 |
<p class="text-muted">%s %s</p> |
1074 |
</li> |
1075 |
'; |
1076 |
$panel_elem = sprintf( |
1077 |
$template_elem, |
1078 |
"bg-info", |
1079 |
intval($res), |
1080 |
_("Non lu"), |
1081 |
"" |
1082 |
); |
1083 |
// |
1084 |
$panel .= sprintf( |
1085 |
$template_panel, |
1086 |
$panel_elem |
1087 |
); |
1088 |
echo $panel; |
1089 |
|
1090 |
/** |
1091 |
* |
1092 |
*/ |
1093 |
if ($filtre === "aucun") { |
1094 |
$obj_href_more_link = "consultation_tous_retours"; |
1095 |
} elseif ($filtre === "division") { |
1096 |
$obj_href_more_link = "consultation_retours_ma_division"; |
1097 |
} else { |
1098 |
$obj_href_more_link = "consultation_mes_retours"; |
1099 |
} |
1100 |
|
1101 |
// |
1102 |
if (!$this->f->isAccredited(array($obj_href_more_link, $obj_href_more_link."_tab"), "OR")) { |
1103 |
return; |
1104 |
} |
1105 |
// Affichage du footer |
1106 |
printf( |
1107 |
$this->template_footer, |
1108 |
// href |
1109 |
sprintf( |
1110 |
'../scr/tab.php?obj=%s', |
1111 |
$obj_href_more_link |
1112 |
), |
1113 |
// titre |
1114 |
_("Voir +") |
1115 |
); |
1116 |
|
1117 |
} |
1118 |
|
1119 |
|
1120 |
/** |
1121 |
* Cette méthode permet de récupérer la configuration du widget 'Retours de |
1122 |
* consultation'. |
1123 |
* |
1124 |
* @return array |
1125 |
*/ |
1126 |
function get_config_consultation_retours($arguments) { |
1127 |
// Initialisation du tableau des paramètres avec ses valeur par défaut |
1128 |
$arguments_default = array( |
1129 |
"filtre" => "instructeur", |
1130 |
); |
1131 |
// Vérification des arguments |
1132 |
foreach ($arguments_default as $key => $value) { |
1133 |
// |
1134 |
if (isset($arguments[$key])) { |
1135 |
// |
1136 |
$elem = trim($arguments[$key]); |
1137 |
// |
1138 |
if ($key === "filtre" |
1139 |
&& in_array($elem, array("instructeur", "division", "aucun"))) { |
1140 |
// La valeur doit être dans cette liste |
1141 |
$arguments[$key] = $elem; |
1142 |
continue; |
1143 |
} |
1144 |
} |
1145 |
// |
1146 |
$arguments[$key] = $value; |
1147 |
} |
1148 |
// |
1149 |
$filtre = $arguments["filtre"]; |
1150 |
|
1151 |
/** |
1152 |
* Construction de la requête |
1153 |
*/ |
1154 |
// FROM |
1155 |
$query_ct_from = " |
1156 |
".DB_PREFIXE."consultation |
1157 |
LEFT JOIN ".DB_PREFIXE."avis_consultation |
1158 |
ON consultation.avis_consultation=avis_consultation.avis_consultation |
1159 |
LEFT JOIN ".DB_PREFIXE."dossier |
1160 |
ON consultation.dossier=dossier.dossier |
1161 |
LEFT JOIN ".DB_PREFIXE."service |
1162 |
ON consultation.service=service.service |
1163 |
INNER JOIN ".DB_PREFIXE."instructeur |
1164 |
ON instructeur.instructeur=dossier.instructeur |
1165 |
INNER JOIN ".DB_PREFIXE."om_utilisateur |
1166 |
ON instructeur.om_utilisateur = om_utilisateur.om_utilisateur |
1167 |
LEFT JOIN ".DB_PREFIXE."division |
1168 |
ON dossier.division=division.division |
1169 |
LEFT JOIN ".DB_PREFIXE."om_collectivite |
1170 |
ON dossier.om_collectivite=om_collectivite.om_collectivite"; |
1171 |
// WHERE - COMMON |
1172 |
$query_ct_where_common = " |
1173 |
consultation.lu IS FALSE |
1174 |
"; |
1175 |
// WHERE - USER |
1176 |
// Filtre sur les dossiers qui concernent l'utilisateur |
1177 |
$query_ct_where_user_filter = ""; |
1178 |
// |
1179 |
if ($filtre == "instructeur") { |
1180 |
// |
1181 |
$query_ct_where_user_filter .= " |
1182 |
AND om_utilisateur.login='".$_SESSION['login']."' |
1183 |
"; |
1184 |
} elseif ($filtre == "division") { |
1185 |
// |
1186 |
$query_ct_where_user_filter .= " |
1187 |
AND dossier.division = ".$_SESSION['division']." |
1188 |
"; |
1189 |
} |
1190 |
// Dans tous les cas si l'utilisateur fait partie d'une collectivité |
1191 |
// de niveau 1 (mono), on restreint le listing sur les dossiers de sa |
1192 |
// collectivité |
1193 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
1194 |
$query_ct_where_user_filter .= " |
1195 |
AND dossier.om_collectivite=".$_SESSION['collectivite']." |
1196 |
"; |
1197 |
} |
1198 |
|
1199 |
/** |
1200 |
* Message d'aide |
1201 |
*/ |
1202 |
// |
1203 |
$message_filtre = ""; |
1204 |
// |
1205 |
switch ($filtre) { |
1206 |
case "instructeur": |
1207 |
$message_filtre = " "._("dont je suis l'instructeur"); |
1208 |
break; |
1209 |
case "division": |
1210 |
$message_filtre = " "._("situés dans ma division"); |
1211 |
break; |
1212 |
case "aucun": |
1213 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
1214 |
$message_filtre = " "._("situés dans ma collectivité"); |
1215 |
} else { |
1216 |
$message_filtre = " "._("situés dans toutes les collectivités"); |
1217 |
} |
1218 |
break; |
1219 |
} |
1220 |
// |
1221 |
$message_help = sprintf( |
1222 |
_("Les consultations marquées comme 'non lu' qui concernent des ". |
1223 |
"dossiers d'instruction%s."), |
1224 |
$message_filtre |
1225 |
); |
1226 |
|
1227 |
/** |
1228 |
* Return |
1229 |
*/ |
1230 |
// |
1231 |
return array( |
1232 |
"arguments" => $arguments, |
1233 |
"message_help" => $message_help, |
1234 |
"query_ct_from" => $query_ct_from, |
1235 |
"query_ct_where_common" => $query_ct_where_common, |
1236 |
"query_ct_where_user_filter" => $query_ct_where_user_filter, |
1237 |
); |
1238 |
} |
1239 |
|
1240 |
|
1241 |
/** |
1242 |
* WIDGET DASHBOARD - Dossiers en incomplet ou majoration sans retour RAR |
1243 |
* |
1244 |
* @return void |
1245 |
*/ |
1246 |
function view_widget_dossiers_evenement_incomplet_majoration($content = null) { |
1247 |
|
1248 |
/** |
1249 |
* Ce widget est configurable via l'interface Web. Lors de la création |
1250 |
* du widget dans le paramétrage il est possible de spécifier la ou les |
1251 |
* options suivantes : |
1252 |
* |
1253 |
* - filtre : |
1254 |
* = instructeur |
1255 |
* = division |
1256 |
* = aucun |
1257 |
* (default) Par défaut les dossiers sont filtrés sur l'instructeur. |
1258 |
*/ |
1259 |
// Liste des paramètres |
1260 |
$params = array("filtre", ); |
1261 |
// Formatage des arguments reçus en paramètres |
1262 |
$arguments = $this->get_arguments($content, $params); |
1263 |
// Récupération de la configuration du widget |
1264 |
$conf = $this->get_config_dossiers_evenement_incomplet_majoration($arguments); |
1265 |
// |
1266 |
$filtre = $conf["arguments"]["filtre"]; |
1267 |
|
1268 |
/** |
1269 |
* Composition de la requête |
1270 |
*/ |
1271 |
// |
1272 |
$query = sprintf(" |
1273 |
SELECT |
1274 |
%s |
1275 |
FROM |
1276 |
%s |
1277 |
WHERE |
1278 |
%s |
1279 |
%s |
1280 |
ORDER BY |
1281 |
%s |
1282 |
LIMIT 10", |
1283 |
$conf["query_ct_select"], |
1284 |
$conf["query_ct_from"], |
1285 |
$conf["query_ct_where_common"], |
1286 |
$conf["query_ct_where_user_filter"], |
1287 |
$conf["query_ct_orderby"] |
1288 |
); |
1289 |
|
1290 |
// Exécution de la requête |
1291 |
$res = $this->f->db->query($query); |
1292 |
$this->addToLog(__METHOD__."(): db->query(\"".$query."\");", VERBOSE_MODE); |
1293 |
$this->f->isDatabaseError($res); |
1294 |
|
1295 |
// Affichage du message d'informations |
1296 |
printf( |
1297 |
$this->template_help, |
1298 |
$conf["message_help"] |
1299 |
); |
1300 |
|
1301 |
/** |
1302 |
* Si il n'y a aucun dossier à afficher, alors on affiche un message |
1303 |
* clair à l'utilisateur et on sort de la vue. |
1304 |
*/ |
1305 |
// Si il n'y a aucun dossier à afficher |
1306 |
if ($res->numrows() == 0) { |
1307 |
// Affichage du message d'informations |
1308 |
echo _("Vous n'avez pas de dossiers avec un evenement incomplet ou majoration sans RAR pour le moment."); |
1309 |
// Exit |
1310 |
return; |
1311 |
} |
1312 |
|
1313 |
/** |
1314 |
* Template nécessaires à l'affichage du widget |
1315 |
*/ |
1316 |
// Lien vers le dossier d'instructions |
1317 |
|
1318 |
// Bouton consulter |
1319 |
$template_btn_consulter = ' |
1320 |
<span class="om-icon om-icon-16 om-icon-fix consult-16" title="'._('Consulter').'">' |
1321 |
._('Consulter') |
1322 |
.'</span> |
1323 |
'; |
1324 |
|
1325 |
$template_table = ' |
1326 |
<table class="tab-tab"> |
1327 |
<thead> |
1328 |
<tr class="ui-tabs-nav ui-accordion ui-state-default tab-title"> |
1329 |
<th class="title col-0 firstcol"> |
1330 |
<span class="name"> |
1331 |
%s |
1332 |
</span> |
1333 |
</th> |
1334 |
<th class="title col-1"> |
1335 |
<span class="name"> |
1336 |
%s |
1337 |
</span> |
1338 |
</th> |
1339 |
<th class="title col-2 lastcol"> |
1340 |
<span class="name"> |
1341 |
%s |
1342 |
</span> |
1343 |
</th> |
1344 |
</tr> |
1345 |
</thead> |
1346 |
<tbody> |
1347 |
%s |
1348 |
</tbody> |
1349 |
</table> |
1350 |
'; |
1351 |
|
1352 |
// Données dans le tableau |
1353 |
// |
1354 |
$template_line = ' |
1355 |
<tr class="tab-data odd"> |
1356 |
<td class="col-1 firstcol"> |
1357 |
%s |
1358 |
</td> |
1359 |
<td class="col-1"> |
1360 |
%s |
1361 |
</td> |
1362 |
<td class="col-2 lastcol"> |
1363 |
%s |
1364 |
</td> |
1365 |
</tr> |
1366 |
'; |
1367 |
// |
1368 |
$template_href = '../scr/form.php?obj=dossier_instruction&action=3&idx=%s'; |
1369 |
// |
1370 |
$template_link = ' |
1371 |
<a class="lienTable" href="%s"> |
1372 |
%s |
1373 |
</a> |
1374 |
'; |
1375 |
|
1376 |
/** |
1377 |
* Si il y a des dossiers à afficher, alors on affiche le widget. |
1378 |
*/ |
1379 |
// On construit le contenu du tableau |
1380 |
$ct_tbody = ''; |
1381 |
while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) { |
1382 |
// On construit l'attribut href du lien |
1383 |
$ct_href = sprintf( |
1384 |
$template_href, |
1385 |
// idx |
1386 |
$row["dossier"] |
1387 |
); |
1388 |
// On construit la ligne |
1389 |
$ct_tbody .= sprintf( |
1390 |
$template_line, |
1391 |
// Colonne 1 - Bouton consulter |
1392 |
sprintf( |
1393 |
$template_link, |
1394 |
$ct_href, |
1395 |
$template_btn_consulter |
1396 |
), |
1397 |
// Colonne 2 - Numéro de dossier |
1398 |
sprintf( |
1399 |
$template_link, |
1400 |
$ct_href, |
1401 |
$row["dossier_libelle"] |
1402 |
), |
1403 |
// Colonne 3 - Date de dépôt |
1404 |
sprintf( |
1405 |
$template_link, |
1406 |
$ct_href, |
1407 |
$this->f->formatDate($row["date_depot"]) |
1408 |
) |
1409 |
); |
1410 |
} |
1411 |
// Affichage du tableau listant les dossiers |
1412 |
printf( |
1413 |
$template_table, |
1414 |
// Colonne 1 - Bouton consulter |
1415 |
'', |
1416 |
// Colonne 2 - Numéro de dossier |
1417 |
_('dossier'), |
1418 |
// Colonne 3 - Date de dépôt du dossier |
1419 |
_('date_depot'), |
1420 |
// Contenu du tableau |
1421 |
$ct_tbody |
1422 |
); |
1423 |
|
1424 |
// Affichage du footer |
1425 |
printf( |
1426 |
$this->template_footer, |
1427 |
// href (avec les paramètres du widget) |
1428 |
sprintf( |
1429 |
"../scr/tab.php?obj=dossiers_evenement_incomplet_majoration&filtre=%s", |
1430 |
$filtre |
1431 |
), |
1432 |
// titre |
1433 |
_("Voir tous les dossiers evenement incomplet ou majoration sans RAR") |
1434 |
); |
1435 |
} |
1436 |
|
1437 |
|
1438 |
/** |
1439 |
* Cette méthode permet de récupérer la configuration du widget 'Retours de |
1440 |
* consultation'. |
1441 |
* |
1442 |
* @return array |
1443 |
*/ |
1444 |
function get_config_dossiers_evenement_incomplet_majoration($arguments) { |
1445 |
// Initialisation du tableau des paramètres avec ses valeur par défaut |
1446 |
$arguments_default = array( |
1447 |
"filtre" => "instructeur", |
1448 |
); |
1449 |
// Vérification des arguments |
1450 |
foreach ($arguments_default as $key => $value) { |
1451 |
// |
1452 |
if (isset($arguments[$key])) { |
1453 |
// |
1454 |
$elem = trim($arguments[$key]); |
1455 |
// |
1456 |
if ($key === "filtre" |
1457 |
&& in_array($elem, array("instructeur", "division", "aucun"))) { |
1458 |
// La valeur doit être dans cette liste |
1459 |
$arguments[$key] = $elem; |
1460 |
continue; |
1461 |
} |
1462 |
} |
1463 |
// |
1464 |
$arguments[$key] = $value; |
1465 |
} |
1466 |
// |
1467 |
$filtre = $arguments["filtre"]; |
1468 |
|
1469 |
/** |
1470 |
* Construction de la requête |
1471 |
*/ |
1472 |
// SELECT |
1473 |
$query_ct_select = " |
1474 |
dossier.dossier, |
1475 |
dossier.dossier_libelle, |
1476 |
dossier.date_depot |
1477 |
"; |
1478 |
// SELECT - CHAMPAFFICHE |
1479 |
$query_ct_select_champaffiche = array( |
1480 |
'dossier.dossier as "'._("dossier").'"', |
1481 |
'dossier.dossier_libelle as "'._("dossier").'"', |
1482 |
'to_char(dossier.date_depot ,\'DD/MM/YYYY\') as "'._("date_depot").'"' |
1483 |
); |
1484 |
// FROM |
1485 |
$query_ct_from = " |
1486 |
".DB_PREFIXE."dossier |
1487 |
LEFT JOIN |
1488 |
".DB_PREFIXE."instruction |
1489 |
ON |
1490 |
dossier.dossier = instruction.dossier |
1491 |
LEFT JOIN |
1492 |
".DB_PREFIXE."evenement |
1493 |
ON |
1494 |
instruction.evenement = evenement.evenement |
1495 |
LEFT JOIN |
1496 |
".DB_PREFIXE."instructeur |
1497 |
ON |
1498 |
instructeur.instructeur = dossier.instructeur |
1499 |
LEFT JOIN |
1500 |
".DB_PREFIXE."om_utilisateur |
1501 |
ON |
1502 |
instructeur.om_utilisateur=om_utilisateur.om_utilisateur |
1503 |
"; |
1504 |
// WHERE - COMMON |
1505 |
$query_ct_where_common = " |
1506 |
( |
1507 |
LOWER(evenement.type) = 'incompletude' OR |
1508 |
LOWER(evenement.type) = 'majoration_delai' |
1509 |
) AND |
1510 |
( |
1511 |
instruction.date_envoi_rar > CURRENT_TIMESTAMP - interval '1 month' AND |
1512 |
instruction.date_envoi_rar <= CURRENT_TIMESTAMP |
1513 |
) AND |
1514 |
instruction.date_retour_rar IS NULL AND |
1515 |
evenement.retour = 'f' |
1516 |
"; |
1517 |
|
1518 |
// WHERE - USER |
1519 |
// Filtre sur les dossiers qui concernent l'utilisateur |
1520 |
$query_ct_where_user_filter = ""; |
1521 |
// |
1522 |
if ($filtre == "instructeur") { |
1523 |
// |
1524 |
$query_ct_where_user_filter .= " |
1525 |
AND om_utilisateur.login='".$_SESSION['login']."' |
1526 |
"; |
1527 |
} elseif ($filtre == "division") { |
1528 |
// |
1529 |
$query_ct_where_user_filter .= " |
1530 |
AND dossier.division = ".$_SESSION['division']." |
1531 |
"; |
1532 |
} elseif ($filtre == "aucun") { |
1533 |
// Dans tous les cas si l'utilisateur fait partie d'une collectivité |
1534 |
// de niveau 1 (mono), on restreint le listing sur les dossiers de sa |
1535 |
// collectivité |
1536 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
1537 |
$query_ct_where_user_filter = " |
1538 |
AND dossier.om_collectivite=".$_SESSION['collectivite']." |
1539 |
"; |
1540 |
} |
1541 |
} |
1542 |
// ORDER BY |
1543 |
$query_ct_orderby = " |
1544 |
dossier.date_depot desc |
1545 |
"; |
1546 |
|
1547 |
/** |
1548 |
* Message d'aide |
1549 |
*/ |
1550 |
// |
1551 |
$message_filtre = ""; |
1552 |
// |
1553 |
switch ($filtre) { |
1554 |
case "instructeur": |
1555 |
$message_filtre = " "._("dont je suis l'instructeur"); |
1556 |
break; |
1557 |
case "division": |
1558 |
$message_filtre = " "._("situés dans ma division"); |
1559 |
break; |
1560 |
case "aucun": |
1561 |
if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) { |
1562 |
$message_filtre = " "._("situés dans ma collectivité"); |
1563 |
} else { |
1564 |
$message_filtre = " "._("situés dans toutes les collectivités"); |
1565 |
} |
1566 |
break; |
1567 |
} |
1568 |
// |
1569 |
$message_help = sprintf( |
1570 |
_("Les dossiers d'instruction%s qui ont un evenement incomplet ou majoration". |
1571 |
" avec une date d'envoi RAR, mais pas de date de retour RAR."), |
1572 |
$message_filtre |
1573 |
); |
1574 |
|
1575 |
/** |
1576 |
* Return |
1577 |
*/ |
1578 |
// |
1579 |
return array( |
1580 |
"arguments" => $arguments, |
1581 |
"message_help" => $message_help, |
1582 |
"query_ct_select" => $query_ct_select, |
1583 |
"query_ct_select_champaffiche" => $query_ct_select_champaffiche, |
1584 |
"query_ct_from" => $query_ct_from, |
1585 |
"query_ct_where_common" => $query_ct_where_common, |
1586 |
"query_ct_where_user_filter" => $query_ct_where_user_filter, |
1587 |
"query_ct_orderby" => $query_ct_orderby, |
1588 |
); |
1589 |
} |
1590 |
|
1591 |
} |
1592 |
|
1593 |
?> |