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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18876 - (show annotations)
Tue Oct 8 08:41:06 2024 UTC (8 weeks, 1 day ago) by softime
File size: 520364 byte(s)
merge: fusion de la branche d'intégration 6.8.0-develop dans le trunk

1 <?php
2 /**
3 * DBFORM - 'instruction' - Surcharge gen.
4 *
5 * specific :
6 * - cle secondaire
7 * destruction autorisée que pour le dernier evenement
8 * [delete the last event ]
9 * - variable globale [global variables]
10 * var $retourformulaire;
11 * var $idxformulaire;
12 * - modification des données dans dossier trigger avant
13 * [modify dossier data with trigger function]
14 * - function mois_date : pour ajouter des mois a une date
15 * [add months (delay) and calculation final date]
16 * - voir script_lang.js : bible ...
17 *
18 * @package openfoncier
19 * @version SVN : $Id$
20 */
21
22 //
23 require_once "../gen/obj/instruction.class.php";
24 require_once "../obj/task.class.php";
25
26 //
27 class instruction extends instruction_gen {
28
29 // Champs contenant les UID des fichiers
30 var $abstract_type = array(
31 "om_fichier_instruction" => "file",
32 );
33
34 var $valEvenement;
35 var $restriction_valid = null;
36 // Tableau contenant une partie des métadonnées arrêtés
37 var $metadonneesArrete;
38
39 /**
40 * Instance de la classe dossier
41 *
42 * @var mixed
43 */
44 var $inst_dossier = null;
45
46 /**
47 * Instance de la classe instructeur
48 *
49 * @var mixed
50 */
51 var $inst_instructeur = null;
52
53 /**
54 * Instance de la classe om_utilisateur
55 *
56 * @var mixed
57 */
58 var $inst_om_utilisateur = null;
59
60 var $metadata = array(
61 "om_fichier_instruction" => array(
62 "dossier" => "getDossier",
63 "dossier_version" => "getDossierVersion",
64 "numDemandeAutor" => "getNumDemandeAutor",
65 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
66 "typeInstruction" => "getTypeInstruction",
67 "statutAutorisation" => "getStatutAutorisation",
68 "typeAutorisation" => "getTypeAutorisation",
69 "dateEvenementDocument" => "getDateEvenementDocument",
70 "groupeInstruction" => 'getGroupeInstruction',
71 "title" => 'getTitle',
72 'concerneERP' => 'get_concerne_erp',
73
74 'date_cloture_metier' => 'getDossierDateDecision',
75 'type' => 'getDocumentType',
76 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
77 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
78 'region' => 'getDossierRegion',
79 'departement' => 'getDossierDepartement',
80 'commune' => 'getDossierCommune',
81 'annee' => 'getDossierAnnee',
82 'division' => 'getDossierDivision',
83 'collectivite' => 'getDossierServiceOrCollectivite',
84 ),
85 "arrete" => array(
86 "numArrete" => "getNumArrete",
87 "ReglementaireArrete" => "getReglementaireArrete",
88 "NotificationArrete" => "getNotificationArrete",
89 "dateNotificationArrete" => "getDateNotificationArrete",
90 "controleLegalite" => "getControleLegalite",
91 "dateSignature" => "getDateSignature",
92 "nomSignataire" => "getNomSignataire",
93 "qualiteSignataire" => "getQualiteSignataire",
94 "ap_numRue" => "getAp_numRue",
95 "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
96 "ap_codePostal" => "getAp_codePostal",
97 "ap_ville" => "getAp_ville",
98 "activite" => "getActivite",
99 "dateControleLegalite" => "getDateControleLegalite",
100 )
101 );
102
103 /**
104 * Flag pour identifier la reprise de l'instruction d'un dossier.
105 * Le statut de l'état passe de "cloture" à "encours".
106 *
107 * @var boolean
108 */
109 var $di_reopened = null;
110
111 /**
112 * Méthode appelée par le module_manager lors de la récupération des modules de cet objet.
113 * Permet d'ajouer des modules en plus de ceux récupérer par défaut par le module_manager.
114 *
115 * @param bool $only_for_class Ne renvoie que les modules pour la classe de l'objet
116 *
117 * @return array Liste de modules supplémentaires pour cet objet
118 */
119 public function get_modules_append(bool $only_for_class = false) {
120 $modules = array();
121
122 // si on est sur un dossier d'instruction
123 if ($this->f->contexte_dossier_instruction()) {
124 $idx = $this->f->get_submitted_get_value('idxformulaire');
125
126 $object_id = $this->getVal($this->clePrimaire);
127
128 $evenements_ids = array();
129
130 // Dans le cas ou on a un identifiant de dossier et que
131 // l'objet courant n'a pas de cle primaire définie
132 // ou qu'on est dans le contexte d'une classe d'objet
133 if (! empty($idx) && (empty($object_id) || $only_for_class === true)) {
134
135 // Utilise la valeur evenement si elle est déterminé,
136 $evenement = $this->f->get_submitted_post_value('evenement');
137 if (! empty($evenement)) $evenements_ids = array($evenement);
138 if (empty($evenements_ids)){
139 // si on est dans le cadre de l'affichage d'une nouvelle instruction
140 $action = $this->f->get_submitted_get_value('action');
141
142 if ($action == '0') {
143
144 // ajoute les modules des évènements possible sur le dossier courant
145 $evenements_data = $this->get_var_sql_forminc__sql_evenement();
146 $evenements_ids = array_column($evenements_data, 'evenement');
147 }
148
149 // si on est dans le cadre d'un listing
150 else if (is_null($action) || $action === '') {
151
152 // récupère la liste des évènements d'instructions du dossier d'instruction
153 $sql = sprintf("
154 SELECT
155 evenement
156 FROM
157 ".DB_PREFIXE."instruction
158 WHERE
159 dossier = '%s'
160 ", $this->f->db->escapeSimple($idx));
161 $qres = $this->f->get_all_results_from_db_query(
162 $sql, array('origin' => __METHOD__));
163 if ($qres['code'] !== 'OK') {
164 $err_msg = "Failed to execute SQL: $sql. Detail: ".($qres['message'] ?? '');
165 $this->f->log(__METHOD__, $err_msg, 'ERROR');
166 throw new RuntimeException($err_msg);
167 }
168
169 // ajoute les modules des évènements des instructions du dossier courant
170 $evenements_ids = array_column($qres['result'], 'evenement');
171 }
172 }
173 }
174 if (!empty($evenements_ids)){
175 $this->f->log(__METHOD__, 'evenements: '.implode(',', $evenements_ids));
176 $modules = $this->f->module_manager->get_modules_for_object_name_and_ids(
177 'evenement', $evenements_ids, $this, false);
178 }
179 }
180 return $modules;
181 }
182
183 // {{{ Gestion de la confidentialité des données spécifiques
184
185 /**
186 * Définition des actions disponibles sur la classe.
187 *
188 * @return void
189 */
190 function init_class_actions() {
191
192 parent::init_class_actions();
193
194 // ACTION - 000 - ajouter
195 // Modifie la condition d'affichage du bouton ajouter
196 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
197
198 // ACTION - 001 - modifier
199 // Modifie la condition et le libellé du bouton modifier
200 $this->class_actions[1]["condition"] = array(
201 "is_editable",
202 "is_finalizable_without_bypass",
203 "can_user_access_dossier_contexte_modification",
204 "is_evenement_modifiable",
205 );
206 $this->class_actions[1]["portlet"]["libelle"] = __("Modifier");
207
208 // ACTION - 002 - supprimer
209 // Modifie la condition et le libellé du bouton supprimer
210 $this->class_actions[2]["condition"] = array(
211 "is_deletable",
212 "is_finalizable_without_bypass",
213 "can_user_access_dossier_contexte_modification",
214 "is_evenement_supprimable",
215 );
216 $this->class_actions[2]["portlet"]["libelle"] = __("Supprimer");
217
218 // ACTION - 003 - consulter
219 //
220 $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
221
222 // ACTION - 100 - finaliser
223 // Finalise l'enregistrement
224 $this->class_actions[100] = array(
225 "identifier" => "finaliser",
226 "portlet" => array(
227 "type" => "action-direct",
228 "libelle" => __("Finaliser le document"),
229 "order" => 110,
230 "class" => "finalise",
231 ),
232 "view" => "formulaire",
233 "method" => "finalize",
234 "button" => "finaliser",
235 "permission_suffix" => "finaliser",
236 "condition" => array(
237 "is_finalizable",
238 "is_finalizable_without_bypass",
239 "has_an_edition",
240 "can_user_access_dossier_contexte_modification",
241 ),
242 );
243
244 // ACTION - 110 - definaliser
245 // Finalise l'enregistrement
246 $this->class_actions[110] = array(
247 "identifier" => "definaliser",
248 "portlet" => array(
249 "type" => "action-direct",
250 "libelle" => __("Reprendre la redaction du document"),
251 "order" => 110,
252 "class" => "definalise",
253 ),
254 "view" => "formulaire",
255 "method" => "unfinalize",
256 "button" => "definaliser",
257 "permission_suffix" => "definaliser",
258 "condition" => array(
259 "is_unfinalizable",
260 "is_unfinalizable_without_bypass",
261 "can_user_access_dossier_contexte_modification",
262 "is_not_sent_for_signature",
263 "is_not_signed",
264 ),
265 );
266
267 // ACTION - 115 - Modification d'un document généré par une instruction
268 // Permet à un instructeur de modifier un document généré par une instruction
269 $this->class_actions[115] = array(
270 "identifier" => "modale_selection_document_signe",
271 "portlet" => array(
272 "type" => "action-self",
273 "libelle" => __("Remplacer par le document signé"),
274 "order" => 115,
275 "class" => "selection-document-signé",
276 ),
277 "view" => "view_modale_selection_document_signe",
278 "permission_suffix" => "selection_document_signe",
279 "condition" => array(
280 "is_finalized",
281 "is_not_date_retour_signature_set",
282 ),
283 );
284
285 // ACTION - 120 - edition
286 // Affiche l'édition
287 $this->class_actions[120] = array(
288 "identifier" => "edition",
289 "portlet" => array(
290 "type" => "action-blank",
291 "libelle" => __("Edition"),
292 "order" => 100,
293 "class" => "pdf-16",
294 ),
295 "view" => "view_edition",
296 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
297 "permission_suffix" => "om_fichier_instruction_telecharger",
298 );
299
300 // ACTION - 125 - modifier_suivi
301 // Suivi des dates
302 $this->class_actions[125] = array(
303 "identifier" => "modifier_suivi",
304 "portlet" => array(
305 "type" => "action-self",
306 "libelle" => __("Suivi des dates"),
307 "order" => 125,
308 "class" => "suivi-dates-16",
309 ),
310 "crud" => "update",
311 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
312 "permission_suffix" => "modification_dates",
313 );
314
315 // ACTION - 130 - bible
316 // Affiche la bible
317 $this->class_actions[130] = array(
318 "identifier" => "bible",
319 "view" => "view_bible",
320 "permission_suffix" => "modifier",
321 );
322
323 // ACTION - 140 - bible_auto
324 // Active la bible automatique
325 $this->class_actions[140] = array(
326 "identifier" => "bible_auto",
327 "view" => "view_bible_auto",
328 "permission_suffix" => "modifier",
329 );
330
331 // ACTION - 150 - suivi_bordereaux
332 // Imprimer un bordereau d'envoi
333 $this->class_actions[150] = array(
334 "identifier" => "suivi_bordereaux",
335 "view" => "view_suivi_bordereaux",
336 "permission_suffix" => "consulter",
337 );
338
339 // ACTION - 160 - suivi_envoi_lettre_rar
340 // Imprimer un bordereau d'envoi
341 $this->class_actions[160] = array(
342 "identifier" => "suivi_envoi_lettre_rar",
343 "view" => "view_suivi_envoi_lettre_rar",
344 "permission_suffix" => "consulter",
345 );
346
347 // ACTION - 170 - suivi_mise_a_jour_des_dates
348 // Mettre à jour les dates de l'instruction
349 $this->class_actions[170] = array(
350 "identifier" => "suivi_mise_a_jour_des_dates",
351 "view" => "view_suivi_mise_a_jour_des_dates",
352 "permission_suffix" => "consulter",
353 );
354
355 // ACTION - 175 - edit_by_notification_task
356 // Action à utiliser lors de la mise à jour des instructions par notification
357 $this->class_actions[175] = array(
358 "identifier" => "edit_by_notification_task",
359 "view" => "formulaire",
360 "permission_suffix" => "modifier",
361 "crud" => "update",
362 );
363
364 // ACTION - 176 - add_by_evenement_retour_after_notification_task
365 // Action à utiliser lors de l'ajout des instructions par événement suivant
366 // suite à une notification par tâche (donc notification dématerialisée)
367 $this->class_actions[176] = array(
368 "identifier" => "add_by_evenement_retour_after_notification_task",
369 "view" => "formulaire",
370 "permission_suffix" => "ajouter",
371 "crud" => "create",
372 );
373
374 // ACTION - 180 - pdf_lettre_rar
375 // Génère PDF sur bordereaux de lettres AR
376 $this->class_actions[180] = array(
377 "identifier" => "pdf_lettre_rar",
378 "view" => "view_pdf_lettre_rar",
379 "permission_suffix" => "consulter",
380 );
381
382 // ACTION - 190 - bordereau_envoi_maire
383 // Formulaire pour générer le bordereau d'envoi au maire
384 // Met à jour la date d'envoi à signature du maire
385 $this->class_actions[190] = array(
386 "identifier" => "bordereau_envoi_maire",
387 "view" => "view_bordereau_envoi_maire",
388 "permission_suffix" => "bordereau_envoi_maire",
389 );
390
391 // ACTION - 200 - generate_bordereau_envoi_maire
392 // Génère PDF bordereau d'envoi au maire
393 $this->class_actions[200] = array(
394 "identifier" => "generate_bordereau_envoi_maire",
395 "view" => "view_generate_bordereau_envoi_maire",
396 "permission_suffix" => "bordereau_envoi_maire",
397 );
398
399 // ACTION - 210 - notifier_commune
400 // Notifie la commune par mail d'un évément d'instruction finalisé
401 $this->class_actions[210] = array(
402 "identifier" => "notifier_commune",
403 "portlet" => array(
404 "type" => "action-direct-with-confirmation",
405 "libelle" => __("Notifier la commune par courriel"),
406 "order" => 210,
407 "class" => "notifier_commune-16",
408 ),
409 "view" => "formulaire",
410 "method" => "notifier_commune",
411 "permission_suffix" => "notifier_commune",
412 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
413 );
414
415 // ACTION - 220 - generate_suivi_bordereaux
416 // GénÚre PDF bordereaux
417 $this->class_actions[220] = array(
418 "identifier" => "generate_suivi_bordereaux",
419 "view" => "view_generate_suivi_bordereaux",
420 "permission_suffix" => "consulter",
421 );
422
423 // ACTION - 777 - pdf_temp
424 // Crée un PDF temporaire et affiche son contenu en base64
425 $this->class_actions[777] = array(
426 "identifier" => "pdf_temp",
427 "view" => "view_pdf_temp",
428 "permission_suffix" => "modifier",
429 "condition" => array("can_user_access_dossier_contexte_modification"),
430 );
431
432 // ACTION - 701
433 $this->class_actions[701] = array(
434 "identifier" => "enable-edition-integrale",
435 "portlet" => array(
436 "type" => "action-direct-with-confirmation",
437 "libelle" => __("Rédaction libre"),
438 "order" => 50,
439 "class" => "redac-libre-16",
440 ),
441 "view" => "formulaire",
442 "method" => "enable_edition_integrale",
443 "permission_suffix" => "modifier",
444 "condition" => array(
445 "is_editable",
446 "is_finalizable_without_bypass",
447 "can_user_access_dossier_contexte_modification",
448 "is_edition_integrale_not_enabled",
449 "is_option_redaction_libre_enabled",
450 "has_an_edition",
451 ),
452 );
453 // ACTION - 702
454 $this->class_actions[702] = array(
455 "identifier" => "disable-edition-integrale",
456 "portlet" => array(
457 "type" => "action-direct-with-confirmation",
458 "libelle" => __("Rédaction par compléments"),
459 "order" => 50,
460 "class" => "redac-complement-16",
461 ),
462 "view" => "formulaire",
463 "method" => "disable_edition_integrale",
464 "permission_suffix" => "modifier",
465 "condition" => array(
466 "is_editable",
467 "is_finalizable_without_bypass",
468 "can_user_access_dossier_contexte_modification",
469 "is_edition_integrale_enabled",
470 "is_option_redaction_libre_enabled",
471 "has_an_edition",
472 ),
473 );
474 // ACTION - 300 - evenement_has_an_edition_json
475 //
476 $this->class_actions[300] = array(
477 "identifier" => "evenement_has_an_edition_json",
478 "view" => "view_evenement_has_an_edition_json",
479 "permission_suffix" => "consulter",
480 );
481
482 // ACTION - 301 - evenement_has_a_commentaire
483 //
484 $this->class_actions[301] = array(
485 "identifier" => "evenement_has_a_commentaire_json",
486 "view" => "view_evenement_has_a_commentaire_json",
487 "permission_suffix" => "consulter",
488 );
489
490 // ACTION - 400 - Envoyer en signature
491 // Cet évenement permet d'envoyer le document au parapheur pour signature
492 $this->class_actions[400] = array(
493 "identifier" => "envoyer_a_signature",
494 "portlet" => array(
495 "libelle" => __("Envoyer à signature"),
496 "type" => "action-direct-with-confirmation",
497 "class" => "envoyer_a_signature-16",
498 ),
499 "view" => "formulaire",
500 "method" => "envoyer_a_signature_sans_relecture",
501 "condition" => array(
502 "can_be_signed",
503 ),
504 "permission_suffix" => "envoyer_a_signature",
505 );
506
507 // ACTION - 402 - Envoyer en signature avec relecture
508 // Cet évenement permet d'envoyer le document au parapheur pour signature
509 $this->class_actions[402] = array(
510 "identifier" => "envoyer_a_signature_relecture",
511 "portlet" => array(
512 "libelle" => __("Envoyer à signature avec relecture"),
513 "type" => "action-direct-with-confirmation",
514 "class" => "envoyer_a_signature-16",
515 ),
516 "view" => "formulaire",
517 "method" => "envoyer_a_signature_avec_relecture",
518 "condition" => array(
519 "can_be_signed",
520 "is_parapheur_relecture_parameter_enabled"
521 ),
522 "permission_suffix" => "envoyer_a_signature",
523 );
524
525 // ACTION - 404 - Annuler l'envoi en signature
526 // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
527 $this->class_actions[404] = array(
528 "identifier" => "annuler_envoi_signature",
529 "portlet" => array(
530 "libelle" => __("Annuler l'envoi en signature"),
531 "type" => "action-direct-with-confirmation",
532 "class" => "annuler_envoi_signature-16",
533 ),
534 "view" => "formulaire",
535 "method" => "annuler_envoi_en_signature",
536 "condition" => array(
537 "is_sent_for_signature",
538 "is_parapheur_annulation_parameter_enabled"
539 ),
540 "permission_suffix" => "envoyer_a_signature",
541 );
542
543 //
544 $this->class_actions[401] = array(
545 "identifier" => "preview_edition",
546 "view" => "formulaire",
547 "permission_suffix" => "tab",
548 );
549
550 //
551 $this->class_actions[405] = array(
552 "identifier" => "telecharger_editions",
553 "view" => "view_telecharger_editions",
554 "permission_suffix" => "om_fichier_instruction_telecharger",
555 );
556
557 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
558 $this->class_actions[410] = array(
559 "identifier" => "overlay_notification_manuelle",
560 "portlet" => array(
561 "libelle" => __("Notifier les pétitionnaires"),
562 "type" => "action-self",
563 "class" => "notifier_commune-16",
564 ),
565 "condition" => array(
566 "is_notifiable_by_task_manual",
567 "is_not_portail_notification_sans_annexe"
568 ),
569 "view" => "view_overlay_notification_manuelle",
570 "permission_suffix" => "modifier",
571 );
572
573 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
574 $this->class_actions[411] = array(
575 "identifier" => "notification_manuelle_portal",
576 "portlet" => array(
577 "libelle" => __("Notifier les pétitionnaires"),
578 "type" => "action-direct-with-confirmation",
579 "class" => "notifier_commune-16",
580 ),
581 "condition" => array(
582 "is_notifiable_by_task_manual",
583 "is_portail_notification_sans_annexe"
584 ),
585 "method" => "notifier_demandeur_principal_via_portal",
586 "permission_suffix" => "modifier",
587 );
588
589 // ACTION - 412 - Vérifie le dépassement de la date limite de notification
590 $this->class_actions[412] = array(
591 "identifier" => "is_date_limite_notification_dossier_depasse",
592 "view" => "is_date_limite_notification_dossier_depasse",
593 "permission_suffix" => "modifier",
594 );
595
596 // ACTION - 420 - Notifier les services consultés (mail)
597 $this->class_actions[420] = array(
598 "identifier" => "overlay_notification_service_consulte",
599 "portlet" => array(
600 "libelle" => __("Notifier les services consultés"),
601 "type" => "action-self",
602 "class" => "notifier_commune-16",
603 ),
604 "condition" => array(
605 "is_service_notifiable"
606 ),
607 "view" => "view_overlay_notification_service_consulte",
608 "permission_suffix" => "tab",
609 );
610
611 // ACTION - 430 - Notifier les tiers consultés (mail)
612 $this->class_actions[430] = array(
613 "identifier" => "overlay_notification_tiers_consulte",
614 "portlet" => array(
615 "libelle" => __("Notifier les tiers consultés"),
616 "type" => "action-self",
617 "class" => "notifier_commune-16",
618 ),
619 "condition" => array(
620 "is_tiers_notifiable"
621 ),
622 "view" => "view_overlay_notification_tiers_consulte",
623 "permission_suffix" => "tab",
624 );
625
626 //
627 $this->class_actions[403] = array(
628 "identifier" => "envoyer_au_controle_de_legalite",
629 "portlet" => array(
630 "libelle" => __("Envoyer au contrôle de légalité"),
631 "type" => "action-direct-with-confirmation",
632 "class" => "envoyer_au_controle_de_legalite-16",
633 ),
634 "view" => "formulaire",
635 "method" => "envoyer_au_controle_de_legalite",
636 "condition" => array(
637 "can_be_sent_to_cl"
638 ),
639 "permission_suffix" => "envoyer_au_controle_de_legalite",
640 );
641
642 //
643 $this->class_actions[998] = array(
644 "identifier" => "json_data",
645 "view" => "view_json_data",
646 "permission_suffix" => "consulter",
647 );
648 }
649
650 /**
651 * Clause select pour la requête de sélection des données de l'enregistrement.
652 *
653 * @return array
654 */
655 function get_var_sql_forminc__champs() {
656 return array(
657 "instruction",
658 "destinataire",
659 "instruction.evenement",
660 "instruction.commentaire",
661 "date_evenement",
662 "document_type_instruction",
663 "fichier_instruction_name",
664 "instruction.lettretype",
665 "signataire_arrete",
666 "flag_edition_integrale",
667 "om_final_instruction_utilisateur",
668 "date_finalisation_courrier",
669 "date_envoi_signature",
670 "date_retour_signature",
671 "date_envoi_rar",
672
673 "date_retour_rar",
674 "date_envoi_controle_legalite",
675 "date_retour_controle_legalite",
676
677 "numero_arrete",
678
679 "complement_om_html",
680 "'' as bible_auto",
681 "'' as bible",
682 "complement2_om_html",
683 "'' as bible2",
684 "complement3_om_html",
685 "'' as bible3",
686 "complement4_om_html",
687 "'' as bible4",
688
689 "titre_om_htmletat",
690 "corps_om_htmletatex",
691
692 "'' as btn_preview",
693 "'' as btn_redaction",
694
695 "'' as btn_refresh",
696 "'' as live_preview",
697
698 "dossier",
699 "instruction.action",
700 "instruction.delai",
701 "instruction.etat",
702 "instruction.autorite_competente",
703 "instruction.accord_tacite",
704 "instruction.delai_notification",
705 "instruction.avis_decision",
706 "archive_delai",
707 "archive_accord_tacite",
708 "archive_etat",
709 "archive_avis",
710 "archive_date_complet",
711 "archive_date_rejet",
712 "archive_date_limite",
713 "archive_date_notification_delai",
714 "archive_date_decision",
715 "archive_date_validite",
716 "archive_date_achevement",
717 "archive_date_conformite",
718 "archive_date_chantier",
719 "archive_date_dernier_depot",
720 "date_depot",
721 "date_depot_mairie",
722 "complement5_om_html",
723 "'' as bible5",
724 "complement6_om_html",
725 "'' as bible6",
726 "complement7_om_html",
727 "'' as bible7",
728 "complement8_om_html",
729 "'' as bible8",
730 "complement9_om_html",
731 "'' as bible9",
732 "complement10_om_html",
733 "'' as bible10",
734 "complement11_om_html",
735 "'' as bible11",
736 "complement12_om_html",
737 "complement13_om_html",
738 "complement14_om_html",
739 "complement15_om_html",
740 "archive_incompletude",
741 "archive_incomplet_notifie",
742 "archive_evenement_suivant_tacite",
743 "archive_evenement_suivant_tacite_incompletude",
744 "archive_etat_pendant_incompletude",
745 "archive_date_limite_incompletude",
746 "archive_delai_incompletude",
747 "archive_autorite_competente",
748 "code_barres",
749 "om_fichier_instruction",
750 "om_final_instruction",
751 "om_fichier_instruction_dossier_final",
752 "document_numerise",
753 "duree_validite_parametrage",
754 "duree_validite",
755 "created_by_commune",
756 "archive_date_cloture_instruction",
757 "archive_date_premiere_visite",
758 "archive_date_derniere_visite",
759 "archive_date_contradictoire",
760 "archive_date_retour_contradictoire",
761 "archive_date_ait",
762 "archive_date_transmission_parquet",
763 "archive_dossier_instruction_type",
764 "archive_date_affichage",
765 "pec_metier",
766 "archive_pec_metier",
767 "archive_a_qualifier",
768 "id_parapheur_signature",
769 "statut_signature",
770 "commentaire_signature",
771 "historique_signature",
772 "'' as suivi_notification",
773 "'' as suivi_notification_service",
774 "'' as suivi_notification_tiers",
775 "'' as suivi_notification_commune",
776
777 "'' as preview_edition",
778 "envoye_cl_platau",
779 "'' as log_instruction",
780 "parapheur_lien_page_signature"
781 );
782 }
783
784 /**
785 * CONDITION - is_edition_integrale_enabled
786 *
787 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
788 *
789 * @return boolean
790 */
791 function is_edition_integrale_enabled() {
792 if ($this->getVal("flag_edition_integrale") == 't') {
793 return true;
794 }
795 return false;
796 }
797
798 /**
799 * CONDITION - is_edition_integrale_not_enabled
800 *
801 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
802 *
803 * @return boolean
804 */
805 function is_edition_integrale_not_enabled() {
806 return !$this->is_edition_integrale_enabled();
807 }
808
809 /**
810 * CONDITION - is_option_redaction_libre_enabled
811 *
812 * Vérifie que l'option de rédaction libre est activée.
813 *
814 * @return boolean
815 */
816 function is_option_redaction_libre_enabled() {
817 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
818 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
819 }
820
821 /**
822 * CONDITION - is_option_parapheur_relecture_enabled
823 *
824 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
825 *
826 * @return boolean
827 */
828 function is_parapheur_relecture_parameter_enabled() {
829 //Instanciation de la classe electronicsignature
830 $inst_es = $this->get_electronicsignature_instance();
831 if ($inst_es === false) {
832 return false;
833 }
834
835 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
836 return false;
837 }
838
839 return true;
840 }
841
842 /**
843 * CONDITION - is_parapheur_annulation_parameter_enabled
844 *
845 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
846 *
847 * @return boolean
848 */
849 function is_parapheur_annulation_parameter_enabled() {
850 //Instanciation de la classe electronicsignature
851 $inst_es = $this->get_electronicsignature_instance();
852 if ($inst_es === false) {
853 return false;
854 }
855
856 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
857 return false;
858 }
859
860 return true;
861 }
862
863
864 /**
865 * CONDITION - is_sent_for_signature
866 *
867 * Vérifie que l'instruction a été envoyé à signature
868 *
869 * @return boolean
870 */
871 function is_sent_for_signature() {
872 // Si un parapheur a été configuré
873 // et que le champ id_parapheur_signature n'est pas vide
874 // que le status est différent de "canceled" ou "expired"
875 // alors l'évènement a été envoyé en signature
876 if ($this->has_connector_electronicsignature() === true
877 && empty($this->getVal("id_parapheur_signature")) === false
878 && ($this->getVal("statut_signature") != "canceled"
879 && $this->getVal("statut_signature") != "expired"
880 && $this->getVal("statut_signature") != "finished")) {
881 //
882 return true;
883 }
884
885 return false;
886 }
887
888 /**
889 * CONDITION - is_not_sent_for_signature
890 *
891 * Vérifie que l'instruction n'a pas été envoyé à signature
892 *
893 * @return boolean
894 */
895 function is_not_sent_for_signature() {
896 // Contrôle si l'utilisateur possède un bypass
897 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
898 if ($bypass == true) {
899 return true;
900 }
901
902 return !$this->is_sent_for_signature();
903 }
904
905
906 /**
907 * CONDITION - is_signed
908 *
909 * Vérifie que l'instruction a été signé
910 *
911 * @return boolean
912 */
913 function is_signed() {
914 // Si un parapheur a été configuré
915 // et que le champ id_parapheur_signature n'est pas vide
916 // et que le statut est égal à "finished"
917 // alors le document de l'instruciton à été signé
918 if ($this->has_connector_electronicsignature() === true
919 && empty($this->getVal("id_parapheur_signature")) === false
920 && $this->getVal("statut_signature") == "finished") {
921 //
922 return true;
923 }
924
925 return false;
926 }
927
928 /**
929 * CONDITION - is_signed
930 *
931 * Vérifie que l'instruction n'a pas été signée
932 *
933 * @return boolean
934 */
935 function is_not_signed() {
936 // Contrôle si l'utilisateur possède un bypass
937 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
938 if ($bypass == true) {
939 return true;
940 }
941
942 return !$this->is_signed();
943 }
944
945
946 /**
947 * is_sent_to_cl
948 *
949 * Vérifie que l'instruction a été envoyé au contrôle de légalité
950 *
951 * @return boolean
952 */
953 function is_sent_to_cl() {
954 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
955 if ($this->getVal('envoye_cl_platau') === 't') {
956 //
957 return true;
958 }
959 //
960 return false;
961 }
962
963 /**
964 * CONDITION - is_portail_notification
965 *
966 * Vérifie si la notification est une notification de catégorie portail
967 *
968 * @return boolean
969 */
970 function is_portail_notification_sans_annexe() {
971 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
972 $ev = $this->get_inst_evenement($this->getVal('evenement'));
973 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
974 && $ev->getVal('notification') != 'notification_manuelle_annexe'
975 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
976 ) {
977 return true;
978 }
979 return false;
980 }
981
982 /**
983 * CONDITION - is_not_portail_notification
984 *
985 * Vérifie si la notification n'est pas une notification de catégorie portail
986 *
987 * @return boolean
988 */
989 function is_not_portail_notification_sans_annexe() {
990 return (! $this->is_portail_notification_sans_annexe());
991 }
992
993 /**
994 * CONDITION - can_be_signed
995 *
996 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
997 *
998 * @return boolean
999 */
1000 function can_be_signed() {
1001 // Instanciation de l'objet signataire_arrete
1002 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
1003 "obj" => "signataire_arrete",
1004 "idx" => $this->getVal("signataire_arrete"),
1005 ));
1006 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
1007 // possède une adresse email, on vérifie le champ id_parapheur_signature
1008 // S'il est vide l'évènement peut être envoyé en signature
1009 // S'il ne l'est pas, alors on vérifie le champ statut_signature
1010 // Si la valeur de ce champ est égal à "canceled" ou "expired"
1011 // alors l'évènement peut être envoyé en signature
1012 if ($this->has_connector_electronicsignature() === true
1013 && $this->getVal("om_final_instruction") == 't'
1014 && empty($inst_signataire_arrete->getVal('email')) === false) {
1015 //
1016 if (empty($this->getVal("id_parapheur_signature")) === true
1017 || $this->getVal("statut_signature") == "canceled"
1018 || $this->getVal("statut_signature") == "expired") {
1019 //
1020 return true;
1021 }
1022 }
1023
1024 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
1025 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
1026 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
1027 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
1028 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
1029
1030 return false;
1031 }
1032
1033 /**
1034 * CONDITION - has_connector_electronicsignature
1035 *
1036 * Vérifie qu'un parapheur est paramétré
1037 *
1038 * @return boolean
1039 */
1040 function has_connector_electronicsignature() {
1041 $inst_es = $this->get_electronicsignature_instance(false);
1042 if ($inst_es === false) {
1043 return false;
1044 }
1045 return true;
1046 }
1047
1048 /**
1049 * CONDITION - can_display_parapheur
1050 *
1051 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
1052 *
1053 * @return boolean
1054 */
1055 function can_display_parapheur() {
1056 $evenement_id = $this->getVal("evenement");
1057 $inst_evenement = $this->get_inst_evenement($evenement_id);
1058 if ($this->has_connector_electronicsignature() === true
1059 && $inst_evenement->getVal('lettretype') !== ''
1060 && $inst_evenement->getVal('lettretype') !== null
1061 && (empty($this->getVal("id_parapheur_signature")) === false
1062 || empty($this->getVal("historique_signature")) === false)) {
1063 //
1064 return true;
1065 }
1066
1067 return false;
1068 }
1069
1070 /**
1071 * CONDITION - can_display_notification
1072 *
1073 * Vérifie que le champs "Suivi notification" est affichable
1074 *
1075 * @return boolean
1076 */
1077 function can_display_notification_demandeur() {
1078 // Le suivi des notification est affiché si l'instruction a
1079 // des notifications de demandeurs associées
1080 $idsNotifs = $this->get_instruction_notification(
1081 $this->getVal($this->clePrimaire),
1082 array(
1083 'notification_recepisse',
1084 'notification_instruction',
1085 'notification_decision',
1086 ),
1087 true
1088 );
1089 return isset($idsNotifs) && $idsNotifs !== array();
1090 }
1091
1092 /**
1093 * CONDITION - can_display_notification
1094 *
1095 * Vérifie que le champs "suivi_notification_service" est affichable
1096 *
1097 * @return boolean
1098 */
1099 function can_display_notification_service() {
1100 // Le suivi des notification est affiché si l'événement est notifiable
1101 // et si des notifications ont été envoyées
1102 $evenement_id = $this->getVal("evenement");
1103 $inst_evenement = $this->get_inst_evenement($evenement_id);
1104 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1105 // Des notifications ont été envoyé si il existe au moins une notification
1106 // de type notification_service_consulte liées à l'instruction
1107 $idsNotifs = $this->get_instruction_notification(
1108 $this->getVal($this->clePrimaire),
1109 'notification_service_consulte'
1110 );
1111 if (isset($idsNotifs) && $idsNotifs !== array()) {
1112 return true;
1113 }
1114 }
1115 return false;
1116 }
1117
1118
1119 /**
1120 * CONDITION - can_display_notification_tiers
1121 *
1122 * Vérifie que le champs "suivi_notification_tiers" est affichable
1123 *
1124 * @return boolean
1125 */
1126 function can_display_notification_tiers() {
1127 // Le suivi des notification est affiché si l'instruction a
1128 // des notifications de tiers associées
1129 $idsNotifs = $this->get_instruction_notification(
1130 $this->getVal($this->clePrimaire),
1131 'notification_tiers_consulte'
1132 );
1133 return isset($idsNotifs) && $idsNotifs !== array();
1134 }
1135
1136 /**
1137 * CONDITION - can_display_notification_commune
1138 *
1139 * Vérifie que le champs "suivi_notification_commune" est affichable
1140 *
1141 * @return boolean
1142 */
1143 function can_display_notification_commune() {
1144 // Le suivi des notification si il existe au moins une notification
1145 // de type notification_depot_demat liées à l'instruction
1146 $idsNotifs = $this->get_instruction_notification(
1147 $this->getVal($this->clePrimaire),
1148 array('notification_depot_demat', 'notification_commune')
1149 );
1150 if (isset($idsNotifs) && $idsNotifs !== array()) {
1151 return true;
1152 }
1153 return false;
1154 }
1155
1156 /**
1157 * TREATMENT - disable_edition_integrale.
1158 *
1159 * Cette methode permet de passer la consultation en "lu"
1160 *
1161 * @return boolean true si maj effectué false sinon
1162 */
1163 function disable_edition_integrale() {
1164 // Cette méthode permet d'exécuter une routine en début des méthodes
1165 // dites de TREATMENT.
1166 $this->begin_treatment(__METHOD__);
1167 $this->correct = true;
1168 $valF = array(
1169 "flag_edition_integrale" => false,
1170 "titre_om_htmletat" => null,
1171 "corps_om_htmletatex" => null,
1172 );
1173 $res = $this->f->db->autoExecute(
1174 DB_PREFIXE.$this->table,
1175 $valF,
1176 DB_AUTOQUERY_UPDATE,
1177 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1178 );
1179 if ($this->f->isDatabaseError($res, true)) {
1180 // Appel de la methode de recuperation des erreurs
1181 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1182 $this->correct = false;
1183 // Termine le traitement
1184 return $this->end_treatment(__METHOD__, false);
1185 } else {
1186 $this->addToMessage(__("Rédaction par compléments activé."));
1187 return $this->end_treatment(__METHOD__, true);
1188 }
1189
1190 // Termine le traitement
1191 return $this->end_treatment(__METHOD__, false);
1192 }
1193
1194 /**
1195 * TREATMENT - enable_edition_integrale.
1196 *
1197 * Cette methode permet de passer la consultation en "lu"
1198 *
1199 * @return boolean true si maj effectué false sinon
1200 */
1201 function enable_edition_integrale() {
1202 // Cette méthode permet d'exécuter une routine en début des méthodes
1203 // dites de TREATMENT.
1204 $this->begin_treatment(__METHOD__);
1205 $this->correct = true;
1206
1207 // Récupère la collectivite du dossier d'instruction
1208 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1209 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1210 //
1211 $params = array(
1212 "specific" => array(
1213 "corps" => array(
1214 "mode" => "get",
1215 )
1216 ),
1217 );
1218 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1219 $corps = $result['pdf_output'];
1220 //
1221 $params = array(
1222 "specific" => array(
1223 "titre" => array(
1224 "mode" => "get",
1225 )
1226 ),
1227 );
1228 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1229 $titre = $result['pdf_output'];
1230 //
1231 $valF = array(
1232 "flag_edition_integrale" => true,
1233 "titre_om_htmletat" => $titre,
1234 "corps_om_htmletatex" => $corps,
1235 );
1236 $res = $this->f->db->autoExecute(
1237 DB_PREFIXE.$this->table,
1238 $valF,
1239 DB_AUTOQUERY_UPDATE,
1240 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1241 );
1242 if ($this->f->isDatabaseError($res, true)) {
1243 // Appel de la methode de recuperation des erreurs
1244 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1245 $this->correct = false;
1246 // Termine le traitement
1247 return $this->end_treatment(__METHOD__, false);
1248 } else {
1249 $this->addToMessage(__("Rédaction libre activé."));
1250 return $this->end_treatment(__METHOD__, true);
1251 }
1252
1253 // Termine le traitement
1254 return $this->end_treatment(__METHOD__, false);
1255 }
1256
1257 /**
1258 * Cette méthode instancie le dossier à partir de l'identifiant passé
1259 * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1260 * associé au dossier.
1261 * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1262 * renverra NULL
1263 *
1264 * @param string identifiant du dossier
1265 * @return null|string null ou identifiant du DA
1266 */
1267 function getNumDemandeAutorFromDossier($id) {
1268 if (!isset($id)) {
1269 return NULL;
1270 }
1271
1272 $dossier = $this->f->get_inst__om_dbform(array(
1273 'obj' => 'dossier',
1274 'idx' => $id,
1275 ));
1276
1277 return $dossier->getVal('dossier_autorisation');
1278 }
1279
1280
1281 /**
1282 * Cette méthode permet de récupérer le libelle du type de document
1283 * en instanciant l'objet document_type.
1284 *
1285 * Un évènement peux avoir ou non un type de document, et si c'est le cas,
1286 * on le récupère pour l'afficher.
1287 *
1288 * @return string|NULL Retourne le libelle du type de document ou vide
1289 */
1290 function get_type_document_linked_with_instruction(){
1291 //
1292 $document_type = $this->f->get_inst__om_dbform(array(
1293 'obj' => 'document_type',
1294 'idx' => $this->getVal("document_type_instruction"),
1295 ));
1296 if ($document_type->exists() === true) {
1297 return $document_type->getVal("libelle");
1298 }
1299 return NULL;
1300 }
1301
1302
1303 function setType(&$form, $maj) {
1304 $data = array('form' => &$form, 'maj' => &$maj);
1305 $this->f->module_manager->run_hooks('setType_pre', $this, $data);
1306
1307 // Récupération du mode de l'action
1308 $crud = $this->get_action_crud($maj);
1309 // Récupère la collectivité du dossier d'instruction
1310 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1311
1312 // Cache tous les champs
1313 foreach ($this->champs as $value) {
1314 $form->setType($value, 'hidden');
1315 }
1316
1317 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1318 if ($this->can_display_parapheur() === true && $maj == 3) {
1319 $form->setType('statut_signature', 'selectstatic');
1320 $form->setType('historique_signature', 'jsontotab');
1321 if ($this->getVal('commentaire_signature') == null) {
1322 $form->setType('commentaire_signature', 'hidden');
1323 } else {
1324 $form->setType('commentaire_signature', 'hiddenstatic');
1325 }
1326 }
1327
1328 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1329 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1330 $form->setType('suivi_notification', 'jsontotab');
1331 }
1332 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1333 if ($maj == 3 && $this->can_display_notification_service() === true) {
1334 $form->setType('suivi_notification_service', 'jsontotab');
1335 }
1336 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1337 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1338 $form->setType('suivi_notification_tiers', 'jsontotab');
1339 }
1340 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1341 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1342 $form->setType('suivi_notification_commune', 'jsontotab');
1343 }
1344
1345 // MODE AJOUTER
1346 if ($this->getParameter('maj') == 0) {
1347 $form->setType('commentaire', 'textareahidden');
1348 // Si l'option est active passage du champ date en lecture seule
1349 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1350 $form->setType("date_evenement", "hiddenstaticdate");
1351 } else {
1352 $form->setType("date_evenement", "date");
1353 }
1354 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1355 $form->setType("evenement", "selecthiddenstatic");
1356 } else {
1357 $form->setType("evenement", "select");
1358 }
1359 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1360 $form->setType("signataire_arrete", "selecthiddenstatic");
1361 } else {
1362 $form->setType("signataire_arrete", "select");
1363 }
1364 if ($this->is_option_redaction_libre_enabled() === true) {
1365 $form->setType("flag_edition_integrale", "select");
1366 }
1367 }
1368
1369 // MODE MODIFIER
1370 if ($this->getParameter('maj') == 1) {
1371 // Si l'option est active passage du champ date en lecture seule
1372 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1373 $form->setType("date_evenement", "hiddenstaticdate");
1374 } else {
1375 $form->setType("date_evenement", "date");
1376 }
1377 $form->setType("evenement", "selecthiddenstatic");
1378 if ($this->has_an_edition() === true) {
1379 $form->setType('document_type_instruction', 'selecthiddenstatic');
1380 $form->setType('lettretype', 'hiddenstatic');
1381 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1382 $form->setType("signataire_arrete", "selecthiddenstatic");
1383 } else {
1384 $form->setType("signataire_arrete", "select");
1385 }
1386 if ($this->getVal("flag_edition_integrale") == "t") {
1387 $form->setType("titre_om_htmletat", "htmlEtat");
1388 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1389 } else {
1390 $form->setType("complement_om_html", "html");
1391 $form->setType("complement2_om_html", "html");
1392 $form->setType("complement3_om_html", "html");
1393 $form->setType("complement4_om_html", "html");
1394 $form->setType('bible_auto', 'httpclick');
1395 $form->setType('bible', 'httpclick');
1396 $form->setType('bible2', 'httpclick');
1397 $form->setType('bible3', 'httpclick');
1398 $form->setType('bible4', 'httpclick');
1399 }
1400 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1401 //
1402 $form->setType('btn_refresh', 'httpclickbutton');
1403 $form->setType('btn_preview', 'httpclickbutton');
1404 $form->setType('btn_redaction', 'httpclickbutton');
1405 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1406 // pour identifiant le champ de prévisualisation et régler sa taille à
1407 // l'affichage du champ. En cas de modification, le selecteur doit également
1408 // être mis à jour
1409 $form->setType('live_preview', 'previsualiser_pdf');
1410 }
1411
1412 // necessaire pour calcul de date en modification
1413 //$form->setType('delai', 'hiddenstatic');
1414 // les administrateurs technique et fonctionnel peuvent
1415 // modifier tous les champs de date
1416 // si l'instruction a déjà été finalisée au moins une fois
1417 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1418 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1419 && $this->getVal("date_finalisation_courrier") != '') {
1420 //
1421 $form->setType('date_envoi_signature', 'date');
1422 $form->setType('date_retour_signature', 'date');
1423 if ($this->is_sent_for_signature() === true
1424 && $this->is_signed() === true) {
1425 //
1426 $form->setType("date_envoi_signature", "datereadonly");
1427 $form->setType("date_retour_signature", "datereadonly");
1428 }
1429 $form->setType('date_envoi_rar', 'date');
1430 $form->setType('date_retour_rar', 'date');
1431 $form->setType('date_envoi_controle_legalite', 'date');
1432 if ($this->is_sent_to_cl() === true) {
1433 $form->setType("date_envoi_controle_legalite", "datedisabled");
1434 }
1435 $form->setType('date_retour_controle_legalite', 'date');
1436 $form->setType('date_finalisation_courrier', 'date');
1437 }
1438 }
1439 }
1440
1441 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1442 if ($this->getParameter('maj') == 3
1443 || $this->getParameter('maj') == 2
1444 || $this->getParameter('maj') == 125
1445 || $this->getParameter('maj') == 410) {
1446 //
1447 $form->setType("date_evenement", "datestatic");
1448 $form->setType("evenement", "selecthiddenstatic");
1449 if ($this->has_an_edition() === true) {
1450 $form->setType("document_type_instruction", "selecthiddenstatic");
1451 $form->setType('lettretype', 'hiddenstatic');
1452 $form->setType("signataire_arrete", "selecthiddenstatic");
1453 if ($this->getVal("om_final_instruction") == 't') {
1454 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1455 } else {
1456 $form->setType('om_final_instruction_utilisateur', 'hidden');
1457 }
1458 }
1459 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1460 $form->setType('commentaire', 'textareastatic');
1461 }
1462 }
1463
1464 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1465 if ($this->getParameter('maj') == 3
1466 || $this->getParameter('maj') == 2
1467 || $this->getParameter('maj') == 410) {
1468 // Si il n'y a pas de lettre type (edition) associé à l'événement
1469 // les dates de suivi ne sont pas affichée
1470 if ($this->has_an_edition() === true) {
1471 $form->setType('date_envoi_signature', 'datestatic');
1472 $form->setType('date_retour_signature', 'datestatic');
1473 $form->setType('date_envoi_rar', 'datestatic');
1474 $form->setType('date_retour_rar', 'datestatic');
1475 $form->setType('date_envoi_controle_legalite', 'datestatic');
1476 $form->setType('date_retour_controle_legalite', 'datestatic');
1477 $form->setType('date_finalisation_courrier', 'datestatic');
1478 if ($this->getVal("flag_edition_integrale") == "t") {
1479 $form->setType("titre_om_htmletat", "htmlstatic");
1480 $form->setType("corps_om_htmletatex", "htmlstatic");
1481 } else {
1482 $form->setType("complement_om_html", "htmlstatic");
1483 $form->setType("complement2_om_html", "htmlstatic");
1484 $form->setType("complement3_om_html", "htmlstatic");
1485 $form->setType("complement4_om_html", "htmlstatic");
1486 }
1487 }
1488 }
1489
1490 // MODE SUIVI DES DATES 125
1491 if ($this->getParameter('maj') == 125) {
1492 $form->setType("date_evenement", "hiddenstaticdate");
1493 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1494 $form->setType('date_envoi_signature', 'date');
1495 $form->setType('date_retour_signature', 'date');
1496 if ($this->is_sent_for_signature() === true
1497 || $this->is_signed() === true) {
1498 //
1499 $form->setType("date_envoi_signature", "datereadonly");
1500 $form->setType("date_retour_signature", "datereadonly");
1501 }
1502 $form->setType('date_envoi_rar', 'date');
1503 $form->setType('date_retour_rar', 'date');
1504 $form->setType('date_envoi_controle_legalite', 'date');
1505 if ($this->is_sent_to_cl() === true) {
1506 $form->setType("date_envoi_controle_legalite", "datedisabled");
1507 }
1508 $form->setType('date_retour_controle_legalite', 'date');
1509 $form->setType('date_finalisation_courrier', 'date');
1510 }
1511
1512 if ($maj == 401) {
1513 foreach ($this->champs as $champ) {
1514 $form->setType($champ, 'hidden');
1515 }
1516 $form->setType('preview_edition', 'previsualiser');
1517 }
1518
1519 // Si l'instruction a été envoyé au contrôle de légalité et que la
1520 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1521 // l'utilisateur que l'envoi au cl est en cours de traitement.
1522 if ($this->is_sent_to_cl() === true
1523 && $maj == 3) {
1524 $form->setType("date_envoi_controle_legalite", "datestatic");
1525 if (empty($this->getVal('date_envoi_controle_legalite'))) {
1526 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1527 }
1528 }
1529 $data = array('form' => &$form, 'maj' => &$maj, 'collectivite_di' => $collectivite_di);
1530 $this->f->module_manager->run_hooks('setType_post', $this, $data);
1531 }
1532
1533 function setOnchange(&$form,$maj){
1534 $this->f->log(__METHOD__, 'BEGIN');
1535 $data = array('form' => &$form, 'maj' => &$maj);
1536 $this->f->module_manager->run_hooks('setOnchange_pre', $this, $data);
1537
1538 parent::setOnchange($form,$maj);
1539
1540 // MODE AJOUTER
1541 if ($this->getParameter('maj') == 0) {
1542 $form->setOnchange(
1543 "evenement",
1544 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1545 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1546 );
1547 }
1548
1549 $data = array('form' => &$form, 'maj' => &$maj);
1550 $this->f->module_manager->run_hooks('setOnchange_post', $this, $data);
1551 $this->f->log(__METHOD__, 'END');
1552 }
1553
1554 function evenement_has_an_edition($evenement_id) {
1555 $evenement = $this->get_inst_evenement($evenement_id);
1556 $lettretype = $evenement->getVal('lettretype');
1557 if ($lettretype !== '' && $lettretype !== null) {
1558 return true;
1559 }
1560 return false;
1561 }
1562
1563 function view_evenement_has_an_edition_json() {
1564 $json_return = array(
1565 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1566 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1567 );
1568 echo json_encode($json_return);
1569 }
1570
1571 function evenement_has_a_commentaire($evenement_id) {
1572 $evenement = $this->get_inst_evenement($evenement_id);
1573 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1574 }
1575
1576 function view_evenement_has_a_commentaire_json() {
1577 $json_return = array(
1578 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1579 );
1580 echo json_encode($json_return);
1581 }
1582
1583
1584 /**
1585 * CONDITION - can_be_sent_to_cl
1586 *
1587 * Vérifie que le contrôle de légalité est disponible
1588 *
1589 * @return boolean
1590 */
1591 function can_be_sent_to_cl() {
1592 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1593
1594 // Si événement est paramétré pour envoyer le contrôle de légalité
1595 // par Plat'AU
1596 if ($inst_evenement->getVal('envoi_cl_platau') === 't') {
1597 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1598
1599 // S'il n'y a pas déjà eu un envoi au CL (flag envoye_cl_platau)
1600 // Que le type de dossier d'autorisation est transmissible à Plat'AU
1601 // Que l'état de transmission du dossier n'est pas en 'jamais_transmissible'
1602 if ($this->getVal('envoye_cl_platau') === 'f'
1603 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1604 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1605
1606 // Si l'instruction n'a pas d'édition liée alors elle peut être envoyé au CL
1607 if ($this->has_an_edition() === false) {
1608 return true;
1609 }
1610
1611 // Si l'instruction a une édition et que la date de retour signature est renseignée
1612 // et que la date d'envoi au contrôle légalité n'est pas renseignée alors on peut
1613 // envoyer l'instruction au CL
1614 if ($this->has_an_edition() === true
1615 && empty($this->getVal('date_retour_signature')) === false
1616 && empty($this->getVal('date_envoi_controle_legalite')) === true) {
1617
1618 return true;
1619 }
1620 }
1621 }
1622 //
1623 return false;
1624 }
1625
1626 /**
1627 *
1628 * @return string
1629 */
1630 function get_var_sql_forminc__sql_signataire_arrete() {
1631 return sprintf(
1632 "SELECT
1633 signataire_arrete.signataire_arrete,
1634 CONCAT_WS(
1635 ' - ',
1636 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1637 signataire_habilitation.libelle,
1638 signataire_arrete.description
1639 )
1640 FROM
1641 %1\$ssignataire_arrete
1642 LEFT JOIN %1\$ssignataire_habilitation
1643 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1644 WHERE
1645 ((signataire_arrete.om_validite_debut IS NULL
1646 AND (signataire_arrete.om_validite_fin IS NULL
1647 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1648 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1649 AND (signataire_arrete.om_validite_fin IS NULL
1650 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1651 ORDER BY
1652 signataire_arrete.prenom,
1653 signataire_arrete.nom",
1654 DB_PREFIXE
1655 );
1656 }
1657
1658 /**
1659 *
1660 * @return string
1661 */
1662 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1663 return sprintf(
1664 "SELECT
1665 signataire_arrete.signataire_arrete,
1666 CONCAT_WS(
1667 ' - ',
1668 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1669 signataire_habilitation.libelle,
1670 signataire_arrete.description
1671 )
1672 FROM
1673 %1\$ssignataire_arrete
1674 LEFT JOIN %1\$ssignataire_habilitation
1675 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1676 WHERE
1677 signataire_arrete.signataire_arrete = <idx>",
1678 DB_PREFIXE
1679 );
1680 }
1681
1682 /**
1683 *
1684 * @return string
1685 */
1686 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1687 return sprintf(
1688 "SELECT
1689 signataire_arrete.signataire_arrete,
1690 CONCAT_WS(
1691 ' - ',
1692 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1693 signataire_habilitation.libelle,
1694 signataire_arrete.description
1695 )
1696 FROM
1697 %1\$ssignataire_arrete
1698 LEFT JOIN %1\$som_collectivite
1699 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1700 LEFT JOIN %1\$ssignataire_habilitation
1701 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1702 WHERE
1703 ((signataire_arrete.om_validite_debut IS NULL
1704 AND (signataire_arrete.om_validite_fin IS NULL
1705 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1706 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1707 AND (signataire_arrete.om_validite_fin IS NULL
1708 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1709 AND (om_collectivite.niveau = '2'
1710 OR signataire_arrete.om_collectivite = <collectivite_di>)
1711 ORDER BY
1712 signataire_arrete.prenom, signataire_arrete.nom",
1713 DB_PREFIXE
1714 );
1715 }
1716
1717 /**
1718 *
1719 * @return string
1720 */
1721 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1722 return sprintf(
1723 "SELECT
1724 signataire_arrete.signataire_arrete,
1725 CONCAT_WS(
1726 ' - ',
1727 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1728 signataire_habilitation.libelle,
1729 signataire_arrete.description
1730 )
1731 FROM
1732 %1\$ssignataire_arrete
1733 LEFT JOIN %1\$ssignataire_habilitation
1734 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1735 WHERE
1736 ((signataire_arrete.om_validite_debut IS NULL
1737 AND (signataire_arrete.om_validite_fin IS NULL
1738 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1739 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1740 AND (signataire_arrete.om_validite_fin IS NULL
1741 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1742 AND signataire_arrete.defaut IS TRUE
1743 ORDER BY
1744 signataire_arrete.prenom, signataire_arrete.nom",
1745 DB_PREFIXE
1746 );
1747 }
1748
1749 /**
1750 *
1751 * @return string
1752 */
1753 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1754 return sprintf(
1755 "SELECT
1756 signataire_arrete.signataire_arrete,
1757 CONCAT_WS(
1758 ' - ',
1759 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1760 signataire_habilitation.libelle,
1761 signataire_arrete.description
1762 )
1763 FROM
1764 %1\$ssignataire_arrete
1765 LEFT JOIN %1\$ssignataire_habilitation
1766 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1767 LEFT JOIN %1\$som_collectivite
1768 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1769 WHERE
1770 ((signataire_arrete.om_validite_debut IS NULL
1771 AND (signataire_arrete.om_validite_fin IS NULL
1772 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1773 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1774 AND (signataire_arrete.om_validite_fin IS NULL
1775 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1776 AND signataire_arrete.defaut IS TRUE
1777 AND (om_collectivite.niveau = '2'
1778 OR signataire_arrete.om_collectivite = <collectivite_di>)
1779 ORDER BY
1780 signataire_arrete.prenom,
1781 signataire_arrete.nom",
1782 DB_PREFIXE
1783 );
1784 }
1785
1786 /**
1787 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1788 * dont l'identifiant a été passé en paramètre dans l'url.
1789 *
1790 * @return array
1791 */
1792 function get_var_sql_forminc__sql_evenement() {
1793 // Récupération du numéro de dossier
1794 $dossier = $this->getParameter("idxformulaire") ?? $_GET['idxformulaire'];
1795 $this->f->log(__METHOD__, 'dossier: '.var_export($dossier, true));
1796 // Si changement de décision par instructeur commune
1797 $filter = '';
1798 if ($this->f->isUserInstructeur() === true
1799 // TODO faire autrement car ça instancier le dossier et donc charge ses modules !
1800 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1801 && $this->isInstrCanChangeDecision($dossier) === true) {
1802 $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1803 }
1804 // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1805 // de déterminer si il s'agit d'évènements suggérés.
1806 $qres = $this->f->get_all_results_from_db_query(
1807 sprintf(
1808 'SELECT
1809 DISTINCT(evenement.evenement),
1810 evenement.libelle,
1811 -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1812 CASE WHEN evenement_suggere_dossier.evenement IS NULL
1813 THEN FALSE
1814 ELSE TRUE
1815 END AS is_suggested
1816 FROM
1817 -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1818 -- selon le type de dossier et l état du dossier.
1819 %1$sevenement
1820 JOIN %1$slien_dossier_instruction_type_evenement
1821 ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1822 JOIN %1$stransition
1823 ON evenement.evenement = transition.evenement
1824 JOIN %1$sdossier
1825 ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1826 AND transition.etat = dossier.etat
1827 -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1828 LEFT JOIN (
1829 SELECT
1830 lien_sig_contrainte_evenement.evenement,
1831 dossier.dossier
1832 FROM
1833 %1$slien_sig_contrainte_evenement
1834 JOIN %1$ssig_contrainte
1835 ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1836 JOIN %1$slien_sig_contrainte_dossier_instruction_type
1837 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1838 JOIN %1$slien_sig_contrainte_om_collectivite
1839 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1840 JOIN %1$scontrainte
1841 ON sig_contrainte.libelle = contrainte.libelle
1842 JOIN %1$sdossier_contrainte
1843 ON contrainte.contrainte = dossier_contrainte.contrainte
1844 JOIN %1$sdossier
1845 ON dossier_contrainte.dossier = dossier.dossier
1846 AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1847 JOIN %1$som_collectivite
1848 ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1849 AND (dossier.om_collectivite = om_collectivite.om_collectivite
1850 OR om_collectivite.niveau = \'2\')
1851 ) AS evenement_suggere_dossier
1852 ON evenement.evenement = evenement_suggere_dossier.evenement
1853 AND dossier.dossier = evenement_suggere_dossier.dossier
1854 WHERE
1855 dossier.dossier = \'%2$s\'
1856 %3$s
1857 ORDER BY
1858 is_suggested DESC,
1859 evenement.libelle',
1860 DB_PREFIXE,
1861 $this->f->db->escapeSimple($dossier),
1862 $filter
1863 ),
1864 array(
1865 "origin" => __METHOD__
1866 )
1867 );
1868 return $qres['result'];
1869 }
1870
1871 /**
1872 * Récupère un tableau contenant des évènements de la forme :
1873 * $events = array(
1874 * 1 => array(
1875 * 'libelle' => 'evenement_libelle',
1876 * 'evenement' => 'identifiant_evenement',
1877 * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1878 * ))
1879 * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1880 *
1881 * Le format de sorti est le suivant :
1882 * $select = array(
1883 * 0 => array( -> liste des id des événements
1884 * '0' => '',
1885 * '1' => array(
1886 * '0' => array(), -> liste des id des événements suggérés
1887 * '1' => array(), -> liste des libelles des événements suggérés
1888 * ),
1889 * ...,
1890 * n => 'id_evenement_n'
1891 * ),
1892 * 1 => array(
1893 * '0' => '__('choisir')." ".__('evenement')',
1894 * '1' => '💡 Suggestions',
1895 * ...,
1896 * 'n' => 'libelle_evenement_n',
1897 * )
1898 * )
1899 *
1900 * @param array tableau des événements
1901 * @return array
1902 */
1903 protected function convert_events_array_to_select_format($events) {
1904 // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1905 $contenu = array(
1906 0 => array("",),
1907 1 => array(__('choisir')." ".__('evenement'),)
1908 );
1909
1910 if (! empty($events)) {
1911 // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1912 $suggested_event_group = array_filter($events, function($a) {
1913 return $a['is_suggested'] === 't';
1914 });
1915 if (! empty($suggested_event_group)) {
1916 // Prépare les données qui permettront d'afficher le groupe des événements
1917 // suggérés.
1918 $values = array();
1919 $labels = array();
1920 foreach ($suggested_event_group as $index => $suggested_event) {
1921 $values[] = $suggested_event['evenement'];
1922 $labels[] = $suggested_event['libelle'];
1923 // Supprime les évènements suggérés de la liste des évènements
1924 unset($events[$index]);
1925 }
1926 // Remplissage du select pour le groupe
1927 $contenu[0][] = array($values, $labels);
1928 $contenu[1][] = __('💡 Suggestions');
1929 }
1930
1931 // Remplissage du select
1932 foreach ($events as $event) {
1933 $contenu[0][] = $event['evenement'];
1934 $contenu[1][] = $event['libelle'];
1935 }
1936 }
1937 return $contenu;
1938 }
1939
1940 /**
1941 * SETTER_FORM - setSelect.
1942 *
1943 * @return void
1944 */
1945 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1946 //parent::setSelect($form, $maj);
1947 /**
1948 * On ne surcharge pas la méthode parent car une requête sur la table
1949 * dossier est mauvaise pour les performances, car la requête qui
1950 * concerne evenement est plus complexe que celle générée et car les
1951 * champs action, avis_decision et etat ne sont pas utilisés comme des
1952 * select
1953 */
1954 //// action
1955 //$this->init_select($form, $this->f->db, $maj, null, "action",
1956 // $sql_action, $sql_action_by_id, false);
1957
1958 //// avis_decision
1959 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1960 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1961
1962 //// dossier
1963 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1964 // $sql_dossier, $sql_dossier_by_id, false);
1965
1966 //// etat
1967 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1968 // $sql_etat, $sql_etat_by_id, false);
1969
1970 //// evenement
1971 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1972 // $sql_evenement, $sql_evenement_by_id, false);
1973
1974 // signataire_arrete
1975 // si contexte DI
1976 if ($this->getParameter("retourformulaire") == "dossier"
1977 || $this->f->contexte_dossier_instruction()) {
1978 // on recupère les signataires de la multicollectivité et de celle du DI
1979 $di = $this->f->get_inst__om_dbform(array(
1980 "obj" => "dossier_instruction",
1981 "idx" => $this->getParameter('idxformulaire'),
1982 ));
1983 $sql_signataire_arrete_by_di = str_replace(
1984 '<collectivite_di>',
1985 $di->getVal("om_collectivite"),
1986 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1987 );
1988 $this->init_select(
1989 $form,
1990 $this->f->db,
1991 $maj,
1992 null,
1993 "signataire_arrete",
1994 $sql_signataire_arrete_by_di,
1995 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1996 true
1997 );
1998 } else {
1999 $this->init_select(
2000 $form,
2001 $this->f->db,
2002 $maj,
2003 null,
2004 "signataire_arrete",
2005 $this->get_var_sql_forminc__sql("signataire_arrete"),
2006 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
2007 true
2008 );
2009 }
2010
2011 /**
2012 * Gestion du filtre sur les événements de workflow disponibles
2013 * On récupère ici en fonction de l'état du dossier d'instruction en
2014 * cours et du type du dossier d'instruction en cours la liste
2015 * événements disponibles.
2016 */
2017 if ($maj == 0) {
2018 $evenements = $this->get_var_sql_forminc__sql_evenement();
2019 $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
2020 } else {
2021 // Instanciation de l'événement pour récupérer son libellé
2022 $evenement = $this->f->get_inst__om_dbform(array(
2023 "obj" => "evenement",
2024 "idx" => $this->getVal("evenement"),
2025 ));
2026
2027 $contenu = array(
2028 0 => array($this->getVal("evenement"),),
2029 1 => array($evenement->getVal('libelle'),)
2030 );
2031 $form->setSelect("evenement", $contenu);
2032 }
2033
2034 /**
2035 * Gesion des liens vers la bible
2036 */
2037 // lien bible_auto
2038 $contenu = array(__("automatique"));
2039 $form->setSelect("bible_auto",$contenu);
2040 // lien bible1
2041 $contenu = array(__("bible"));
2042 $form->setSelect("bible",$contenu);
2043 // lien bible2
2044 $contenu = array(__("bible"));
2045 $form->setSelect("bible2",$contenu);
2046 // lien bible3
2047 $contenu = array(__("bible"));
2048 $form->setSelect("bible3",$contenu);
2049 // lien bible4
2050 $contenu = array(__("bible"));
2051 $form->setSelect("bible4",$contenu);
2052
2053 if ($maj == 1) {
2054 $base64 = $this->init_pdf_temp();
2055 $form->setSelect('live_preview', array('base64'=>$base64));
2056 $form->setSelect("btn_refresh", array(__('Prévisualiser')));
2057 $form->setSelect("btn_preview", array(__('Prévisualiser >>')));
2058 $form->setSelect("btn_redaction", array(__('<< Rédiger')));
2059 }
2060
2061 // Selection du type de rédaction à l'ajout
2062 $content = array(
2063 0 => array('f', 't', ),
2064 1 => array(__('Rédaction par compléments'), __('Rédaction libre'), ),
2065 );
2066 $form->setSelect('flag_edition_integrale', $content);
2067
2068 $contenu = array();
2069 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
2070 $contenu[0][] = $value;
2071 $contenu[1][] = $this->get_trad_for_statut($value);
2072 }
2073 $form->setSelect('statut_signature', $contenu);
2074
2075
2076 if ($maj == 401) {
2077 $idx = $this->getParameter("idx");
2078 $dossier = $this->getParameter("idxformulaire");
2079 if ( strpos($idx, 'STORAGE_') !== FALSE) {
2080 $idx = substr($idx, 8);
2081 $model = 'storage';
2082 $champ = 'uid';
2083 $object = $this->f->get_inst__om_dbform(array(
2084 "obj" => $model,
2085 "idx" => $idx,
2086 ));
2087
2088 $file = $this->f->storage->get($object->getVal($champ));
2089 $label = $file['metadata']['filename'];
2090 $href =sprintf(
2091 '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
2092 $idx
2093 );
2094 $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
2095 $this->val['preview_edition'] = '';
2096 }else{
2097 $label = $this->getVal("fichier_instruction_name");
2098 $href =sprintf(
2099 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
2100 $this->getVal($this->clePrimaire)
2101 );
2102 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
2103 }
2104
2105 $form->setSelect('preview_edition', array(
2106 'base64' => base64_encode($file['file_content']),
2107 'mimetype' => $file['metadata']['mimetype'],
2108 'label' => $label,
2109 'href' => $href
2110 ));
2111 }
2112 // document_type_instruction
2113 $this->init_select(
2114 $form,
2115 $this->f->db,
2116 $maj,
2117 null,
2118 "document_type_instruction",
2119 $this->get_var_sql_forminc__sql("document_type_instruction"),
2120 $this->get_var_sql_forminc__sql("document_type_instruction_by_id"),
2121 true
2122 );
2123 }
2124
2125 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2126 //
2127 // Vérifie uniquementla cle secondaire : demande
2128 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2129
2130 $id = $this->getVal($this->clePrimaire);
2131
2132 //Requête de vérification que cet événement d'instruction n'est pas lié
2133 //à la création d'un dossier d'instruction
2134 $qres = $this->f->get_one_result_from_db_query(
2135 sprintf(
2136 'SELECT
2137 demande_type.dossier_instruction_type
2138 FROM
2139 %1$sdemande_type
2140 LEFT JOIN %1$sdemande
2141 ON demande.demande_type = demande_type.demande_type
2142 WHERE
2143 demande.instruction_recepisse = \'%2$d\'',
2144 DB_PREFIXE,
2145 intval($id)
2146 ),
2147 array(
2148 "origin" => __METHOD__,
2149 )
2150 );
2151
2152 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2153 //création de dossier d'instruction, l'événement d'instruction peut être
2154 //supprimé
2155 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2156 // Requête de vérification que cet événement d'instruction est lié
2157 // à une demande
2158 $qres = $this->f->get_one_result_from_db_query(
2159 sprintf(
2160 'SELECT
2161 demande
2162 FROM
2163 %1$sdemande
2164 WHERE
2165 instruction_recepisse = \'%2$d\'',
2166 DB_PREFIXE,
2167 intval($id)
2168 ),
2169 array(
2170 "origin" => __METHOD__,
2171 )
2172 );
2173
2174 //Si c'est un événement d'instruction lié à une demande
2175 if ($qres['result'] != null || $qres['result'] != ""){
2176 $demande = $this->f->get_inst__om_dbform(array(
2177 "obj" => "demande",
2178 "idx" => $qres['result'],
2179 ));
2180
2181 //On met à jour la demande en supprimant la liaison vers
2182 //l'événement d'instruction
2183 $demande->setParameter("maj", 1);
2184 $valF = array();
2185 foreach($demande->champs as $identifiant => $champ) {
2186 $valF[$champ] = $demande->val[$identifiant];
2187 }
2188 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2189 $valF['instruction_recepisse']=NULL;
2190 $ret = $demande->modifier($valF);
2191 }
2192
2193 /**
2194 * Vérification que l'élément supprimé est le dernier pour pouvoir
2195 * remodifier les données de manière itérative.
2196 */
2197 $qres = $this->f->get_one_result_from_db_query(
2198 sprintf(
2199 'SELECT
2200 max(instruction)
2201 FROM
2202 %1$sinstruction
2203 WHERE
2204 dossier = \'%2$s\'',
2205 DB_PREFIXE,
2206 $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2207 ),
2208 array(
2209 "origin" => __METHOD__,
2210 )
2211 );
2212
2213 // Si on se trouve effectivement sur le dernier evenement d'instruction
2214 // alors on valide la suppression sinon on l'annule
2215 $this->correct = false;
2216 $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2217 if ($qres['result'] == $id) {
2218 // Alors on valide la suppression
2219 $this->correct = true;
2220 $message = __('Destruction_chronologique');
2221 }
2222 $this->addToMessage($message);
2223 }
2224 }
2225
2226 /**
2227 * Vérification de la possibilité ou non de modifier des dates de suivi
2228 * @param string $champ champ date à vérifier
2229 */
2230 function updateDate($champ) {
2231
2232 //Si le retourformulaire est "dossier_instruction"
2233 if ($this->getParameter("retourformulaire") == "dossier"
2234 || $this->f->contexte_dossier_instruction()) {
2235
2236 // Vérification de la possibilité de modifier les dates si déjà éditées
2237 if($this->valF[$champ] != "" && !$this->f->user_is_admin) {
2238 // si l'utilisateur n'est pas un admin
2239 if($this->getVal($champ) != "" && $this->getVal($champ) != $this->valF[$champ]) {
2240
2241 // si le champ concerné est 'date_envoi_signature'
2242 // et que le statut du parapheur est 'expired'
2243 // alors on autorise le changement de la date
2244 // pour tous les autres cas, on ne peut modifier la date
2245 if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2246 $this->correct = false;
2247 $this->addToMessage(__("Les dates de suivis ne peuvent etre modifiees"));
2248 }
2249 }
2250 }
2251 }
2252
2253 //
2254 return true;
2255 }
2256
2257 /**
2258 * SETTER_FORM - setValsousformulaire (setVal).
2259 *
2260 * @return void
2261 */
2262 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2263 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2264 $this->f->module_manager->run_hooks('setValsousformulaire_pre', $this, $data);
2265
2266 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2267 //
2268 $this->retourformulaire = $retourformulaire;
2269 //
2270 if ($maj == 0) {
2271 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2272 $form->setVal("dossier", $this->getParameter("idxformulaire"));
2273 }
2274
2275 // Si l'instruction a été envoyé au contrôle de légalité et que la
2276 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2277 // l'utilisateur que l'envoi au cl est en cours de traitement.
2278 if ($this->is_sent_to_cl() === true
2279 && empty($this->getVal('date_envoi_controle_legalite'))
2280 && $maj == 3) {
2281 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2282 }
2283 //
2284 $this->set_form_default_values($form, $maj, $validation);
2285
2286 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation, 'idxformulaire' => &$idxformulaire, 'retourformulaire' => &$retourformulaire, 'typeformulaire' => &$typeformulaire);
2287 $this->f->module_manager->run_hooks('setValsousformulaire_post', $this, $data);
2288 }
2289
2290 /**
2291 * SETTER_FORM - set_form_default_values (setVal).
2292 *
2293 * @return void
2294 */
2295 function set_form_default_values(&$form, $maj, $validation) {
2296 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2297 $this->f->module_manager->run_hooks('set_form_default_values_pre', $this, $data);
2298
2299 if ($maj == 0) {
2300 // si contexte DI
2301 if ($this->getParameter("retourformulaire") == "dossier"
2302 || $this->f->contexte_dossier_instruction()) {
2303 // on recupère les signataires de la multicollectivité et de celle du DI
2304 $di = $this->f->get_inst__om_dbform(array(
2305 "obj" => "dossier_instruction",
2306 "idx" => $this->getParameter("idxformulaire"),
2307 ));
2308 $sql = str_replace(
2309 "<collectivite_di>",
2310 $di->getVal("om_collectivite"),
2311 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2312 );
2313 } else {
2314 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2315 }
2316
2317 $qres = $this->f->get_all_results_from_db_query($sql, array(
2318 "origin" => __METHOD__));
2319 $row = array_shift($qres['result']);
2320 if (isset($row["signataire_arrete"])
2321 && is_numeric($row["signataire_arrete"])) {
2322 //
2323 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2324 }
2325 // Date du jour
2326 $form->setVal("date_evenement", date("Y-m-d"));
2327 }
2328 //
2329 if ($maj == 0 || $maj == 1 || $maj == 125) {
2330 $form->setVal("bible_auto", "bible_auto()");
2331 $form->setVal("bible", "bible(1)");
2332 $form->setVal("bible2", "bible(2)");
2333 $form->setVal("bible3", "bible(3)");
2334 $form->setVal("bible4", "bible(4)");
2335 }
2336 // TODO à faire autrement car ça génère une requête à chaque fois, plus l'instanciation du dossier d'instruction et donc de ses modules !
2337 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2338 if ($maj == 1
2339 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2340 && $this->has_an_edition() === true) {
2341 //
2342 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2343 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2344 $form->setVal("btn_preview", "show_instr_preview()");
2345 $form->setVal("btn_redaction", "show_instr_redaction()");
2346 }
2347
2348 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2349 // des communes
2350 if ($maj == 3) {
2351 if ($this->can_display_notification_demandeur()) {
2352 $typeNotification = array(
2353 'notification_recepisse',
2354 'notification_instruction',
2355 'notification_decision',
2356 );
2357 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2358 }
2359 if ($this->can_display_notification_service()) {
2360 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2361 }
2362 if ($this->can_display_notification_tiers()) {
2363 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2364 }
2365 if ($this->can_display_notification_commune()) {
2366 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2367 }
2368 if ($this->getVal('flag_edition_integrale') == 't') {
2369 $message = __("Aucun contenu à afficher.");
2370 if (empty($this->getVal('titre_om_htmletat'))) {
2371 $form->setVal("titre_om_htmletat", $message);
2372 }
2373 if (empty($this->getVal('corps_om_htmletatex'))) {
2374 $form->setVal("corps_om_htmletatex", $message);
2375 }
2376 }
2377 }
2378 $data = array('form' => &$form, 'maj' => &$maj, 'validation' => &$validation);
2379 $this->f->module_manager->run_hooks('set_form_default_values_post', $this, $data);
2380 }
2381
2382 function setLayout(&$form, $maj){
2383 $data = array('form' => &$form, 'maj' => &$maj);
2384 $this->f->module_manager->run_hooks('setLayout_pre', $this, $data);
2385
2386 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2387
2388 $form->setFieldset('evenement','D',_('Evenement'));
2389 $form->setFieldset('om_final_instruction_utilisateur','F','');
2390
2391 $form->setBloc('om_final_instruction_utilisateur','F');
2392 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2393 // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2394 $form->setBloc('om_final_instruction_utilisateur','F');
2395 $form->setBloc('parapheur_lien_page_signature','D');
2396
2397 $form->setBloc('date_finalisation_courrier','D',"","");
2398
2399 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2400 $form->setBloc('date_finalisation_courrier','D');
2401 $form->setBloc('date_envoi_rar','F');
2402
2403 $form->setBloc('date_retour_rar','D');
2404 $form->setBloc('date_retour_controle_legalite','F');
2405 $form->setFieldset('date_retour_controle_legalite','F','');
2406
2407 $form->setBloc('date_retour_controle_legalite','F');
2408
2409 $form->setBloc('statut_signature','D');
2410 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2411 $form->setBloc('commentaire_signature','F');
2412 $form->setBloc('historique_signature','D');
2413 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2414 $form->setBloc('historique_signature','F');
2415 $form->setFieldset('historique_signature','F');
2416
2417 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2418 $form->setFieldset('suivi_notification','F');
2419 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2420 $form->setFieldset('suivi_notification_service','F');
2421 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2422 $form->setFieldset('suivi_notification_tiers','F');
2423 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2424 $form->setFieldset('suivi_notification_commune','F');
2425
2426 if ($maj == 1) {
2427 // Récupère la collectivité du dossier d'instruction
2428 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2429
2430 //
2431 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2432 && $this->has_an_edition() === true) {
2433 //
2434 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2435 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2436 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2437 $form->setFieldset('complement_om_html','D',_('Complement'));
2438 $form->setFieldset('bible','F','');
2439 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2440 $form->setFieldset('bible2','F','');
2441 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2442 $form->setFieldset('bible3','F','');
2443 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2444 $form->setFieldset('bible4','F','');
2445 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2446 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2447 $form->setBloc('corps_om_htmletatex','F');
2448 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2449 $form->setBloc('btn_preview','F');
2450 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2451 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2452 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2453 $form->setFieldset('live_preview','F');
2454 $form->setBloc('live_preview','F');
2455 $form->setBloc('live_preview','F');
2456 } else {
2457 $form->setBloc('complement_om_html','D',"","hidelabel");
2458 $form->setFieldset('complement_om_html','D',_('Complement'));
2459 $form->setFieldset('bible','F','');
2460 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2461 $form->setFieldset('bible2','F','');
2462 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2463 $form->setFieldset('bible3','F','');
2464 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2465 $form->setFieldset('bible4','F','');
2466 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2467 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2468 $form->setBloc('corps_om_htmletatex','F');
2469 }
2470 } else {
2471 $form->setBloc('complement_om_html','D',"","hidelabel");
2472 $form->setFieldset('complement_om_html','D',_('Complement'));
2473 $form->setFieldset('bible','F','');
2474 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2475 $form->setFieldset('bible2','F','');
2476 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2477 $form->setFieldset('bible3','F','');
2478 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2479 $form->setFieldset('bible4','F','');
2480 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2481 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2482 $form->setBloc('corps_om_htmletatex','F');
2483 }
2484 $data = array('form' => &$form, 'maj' => &$maj);
2485 $this->f->module_manager->run_hooks('setLayout_post', $this, $data);
2486 }
2487
2488 function setLib(&$form, $maj) {
2489 $data = array('form' => &$form, 'maj' => &$maj);
2490 $this->f->module_manager->run_hooks('setLib_pre', $this, $data);
2491 //
2492 parent::setLib($form, $maj);
2493 //
2494 $form->setLib('bible_auto', "");
2495 $form->setLib('bible', "");
2496 $form->setLib('bible2', "");
2497 $form->setLib('bible3', "");
2498 $form->setLib('bible4', "");
2499 $form->setLib('btn_refresh', "");
2500 $form->setLib('btn_preview', "");
2501 $form->setLib('btn_redaction', "");
2502 $form->setLib('live_preview', "");
2503 $form->setLib('om_final_instruction_utilisateur', __("finalise par"));
2504 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2505 $form->setLib('date_retour_rar', __("date_notification"));
2506 $form->setLib('statut_signature', __("statut"));
2507 $form->setLib('commentaire_signature', __("commentaire"));
2508 $form->setLib('historique_signature', '');
2509 $form->setLib('suivi_notification', '');
2510 $form->setLib('suivi_notification_service', '');
2511 $form->setLib('suivi_notification_tiers', '');
2512 $form->setLib('suivi_notification_commune', '');
2513 $form->setLib('preview_edition', "");
2514 $form->setLib('document_type_instruction', __("Type de document"));
2515
2516 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2517 // ajout et que l'option de rédaction libre est activée sur la
2518 // collectivité du dossier
2519 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2520 //
2521 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2522 $help_text = __("Attention: le passage du mode 'Rédaction libre' à celui de 'Rédaction par compléments' fait perdre toute la rédaction manuelle effectuée.");
2523 $form->setLib('flag_edition_integrale', sprintf($help_text_template, __("Type de rédaction"), $help_text));
2524 }
2525 else {
2526 $form->setLib('flag_edition_integrale', __("Type de rédaction"));
2527 }
2528
2529 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2530 // modification et que l'option de prévisualisation de l'édition est
2531 // activée sur la collectivité du dossier
2532 if ($maj === '1'
2533 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2534 //
2535 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2536 $help_text = __("Attention la modification de la valeur de ce champ n'est pas prise en compte dans la prévisualisation. Pour que cette valeur soit mise à jour, il suffit de valider le formulaire.");
2537 $form->setLib('date_evenement', sprintf($help_text_template, __('date_evenement'), $help_text));
2538 $form->setLib('signataire_arrete', sprintf($help_text_template, __('signataire_arrete'), $help_text));
2539 }
2540 $data = array('form' => &$form, 'maj' => &$maj);
2541 $this->f->module_manager->run_hooks('setLib_post', $this, $data);
2542 }
2543
2544 /**
2545 * Surcharge om_dbform::set_form_specificity()
2546 *
2547 * Traitements spécifiques lié à l'affichage des formulaires.
2548 * Les traitements gérés ici sont les suivants :
2549 * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2550 * pu être récupérée.
2551 * - Affichage d'un message d'information à l'attention de l'utilisateur si
2552 * la notification est activée mais qu'elle n'est pas possible à cause du
2553 * paramètrage.
2554 *
2555 * @param formulaire $form Instance formulaire.
2556 * @param string $maj
2557 *
2558 * @return void
2559 */
2560 function set_form_specificity(&$form, $maj) {
2561 parent::set_form_specificity($form, $maj);
2562
2563 // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2564 // Si ce n'est pas le cas affiche un message d'erreur.
2565 if ((! empty($maj) && $maj == 3)) {
2566 if (! empty($this->getVal('lettretype'))) {
2567
2568 $om_edition = $this->f->get_inst__om_edition();
2569 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2570 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2571 $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2572
2573 if (empty($edition)) {
2574 $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2575 }
2576 }
2577 }
2578
2579 $this->display_notification_info($maj);
2580 }
2581
2582 /**
2583 * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2584 * citoyen, si la notification des demandeurs est activée sur l'évenement
2585 * d'instruction et que le paramétrage du demandeur principal n'est pas
2586 * correct alors un message a destination de l'instructeur est affiché.
2587 *
2588 * @param string $maj
2589 *
2590 * @return void
2591 */
2592 public function display_notification_info($maj) {
2593 if ((! empty($maj) && $maj == 3)) {
2594 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2595 // la requête permettant de savoir le type de demande à échouée) et si
2596 // la notification se fait par mail vérifie si il y a des erreurs de
2597 // paramétrage et si c'est le cas on affiche un message d'information
2598 if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2599 $erreurParam = $this->get_info_notification_fail();
2600 // Récupération de l'évenement d'instruction
2601 $instEV = $this->get_inst_evenement();
2602 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2603 $class = 'text-info ui-state-highlight ui-state-info';
2604 $message = __("La notification n'est pas possible.");
2605 $this->f->display_panel_information(
2606 $class,
2607 $message,
2608 $erreurParam,
2609 __('Les données suivantes doivent être modifiées'),
2610 'erreur_param_notif'
2611 );
2612 }
2613 }
2614 }
2615 }
2616
2617 /**
2618 * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2619 */
2620 public function display_error_message($msg) {
2621 $this->correct = false;
2622 $this->msg = $msg;
2623 }
2624
2625 /**
2626 * TRIGGER - triggerajouter.
2627 * Réalise différents traitements avant d'ajouter l'instruction en base.
2628 *
2629 * Les traitements réalisés sont les suivant :
2630 * - TODO : documenter les traietements existant
2631 * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2632 * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2633 *
2634 * @return boolean
2635 */
2636 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2637 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2638 $parent_res = parent::triggerajouter($id, $dnu1, $val);
2639 if ($parent_res === false) return $parent_res;
2640
2641 $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
2642 $this->f->module_manager->run_hooks('triggerajouter_override_pre', $this, $data);
2643 /**
2644 * Le code suivant permet de récupérer des valeurs des tables evenement
2645 * et dossier pour les stocker dans l'instruction :
2646 * DEPUIS L'EVENEMENT
2647 * - action
2648 * - delai
2649 * - accord_tacite
2650 * - etat
2651 * - avis_decision
2652 * - delai_notification
2653 * - lettretype
2654 * - autorite_competente
2655 * - pec_metier
2656 * - complement_om_html
2657 * - complement2_om_html
2658 * - complement3_om_html
2659 * - complement4_om_html
2660 * - complement5_om_html
2661 * DEPUIS LE DOSSIER D'INSTRUCTION
2662 * - archive_delai
2663 * - archive_accord_tacite
2664 * - archive_etat
2665 * - archive_avis
2666 * - date_complet
2667 * - date_rejet
2668 * - date_limite
2669 * - date_notification_delai
2670 * - date_decision
2671 * - date_validite
2672 * - date_achevement
2673 * - date_chantier
2674 * - date_conformite
2675 * - avis_decision
2676 */
2677 // Récupération de tous les paramètres de l'événement sélectionné
2678 $evenement = $this->f->get_inst__om_dbform(array(
2679 "obj" => "evenement",
2680 "idx" => intval($this->valF['evenement']),
2681 ));
2682 if ($evenement->exists() === true) {
2683 // Récupération de l'identifiant de l'action
2684 // si une action est paramétrée dans l'événement
2685 $this->valF['action'] = NULL;
2686 if (!empty($evenement->getVal('action'))) {
2687 $this->valF['action']=$evenement->getVal('action');
2688 }
2689 // Récupération de la valeur du délai
2690 $this->valF['delai'] = $evenement->getVal('delai');
2691 // Récupération de l'identifiant de l'état
2692 // si un état est paramétré dans l'événement
2693 $this->valF['etat']=NULL;
2694 if (!empty($evenement->getVal('etat'))) {
2695 $this->valF['etat']=$evenement->getVal('etat');
2696 }
2697 // Récupération de la valeur d'accord tacite
2698 $this->valF['accord_tacite']=$evenement->getVal('accord_tacite');
2699 // Récupération de la valeur du délai de notification
2700 $this->valF['delai_notification']=$evenement->getVal('delai_notification');
2701 // Récupération de l'identifiant de l'avis
2702 // si un avis est paramétré dans l'événement
2703 $this->valF['avis_decision'] = NULL;
2704 if(!empty($evenement->getVal('avis_decision'))) {
2705 $this->valF['avis_decision']=$evenement->getVal('avis_decision');
2706 }
2707 // Récupération de la valeur de l'autorité compétente
2708 // si l'autorité compétente est paramétré dans l'événement
2709 $this->valF['autorite_competente'] = NULL;
2710 if(!empty($evenement->getVal('autorite_competente'))) {
2711 $this->valF['autorite_competente']=$evenement->getVal('autorite_competente');
2712 }
2713 // Récupération de la valeur de la lettre type
2714 $this->valF['lettretype']=$evenement->getVal('lettretype');
2715
2716 // Récupération de la valeur du document_type
2717 if(!empty($evenement->getVal('document_type'))){
2718 $this->valF['document_type_instruction']= $evenement->getVal('document_type');
2719 }
2720 // Récupération de la valeur de la prise en compte métier
2721 // si la prise en compte métier est paramétrée dans l'événement
2722 $this->valF['pec_metier'] = NULL;
2723 if(!empty($evenement->getVal('pec_metier'))) {
2724 $this->valF['pec_metier'] = $evenement->getVal('pec_metier');
2725 }
2726 }
2727 // Récupération de toutes les valeurs du dossier d'instruction en cours
2728 // TODO : remplacer cette requête par l'instanciation de l'objet
2729 $qres = $this->f->get_all_results_from_db_query(
2730 sprintf(
2731 'SELECT
2732 *
2733 FROM
2734 %1$sdossier
2735 WHERE
2736 dossier = \'%2$s\'',
2737 DB_PREFIXE,
2738 $this->f->db->escapeSimple($this->valF['dossier'])
2739 ),
2740 array(
2741 "origin" => __METHOD__,
2742 )
2743 );
2744 $row = array_shift($qres['result']);
2745 $this->updateArchiveData($row);
2746
2747 // Récupération de la duree de validite du dossier d'autorisation
2748 $qres = $this->f->get_one_result_from_db_query(
2749 sprintf(
2750 'SELECT
2751 duree_validite_parametrage
2752 FROM
2753 %1$sdossier_autorisation_type_detaille
2754 LEFT JOIN %1$sdossier_autorisation
2755 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2756 LEFT JOIN %1$sdossier
2757 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2758 WHERE
2759 dossier.dossier = \'%2$s\'',
2760 DB_PREFIXE,
2761 $this->f->db->escapeSimple($this->valF['dossier'])
2762 ),
2763 array(
2764 "origin" => __METHOD__,
2765 )
2766 );
2767
2768 if ($qres['result'] != '') {
2769 $this->valF['duree_validite_parametrage'] = $qres['result'];
2770 }
2771
2772 // Identifiant du type de courrier
2773 $idTypeCourrier = '11';
2774 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2775 // Code barres
2776 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2777
2778 // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2779 // à l'ajout de l'instruction.
2780 // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2781 if (! empty($this->valF['lettretype'])) {
2782 $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2783 }
2784
2785 $res = true;
2786 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
2787 $this->f->module_manager->run_hooks('triggerajouter_override_post', $this, $data);
2788 return $res;
2789 }
2790
2791 /**
2792 * Récupère pour chaque champ complementX_om_html le complément correspondant
2793 * et set l'entrée correspondante de valF avec.
2794 *
2795 * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2796 * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2797 * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2798 * aura donc un impact sur cette méthode.
2799 *
2800 * @param string dossier : identifiant du dossier de l'instruction
2801 * @param int evenement : identifiant de l'évènement d'instruction
2802 *
2803 * @return void
2804 */
2805 public function set_precharge_complement($evenement, $dossier) {
2806 // Récupération des bibles et chargement dans les compléments
2807 for ($i = 1; $i <= 15; $i++) {
2808 // Constitution de l'id du champs.
2809 // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2810 $field = "complement".($i === 1 ? '' : $i)."_om_html";
2811 // Récupération des compléments correspondant en fonction de l'évènement
2812 // et du dossier puis insertion dans la champs voulu
2813 $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2814 }
2815 }
2816
2817
2818
2819 /**
2820 * Test si une restriction est valide.
2821 *
2822 * @return boolean
2823 */
2824 function restrictionIsValid($restriction){
2825 if($this->restriction_valid != null) {
2826 return $this->restriction_valid;
2827 }
2828 if(empty($restriction)) {
2829 $this->restriction_valid = true;
2830 return $this->restriction_valid;
2831 }
2832 // Liste des opérateurs possibles sans espace
2833 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2834 // Liste identique mais avec le marqueur §
2835 $mark = "§";
2836 $operateurs_marked = array();
2837 foreach ($operateurs as $operateur) {
2838 $operateurs_marked[] = $mark.$operateur.$mark;
2839 }
2840
2841 // Supprime tous les espaces de la chaîne de caractère
2842 $restriction = preg_replace('/\s+/', '', $restriction);
2843
2844 // Met un marqueur avant et après les opérateurs
2845 // puis transforme la chaine en un tableau
2846 $restriction = str_replace($operateurs, $operateurs_marked,
2847 $restriction);
2848
2849 // Pour chaque opérateur logique
2850 foreach (array('&&', '||') as $operator) {
2851
2852 // S'il est absent on ne fait aucun traitement
2853 if (strpos($restriction, $mark.$operator.$mark) === false) {
2854 continue;
2855 }
2856 // Sinon on vérifie les deux conditions avec le OU/ET logique
2857 $restrictions = explode($mark.$operator.$mark, $restriction);
2858 $restrictions[0] = explode($mark, $restrictions[0]);
2859 $restrictions[1] = explode($mark, $restrictions[1]);
2860 $res_bool = false;
2861 if ($operator == '&&') {
2862 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2863 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2864 $res_bool = true;
2865 }
2866 }
2867 if ($operator == '||') {
2868 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2869 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2870 $res_bool = true;
2871 }
2872 }
2873 return $res_bool;
2874 }
2875 $tabRestriction = explode($mark, $restriction);
2876 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2877
2878 }
2879
2880 function is_restriction_satisfied($restriction, $operateurs) {
2881 // Tableau comprenant les résultat
2882 $res = array();
2883 // Compteur pour les résultat
2884 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2885 $j = 1;
2886 // Comparateur du calcul
2887 $comparateur = '';
2888 // Booléen retourné
2889 $res_bool = true;
2890
2891 // S'il y a un comparateur
2892 if (in_array(">=", $restriction)
2893 || in_array("<=", $restriction)
2894 || in_array("==", $restriction)
2895 || in_array("!=", $restriction)) {
2896
2897 // Si le tableau n'est pas vide
2898 if (count($restriction) > 0) {
2899
2900 // Boucle dans le tableau pour récupérer seulement les valeurs
2901 foreach ($restriction as $key => $value) {
2902 //
2903 if (!in_array($value, $operateurs)) {
2904 if ($this->getRestrictionValue($value) != false) {
2905 $res[] = $this->getRestrictionValue($value);
2906 } else {
2907 // Message d'erreur
2908 $error_message = sprintf(__("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2909 $this->addToMessage($error_message);
2910 // Arrête le traitement
2911 return false;
2912 }
2913 }
2914 }
2915
2916 // Boucle dans le tableau
2917 // commence à 1 car le 0 doit rester inchangé tout au long du
2918 // traitement
2919 for ($i = 1; $i<count($restriction); $i++) {
2920
2921 // Récupère le comparateur
2922 if ($restriction[$i] === ">="
2923 || $restriction[$i] === "<="
2924 || $restriction[$i] === "=="
2925 || $restriction[$i] === "!=") {
2926 $comparateur = $restriction[$i];
2927 }
2928
2929 // Si l'opérateur qui suit est un "+"
2930 if ($restriction[$i] === "+") {
2931 $dateDep = $res[$j];
2932 unset($res[$j]);$j++;
2933 $duree = $res[$j];
2934 unset($res[$j]);
2935 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2936 }
2937
2938 // Si l'opérateur qui suit est un "-"
2939 if ($restriction[$i] === "-") {
2940 $dateDep = $res[$j];
2941 unset($res[$j]);$j++;
2942 $duree = $res[$j];
2943 unset($res[$j]);
2944 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2945 }
2946 }
2947
2948 }
2949
2950 // Si les tableau des résultats n'est pas vide
2951 if (count($res) > 0) {
2952 //
2953 $res_bool = false;
2954 // Effectue le test
2955 if ($comparateur === ">=") {
2956 //
2957 if (strtotime($res[0]) >= strtotime($res[$j])) {
2958 $res_bool = true;
2959 }
2960 }
2961 if ($comparateur === "<=") {
2962 //
2963 if (strtotime($res[0]) <= strtotime($res[$j])) {
2964 $res_bool = true;
2965 }
2966 }
2967 if ($comparateur === "==") {
2968 //
2969 if (strtotime($res[0]) == strtotime($res[$j])) {
2970 $res_bool = true;
2971 }
2972 }
2973 if ($comparateur === "!=") {
2974 //
2975 if (strtotime($res[0]) != strtotime($res[$j])) {
2976 $res_bool = true;
2977 }
2978 }
2979 }
2980 // Sinon une erreur s'affiche
2981 } else {
2982
2983 // Message d'erreur
2984 $error_message = __("Mauvais parametrage de la restriction.")." ".
2985 __("Contactez votre administrateur");
2986 $this->addToMessage($error_message);
2987 // Arrête le traitement
2988 return false;
2989 }
2990
2991 return $res_bool;
2992
2993 }
2994
2995 /**
2996 * Permet de définir si l'événement passé en paramètre est un événement retour.
2997 * @param integer $evenement événement à tester
2998 *
2999 * @return boolean retourne true si événement retour sinon false
3000 */
3001 function is_evenement_retour($evenement) {
3002 if(empty($evenement) || !is_numeric($evenement)) {
3003 return "";
3004 }
3005
3006 $evenement = $this->f->get_inst__om_dbform(array(
3007 "obj" => "evenement",
3008 "idx" => $evenement,
3009 ));
3010
3011 return $evenement->getVal('retour') == 't';
3012 }
3013
3014 /**
3015 * Retourne le champ restriction de l'événement passé en paramètre.
3016 *
3017 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
3018 *
3019 * @return string contenu du champ restriction
3020 */
3021 function get_restriction($evenement) {
3022 if(empty($evenement) || !is_numeric($evenement)) {
3023 return "";
3024 }
3025 //Récupère la restriction
3026 $evenement = $this->f->get_inst__om_dbform(array(
3027 "obj" => "evenement",
3028 "idx" => $evenement,
3029 ));
3030
3031 return $evenement->getVal('restriction');
3032 }
3033
3034 /**
3035 * Récupère la valeur du champ dans la restriction
3036 * @param string $restrictionValue Nom du champ
3037 * @return mixed Valeur du champ
3038 */
3039 function getRestrictionValue($restrictionValue){
3040
3041 // Initialisation de la valeur de retour
3042 $return = false;
3043
3044 // Récupére les valeurs du dossier
3045 $value_dossier = $this->get_dossier_actual();
3046
3047 //
3048 if (is_numeric($restrictionValue)) {
3049 $return = $restrictionValue;
3050 }elseif (isset($value_dossier[$restrictionValue])) {
3051 $return = $value_dossier[$restrictionValue];
3052 }elseif (isset($this->valF[$restrictionValue])) {
3053 $return = $this->valF[$restrictionValue];
3054 }
3055
3056 // Retourne la valeur du champ
3057 return $return;
3058 }
3059
3060
3061 /**
3062 * Calcul une regle à partir des données de l'url et affiche son
3063 * résultat au format json
3064 */
3065 public function is_date_limite_notification_dossier_depasse($contexte_notification_manuelle = False) {
3066 // Récupération de la date limite
3067 $dossier = $this->f->get_inst__om_dbform(array(
3068 'obj' => 'dossier',
3069 'idx' => $this->getVal('dossier')
3070 ));
3071 $date_limite = $dossier->getVal('incomplet_notifie') !== 't' ?
3072 $dossier->getVal('date_limite') :
3073 $dossier->getVal('date_limite_incompletude');
3074 // Ajout d'un jour à la date limite (reglementaire lors de la notification
3075 // par demat)
3076 $date_limite = $this->f->mois_date($date_limite, "1", "+", "jour");
3077 // Compare la date limite à j+1 et la date du jour
3078 // La date du jour est récupérée via la fonction date pour pouvoir comparer
3079 // des timestamps de début de journée
3080 if ($contexte_notification_manuelle === True) return strtotime($date_limite) < strtotime(date("Y-m-d")) ? True : False;
3081 echo strtotime($date_limite) < strtotime(date("Y-m-d")) ? 'True' : 'False';
3082 }
3083
3084 /**
3085 * Vérifie si le type d'événement en cours fait partie des types autorisés en paramètres.
3086 *
3087 * @param object $ev Instance de l'événement associé à l'instruction
3088 * @param array $params Types d'événements autorisés
3089 * @return boolean
3090 */
3091 public function is_type_evenement_autorise($ev, $params = array()) {
3092 $type_evenement = $ev->getVal('type');
3093 if (isset($params["types_evenements_autorises"])
3094 && ! empty($params["types_evenements_autorises"])
3095 && in_array($type_evenement, $params["types_evenements_autorises"], true) === true) {
3096 return true;
3097 }
3098 return false;
3099 }
3100
3101 /**
3102 * Vérifie si la date limite de notification au demandeur est dépassée.
3103 *
3104 * @param boolean $add_one_day Active ou non l'ajout d'un jour à la DLN
3105 * @return boolean
3106 */
3107 public function is_date_limite_notification_premier_mois_depasee($add_one_day = false) {
3108 $dln = $this->getVal('archive_date_notification_delai');
3109 if ($dln === ''
3110 || $dln === null) {
3111 //
3112 $dossier = $this->f->get_inst__om_dbform(array(
3113 'obj' => 'dossier',
3114 'idx' => $this->getVal('dossier')
3115 ));
3116 $dln = $dossier->getVal('date_notification_delai');
3117 }
3118 if ($dln === ''
3119 || $dln === null) {
3120 //
3121 return false;
3122 }
3123 // Ajout d'un jour à la date limite de notification
3124 if ($add_one_day === true) {
3125 $dln = $this->f->mois_date($dln, "1", "+", "jour");
3126 }
3127 // Compare la date limite de notification et la date du jour
3128 return strtotime($dln) <= strtotime(date("Y-m-d"));
3129 }
3130
3131 /**
3132 * Calcul des règle d'action selon leur type.
3133 *
3134 * Types de règle :
3135 * - date
3136 * - numeric
3137 * - text
3138 * - bool
3139 * - specific
3140 * - technical_data
3141 *
3142 * @param string $rule Règle d'action.
3143 * @param string $rule_name Nom de la règle.
3144 * @param string $type Type de la règle.
3145 *
3146 * @return mixed Résultat de la règle
3147 */
3148 public function regle($rule, $rule_name, $type = null) {
3149
3150 // Supprime tous les espaces de la chaîne de caractère
3151 $rule = str_replace(' ', '', $rule);
3152 // On force les minuscules
3153 $rule = strtolower($rule);
3154 // Coupe la chaîne au niveau de l'opérateur
3155 $operands = explode ("+", $rule);
3156 // Nombre d'opérande
3157 $nb_operands = count($operands);
3158
3159 // Règle à null
3160 if ($rule == "null") {
3161 return null;
3162 }
3163
3164 // Tableau des champs de type date
3165 $rule_type_date = array(
3166 "regle_date_limite",
3167 "regle_date_notification_delai",
3168 "regle_date_complet",
3169 "regle_date_validite",
3170 "regle_date_decision",
3171 "regle_date_chantier",
3172 "regle_date_achevement",
3173 "regle_date_conformite",
3174 "regle_date_rejet",
3175 "regle_date_dernier_depot",
3176 "regle_date_limite_incompletude",
3177 "regle_date_cloture_instruction",
3178 "regle_date_premiere_visite",
3179 "regle_date_derniere_visite",
3180 "regle_date_contradictoire",
3181 "regle_date_retour_contradictoire",
3182 "regle_date_ait",
3183 "regle_date_transmission_parquet",
3184 "regle_date_affichage",
3185 "duree_validite",
3186 "duree_validite_parametrage",
3187 );
3188 // Tableau des champs de type numérique
3189 $rule_type_numeric = array(
3190 );
3191 // Tableau des champs de type text
3192 $rule_type_time_delai = array(
3193 "regle_delai",
3194 "regle_delai_incompletude",
3195 );
3196 // Tableau des champs de type text
3197 $rule_type_text = array(
3198 );
3199 // Tableau des champs de type booléen
3200 $rule_type_bool = array(
3201 "regle_a_qualifier",
3202 "regle_incompletude",
3203 "regle_incomplet_notifie",
3204 "regle_evenement_suivant_tacite_incompletude",
3205 );
3206 // Tableau des champs spécifiques
3207 $rule_type_specific = array(
3208 "regle_autorite_competente",
3209 "regle_etat",
3210 "regle_accord_tacite",
3211 "regle_avis",
3212 "regle_pec_metier",
3213 "regle_etat_pendant_incompletude",
3214 );
3215 // Tableau des champs de données techniques
3216 $rule_type_technical_data = array(
3217 'regle_donnees_techniques1',
3218 'regle_donnees_techniques2',
3219 'regle_donnees_techniques3',
3220 'regle_donnees_techniques4',
3221 'regle_donnees_techniques5',
3222 );
3223 // Tableau des champs simple
3224 $rule_type_simple = array(
3225 "regle_dossier_instruction_type",
3226 );
3227
3228 // Définit le type du champ
3229 if (in_array($rule_name, $rule_type_date) == true) {
3230 $type = "date";
3231 }
3232 if (in_array($rule_name, $rule_type_numeric) == true) {
3233 $type = "numeric";
3234 }
3235 if (in_array($rule_name, $rule_type_text) === true) {
3236 $type = "text";
3237 }
3238 if (in_array($rule_name, $rule_type_bool) === true) {
3239 $type = "bool";
3240 }
3241 if (in_array($rule_name, $rule_type_specific) === true) {
3242 $type = "specific";
3243 }
3244 if (in_array($rule_name, $rule_type_technical_data) === true) {
3245 $type = 'technical_text';
3246 }
3247 if (in_array($rule_name, $rule_type_simple) === true) {
3248 $type = 'simple';
3249 }
3250 if (in_array($rule_name, $rule_type_time_delai) === true) {
3251 $type = "time_delai";
3252 }
3253
3254 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3255 // Récupère directement la valeur de l'opérande
3256 if ($type === 'specific') {
3257 //
3258 return $this->get_value_for_rule($rule);
3259 }
3260
3261 // Initialisation des variables
3262 $total_numeric = 0;
3263 $res_text = '';
3264 $final_date = null;
3265
3266 // Pour chaque opérande
3267 foreach ($operands as $key => $operand) {
3268 // Si c'est une règle de type date
3269 if ($type == 'date') {
3270 if (is_numeric($operand) === false){
3271 $rule_value = $this->get_value_for_rule($operand);
3272 if (
3273 $rule_value !== null
3274 && (
3275 strpos($operand, 'mois') !== false
3276 || strpos($operand, 'jour') !== false
3277 )
3278 ){
3279 $rule_value = $operand;
3280 }
3281 if ($rule_value !== null){
3282 // Vérifie si l'opérande est une date
3283 if ($this->f->check_date($rule_value) == true) {
3284 // Affecte la date
3285 $final_date = $rule_value;
3286 }else{
3287 // Gère les opérandes
3288 preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3289
3290 // Ajoute l'opérande au total
3291 foreach ($matches[1] as $matche_key => $matche_value) {
3292 $timelength = $matches[1][$matche_key][0];
3293 $timetype = 'mois';
3294 if ( $matches[2][$matche_key][0] != ''){
3295 $timetype = $matches[2][$matche_key][0];
3296 }
3297 // Ajout au calcul de la date
3298 $final_date = $this->f->mois_date(
3299 $final_date,
3300 $timelength,
3301 "+",
3302 $timetype
3303 );
3304 }
3305 }
3306 }
3307 }
3308 // Les autres opérandes doivent être que des numériques
3309 if (is_numeric($operand) == true) {
3310 // Ajoute l'opérande au total
3311 // Ajout au calcul de la date
3312 $final_date = $this->f->mois_date($final_date,
3313 $operand, "+");
3314 }
3315 }
3316
3317 // Si c'est une règle de type numérique
3318 if ($type == 'numeric') {
3319 // Les opérandes doivent être que des numériques
3320 if (is_numeric($operand) == true) {
3321 // Ajoute l'opérande au total
3322 $total_numeric += $operand;
3323 }
3324 if (is_numeric($operand) === false
3325 && $this->get_value_for_rule($operand) !== null
3326 && is_numeric($this->get_value_for_rule($operand)) == true) {
3327 // Ajoute l'opérande au total
3328 $total_numeric += $this->get_value_for_rule($operand);
3329 }
3330 }
3331
3332 // Si c'est une règle de type text
3333 if ($type === 'text' || $type === 'technical_text') {
3334 // Concatène toutes les chaînes de caractère
3335 $res_text .= $this->get_value_for_rule($operand);
3336 }
3337
3338 // Si c'est une règle de type time_delai
3339 if ($type === 'time_delai') {
3340 $rule_value = $this->get_value_for_rule($operand);
3341 if ( strlen($res_text) != 0) {
3342 $res_text .= "+";
3343 }
3344 if ($rule_value != null && $rule_value != ''){
3345 // Supprime tous les espaces de la chaîne de caractère
3346 // Concatène toutes les chaînes de caractère
3347 $res_text .= $rule_value;
3348 } else {
3349 $res_text .= $operand;
3350 }
3351 }
3352
3353 }
3354
3355 // Résultat pour une règle de type date
3356 if ($type == 'date') {
3357 // Retourne la date
3358 return $final_date;
3359 }
3360
3361 // Résultat pour une règle de type numérique
3362 if ($type == 'numeric') {
3363 // Retourne le calcul
3364 return $total_numeric;
3365 }
3366
3367 // Résultat pour une règle de type text
3368 if (in_array($type, array('text', 'technical_text')) === true) {
3369 // Retourne la chaîne de caractère
3370 return $res_text;
3371 }
3372
3373 // Résultat pour une règle de type text
3374 if (in_array($type, array('time_delai')) === true) {
3375 // Traitement de la valeur à afficher
3376 $res_text = str_replace(' ', '', $res_text);
3377 $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3378 $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3379 $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3380 return $res_text;
3381 }
3382
3383 if ($type === 'simple' || $type === 'bool') {
3384 // Retourne la valeur du champs rule
3385 return $rule;
3386 }
3387 }
3388
3389
3390 /**
3391 * Récupère la valeur du champs dans l'instruction ou dans les données
3392 * techniques.
3393 * Spécifique au calcul des règles.
3394 *
3395 * @param string $field Champ
3396 *
3397 * @return mixed Valeur du champ
3398 */
3399 private function get_value_for_rule($field) {
3400 // Si le champ n'existe pas dans la table instruction
3401 if (array_key_exists($field, $this->valF) === false) {
3402 // Récupère l'instance de la classe donnees_techniques
3403 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3404 // Retourne la valeur de la donnée technique
3405 return $inst_donnees_techniques->getVal($field);
3406 }
3407
3408 //
3409 return $this->valF[$field];
3410 }
3411
3412
3413 /**
3414 * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3415 * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3416 *
3417 * Pour générer le nom du fichier, si le type de document en lien avec l'évènement existe, on récupère son libellé
3418 * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3419 *
3420 * @return string : le nom du fichier générer
3421 */
3422 function determinate_name_doc_pdf(){
3423 $id_DI = $this->getVal("dossier");
3424 $date = date('Ymd');
3425 $data = "";
3426
3427 // Récupération de l'id de la lettre type associée à l'instruction
3428 $data = $this->getVal("lettretype");
3429
3430 // Récupération de l'id de l'instruction
3431 $id_instr = $this->getVal("instruction");
3432
3433 // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3434 if(!empty($this->get_type_document_linked_with_instruction())){
3435 $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3436 }
3437
3438 // On retourne le nom du fichier généré
3439 return $this->f->normalize_string(
3440 sprintf(
3441 "%s_%s_%s_%s",
3442 $id_DI,
3443 $id_instr,
3444 $date,
3445 $data
3446 )
3447 );
3448 }
3449
3450
3451 /**
3452 * [get_inst_donnees_techniques description]
3453 *
3454 * @param [type] $donnees_techniques [description]
3455 *
3456 * @return [type] [description]
3457 */
3458 function get_inst_donnees_techniques($donnees_techniques = null) {
3459 //
3460 if (isset($this->inst_donnees_techniques) === false ||
3461 $this->inst_donnees_techniques === null) {
3462 //
3463 if (is_null($donnees_techniques)) {
3464 $donnees_techniques = $this->getDonneesTechniques();
3465 }
3466 //
3467 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3468 "obj" => "donnees_techniques",
3469 "idx" => $donnees_techniques,
3470 ));
3471 }
3472 //
3473 return $this->inst_donnees_techniques;
3474 }
3475
3476
3477 /**
3478 * Retourne l'identifiant des données techniques liées du dossier
3479 * @return string L'identifiant des données techniques liées du dossier
3480 */
3481 function getDonneesTechniques() {
3482
3483 $qres = $this->f->get_one_result_from_db_query(
3484 sprintf(
3485 'SELECT
3486 donnees_techniques
3487 FROM
3488 %1$sdonnees_techniques
3489 WHERE
3490 dossier_instruction = \'%2$s\'',
3491 DB_PREFIXE,
3492 $this->f->db->escapeSimple($this->valF["dossier"])
3493 ),
3494 array(
3495 "origin" => __METHOD__,
3496 )
3497 );
3498
3499 return $qres['result'];
3500 }
3501
3502 /**
3503 * TRIGGER - triggerajouterapres.
3504 *
3505 * - Mise à jour des informations liées au workflow sur le dossier
3506 * - Interface avec le référentiel ERP [105][111]
3507 * - Mise à jour du DA
3508 * - Historisation de la vie du DI
3509 *
3510 * @return boolean
3511 */
3512 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3513 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3514
3515 $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3516 if ($parent_res === false) return $parent_res;
3517
3518 $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3519 $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data);
3520
3521 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3522 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3523 // Instance de la classe evenement
3524 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3525 // Instance de l'état courant du dossier d'instruction
3526 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3527 "obj" => "etat",
3528 "idx" => $inst_di->get_id_etat(),
3529 ));
3530
3531 /**
3532 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3533 * par l'action
3534 */
3535 // état de complétude actuel du dossier
3536 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3537 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3538 $ev_suiv_tacite_incompletude = false;
3539 // Initialisation
3540 $valF = array();
3541 $valF_dt = array();
3542 //
3543 // Récupération des paramètres de l'action
3544 // TODO : remplacer cette requête par l'instanciation de l'action
3545 $qres = $this->f->get_all_results_from_db_query(
3546 sprintf(
3547 'SELECT
3548 *
3549 FROM
3550 %1$saction
3551 WHERE
3552 action = \'%2$s\'',
3553 DB_PREFIXE,
3554 $this->f->db->escapeSimple($this->valF['action'])
3555 ),
3556 array(
3557 "origin" => __METHOD__
3558 )
3559 );
3560 foreach ($qres['result'] as $row) {
3561
3562 // pour chacune des regles, on applique la regle
3563 if ($row['regle_delai'] != '') {
3564 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3565 }
3566 if ($row['regle_accord_tacite'] != '') {
3567 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3568 }
3569 if ($row['regle_avis'] != '') {
3570 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3571 }
3572 if ($row['regle_date_limite'] != '') {
3573 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3574 }
3575 if ($row['regle_date_complet'] != '') {
3576 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3577 }
3578 if ($row['regle_date_dernier_depot'] != '') {
3579 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3580 }
3581 if ($row['regle_date_notification_delai'] != '') {
3582 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3583 }
3584 if ($row['regle_date_decision'] != '') {
3585 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3586 }
3587 if ($row['regle_date_rejet'] != '') {
3588 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3589 }
3590 if ($row['regle_date_validite'] != '') {
3591 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3592 }
3593 if ($row['regle_date_chantier'] != '') {
3594 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3595 }
3596 if ($row['regle_date_achevement'] != '') {
3597 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3598 }
3599 if ($row['regle_date_conformite'] != '') {
3600 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3601 }
3602 if ($row['regle_date_limite_incompletude'] != '') {
3603 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3604 }
3605 if ($row['regle_delai_incompletude'] != '') {
3606 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3607 }
3608 if ($row['regle_autorite_competente'] != '') {
3609 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3610 }
3611 if ($row['regle_etat'] != '') {
3612 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3613 }
3614 if ($row['regle_date_cloture_instruction'] !== '') {
3615 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3616 }
3617 if ($row['regle_date_premiere_visite'] !== '') {
3618 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3619 }
3620 if ($row['regle_date_derniere_visite'] !== '') {
3621 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3622 }
3623 if ($row['regle_date_contradictoire'] !== '') {
3624 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3625 }
3626 if ($row['regle_date_retour_contradictoire'] !== '') {
3627 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3628 }
3629 if ($row['regle_date_ait'] !== '') {
3630 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3631 }
3632 if ($row['regle_donnees_techniques1'] !== '') {
3633 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3634 }
3635 if ($row['regle_donnees_techniques2'] !== '') {
3636 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3637 }
3638 if ($row['regle_donnees_techniques3'] !== '') {
3639 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3640 }
3641 if ($row['regle_donnees_techniques4'] !== '') {
3642 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3643 }
3644 if ($row['regle_donnees_techniques5'] !== '') {
3645 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3646 }
3647 if ($row['regle_date_transmission_parquet'] !== '') {
3648 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3649 }
3650 if ($row['regle_dossier_instruction_type'] !== '') {
3651 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3652 }
3653 // La date d'affichage est modifiée seulement si le champ n'est pas
3654 // renseigné
3655 if ($row['regle_date_affichage'] !== ''
3656 && ($inst_di->getVal('date_affichage') === ''
3657 || $inst_di->getVal('date_affichage') === null)) {
3658 //
3659 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3660 }
3661 //
3662 if ($row['regle_pec_metier'] != '') {
3663 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3664 }
3665 if ($row['regle_a_qualifier'] != '') {
3666 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3667 }
3668 //
3669 if ($row['regle_incompletude'] != '') {
3670 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3671 }
3672 if ($row['regle_incomplet_notifie'] != '') {
3673 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3674 }
3675 if ($row['regle_etat_pendant_incompletude'] != '') {
3676 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3677 }
3678 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3679 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3680 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3681 $ev_suiv_tacite_incompletude = true;
3682 }
3683 }
3684 }
3685
3686 // Si l'événement a un événement suivant tacite
3687 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3688 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3689 // pas associé de le même façon au dossier d'instruction
3690 if ($ev_suiv_tacite_incompletude === false) {
3691 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3692 }
3693 if ($ev_suiv_tacite_incompletude === true) {
3694 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3695 }
3696 }
3697 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3698 if (count($valF_dt) > 0) {
3699 $dt_id = $this->getDonneesTechniques();
3700 // On met à jour le dossier
3701 $cle = " donnees_techniques='".$dt_id."'";
3702 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3703 $this->addToLog(
3704 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3705 VERBOSE_MODE
3706 );
3707 $this->f->isDatabaseError($res1);
3708 // Affichage d'informations à l'utilisateur
3709 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3710 }
3711 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3712 if (count($valF) > 0) {
3713 //
3714 $inst_dossier = $this->f->get_inst__om_dbform(array(
3715 "obj" => "dossier",
3716 "idx" => $this->valF['dossier'],
3717 ));
3718 $valF['instruction'] = $id;
3719 $valF['crud'] = 'create';
3720 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3721 if ($update_by_instruction === false) {
3722 $this->cleanMessage();
3723 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3724 return false;
3725 }
3726 // Affichage d'informations à l'utilisateur
3727 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
3728 }
3729
3730 /**
3731 * Interface avec le référentiel ERP.
3732 *
3733 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3734 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3735 * Déclencheur :
3736 * - L'option ERP est activée
3737 * - Le dossier est marqué comme "connecté au référentiel ERP"
3738 * - Le dossier est de type PC
3739 * - Le formulaire d'ajout d'un événement d'instruction est validé
3740 * avec un événement pour lequel les services ERP doivent être
3741 * informé
3742 */
3743 //
3744 if ($this->f->is_option_referentiel_erp_enabled() === true
3745 && $inst_di->is_connected_to_referentiel_erp() === true
3746 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3747 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3748 //
3749 $infos = array(
3750 "dossier_instruction" => $this->valF['dossier'],
3751 "decision" => $inst_evenement->getVal("libelle"),
3752 );
3753 //
3754 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3755 if ($ret !== true) {
3756 $this->cleanMessage();
3757 $this->addToMessage(__("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3758 return false;
3759 }
3760 $this->addToMessage(__("Notification (105) du référentiel ERP OK."));
3761 }
3762
3763 // Si le mode en rédaction intégrale est activé
3764 if (isset($this->valF['flag_edition_integrale']) === true
3765 && $this->valF['flag_edition_integrale'] === true) {
3766 $redactionIntegraleValF = array();
3767
3768 // Récupère la collectivite du dossier d'instruction
3769 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3770 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3771 // Récupère le corps de la lettre type
3772 $params = array(
3773 "specific" => array(
3774 "corps" => array(
3775 "mode" => "get",
3776 )
3777 ),
3778 );
3779 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3780 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3781 // Récupère le titre de la lettre type
3782 $params = array(
3783 "specific" => array(
3784 "titre" => array(
3785 "mode" => "get",
3786 )
3787 ),
3788 );
3789 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3790 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3791
3792 // mise à jour en base de données
3793 $res = $this->f->db->autoExecute(
3794 DB_PREFIXE.$this->table,
3795 $redactionIntegraleValF,
3796 DB_AUTOQUERY_UPDATE,
3797 $this->clePrimaire."=".$id
3798 );
3799 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3800 if ($this->f->isDatabaseError($res, true) === true) {
3801 return false;
3802 }
3803 }
3804
3805 /**
3806 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3807 */
3808 // Si la finalisation automatique de l'événement est activée
3809 // ET si l'instruction n'a pas déjà été finalisée
3810 // ET s'il existe une lettre type associée
3811 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3812 && $inst_evenement->getVal('om_final_instruction') !== 't'
3813 && $inst_evenement->getVal('lettretype') !== ''
3814 && $inst_evenement->getVal('lettretype') !== null) {
3815
3816 // On instancie l'instruction
3817 $inst_instruction = $this->f->get_inst__om_dbform(array(
3818 "obj" => "instruction",
3819 "idx" => $this->valF[$this->clePrimaire],
3820 ));
3821
3822 // On finalise l'instruction dans le contexte de finalisation : action 100
3823 $inst_instruction->setParameter('maj', 100);
3824 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3825
3826 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3827 // et dans le message d'erreur
3828 if ($finalize === false) {
3829 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3830 $this->addToMessage(__("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3831 return false;
3832 }
3833 }
3834
3835 /**
3836 * Finalisation automatique des instructions tacites ou retours.
3837 */
3838 // Si l'option de finalisation automatique des instructions tacites ou
3839 // retours est activée et l'événement d'instruction a une lettre type
3840 // associée
3841 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3842 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3843 && $inst_evenement->getVal('lettretype') !== ''
3844 && $inst_evenement->getVal('lettretype') !== null) {
3845
3846 // Rècupère l'identifiant de l'événement
3847 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3848
3849 // Si l'événement d'instruction est identifié comme un événement
3850 // retour
3851 // OU l'événement d'instruction est l'événement suivant tacite du
3852 // dossier d'instruction (incomplétude prise en compte)
3853 // ET l'événement d'instruction n'a pas déjà été finalisé
3854 if (($inst_evenement->getVal("retour") === 't'
3855 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3856 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3857 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3858
3859 // Finalise l'instruction
3860 $inst_instruction = $this->f->get_inst__om_dbform(array(
3861 "obj" => "instruction",
3862 "idx" => $this->valF[$this->clePrimaire],
3863 ));
3864 $inst_instruction->setParameter('maj', 100);
3865 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3866 if ($finalize === false) {
3867 //
3868 return false;
3869 }
3870 }
3871 }
3872
3873 /**
3874 * Mise à jour de la version de clôture *version_clos* du dossier si et
3875 * seulement si l'instruction met à jour l'état du dossier.
3876 */
3877 if (isset($valF['etat']) === true
3878 && $valF['etat'] !== null
3879 && $valF['etat'] !== '') {
3880 // Instanciation de l'état appliqué sur le dossier par l'instruction
3881 $inst_etat = $this->f->get_inst__om_dbform(array(
3882 "obj" => "etat",
3883 "idx" => $valF['etat'],
3884 ));
3885 //
3886 $update_version_clos = null;
3887 // En cas d'instruction qui clôture le dossier
3888 if ($inst_etat->getVal('statut') === 'cloture') {
3889 $update_version_clos = $inst_di->update_version_clos('up');
3890 }
3891 // En cas d'instruction qui rouvre le dossier
3892 if ($inst_current_etat->getVal('statut') === 'cloture'
3893 && $inst_etat->getVal('statut') !== 'cloture') {
3894 //
3895 $update_version_clos = $inst_di->update_version_clos('down');
3896 //
3897 $params = array(
3898 'di_reopened' => true,
3899 );
3900 }
3901 //
3902 if ($update_version_clos === false) {
3903 $this->f->addToLog(sprintf(
3904 "%s() : ERREUR - %s %s",
3905 __METHOD__,
3906 sprintf(
3907 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3908 $inst_di->getVal($inst_di->clePrimaire)
3909 ),
3910 sprintf(
3911 __("L'instruction tente d'appliquer l'état %s."),
3912 $inst_etat->getVal($inst_etat->clePrimaire)
3913 )
3914 ));
3915 $this->addToMessage(sprintf(
3916 "%s %s",
3917 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3918 __("Veuillez contacter votre administrateur.")
3919 ));
3920 return false;
3921 }
3922 }
3923
3924 /**
3925 * Notification automatique
3926 */
3927 // Notification automatique à l'ajout de l'instruction si la notification
3928 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3929 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3930 ($inst_evenement->getVal('lettretype') === null || $inst_evenement->getVal('lettretype') === '')) {
3931
3932 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3933 $msgLog = sprintf(
3934 '%s %s : %d',
3935 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3936 __('Instruction notifiée'),
3937 $id
3938 );
3939
3940 // Récupération de la liste des demandeurs à notifier et de la catégorie
3941 $categorie = $this->f->get_param_option_notification($collectivite_di);
3942 $isPortal = $categorie === PORTAL;
3943 $demandeursANotifie = $this->get_demandeurs_notifiable(
3944 $this->valF['dossier'],
3945 $isPortal
3946 );
3947
3948 //
3949 $msg_notif = '';
3950
3951 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3952 $demandeurPrincipalNotifie = false;
3953 foreach ($demandeursANotifie as $demandeur) {
3954 // Identifie si le demandeur principal a été notifié ou pas
3955 // et récupère ses informations
3956 if ($demandeur['petitionnaire_principal'] == 't') {
3957 $demandeurPrincipalNotifie = true;
3958 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3959 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3960 // suivante. On le considère également comme non notifié pour gérer l'envoie
3961 // des messages d'erreurs
3962 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3963 // d'impact sur la notification
3964 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3965 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3966 $demandeurPrincipalNotifie = false;
3967 continue;
3968 }
3969 }
3970 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
3971 $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
3972 // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
3973 // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
3974 if (! empty($option_bloquer_notif_auto_dln_types_evenements)
3975 && $this->is_type_evenement_autorise($inst_evenement, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
3976 && $this->is_date_limite_notification_premier_mois_depasee() === true) {
3977 // Ajout de la notif et récupération de son id
3978 $idNotif = $this->ajouter_notification(
3979 $this->valF[$this->clePrimaire],
3980 $this->f->get_connected_user_login_name(),
3981 $demandeur,
3982 $collectivite_di,
3983 array(),
3984 true,
3985 'Echec',
3986 __('La date limite de notification au demandeur est dépassée')
3987 );
3988 if ($idNotif === false) {
3989 // Termine le traitement
3990 $this->addToLog(
3991 sprintf('%s() : %s', __METHOD__, $msgLog),
3992 DEBUG_MODE
3993 );
3994 return $this->end_treatment(__METHOD__, false);
3995 }
3996 $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
3997 }
3998 else {
3999 // Ajout de la notif et récupération de son id
4000 $idNotif = $this->ajouter_notification(
4001 $this->valF[$this->clePrimaire],
4002 $this->f->get_connected_user_login_name(),
4003 $demandeur,
4004 $collectivite_di,
4005 array(),
4006 true
4007 );
4008 if ($idNotif === false) {
4009 $this->addToLog(
4010 sprintf('%s() : %s', __METHOD__, $msgLog),
4011 DEBUG_MODE
4012 );
4013 return false;
4014 }
4015 // Création de la tache en lui donnant l'id de la notification
4016 $notification_by_task = $this->notification_by_task(
4017 $idNotif,
4018 $this->valF['dossier'],
4019 $categorie
4020 );
4021 if ($notification_by_task === false) {
4022 $this->addToLog(
4023 sprintf('%s() : %s', __METHOD__, $msgLog),
4024 DEBUG_MODE
4025 );
4026 $this->addToMessage(
4027 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4028 );
4029 return false;
4030 }
4031 $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
4032 }
4033 }
4034 // Pour la notification par mail ou la notification via portal si le dossier a
4035 // été déposés via portal, si le demandeur principal n'est pas notifiable,
4036 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4037 // laquelle le demandeur principal n'a pas pu être notifié
4038 $depotPortal = $this->dossier_depose_sur_portail();
4039 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4040 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
4041 // ' ' permet de mettre un espace entre les 2 msg de log.
4042 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4043 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4044 $erreursParam = $this->get_info_notification_fail($val['dossier']);
4045 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
4046 // Ajout de la notif et récupération de son id
4047 $idNotif = $this->ajouter_notification(
4048 $this->valF[$this->clePrimaire],
4049 $this->f->get_connected_user_login_name(),
4050 $demandeurPrincipal,
4051 $collectivite_di,
4052 array(),
4053 true,
4054 'Echec',
4055 implode(' ', $erreursParam)
4056 );
4057 if ($idNotif === false) {
4058 $this->addToLog(
4059 sprintf('%s() : %s', __METHOD__, $msgLog),
4060 DEBUG_MODE
4061 );
4062 $this->addToMessage(
4063 __('Erreur : la création de la notification a échouée.').
4064 __("Veuillez contacter votre administrateur.")
4065 );
4066 return false;
4067 }
4068 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4069 // de l'échec de la notification
4070 $dossier_message = $this->get_inst_dossier_message(0);
4071 $dossier_message_val = array(
4072 'dossier' => $val['dossier'],
4073 'type' => __('erreur expedition'),
4074 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
4075 'login' => $_SESSION['login'],
4076 'date_emission' => date('Y-m-d H:i:s'),
4077 'contenu' => __('Échec lors de la notification de l\'instruction ').
4078 $inst_evenement->getVal('libelle').
4079 '.<br>'.
4080 implode("\n", $erreursParam).
4081 '<br>'.
4082 __('Veuillez corriger ces informations avant de renvoyer la notification.')
4083 );
4084 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4085 // Si une erreur se produit pendant l'ajout
4086 if ($add !== true) {
4087 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4088 return false;
4089 }
4090 }
4091 $this->addToMessage($msg_notif);
4092 }
4093
4094 // Notification automatique en cas de dépôt de dossier dématérialisé
4095 // Vérifie si l'option de notification est active et si il s'agit bien d'une
4096 // instruction de récépissé
4097 if (
4098 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4099 && $this->is_instruction_recepisse()
4100 ) {
4101 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4102 $msgLog = sprintf(
4103 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4104 $val['dossier']
4105 );
4106 // Récupère l'instance de la demande
4107 $demande = $inst_di->get_inst_demande();
4108 // Vérifie que le dossier a été déposé via platau ou portal
4109 if (
4110 ($demande->getVal('source_depot') == PLATAU ||
4111 $demande->getVal('source_depot') == PORTAL)
4112 ) {
4113 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4114 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4115 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4116 if (empty($listeEmails)) {
4117 $this->addToLog(
4118 sprintf(
4119 '%s(): %s %s',
4120 __METHOD__,
4121 $msgLog,
4122 __('Aucun courriel paramétré.')
4123 ),
4124 DEBUG_MODE
4125 );
4126 } else {
4127 foreach ($listeEmails as $email) {
4128 // Ajout de la notif et récupération de son id
4129 $destinataire = array(
4130 'destinataire' => $email,
4131 'courriel' => $email
4132 );
4133 $idNotif = $this->ajouter_notification(
4134 $this->valF[$this->clePrimaire],
4135 $this->f->get_connected_user_login_name(),
4136 $destinataire,
4137 $collectivite_di,
4138 array(),
4139 true
4140 );
4141 if ($idNotif === false) {
4142 $this->addToLog(
4143 sprintf('%s(): %s', __METHOD__, $msgLog),
4144 DEBUG_MODE
4145 );
4146 return false;
4147 }
4148 // Création de la tache en lui donnant l'id de la notification
4149 $notification_by_task = $this->notification_by_task(
4150 $idNotif,
4151 $this->valF['dossier'],
4152 'mail',
4153 'notification_depot_demat'
4154 );
4155 if ($notification_by_task === false) {
4156 $this->addToMessage(
4157 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4158 );
4159 $this->addToLog(
4160 sprintf('%s(): %s', __METHOD__, $msgLog),
4161 DEBUG_MODE
4162 );
4163 return false;
4164 }
4165 }
4166 }
4167 }
4168 }
4169
4170 /**
4171 * Mise à jour de la date de dernière modification du dossier
4172 */
4173 $inst_di->update_last_modification_date();
4174
4175 /**
4176 * Mise à jour des données du DA.
4177 */
4178 $inst_da = $inst_di->get_inst_dossier_autorisation();
4179 $params['di_id'] = $this->valF['dossier'];
4180 if ($inst_da->majDossierAutorisation($params) === false) {
4181 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4182 $this->correct = false;
4183 return false;
4184 }
4185
4186 /**
4187 * Historisation de la vie du DI.
4188 */
4189
4190 $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4191
4192 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4193 $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data);
4194 return $res;
4195 }
4196
4197 /**
4198 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4199 * sont remplies.
4200 * Les conditions vérifiées sont les suivantes :
4201 * - L'option de notification *option_notification* doit être définie
4202 * - Le petitionnaire principal doit accepter les notifications
4203 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4204 * - Le pétitionnaire principal doit avoir une adresse mail correcte
4205 * Pour chaque vérification effectué un message d'erreur est ajouté si la
4206 * condition n'est pas remplie.
4207 * Renvoie le message d'erreur en sortie.
4208 *
4209 * @param string identifiant du dossier sur lequel les notifications ont échouée
4210 * @return string
4211 */
4212 public function get_info_notification_fail($dossier = null) {
4213 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4214 // utilise celui associé à l'instruction
4215 if ($dossier == null) {
4216 $dossier = $this->getVal('dossier');
4217 }
4218 // Tableau contenant la liste des messages d'erreur
4219 $errorMessage = array();
4220 // Récupère l'option de notification
4221 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4222 $option_notification = $this->f->get_param_option_notification($collectivite_di);
4223 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4224 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4225 }
4226 // Récupère les informations du demandeurs principal
4227 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4228 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4229 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4230 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4231 }
4232 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4233 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4234 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4235 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4236 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4237 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4238 $infoPetitionnaire['courriel'].
4239 '.';
4240 }
4241 } else {
4242 // Si le courriel du pétitionnaire principal
4243 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4244 }
4245
4246 return $errorMessage;
4247 }
4248
4249 /**
4250 * Méthode servant à vérifier si un dossier a été déposé sur
4251 * le portail citoyen ou pas.
4252 * La verification se fait via une requête sql dans laquelle
4253 * on va chercher un dossier ayant pour id l'identifiant de
4254 * dossier associé à l'instruction et pour lequel la demande
4255 * associée la plus ancienne est une demande de création de
4256 * dossier via portail
4257 *
4258 * @param string identifiant du dossier. Si non renseigné c'est le dossier
4259 * associé à l'instruction qui est utilisé
4260 * @return boolean|void true : dossier déposé via portail, false : dossier
4261 * non déposé via portail et null : erreur de base de données.
4262 */
4263 protected function dossier_depose_sur_portail($dossier = null) {
4264 if (empty($dossier)) {
4265 $dossier = $this->getVal('dossier');
4266 }
4267 $qres = $this->f->get_one_result_from_db_query(
4268 sprintf(
4269 'SELECT
4270 dossier
4271 FROM
4272 %1$sdossier
4273 -- Récuperation de la première demande associée au dossier
4274 LEFT JOIN (
4275 SELECT
4276 demande,
4277 dossier_instruction,
4278 source_depot
4279 FROM
4280 %1$sdemande
4281 WHERE
4282 dossier_instruction = \'%2$s\'
4283 ORDER BY
4284 demande ASC
4285 LIMIT 1
4286 ) AS demande
4287 ON dossier.dossier = demande.dossier_instruction
4288 WHERE
4289 dossier.dossier = \'%2$s\'
4290 AND demande.source_depot = \'portal\'',
4291 DB_PREFIXE,
4292 $this->f->db->escapeSimple($dossier)
4293 ),
4294 array(
4295 "origin" => __METHOD__,
4296 "force_return" => true,
4297 )
4298 );
4299 if ($qres["code"] !== "OK") {
4300 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4301 return;
4302 }
4303 // Si on a un résultat c'est que le dossier a été déposé via le portail
4304 return ! empty($qres["result"]);
4305 }
4306
4307 public function is_service_notifiable() {
4308 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4309
4310 // Si l'instruction a une édition non finalisé quel que soit
4311 // le type de notification, il n'est pas notifiable
4312 if ($this->has_an_edition() === true) {
4313 if ($this->is_unfinalizable_without_bypass() === false) {
4314 return false;
4315 }
4316 }
4317 // Vérifie si la notification des tiers est active pour l'évènement
4318 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4319 }
4320
4321 public function is_tiers_notifiable() {
4322 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4323
4324 // Si l'instruction a une édition non finalisé quel que soit
4325 // le type de notification, il n'est pas notifiable
4326 if ($this->has_an_edition() === true) {
4327 if ($this->is_unfinalizable_without_bypass() === false) {
4328 return false;
4329 }
4330 }
4331 // Vérifie si la notification des tiers est active pour l'évènement
4332 return ! empty($evenement->getVal('notification_tiers'));
4333 }
4334
4335 /**
4336 * Méthode permettant de savoir si une instruction peut
4337 * être notifiée manuellement selon les différents types
4338 * de notification.
4339 *
4340 * Si l'instruction a une édition non finalisée alors elle n'est pas
4341 * manuellement notifiable.
4342 * Si l'instruction est associé à un événement de notification pour
4343 * lequel un retour signature est recquis, elle n'est notifiable que
4344 * si la date de retour de signature est remplie.
4345 * Par défaut si le type de notification n'est pas connu alors l'instruction
4346 * n'est pas notifiable.
4347 * Pour tous les autres cas l'instruction est manuellement notifiable.
4348 *
4349 * @return boolean true : notifiable | false : non notifiable
4350 */
4351 public function is_notifiable_by_task_manual() {
4352 $ev = $this->get_inst_evenement($this->getVal('evenement'));
4353
4354 // Si l'instruction a une édition non finalisé quel que soit
4355 // le type de notification, il n'est pas notifiable
4356 if ($this->has_an_edition() === true) {
4357 if ($this->is_unfinalizable_without_bypass() === false) {
4358 return false;
4359 }
4360 }
4361
4362 // Gestion des différents cas selon la valeur du champs notification
4363 if ($ev->getVal('notification') == 'notification_manuelle' ||
4364 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4365 $ev->getVal('notification') == 'notification_automatique'
4366 ) {
4367 return true;
4368 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4369 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4370 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4371 $this->getVal('date_retour_signature') != null &&
4372 $this->getVal('date_retour_signature') != ''
4373 ) {
4374 return true ;
4375 }
4376 return false;
4377 }
4378
4379 /**
4380 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4381 * pour le demandeur principal.
4382 *
4383 * @return boolean true si le traitement à réussi
4384 */
4385 protected function notifier_demandeur_principal_via_portal() {
4386 $this->begin_treatment(__METHOD__);
4387 $message = '';
4388 // Récupération des informations concernant le demandeur
4389 $dossier = $this->getVal('dossier');
4390 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4391 $demandeur = $this->get_demandeurs_notifiable(
4392 $dossier,
4393 true
4394 );
4395 if ($demandeur !== array()) {
4396 $destinataire = array_values($demandeur);
4397 // Ajout de la notif et récupération de son id
4398 $idNotification = $this->ajouter_notification(
4399 $this->getVal($this->clePrimaire),
4400 $this->f->get_connected_user_login_name(),
4401 $destinataire[0],
4402 $collectivite_di,
4403 array(),
4404 true
4405 );
4406 if ($idNotification === false) {
4407 return $this->end_treatment(__METHOD__, false);
4408 }
4409 // Création de la tâche en lui donnant l'id de la notification
4410 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4411 if ($notification_by_task === false) {
4412 $this->addToMessage(
4413 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4414 );
4415 return $this->end_treatment(__METHOD__, false);
4416 }
4417 $this->addToMessage($message .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction.")));
4418 return $this->end_treatment(__METHOD__, true);
4419 }
4420 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4421 return $this->end_treatment(__METHOD__, false);
4422 }
4423
4424 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4425 // Si le type n'est pas correctement spécifié, alors il est calculé
4426 if ($type !== 'notification_recepisse'
4427 && $type !== 'notification_instruction'
4428 && $type !== 'notification_decision'
4429 && $type !== 'notification_service_consulte'
4430 && $type !== 'notification_tiers_consulte'
4431 && $type !== 'notification_depot_demat'
4432 && $type !== 'notification_commune'
4433 && $type !== 'notification_signataire') {
4434 //
4435 $type = 'notification_instruction';
4436 // Vérifie si l'instruction est un récépissé
4437 if ($this->is_instruction_recepisse()) {
4438 $type = 'notification_recepisse';
4439
4440 }
4441 // Vérifie si l'instruction est une décision
4442 if ($type !== 'notification_recepisse') {
4443 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4444 if ($avis_decision !== null && $avis_decision !== '') {
4445 $type = 'notification_decision';
4446 }
4447 }
4448 }
4449 // Préparation des valeurs de la tâche
4450 $task_val = array(
4451 'type' => $type,
4452 'object_id' => $object_id,
4453 'dossier' => $dossier,
4454 'category' => $category,
4455 );
4456 // Préparation de la tache de notification
4457 $inst_task = $this->f->get_inst__om_dbform(array(
4458 "obj" => "task",
4459 "idx" => 0,
4460 ));
4461
4462 $add_task = $inst_task->add_task(array('val' => $task_val));
4463 if ($add_task === false) {
4464 $this->addToLog(
4465 sprintf(
4466 '%s(): %s %s : %s',
4467 __METHOD__,
4468 __('Echec de l\'ajout de la tâche de notification.'),
4469 __('Paramétrage de la tâche'),
4470 var_export($task_val, true)
4471 ),
4472 DEBUG_MODE
4473 );
4474 return false;
4475 }
4476
4477 return true;
4478 }
4479
4480 /**
4481 * Cette méthode permet de savoir si l'instruction est une instruction
4482 * de recepisse (instruction lié à l'ajout du dossier).
4483 *
4484 * Pour cela, on récupère la liste des actions qui ont menées à la création
4485 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4486 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4487 * l'instruction et donc qu'il s'agit d'un recepisse.
4488 *
4489 * @return boolean
4490 */
4491 protected function is_instruction_recepisse() {
4492 // Récupère la liste des actions qui ont mené à la création de
4493 // l'instruction
4494 $trace = debug_backtrace();
4495 // Parcours la liste des actions et si une de ces actions est lié
4496 // à la classe demande on cosidère que l'instruction est un recepisse
4497 foreach ($trace as $key => $value) {
4498 if (isset($trace[$key]['class']) === true
4499 && empty($trace[$key]['class']) === false) {
4500 if (strtolower($trace[$key]['class']) === 'demande') {
4501 return true;
4502 }
4503 }
4504 }
4505 return false;
4506 }
4507
4508 /**
4509 * A partir des informations passée en argument ajoute un nouvel élément
4510 * dans la table instruction_notification.
4511 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4512 * paramètre si le paramétrage attendus est ok.
4513 * Ajoute également un nouvel élement dans instruction_notification_document
4514 * si l'instruction possède une lettretype.
4515 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4516 * élement dans la table instruction_notification_document qui correspondra
4517 * à l'annexe de la notification.
4518 *
4519 * @param integer identifiant de l'instruction notifiée
4520 * @param string information concernant l'emetteur
4521 * @param array tableau contenant 2 entrées
4522 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4523 * - courriel : adresse mail de la personne à notifier
4524 * @param integer identifiant de la collectivité permettant de récupèrer les
4525 * paramètres à valider
4526 * @param boolean indique si la notification est automatique ou manuelle
4527 * @param integer identifiant d'une instruction dont l'édition sera annexé
4528 * à la notification
4529 *
4530 * @return integer|boolean identifiant de la notification créée si le traitement
4531 * a réussie, false sinon.
4532 */
4533 protected function ajouter_notification(
4534 $idInstruction,
4535 $emetteur,
4536 $destinataire,
4537 $collectiviteId,
4538 $annexes = array(),
4539 $demandeAuto = false,
4540 $statut = 'en cours d\'envoi',
4541 $commentaire = 'Notification en cours de traitement'
4542 ) {
4543 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4544 // de créer la notification
4545 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4546 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4547 $this->addToMessage($msgErreur);
4548 $this->addToLog(
4549 sprintf('%s() : %s', __METHOD__, $msgErreur),
4550 DEBUG_MODE
4551 );
4552 return false;
4553 }
4554 // Préparation de la notification
4555 $inst_notif = $this->f->get_inst__om_dbform(array(
4556 "obj" => "instruction_notification",
4557 "idx" => "]",
4558 ));
4559 $notif_val = array(
4560 'instruction_notification' => null,
4561 'instruction' => $idInstruction,
4562 'automatique' => $demandeAuto,
4563 'emetteur' => $emetteur,
4564 'date_envoi' => null,
4565 'destinataire' => $destinataire['destinataire'],
4566 'courriel' => $destinataire['courriel'],
4567 'date_premier_acces' => null,
4568 'statut' => $statut,
4569 'commentaire' => $commentaire
4570 );
4571
4572 // Création de la notification
4573 $add_notif = $inst_notif->ajouter($notif_val);
4574 if ($add_notif === false) {
4575 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4576 $this->addToLog(
4577 sprintf(
4578 '%s() : %s %s : %s',
4579 __METHOD__,
4580 __("Echec de l'ajout de la notification en base de données."),
4581 __('Paramétrage de la notification'),
4582 var_export($notif_val, true)
4583 ),
4584 DEBUG_MODE
4585 );
4586 return false;
4587 }
4588
4589 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4590 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4591 $add_notif_doc = $this->ajouter_notification_document(
4592 $inst_notif->getVal($inst_notif->clePrimaire),
4593 $this->getVal($this->clePrimaire),
4594 'instruction'
4595 );
4596 if ($add_notif_doc === false) {
4597 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4598 return false;
4599 }
4600 }
4601 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4602 if (! empty($annexes) && is_array($annexes)) {
4603 $add_notif_annexe = $this->ajouter_notification_document_multiple(
4604 $inst_notif->getVal($inst_notif->clePrimaire),
4605 $annexes
4606 );
4607 if ($add_notif_annexe === false) {
4608 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4609 return false;
4610 }
4611 }
4612
4613 // Renvoie l'id de la nouvelle instance de instruction_notification
4614 return $inst_notif->getVal($inst_notif->clePrimaire);
4615 }
4616
4617 /**
4618 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4619 * instance dans la table instruction_notification_document lié a la
4620 * notification dont l'id est passé en paramètre.
4621 *
4622 * @param array tableau contenant les informations nécessaires pour créer les annexes
4623 *
4624 * @return integer|boolean identifiant de la notification créée si le traitement
4625 * a réussie, false sinon.
4626 */
4627 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4628 foreach ($listeDocument as $paramDoc) {
4629 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4630 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4631 return false;
4632 }
4633 }
4634 return true;
4635 }
4636
4637 /**
4638 * Ajoute un élément dans la table instruction_notification_document en utilisant
4639 * les éléments fourni en paramètre
4640 *
4641 * @param integer $idNotification : id de la notification à laquelle on associe le document
4642 * @param integer $idDocument : id de l'objet auquel est rattaché le document
4643 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4644 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4645 *
4646 * @return boolean indique si le traitement a réussi
4647 */
4648 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4649 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4650 "obj" => "instruction_notification_document",
4651 "idx" => "]",
4652 ));
4653 // l'attribut instruction doit obligatoirement être renseigné
4654 // pour éviter toutes confusion avec d'autres instruction l'id
4655 // 0 est donné au document n'appartenant pas aux instructions
4656 $notif_doc_val = array(
4657 'instruction_notification_document' => null,
4658 'instruction_notification' => $idNotification,
4659 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4660 'document_type' => $tableDocument,
4661 'document_id' => $idDocument,
4662 'cle' => $this->getCleAccesDocument(),
4663 'annexe' => $isAnnexe
4664 );
4665
4666 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4667 if ($add_notif_doc === false) {
4668 $this->addToLog(
4669 sprintf(
4670 '%s() : %s %s : %s',
4671 __METHOD__,
4672 __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4673 __('Paramétrage du document'),
4674 var_export($notif_doc_val, true)
4675 ),
4676 DEBUG_MODE
4677 );
4678 return false;
4679 }
4680 return true;
4681 }
4682
4683 /**
4684 * Récupère via une requête la liste des identifiants des éléments de la table
4685 * parametrage_annexe liés à une instruction.
4686 * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4687 * et lui appliquer le traitement de suppression.
4688 *
4689 * @param integer identifiant d'une instruction
4690 * @return boolean état du traitement. True : OK, False : Echec
4691 */
4692 function supprimer_parametrage_annexe($id_instruction) {
4693 // Récupère la liste des parametrage_annexe associés à l'instruction
4694 $qres = $this->f->get_all_results_from_db_query(sprintf(
4695 'SELECT parametrage_annexe
4696 FROM %sparametrage_annexe
4697 WHERE parametrage_annexe.instruction = %d',
4698 DB_PREFIXE,
4699 intval($id_instruction)),
4700 array('origin' => __METHOD__));
4701 // Instancie puis supprime chacun des éléments de la liste
4702 foreach ($qres['result'] as $res) {
4703 $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4704 'obj' => 'parametrage_annexe',
4705 'idx' => $res['parametrage_annexe']
4706 ));
4707 foreach ($parametrage_annexe->champs as $champ) {
4708 $val[$champ] = $parametrage_annexe->getVal($champ);
4709 }
4710 $suppression = $parametrage_annexe->supprimer($val);
4711 // En cas d'échec arrête le traitement et renvoie false
4712 if ($suppression === false) {
4713 return false;
4714 }
4715 }
4716 return true;
4717 }
4718
4719 /**
4720 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4721 *
4722 * @param integer identifiant de la collectivité
4723 * @return boolean
4724 */
4725 protected function is_parametrage_notification_correct($collectiviteId) {
4726 $categorie = $this->f->get_param_option_notification($collectiviteId);
4727 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4728 if ($categorie === 'mail' && $urlAccesNotif === null) {
4729 return false;
4730 }
4731 return true;
4732 }
4733
4734 /**
4735 * TRIGGER - triggermodifierapres.
4736 *
4737 * @return boolean
4738 */
4739 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4740 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4741 $data = array('val' => &$val, 'id' => $id);
4742 $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data);
4743 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4744 $message = '';
4745 $res = true;
4746 // Définit si le dossier d'instruction doit être mis à jour
4747 $update_dossier = true;
4748 // Les actions de mise à jour des dates ne doivent pas appliquer
4749 // l'action de l'événement et donc ne pas mettre à jour le dossier
4750 if ($this->getParameter("maj") == 125
4751 || $this->getParameter("maj") == 170
4752 || $this->getParameter("maj") == 175) {
4753 $update_dossier = false;
4754 }
4755
4756 // Traitement en cas de mise à jour du dossier
4757 if ($update_dossier === true) {
4758 /**
4759 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4760 * si la date de l'evenement est modifiee
4761 */
4762 // Initialisation
4763 $valF = array();
4764 $valF_dt = array();
4765 // Initialisation du type d'événement
4766 $type_evmt = "";
4767 // Récupération de l'action correspondante à l'événement
4768 $evenement = $this->f->get_inst__om_dbform(array(
4769 "obj" => "evenement",
4770 "idx" => $this->valF['evenement']
4771 ));
4772
4773 // Récupération des paramètres de l'action
4774 // TODO : remplacer cette requête par l'instanciation de l'action
4775 $qres = $this->f->get_all_results_from_db_query(
4776 sprintf(
4777 'SELECT
4778 *
4779 FROM
4780 %1$saction
4781 WHERE
4782 action = \'%2$s\'',
4783 DB_PREFIXE,
4784 $this->f->db->escapeSimple($evenement->getVal('action'))
4785 ),
4786 array(
4787 "origin" => __METHOD__
4788 )
4789 );
4790 foreach ($qres['result'] as $row) {
4791 // application des regles sur le courrier + delai
4792 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4793 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4794 }
4795 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4796 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4797 }
4798 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4799 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4800 }
4801 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4802 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4803 }
4804 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4805 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4806 }
4807 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4808 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4809 }
4810 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4811 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4812 }
4813 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4814 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4815 }
4816 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4817 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4818 }
4819 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4820 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4821 }
4822 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4823 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4824 }
4825 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4826 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4827 }
4828 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4829 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4830 }
4831 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4832 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4833 }
4834 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4835 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4836 }
4837 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4838 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4839 }
4840 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4841 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4842 }
4843 if ($row['regle_donnees_techniques1'] !== '') {
4844 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4845 }
4846 if ($row['regle_donnees_techniques2'] !== '') {
4847 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4848 }
4849 if ($row['regle_donnees_techniques3'] !== '') {
4850 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4851 }
4852 if ($row['regle_donnees_techniques4'] !== '') {
4853 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4854 }
4855 if ($row['regle_donnees_techniques5'] !== '') {
4856 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4857 }
4858 if ($row['regle_dossier_instruction_type'] !== '') {
4859 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4860 }
4861 }
4862 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4863 if (count($valF_dt) > 0) {
4864 $dt_id = $this->getDonneesTechniques();
4865 // On met à jour le dossier
4866 $cle = " donnees_techniques='".$dt_id."'";
4867 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4868 $this->addToLog(
4869 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4870 VERBOSE_MODE
4871 );
4872 $this->f->isDatabaseError($res1);
4873 // Affichage d'informations à l'utilisateur
4874 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4875 }
4876 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4877 if (count($valF) > 0) {
4878 $inst_dossier = $this->f->get_inst__om_dbform(array(
4879 "obj" => "dossier",
4880 "idx" => $this->valF['dossier'],
4881 ));
4882 $valF['instruction'] = $id;
4883 $valF['crud'] = 'update';
4884 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4885 if ($update_by_instruction === false) {
4886 $this->cleanMessage();
4887 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4888 return false;
4889 }
4890 // Affichage d'informations à l'utilisateur
4891 $this->addToMessage(__('enregistrement')." ".$this->valF['dossier']." ".__('table')." dossier [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
4892 }
4893 }
4894
4895 // Par défaut les instructions à ajouter suite à la saisie d'une date
4896 // de retour signature ou de notification, utilisent l'action 0
4897 // Si la création d'événement d'instruction suivant est déclenchée par
4898 // une notification suite au traitement d'une tâche (démat') alors l'ajout
4899 // de la nouvelle instruction se fait avec l'action 176
4900 // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4901 // nouvelle instruction, depuis la méthode verifier()
4902 $code_action_add = 0;
4903 if ($this->getParameter("maj") == 175) {
4904 $code_action_add = 176;
4905 }
4906 $restriction = $this->get_restriction($val['evenement']);
4907 $this->restriction_valid = $this->restrictionIsValid($restriction);
4908
4909 if($restriction == "" || $this->restriction_valid ){
4910 // Récupération de tous les paramètres de l'événement sélectionné
4911 // TODO : remplacer cette requête par l'instanciation de l'evenement
4912 $qres = $this->f->get_all_results_from_db_query(
4913 sprintf(
4914 'SELECT
4915 *
4916 FROM
4917 %1$sevenement
4918 WHERE
4919 evenement = %2$d',
4920 DB_PREFIXE,
4921 intval($this->valF['evenement'])
4922 ),
4923 array(
4924 "origin" => __METHOD__
4925 )
4926 );
4927 $current_id = $this->getVal($this->clePrimaire);
4928 foreach ($qres['result'] as $row) {
4929 // Si la date de retour signature est éditée
4930 if (
4931 $this->getVal('date_retour_signature') == "" &&
4932 $this->valF['date_retour_signature'] != ""
4933 ){
4934 // On Lance le hook
4935 $data = array('val' => $this->valF);
4936 $data['dossier'] = $this->valF['dossier'];
4937 $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
4938
4939 // On vérifie si il existe un événement automatique
4940 if (
4941 $row['evenement_retour_signature'] != ""
4942 ) {
4943 $new_instruction = $this->f->get_inst__om_dbform(array(
4944 "obj" => "instruction",
4945 "idx" => "]",
4946 ));
4947 // Création d'un tableau avec la liste des champs de l'instruction
4948 foreach($new_instruction->champs as $champ) {
4949 $valNewInstr[$champ] = "";
4950 }
4951 // Définition des valeurs de la nouvelle instruction
4952 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4953 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4954 $valNewInstr["dossier"] = $this->valF['dossier'];
4955 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4956 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4957 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4958 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4959 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4960 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4961 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4962 $new_instruction->setParameter("maj", $code_action_add);
4963 $new_instruction->class_actions[$code_action_add]["identifier"] =
4964 sprintf(
4965 __("Ajout suite au retour signature de l'instruction %s"),
4966 $current_id
4967 );
4968 $retour = $new_instruction->ajouter($valNewInstr);
4969
4970 //Si une erreur s'est produite et qu'il s'agit d'un problème
4971 //de restriction
4972 if ($retour == false && !$new_instruction->restriction_valid){
4973 $error_message = $this->get_restriction_error_message($restriction);
4974 $this->f->displayMessage("error", $error_message);
4975 $this->addToLog(__METHOD__."(): evenement retour ".
4976 "instruction ".$this->valF[$this->clePrimaire]." : ".
4977 $new_instruction->msg);
4978 }
4979 //Si une erreur s'est produite après le test de la restriction
4980 elseif ($retour == false && $new_instruction->restriction_valid){
4981 $this->correct = false ;
4982 $this->msg .= $new_instruction->msg;
4983 return false;
4984 }
4985 }
4986
4987 $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
4988 }
4989
4990 // Si la date de retour AR est éditée
4991 if (
4992 $this->getVal('date_retour_rar') == "" &&
4993 $this->valF['date_retour_rar'] != ""
4994 ){
4995 // On Lance le hook Notification/Date retour Accusée Reception
4996 $data = array('val' => $this->valF);
4997 $data['dossier'] = $this->valF['dossier'];
4998 $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
4999
5000 // On vérifie si il existe un événement automatique
5001 if ( $row['evenement_retour_ar'] != "" ) {
5002 $new_instruction = $this->f->get_inst__om_dbform(array(
5003 "obj" => "instruction",
5004 "idx" => "]",
5005 ));
5006 // Création d'un tableau avec la liste des champs de l'instruction
5007 foreach($new_instruction->champs as $champ) {
5008 $valNewInstr[$champ] = "";
5009 }
5010 // Définition des valeurs de la nouvelle instruction
5011 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
5012 $valNewInstr["destinataire"] = $this->valF['destinataire'];
5013 $valNewInstr["dossier"] = $this->valF['dossier'];
5014 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
5015 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
5016 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
5017 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
5018 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
5019 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
5020 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
5021 $new_instruction->setParameter("maj", $code_action_add);
5022 $new_instruction->class_actions[$code_action_add]["identifier"] =
5023 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
5024 $retour = $new_instruction->ajouter($valNewInstr);
5025
5026 //Si une erreur s'est produite et qu'il s'agit d'un problème
5027 //de restriction
5028 if ($retour == false && !$new_instruction->restriction_valid) {
5029 $error_message = $this->get_restriction_error_message($restriction);
5030 $this->f->displayMessage("error", $error_message);
5031 $this->addToLog(
5032 __METHOD__."(): evenement retour instruction ".
5033 $this->valF[$this->clePrimaire]." : ".
5034 $new_instruction->msg
5035 );
5036 }
5037 //Si une erreur s'est produite après le test de la restriction
5038 elseif ($retour == false && $new_instruction->restriction_valid){
5039 $this->correct = false ;
5040 $this->msg .= $new_instruction->msg;
5041 return false;
5042 }
5043 }
5044 $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
5045 }
5046
5047 // Si la date_envoi_signature est éditée
5048 if (
5049 $this->getVal('date_envoi_signature') == "" &&
5050 $this->valF['date_envoi_signature'] != ""
5051 ){
5052 // On Lance le hook
5053 $data = array('val' => $this->valF);
5054 $data['dossier'] = $this->valF['dossier'];
5055 $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
5056 }
5057 // Si la date de envoi AR est éditée
5058 if (
5059 $this->getVal('date_envoi_rar') == "" &&
5060 $this->valF['date_envoi_rar'] != ""
5061 ){
5062 // On Lance le hook
5063 $data = array('val' => $this->valF);
5064 $data['dossier'] = $this->valF['dossier'];
5065 $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
5066 }
5067 // Si la date de envoi controle legalite est éditée
5068 if (
5069 $this->getVal('date_envoi_controle_legalite') == "" &&
5070 $this->valF['date_envoi_controle_legalite'] != ""
5071 ){
5072 // On Lance le hook
5073 $data = array('val' => $this->valF);
5074 $data['dossier'] = $this->valF['dossier'];
5075 $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
5076 }
5077 // Si la date de retour controle legalite est éditée
5078 if (
5079 $this->getVal('date_retour_controle_legalite') == "" &&
5080 $this->valF['date_retour_controle_legalite'] != ""
5081 ){
5082 // On Lance le hook
5083 $data = array('val' => $this->valF);
5084 $data['dossier'] = $this->valF['dossier'];
5085 $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5086 }
5087 }
5088 }
5089
5090 // Traitement en cas de mise à jour du dossier
5091 if ($update_dossier === true) {
5092 /**
5093 * Mise à jour de la date de dernière modification du dossier
5094 * d'instruction
5095 */
5096 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5097 $inst_di->update_last_modification_date();
5098
5099 // Mise à jour des données du dossier d'autorisation
5100 $da = $this->f->get_inst__om_dbform(array(
5101 "obj" => "dossier_autorisation",
5102 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5103 ));
5104 $params = array(
5105 'di_id' => $this->getVal('dossier'),
5106 );
5107 if($da->majDossierAutorisation($params) === false) {
5108 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5109 $this->correct = false;
5110 return false;
5111 }
5112 }
5113
5114 // mise à jour des métadonnées issues des dates de suivi
5115 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5116 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5117 if ($dateRetourSignatureModified || $dateRetourRARModified) {
5118
5119 // Calculs des nouvelles métadonnées
5120 $metadata = $this->getMetadata("om_fichier_instruction");
5121
5122 // On vérifie si l'instruction à finaliser a un événement de type arrete
5123 // TODO : A voir pour remplacer par une instanciation de l'événement.
5124 // Voir également si l'événement ne dois pas être instancié en début de
5125 // méthode pour pouvoir être réutilisé.
5126 $qres = $this->f->get_one_result_from_db_query(
5127 sprintf(
5128 'SELECT
5129 type
5130 FROM
5131 %1$sevenement
5132 WHERE
5133 evenement = \'%2$d\'',
5134 DB_PREFIXE,
5135 intval($this->getVal("evenement"))
5136 ),
5137 array(
5138 "origin" => __METHOD__,
5139 "force_return" => true,
5140 )
5141 );
5142
5143 if ($qres["code"] !== "OK") {
5144 $this->correct = false;
5145 $this->addToMessage(__("Erreur de traitement de fichier."));
5146 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
5147 return false;
5148 }
5149
5150 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5151 if ($qres['result'] == 'arrete'){
5152 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
5153 }
5154
5155 // Filtre pour conserver uniquement les métadonnées liées aux dates
5156 $metadataToKeep = array(
5157 "statutAutorisation",
5158 "dateEvenementDocument",
5159 'date_cloture_metier',
5160 "NotificationArrete",
5161 "dateNotificationArrete",
5162 "controleLegalite",
5163 "dateSignature",
5164 "nomSignataire",
5165 "qualiteSignataire",
5166 "dateControleLegalite",
5167 );
5168 $metadata = array_filter(
5169 $metadata,
5170 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5171 ARRAY_FILTER_USE_KEY
5172 );
5173
5174 // Mise à jour des métadonnées du document en GED
5175 $docUid = $this->getVal("om_fichier_instruction");
5176 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5177 if ($operationOrUID == 'OP_FAILURE') {
5178 $this->correct = false;
5179 $this->addToMessage(__("Erreur de traitement de fichier."));
5180 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5181 return false;
5182 }
5183
5184 // mise à jour de l'UID du document en BDD
5185 else {
5186 $valF = array('om_fichier_instruction' => $operationOrUID);
5187 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5188 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5189 if ($this->f->isDatabaseError($res, true) === true) {
5190 $this->correct = false;
5191 $this->addToMessage(__("Erreur de traitement de fichier."));
5192 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5193 return false;
5194 }
5195 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5196 }
5197 }
5198
5199 // Déclenchement des notifications automatique après finalisation et
5200 // retour de signature
5201 if ($dateRetourSignatureModified === true
5202 && $this->valF['date_retour_signature'] !== ''
5203 && $this->valF['date_retour_signature'] !== null) {
5204
5205 // Message à afficher dans les logs pour indiquer quelle notification a échouée
5206 $msgLog = sprintf(
5207 '%s %s : %d',
5208 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5209 __('Instruction notifiée'),
5210 $id
5211 );
5212
5213 // Récupération de l'instance de l'événement pour accéder au paramètrage
5214 // des notifications
5215 $ev = $this->get_inst_evenement($this->valF['evenement']);
5216 // Si la notification automatique des tiers consulté est active
5217 // déclenche le traitement de notification.
5218 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5219 $typeNotifTiers = $ev->getVal('notification_tiers');
5220 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5221 if ($typeNotifTiers === 'notification_automatique') {
5222 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5223 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5224 $this->correct = false;
5225 }
5226 }
5227
5228 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5229 // Récupération de la liste des demandeurs à notifier et de la catégorie
5230 $categorie = $this->f->get_param_option_notification($collectivite_di);
5231 $isPortal = $categorie === PORTAL;
5232 $demandeursANotifie = $this->get_demandeurs_notifiable(
5233 $this->valF['dossier'],
5234 $isPortal
5235 );
5236
5237 //
5238 $msg_notif = '';
5239
5240 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5241 $demandeurPrincipalNotifie = false;
5242 foreach ($demandeursANotifie as $demandeur) {
5243 // Identifie si le demandeur principal a été notifié ou pas
5244 // et récupère ses informations
5245 if ($demandeur['petitionnaire_principal'] == 't') {
5246 $demandeurPrincipalNotifie = true;
5247 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5248 // son paramétrage, on effectue pas le traitement et on passe à l'itération
5249 // suivante. On le considère également comme non notifié pour gérer l'envoie
5250 // des messages d'erreurs
5251 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5252 // d'impact sur la notification
5253 $erreursParam = $this->get_info_notification_fail();
5254 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5255 $demandeurPrincipalNotifie = false;
5256 continue;
5257 }
5258 }
5259 // Récupération du contenu de l'option option_bloquer_notif_auto_dln
5260 $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
5261 // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
5262 // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
5263 if (! empty($option_bloquer_notif_auto_dln_types_evenements)
5264 && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
5265 && $this->is_date_limite_notification_premier_mois_depasee() === true) {
5266 // Ajout de la notif et récupération de son id
5267 $idNotif = $this->ajouter_notification(
5268 $this->valF[$this->clePrimaire],
5269 $this->f->get_connected_user_login_name(),
5270 $demandeur,
5271 $collectivite_di,
5272 array(),
5273 true,
5274 'Echec',
5275 __('La date limite de notification au demandeur est dépassée')
5276 );
5277 if ($idNotif === false) {
5278 // Termine le traitement
5279 $this->addToLog(
5280 sprintf('%s() : %s', __METHOD__, $msgLog),
5281 DEBUG_MODE
5282 );
5283 return $this->end_treatment(__METHOD__, false);
5284 }
5285 $msg_notif .= sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5286 }
5287 else {
5288 // Ajout de la notif et récupération de son id
5289 $idNotif = $this->ajouter_notification(
5290 $this->valF[$this->clePrimaire],
5291 $this->f->get_connected_user_login_name(),
5292 $demandeur,
5293 $collectivite_di,
5294 array(),
5295 true
5296 );
5297 if ($idNotif === false) {
5298 $this->addToLog(
5299 sprintf('%s() : %s',__METHOD__, $msgLog),
5300 DEBUG_MODE
5301 );
5302 return false;
5303 }
5304 // Création de la tache en lui donnant l'id de la notification
5305 $notification_by_task = $this->notification_by_task(
5306 $idNotif,
5307 $this->valF['dossier'],
5308 $categorie
5309 );
5310 if ($notification_by_task === false) {
5311 $this->addToLog(
5312 sprintf('%s() : %s',__METHOD__, $msgLog),
5313 DEBUG_MODE
5314 );
5315 $this->addToMessage(
5316 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5317 );
5318 return false;
5319 }
5320 $msg_notif .= sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
5321 }
5322 }
5323
5324 // Pour la notification par mail ou la notification via portal si le dossier a
5325 // été déposés via portal, si le demandeur principal n'est pas notifiable,
5326 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5327 // laquelle le demandeur principal n'a pas pu être notifié
5328 $depotPortal = $this->dossier_depose_sur_portail();
5329 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5330 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5331 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5332 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5333 $erreursParam = $this->get_info_notification_fail();
5334 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5335 // Ajout de la notif et récupération de son id
5336 $idNotif = $this->ajouter_notification(
5337 $this->valF[$this->clePrimaire],
5338 $this->f->get_connected_user_login_name(),
5339 $demandeurPrincipal,
5340 $collectivite_di,
5341 array(),
5342 true,
5343 'Echec',
5344 implode(' ', $erreursParam)
5345 );
5346 if ($idNotif === false) {
5347 $this->addToLog(
5348 sprintf('%s() : %s', __METHOD__, $msgLog),
5349 DEBUG_MODE
5350 );
5351 $this->addToMessage(
5352 __('Erreur : la création de la notification a échouée.').
5353 __("Veuillez contacter votre administrateur.")
5354 );
5355 return false;
5356 }
5357 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5358 // de l'échec de la notification
5359 $dossier_message = $this->get_inst_dossier_message(0);
5360 $dossier_message_val = array(
5361 'dossier' => $this->getVal('dossier'),
5362 'type' => __('erreur expedition'),
5363 'emetteur' => $this->f->get_connected_user_login_name(),
5364 'login' => $_SESSION['login'],
5365 'date_emission' => date('Y-m-d H:i:s'),
5366 'contenu' => __('Échec lors de la notification de l\'instruction ').
5367 $ev->getVal('libelle').
5368 '.<br>'.
5369 implode("\n", $erreursParam).
5370 '<br>'.
5371 __('Veuillez corriger ces informations avant de renvoyer la notification.')
5372 );
5373 $add = $dossier_message->add_notification_message($dossier_message_val, true);
5374 // Si une erreur se produit pendant l'ajout
5375 if ($add !== true) {
5376 $this->addToLog(
5377 sprintf(
5378 '%s() : %s',
5379 __METHOD__,
5380 __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5381 ),
5382 DEBUG_MODE
5383 );
5384 return false;
5385 }
5386 }
5387 $this->addToMessage($msg_notif);
5388 }
5389 }
5390 // Assigner les champs 'valF' à 'val' lorsque la modification a réussi
5391 if ($res !== false) {
5392 foreach($this->champs as $index => $champ) {
5393 // if (get_class($this) == 'instruction') {
5394 $this->f->log(__METHOD__, "[".var_export(get_class($this), true)."] this->valF[$champ]): ".var_export($this->valF[$champ] ?? null, true).", this->val[$index]: ".var_export($this->val[$index] ?? null, true), 'DEBUG', 'seb');
5395 // }
5396 $this->val[$index] = $this->valF[$champ] ?? null;
5397 }
5398 }
5399 $res = $this->add_log_to_dossier($id, $val);
5400 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5401 $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data);
5402 return $res;
5403 }
5404
5405 /**
5406 * TRIGGER - triggersupprimer.
5407 *
5408 * @return boolean
5409 */
5410 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5411 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5412 $data = array('val' => &$val, 'id' => $id);
5413 $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data);
5414 /**
5415 * L'objectif ici est de repositionner les valeurs récupérées en
5416 * archive dans le dossier d'instruction avant de supprimer l'événement
5417 * d'instruction si les valeurs du dossier sont différentes
5418 */
5419 $valF = array();
5420 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5421 foreach ($inst_di->champs as $key => $champ) {
5422 // Si le champ du DI à une archive dans l'instruction
5423 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5424 // Si la valeur entre le champ du DI et son archive dans instruction
5425 // est différente
5426 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5427 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5428 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5429 // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5430 if ($champ === "accord_tacite" && $valF[$champ] === null) {
5431 $valF[$champ] = ' ';
5432 }
5433 }
5434 }
5435 }
5436 // Spécificité du champ avis_decision dont le champ archive est nommé
5437 // différemment
5438 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5439 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5440 }
5441 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5442 // par l'archive
5443 unset($valF['date_affichage']);
5444
5445 /**
5446 * Mise à jour de la version de clôture *version_clos* du dossier si et
5447 * seulement si l'instruction met à jour l'état du dossier.
5448 */
5449 if (isset($valF['etat']) === true
5450 && $valF['etat'] !== null
5451 && $valF['etat'] !== '') {
5452 // Récupère l'état actuel du dossier d'instruction
5453 $inst_current_etat = $this->f->get_inst__om_dbform(array(
5454 "obj" => "etat",
5455 "idx" => $inst_di->get_id_etat(),
5456 ));
5457 // Instanciation de l'état archivé appliqué sur le dossier
5458 $inst_etat = $this->f->get_inst__om_dbform(array(
5459 "obj" => "etat",
5460 "idx" => $valF['etat'],
5461 ));
5462 //
5463 $update_version_clos = null;
5464 // En cas de clôture du dossier par l'état archivé
5465 if ($inst_etat->getVal('statut') === 'cloture') {
5466 $update_version_clos = $inst_di->update_version_clos('up');
5467 }
5468 // En cas de réouverture du dossier par l'état archivé
5469 if ($inst_current_etat->getVal('statut') === 'cloture'
5470 && $inst_etat->getVal('statut') !== 'cloture') {
5471 //
5472 $update_version_clos = $inst_di->update_version_clos('down');
5473 //
5474 $this->set_att_di_reopened(true);
5475 }
5476 //
5477 if ($update_version_clos === false) {
5478 $this->f->addToLog(sprintf(
5479 "%s() : ERREUR - %s %s",
5480 __METHOD__,
5481 sprintf(
5482 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5483 $inst_di->getVal($inst_di->clePrimaire)
5484 ),
5485 sprintf(
5486 __("L'instruction tente d'appliquer l'état %s."),
5487 $inst_etat->getVal($inst_etat->clePrimaire)
5488 )
5489 ));
5490 $this->addToMessage(sprintf(
5491 "%s %s",
5492 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5493 __("Veuillez contacter votre administrateur.")
5494 ));
5495 return false;
5496 }
5497 }
5498 // On supprime toutes les notications liées à l'instruction
5499 $notifASupprimer = $this->get_instruction_notification(
5500 $this->getVal($this->clePrimaire),
5501 array(
5502 'notification_recepisse',
5503 'notification_instruction',
5504 'notification_decision',
5505 'notification_service_consulte',
5506 'notification_tiers_consulte',
5507 'notification_depot_demat',
5508 'notification_commune',
5509 'notification_signataire'
5510 ),
5511 true
5512 );
5513
5514 foreach ($notifASupprimer as $idNotif) {
5515 $inst_notif = $this->f->get_inst__om_dbform(array(
5516 "obj" => "instruction_notification",
5517 "idx" => $idNotif,
5518 ));
5519 $val_notif = array();
5520 foreach ($inst_notif->champs as $champ) {
5521 $val_notif[$champ] = $inst_notif->getVal($champ);
5522 }
5523 // La suppression des notifications entrainera la suppression des tâches qui y sont
5524 // liées
5525 $supprNotif = $inst_notif->supprimer($val_notif);
5526 if ($supprNotif == false) {
5527 $this->addToMessage(sprintf(
5528 "%s %s",
5529 __("Erreur lors de la suppression des notifications de l'instruction."),
5530 __("Veuillez contacter votre administrateur.")
5531 ));
5532 return false;
5533 }
5534 }
5535
5536 // Suppression du paramétrage de l'annexe lié à l'évènement
5537 if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5538 $this->addToLog(sprintf(
5539 "%s %s",
5540 __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5541 __("Veuillez contacter votre administrateur.")
5542 ), DEBUG_MODE);
5543 return false;
5544 }
5545
5546 // On met à jour le dossier
5547 $valF['instruction'] = $id;
5548 $valF['crud'] = 'delete';
5549 $update_by_instruction = $inst_di->update_by_instruction($valF);
5550 if ($update_by_instruction === false) {
5551 $this->cleanMessage();
5552 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5553 return false;
5554 }
5555
5556 // Affichage d'informations à l'utilisateur
5557 $this->addToMessage(__("Suppression de l'instruction")." [".$this->f->db->affectedRows()." ".__('enregistrement')." ".__('mis_a_jour')."]");
5558
5559 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5560
5561 $res = true;
5562 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5563 $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data);
5564 return $res;
5565 }
5566
5567 /**
5568 * TRIGGER - triggersupprimerapres.
5569 *
5570 * @return boolean
5571 */
5572 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5573 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5574 $data = array('val' => &$val, 'id' => $id);
5575 $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data);
5576 /**
5577 * Mise à jour de la date de dernière modification du dossier
5578 * d'instruction
5579 */
5580 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5581 $inst_di->update_last_modification_date();
5582
5583 /**
5584 * Mise à jour des données du dossier d'autorisation
5585 */
5586 $da = $this->f->get_inst__om_dbform(array(
5587 "obj" => "dossier_autorisation",
5588 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5589 ));
5590 $params = array(
5591 'di_id' => $this->getVal('dossier'),
5592 'di_reopened' => $this->get_att_di_reopened(),
5593 );
5594 if($da->majDossierAutorisation($params) === false) {
5595 $this->addToMessage(__("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5596 $this->correct = false;
5597 return false;
5598 }
5599
5600 /**
5601 * Gestion des tâches pour la dématérialisation
5602 */
5603 $inst_task_empty = $this->f->get_inst__om_dbform(array(
5604 "obj" => "task",
5605 "idx" => 0,
5606 ));
5607 foreach ($inst_di->task_types as $task_type) {
5608 $task_exists = $inst_task_empty->task_exists($task_type, $id);
5609 if ($task_exists !== false) {
5610 $inst_task = $this->f->get_inst__om_dbform(array(
5611 "obj" => "task",
5612 "idx" => $task_exists,
5613 ));
5614 if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5615 $task_val = array(
5616 'state' => task::STATUS_CANCELED,
5617 );
5618 $update_task = $inst_task->update_task(array('val' => $task_val));
5619 if ($update_task === false) {
5620 $this->addToMessage(sprintf('%s %s',
5621 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5622 __("Veuillez contacter votre administrateur.")
5623 ));
5624 $this->correct = false;
5625 return false;
5626 }
5627 }
5628 }
5629 }
5630
5631 //
5632 $val['evenement'] = $this->getVal('evenement');
5633 $res = $this->add_log_to_dossier($id, $val);
5634 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5635 $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data);
5636 return $res;
5637 }
5638
5639 /**
5640 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5641 * "di_reopened".
5642 *
5643 * @param boolean $val
5644 */
5645 function set_att_di_reopened($val) {
5646 $this->di_reopened = $val;
5647 }
5648
5649 /**
5650 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5651 *
5652 * @return boolean
5653 */
5654 function get_att_di_reopened() {
5655 return $this->di_reopened;
5656 }
5657
5658 /**
5659 * Permet de composer un message d'erreur sur restriction non valide en
5660 * fonction du contexte.
5661 *
5662 * @param string $restriction formule de la restriction
5663 *
5664 * @return string message d'erreur
5665 */
5666 function get_restriction_error_message($restriction) {
5667 // Affichage du message si la restriction s'applique
5668 // Contexte du suivi des dates (message simple)
5669 $message_restrict = __("Probleme de dates :");
5670 // Split restriction
5671 $champs_restrict = preg_split(
5672 '/(\W+)/',
5673 $restriction,
5674 null,
5675 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5676 );
5677 $formated_restrict = "";
5678 // Ajout des chaînes à traduire
5679 foreach ($champs_restrict as $value) {
5680 $formated_restrict .= __($value)." ";
5681 }
5682 $formated_restrict = substr($formated_restrict, 0, -1);
5683 // Message d'erreur dans le contexte du suivi des dates
5684 if($this->getParameter("maj") == 170) {
5685 $message_restrict .= " ".__("contactez l'instructeur du dossier");
5686 $message_restrict .= "<br/>(".$formated_restrict.")";
5687 } else {
5688 // Affichage du message si la restriction s'applique
5689 // Contexte instruction
5690 $message_restrict .= "<br/>".$formated_restrict;
5691 }
5692
5693 return $message_restrict;
5694 }
5695
5696 /**
5697 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5698 * les vérifications suivantes :
5699 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5700 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5701 * le message d'erreur associé à la restriction
5702 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5703 * et / ou la modification et affiche un message d'erreur
5704 * -
5705 * -
5706 * -
5707 * -
5708 * -
5709 * -
5710 *
5711 * @param array val : tableau contenant les valeurs issues du formulaire.
5712 * @param - dnu1 : Paramètre déprécié et non utilisé.
5713 * @param - dnu2 : Paramètre déprécié et non utilisé.
5714 *
5715 * @return void
5716 */
5717 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5718 parent::verifier($val);
5719 //
5720 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5721 $restriction = $this->get_restriction($val['evenement']);
5722
5723 //Test qu'une restriction est présente
5724 if ($restriction != "" ){
5725
5726 // Vérifie le contexte de la modification et test si la restriction est valide.
5727 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5728 // Il n'est donc pas nécessaire de vérifier les restrictions.
5729 $this->restriction_valid = $this->restrictionIsValid($restriction);
5730 if ($this->getParameter("maj") != 176
5731 && !$this->restriction_valid) {
5732
5733 // Affichage du message si la restriction s'applique
5734 $this->addToMessage(
5735 $this->get_restriction_error_message($restriction)
5736 );
5737 $this->correct=false;
5738 return false;
5739 }
5740
5741 // Liste des opérateurs possible
5742 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5743 // Supprime tous les espaces de la chaîne de caractère
5744 $restriction = str_replace(' ', '', $restriction);
5745
5746 // Met des espace avant et après les opérateurs puis transforme la
5747 // chaine en un tableau
5748 $tabRestriction = str_replace($operateurs, " ", $restriction);
5749 // Tableau des champ
5750 $tabRestriction = explode(" ", $tabRestriction);
5751 // Supprime les numériques du tableau
5752 foreach ($tabRestriction as $key => $value) {
5753 if (is_numeric($value)) {
5754 unset($tabRestriction[$key]);
5755 }
5756 }
5757
5758 // Vérifie les champs utilisés pour la restriction
5759 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5760 if ($check_field_exist !== true) {
5761
5762 // Liste des champs en erreur
5763 $string_error_fields = implode(", ", $check_field_exist);
5764
5765 // Message d'erreur
5766 $error_message = __("Le champ %s n'est pas utilisable pour le champ %s");
5767 if (count($check_field_exist) > 1) {
5768 $error_message = __("Les champs %s ne sont pas utilisable pour le champ %s");
5769 }
5770
5771 // Affiche l'erreur
5772 $this->correct=false;
5773 $this->addToMessage(sprintf($error_message, $string_error_fields, __("restriction")));
5774 $this->addToMessage(__("Veuillez contacter votre administrateur."));
5775 }
5776 }
5777
5778 }
5779 if(!$this->updateDate("date_envoi_signature")) {
5780 return false;
5781 }
5782 if(!$this->updateDate("date_retour_signature")) {
5783 return false;
5784 }
5785 if(!$this->updateDate("date_envoi_rar")) {
5786 return false;
5787 }
5788 if(!$this->updateDate("date_retour_rar")) {
5789 return false;
5790 }
5791 if(!$this->updateDate("date_envoi_controle_legalite")) {
5792 return false;
5793 }
5794 if(!$this->updateDate("date_retour_controle_legalite")) {
5795 return false;
5796 }
5797
5798 }
5799
5800 /**
5801 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5802 * principal du dossier auquel appartiens l'instruction.
5803 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5804 *
5805 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5806 * et affiche un message dans les logs.
5807 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5808 *
5809 * @param string identifiant du dossier
5810 * @return array|boolean
5811 */
5812 public function get_info_petitionnaire_principal_dossier($dossier = null) {
5813 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5814 // l'objet courant
5815 if (empty($dossier)) {
5816 $dossier = $this->getVal('dossier');
5817 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5818 // false et on affiche un message d'erreur dans les logs
5819 if (empty($dossier)) {
5820 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5821 return false;
5822 }
5823 }
5824
5825 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5826 // principal
5827 $qres = $this->f->get_all_results_from_db_query(
5828 sprintf(
5829 'SELECT
5830 -- Récupère toutes les informations du demandeur principal
5831 demandeur.*,
5832 CASE
5833 WHEN demandeur.qualite=\'particulier\'
5834 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5835 ELSE
5836 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5837 END AS destinataire
5838 FROM
5839 %1$sdossier
5840 LEFT JOIN %1$slien_dossier_demandeur
5841 ON lien_dossier_demandeur.dossier = dossier.dossier
5842 LEFT JOIN %1$sdemandeur
5843 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5844 WHERE
5845 dossier.dossier = \'%2$s\'
5846 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5847 DB_PREFIXE,
5848 $this->f->db->escapeSimple($dossier)
5849 ),
5850 array(
5851 "origin" => __METHOD__,
5852 )
5853 );
5854 if (is_array($qres["result"]) === true
5855 && array_key_exists(0, $qres["result"]) === true) {
5856 //
5857 return $qres["result"][0];
5858 }
5859 return null;
5860 }
5861
5862
5863
5864 /**
5865 * Finalisation des documents.
5866 * @param string $champ champ du fichier à finaliser
5867 * @param booleen $status permet de définir si on finalise ou définalise
5868 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5869 */
5870 function manage_finalizing($mode = null, $val = array()) {
5871 //
5872 $this->begin_treatment(__METHOD__);
5873
5874 //
5875 $id_inst = $this->getVal($this->clePrimaire);
5876
5877 //
5878 $admin_msg_error = __("Veuillez contacter votre administrateur.");
5879 $file_msg_error = __("Erreur de traitement de fichier.")
5880 ." ".$admin_msg_error;
5881 $bdd_msg_error = __("Erreur de base de données.")
5882 ." ".$admin_msg_error;
5883 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5884
5885 // Si on finalise le document
5886 if ($mode == "finalize"){
5887 //
5888 $etat = __('finalisation');
5889
5890 // Récupère la collectivite du dossier d'instruction
5891 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5892
5893 //
5894 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5895
5896 //
5897 $params = array(
5898 "specific" => array(),
5899 );
5900 // Si la rédaction libre est activée sur l'instruction
5901 if ($this->getVal("flag_edition_integrale") == 't') {
5902 $params["specific"]["corps"] = array(
5903 "mode" => "set",
5904 "value" => $this->getVal("corps_om_htmletatex"),
5905 );
5906 $params["specific"]["titre"] = array(
5907 "mode" => "set",
5908 "value" => $this->getVal("titre_om_htmletat"),
5909 );
5910 }
5911 // Génération du PDF
5912 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5913 $pdf_output = $result['pdf_output'];
5914
5915 //Métadonnées du document
5916 $metadata = array(
5917 'filename' => $this->determinate_name_doc_pdf().'.pdf',
5918 'mimetype' => 'application/pdf',
5919 'size' => strlen($pdf_output)
5920 );
5921
5922 // Récupération des métadonnées calculées après validation
5923 $spe_metadata = $this->getMetadata("om_fichier_instruction");
5924
5925 //On vérifie si l'instruction à finaliser a un événement de type arrete
5926 // TODO : A voir pour remplacer par une instanciation de l'événement.
5927 // Voir également si l'événement ne dois pas être instancié en début de
5928 // méthode pour pouvoir être réutilisé.
5929 $qres = $this->f->get_one_result_from_db_query(
5930 sprintf(
5931 'SELECT
5932 type
5933 FROM
5934 %1$sevenement
5935 WHERE
5936 evenement = \'%2$d\'',
5937 DB_PREFIXE,
5938 intval($this->getVal("evenement"))
5939 ),
5940 array(
5941 "origin" => __METHOD__,
5942 "force_return" => true,
5943 )
5944 );
5945
5946 if ($qres["code"] !== "OK") {
5947 $this->correct = false;
5948 $this->addToMessage($bdd_msg_error);
5949 return $this->end_treatment(__METHOD__, false);
5950 }
5951
5952 //Initialisation de la variable
5953 $arrete_metadata = array();
5954 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5955 if ($qres['result'] === 'arrete'){
5956 $arrete_metadata = $this->getMetadata("arrete");
5957 }
5958
5959 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5960
5961 // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5962 $res = $this->f->db->autoExecute(
5963 DB_PREFIXE.$this->table,
5964 ['fichier_instruction_name' => $metadata['filename']],
5965 DB_AUTOQUERY_UPDATE,
5966 "instruction='".$this->getVal("instruction")."'"
5967 );
5968
5969 // Si le document a déjà été finalisé on le met à jour
5970 // en conservant son UID
5971 if ($this->getVal("om_fichier_instruction") != ''){
5972 $uid = $this->f->storage->update(
5973 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
5974 );
5975 }
5976 // Sinon on crée un nouveau document et dont on récupère l'UID
5977 else {
5978 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5979 }
5980 }
5981
5982 // Si on définalise le document
5983 if ($mode == "unfinalize") {
5984 //
5985 $etat = __('définalisation');
5986 // Récupération de l'uid du document finalisé
5987 $uid = $this->getVal("om_fichier_instruction");
5988 }
5989
5990 // Si on définalise l'UID doit être défini
5991 // Si on finalise la création/modification du fichier doit avoir réussi
5992 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5993 $this->correct = false;
5994 $this->addToMessage($file_msg_error);
5995 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5996 return $this->end_treatment(__METHOD__, false);
5997 }
5998
5999 //
6000 foreach ($this->champs as $key => $champ) {
6001 //
6002 $val[$champ] = $this->val[$key];
6003 }
6004
6005 //
6006 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
6007 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
6008 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
6009 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
6010 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
6011 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
6012 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
6013 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
6014 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
6015 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
6016 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
6017 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
6018 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
6019 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
6020 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
6021 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
6022 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
6023 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
6024 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
6025 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
6026 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
6027 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
6028 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
6029 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
6030 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
6031 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
6032 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
6033 $this->setvalF($val);
6034
6035 // Verification de la validite des donnees
6036 $this->verifier($this->val);
6037 // Si les verifications precedentes sont correctes, on procede a
6038 // la modification, sinon on ne fait rien et on retourne une erreur
6039 if ($this->correct === true) {
6040 //
6041 $valF = array(
6042 "om_fichier_instruction" => $uid,
6043 "date_finalisation_courrier" => date('Y-m-d')
6044 );
6045 //
6046 if($mode=="finalize") {
6047 // état finalisé vrai
6048 $valF["om_final_instruction"] = true;
6049 // ajout log utilisateur
6050 $login = $_SESSION['login'];
6051 $nom = "";
6052 $this->f->getUserInfos();
6053 if (isset($this->f->om_utilisateur["nom"])
6054 && !empty($this->f->om_utilisateur["nom"])) {
6055 $nom = $this->f->om_utilisateur["nom"];
6056 }
6057 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
6058 if ($nom != "") {
6059 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
6060 }
6061 } else {
6062 // état finalisé faux
6063 $valF["om_final_instruction"] = false;
6064 // suppression log utilisateur
6065 $valF["om_final_instruction_utilisateur"] = '';
6066 }
6067
6068 // Execution de la requête de modification des donnees de l'attribut
6069 // valF de l'objet dans l'attribut table de l'objet
6070 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
6071 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
6072 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
6073 //
6074 if ($this->f->isDatabaseError($res, true) === true) {
6075 $this->correct = false;
6076 $this->addToMessage($bdd_msg_error);
6077 return $this->end_treatment(__METHOD__, false);
6078 }
6079
6080 //
6081 $this->addToMessage(sprintf(__("La %s du document s'est effectuee avec succes."), $etat));
6082 //
6083 if ($this->add_log_to_dossier($id_inst, $val) === false) {
6084 return $this->end_treatment(__METHOD__, false);
6085 }
6086 //
6087 return $this->end_treatment(__METHOD__, true);
6088 }
6089 // L'appel de verifier() a déjà positionné correct à false
6090 // et défini un message d'erreur.
6091 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
6092 return $this->end_treatment(__METHOD__, false);
6093 }
6094
6095 /**
6096 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
6097 * @return string numéro de dossier d'instruction
6098 */
6099 protected function getDossier($champ = null) {
6100 if(empty($this->specificMetadata)) {
6101 $this->getSpecificMetadata();
6102 }
6103 return $this->specificMetadata->dossier;
6104 }
6105 /**
6106 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
6107 * @return int Version
6108 */
6109 protected function getDossierVersion() {
6110 if(empty($this->specificMetadata)) {
6111 $this->getSpecificMetadata();
6112 }
6113 return $this->specificMetadata->version;
6114 }
6115 /**
6116 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
6117 * @return string numéro de dossier d'autorisation
6118 */
6119 protected function getNumDemandeAutor() {
6120 if(empty($this->specificMetadata)) {
6121 $this->getSpecificMetadata();
6122 }
6123 return $this->specificMetadata->dossier_autorisation;
6124 }
6125 /**
6126 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
6127 * @return date de la demande initiale
6128 */
6129 protected function getAnneemoisDemandeAutor() {
6130 if(empty($this->specificMetadata)) {
6131 $this->getSpecificMetadata();
6132 }
6133 return $this->specificMetadata->date_demande_initiale;
6134 }
6135 /**
6136 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
6137 * @return string type du dossier d'instruction
6138 */
6139 protected function getTypeInstruction() {
6140 if(empty($this->specificMetadata)) {
6141 $this->getSpecificMetadata();
6142 }
6143 return $this->specificMetadata->dossier_instruction_type;
6144 }
6145 /**
6146 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
6147 * @return string avis
6148 */
6149 protected function getStatutAutorisation() {
6150 if(empty($this->specificMetadata)) {
6151 $this->getSpecificMetadata();
6152 }
6153 return $this->specificMetadata->statut;
6154 }
6155 /**
6156 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
6157 * @return string type du dossier d'autorisation
6158 */
6159 protected function getTypeAutorisation() {
6160 if(empty($this->specificMetadata)) {
6161 $this->getSpecificMetadata();
6162 }
6163 return $this->specificMetadata->dossier_autorisation_type;
6164 }
6165 /**
6166 * Récupération de la date d'ajout de document à ajouter aux métadonnées
6167 * @return date de l'évènement
6168 */
6169 protected function getDateEvenementDocument() {
6170 return date("Y-m-d");
6171 }
6172 /**
6173 * Récupération du groupe d'instruction à ajouter aux métadonnées
6174 * @return string Groupe d'instruction
6175 */
6176 protected function getGroupeInstruction() {
6177 if(empty($this->specificMetadata)) {
6178 $this->getSpecificMetadata();
6179 }
6180 return $this->specificMetadata->groupe_instruction;
6181 }
6182 /**
6183 * Récupération du libellé du type du document à ajouter aux métadonnées
6184 * @return string Groupe d'instruction
6185 */
6186 protected function getTitle() {
6187
6188 // Récupère le champ événement
6189 if (isset($this->valF["evenement"]) && $this->valF["evenement"] != "") {
6190 $evenement = $this->valF["evenement"];
6191 } else {
6192 $evenement = $this->getVal("evenement");
6193 }
6194
6195 // Requête sql
6196 $evenement = $this->f->get_inst__om_dbform(array(
6197 "obj" => "evenement",
6198 "idx" => $evenement
6199 ));
6200
6201 // Retourne le libelle de l'événement
6202 return $evenement->getVal('libelle');
6203 }
6204
6205
6206 /**
6207 * Récupération du champ ERP du dossier d'instruction.
6208 *
6209 * @return boolean
6210 */
6211 public function get_concerne_erp() {
6212 //
6213 if(empty($this->specificMetadata)) {
6214 $this->getSpecificMetadata();
6215 }
6216 //
6217 return $this->specificMetadata->erp;
6218 }
6219
6220
6221 /**
6222 * Cette méthode permet de stocker en attribut toutes les métadonnées
6223 * nécessaire à l'ajout d'un document.
6224 */
6225 public function getSpecificMetadata() {
6226 if (isset($this->valF["dossier"]) && $this->valF["dossier"] != "") {
6227 $dossier = $this->valF["dossier"];
6228 } else {
6229 $dossier = $this->getVal("dossier");
6230 }
6231 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6232 $qres = $this->f->get_all_results_from_db_query(
6233 sprintf(
6234 'SELECT
6235 dossier.dossier AS dossier,
6236 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6237 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6238 dossier_instruction_type.code AS dossier_instruction_type,
6239 etat_dossier_autorisation.libelle AS statut,
6240 dossier_autorisation_type.code AS dossier_autorisation_type,
6241 groupe.code AS groupe_instruction,
6242 CASE WHEN dossier.erp IS TRUE
6243 THEN \'true\'
6244 ELSE \'false\'
6245 END AS erp
6246 FROM
6247 %1$sdossier
6248 LEFT JOIN %1$sdossier_instruction_type
6249 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6250 LEFT JOIN %1$sdossier_autorisation
6251 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6252 LEFT JOIN %1$setat_dossier_autorisation
6253 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6254 LEFT JOIN %1$sdossier_autorisation_type_detaille
6255 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6256 LEFT JOIN %1$sdossier_autorisation_type
6257 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6258 LEFT JOIN %1$sgroupe
6259 ON dossier_autorisation_type.groupe = groupe.groupe
6260 WHERE
6261 dossier.dossier = \'%2$s\'',
6262 DB_PREFIXE,
6263 $this->f->db->escapeSimple($dossier)
6264 ),
6265 array(
6266 "origin" => __METHOD__,
6267 )
6268 );
6269 $row = array_shift($qres['result']);
6270
6271 //Si il y a un résultat
6272 if (! empty($row)) {
6273
6274 // Instrance de la classe dossier
6275 $inst_dossier = $this->get_inst_dossier($dossier);
6276 // TODO : améliorer ce code
6277 //
6278 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6279 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6280 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6281 // valeurs issues de la requête en objet.
6282 $metadata = (object)$row;
6283 // Insère l'attribut version à l'objet
6284 $metadata->version = $inst_dossier->get_di_numero_suffixe();
6285
6286 //Alors on créé l'objet dossier_instruction
6287 $this->specificMetadata = $metadata;
6288
6289 }
6290 }
6291
6292 /**
6293 * Retourne le statut du dossier d'instruction
6294 * @param string $idx Identifiant du dossier d'instruction
6295 * @return string Le statut du dossier d'instruction
6296 */
6297 function getStatutAutorisationDossier($idx){
6298
6299 $statut = '';
6300
6301 //Si l'identifiant du dossier d'instruction fourni est correct
6302 if ( $idx != '' ){
6303
6304 //On récupère le statut de l'état du dossier à partir de l'identifiant du
6305 //dossier
6306 $qres = $this->f->get_one_result_from_db_query(
6307 sprintf(
6308 'SELECT
6309 etat.statut
6310 FROM
6311 %1$sdossier
6312 LEFT JOIN
6313 %1$setat
6314 ON
6315 dossier.etat = etat.etat
6316 WHERE
6317 dossier = \'%2$s\'',
6318 DB_PREFIXE,
6319 $this->f->db->escapeSimple($idx)
6320 ),
6321 array(
6322 "origin" => __METHOD__,
6323 )
6324 );
6325 }
6326
6327 return $qres['result'];
6328 }
6329
6330 /**
6331 * Récupère les données du dossier
6332 * @return array
6333 */
6334 function get_dossier_actual() {
6335
6336 // Initialisation de la valeur de retour
6337 $return = array();
6338
6339 // Récupération de toutes les valeurs du dossier d'instruction en cours
6340 // TODO : remplacer cette requête par une instanciation de l'objet
6341 $qres = $this->f->get_all_results_from_db_query(
6342 sprintf(
6343 'SELECT
6344 *
6345 FROM
6346 %1$sdossier
6347 WHERE
6348 dossier = \'%2$s\'',
6349 DB_PREFIXE,
6350 $this->f->db->escapeSimple($this->valF['dossier'])
6351 ),
6352 array(
6353 'origin' => __METHOD__
6354 )
6355 );
6356
6357 foreach ($qres['result'] as $row) {
6358
6359 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6360 // de l'état et de l'avis du dossier d'instruction
6361 $return['archive_delai'] = $row['delai'];
6362 $return['archive_accord_tacite'] = $row['accord_tacite'];
6363 $return['archive_etat'] = $row['etat'];
6364 $return['archive_avis'] = $row['avis_decision'];
6365 // Récupération de la valeur actuelle des dates du dossier
6366 // d'instruction
6367 $return['archive_date_complet'] = $row['date_complet'];
6368 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6369 $return['archive_date_rejet'] = $row['date_rejet'];
6370 $return['archive_date_limite'] = $row['date_limite'];
6371 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6372 $return['archive_date_decision'] = $row['date_decision'];
6373 $return['archive_date_validite'] = $row['date_validite'];
6374 $return['archive_date_achevement'] = $row['date_achevement'];
6375 $return['archive_date_chantier'] = $row['date_chantier'];
6376 $return['archive_date_conformite'] = $row['date_conformite'];
6377 $return['archive_incompletude'] = $row['incompletude'];
6378 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6379 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6380 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6381 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6382 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6383 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6384 $return['archive_autorite_competente'] = $row['autorite_competente'];
6385 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6386 $return['duree_validite'] = $row['duree_validite'];
6387 $return['date_depot'] = $row['date_depot'];
6388 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6389 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6390 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6391 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6392 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6393 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6394 $return['archive_date_ait'] = $row['date_ait'];
6395 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6396 $return['archive_date_affichage'] = $row['date_affichage'];
6397 $return['archive_pec_metier'] = $row['pec_metier'];
6398 $return['archive_a_qualifier'] = $row['a_qualifier'];
6399 }
6400
6401 // Retour de la fonction
6402 return $return;
6403
6404 }
6405
6406 /**
6407 * Permet de vérifier qu'un événement est verrouillable
6408 * @param integer $idx Identifiant de l'instruction
6409 * @return boolean
6410 */
6411 function checkEvenementNonVerrouillable($idx) {
6412 // Si la condition n'est pas vide
6413 if ($idx != "") {
6414
6415 // Requête SQL
6416 $qres = $this->f->get_one_result_from_db_query(
6417 sprintf(
6418 'SELECT
6419 evenement.non_verrouillable
6420 FROM
6421 %1$sevenement
6422 LEFT JOIN %1$sinstruction
6423 ON instruction.evenement = evenement.evenement
6424 WHERE
6425 instruction.instruction = \'%2$s\'',
6426 DB_PREFIXE,
6427 intval($idx)
6428 ),
6429 array(
6430 "origin" => __METHOD__,
6431 )
6432 );
6433 }
6434
6435 // Si on a un résultat et que ce résultat indique que l'événement n'est
6436 // pas vérrouillable renvoie true, sinon renvoie false
6437 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6438 }
6439
6440 /**
6441 * Mise à jour des champs archive_*
6442 * @param mixed $row La ligne de données
6443 */
6444 public function updateArchiveData($row){
6445
6446 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6447 // de l'état et de l'avis du dossier d'instruction
6448 $this->valF['archive_delai']=$row['delai'];
6449 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6450 $this->valF['archive_etat']=$row['etat'];
6451 $this->valF['archive_avis']=$row['avis_decision'];
6452 // Récupération de la valeur actuelle des 9 dates du dossier
6453 // d'instruction
6454 if ($row['date_complet'] != '') {
6455 $this->valF['archive_date_complet']=$row['date_complet'];
6456 }
6457 if ($row['date_dernier_depot'] != '') {
6458 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6459 }
6460 if ($row['date_rejet'] != '') {
6461 $this->valF['archive_date_rejet']= $row['date_rejet'];
6462 }
6463 if ($row['date_limite'] != '') {
6464 $this->valF['archive_date_limite']= $row['date_limite'];
6465 }
6466 if ($row['date_notification_delai'] != '') {
6467 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6468 }
6469 if ($row['date_decision'] != '') {
6470 $this->valF['archive_date_decision']= $row['date_decision'];
6471 }
6472 if ($row['date_validite'] != '') {
6473 $this->valF['archive_date_validite']= $row['date_validite'];
6474 }
6475 if ($row['date_achevement'] != '') {
6476 $this->valF['archive_date_achevement']= $row['date_achevement'];
6477 }
6478 if ($row['date_chantier'] != '') {
6479 $this->valF['archive_date_chantier']= $row['date_chantier'];
6480 }
6481 if ($row['date_conformite'] != '') {
6482 $this->valF['archive_date_conformite']= $row['date_conformite'];
6483 }
6484 if ($row['incompletude'] != '') {
6485 $this->valF['archive_incompletude']= $row['incompletude'];
6486 }
6487 if ($row['incomplet_notifie'] != '') {
6488 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6489 }
6490 if ($row['evenement_suivant_tacite'] != '') {
6491 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6492 }
6493 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6494 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6495 }
6496 if ($row['etat_pendant_incompletude'] != '') {
6497 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6498 }
6499 if ($row['date_limite_incompletude'] != '') {
6500 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6501 }
6502 if ($row['delai_incompletude'] != '') {
6503 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6504 }
6505 if ($row['autorite_competente'] != '') {
6506 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6507 }
6508 if ($row['duree_validite'] != '') {
6509 $this->valF['duree_validite']= $row['duree_validite'];
6510 }
6511 if ($row['date_depot'] != '') {
6512 $this->valF['date_depot']= $row['date_depot'];
6513 }
6514 if ($row['date_depot_mairie'] != '') {
6515 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6516 }
6517 // Dates concernant les dossiers contentieux
6518 if ($row['date_cloture_instruction'] != '') {
6519 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6520 }
6521 if ($row['date_premiere_visite'] != '') {
6522 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6523 }
6524 if ($row['date_derniere_visite'] != '') {
6525 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6526 }
6527 if ($row['date_contradictoire'] != '') {
6528 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6529 }
6530 if ($row['date_retour_contradictoire'] != '') {
6531 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6532 }
6533 if ($row['date_ait'] != '') {
6534 $this->valF['archive_date_ait']= $row['date_ait'];
6535 }
6536 if ($row['date_transmission_parquet'] != '') {
6537 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6538 }
6539 //
6540 if ($row['dossier_instruction_type'] != '') {
6541 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6542 }
6543 if ($row['date_affichage'] != '') {
6544 $this->valF['archive_date_affichage']= $row['date_affichage'];
6545 }
6546 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6547 $this->valF['archive_pec_metier']= $row['pec_metier'];
6548 }
6549 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6550 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6551 }
6552 }
6553
6554 // {{{
6555 // Méthodes de récupération des métadonnées arrêté
6556 /**
6557 * @return string Retourne le numéro d'arrêté
6558 */
6559 function getNumArrete() {
6560 return $this->getVal("numero_arrete");
6561 }
6562 /**
6563 * @return chaîne vide
6564 */
6565 function getReglementaireArrete() {
6566 return 'true';
6567 }
6568 /**
6569 * @return boolean de notification au pétitionnaire
6570 */
6571 function getNotificationArrete() {
6572 return 'true';
6573 }
6574 /**
6575 * @return date de notification au pétitionnaire
6576 */
6577 function getDateNotificationArrete() {
6578 if (empty($this->metadonneesArrete)) {
6579 $this->getArreteMetadata();
6580 }
6581 return $this->metadonneesArrete["datenotification"];
6582 }
6583 /**
6584 * @return boolean check si le document est passé au contrôle de légalité
6585 */
6586 function getControleLegalite() {
6587 return 'true';
6588 }
6589 /**
6590 * @return date de signature de l'arrêté
6591 */
6592 function getDateSignature() {
6593 if (empty($this->metadonneesArrete)) {
6594 $this->getArreteMetadata();
6595 }
6596 return $this->metadonneesArrete["datesignaturearrete"];
6597 }
6598 /**
6599 * @return string nom du signataire
6600 */
6601 function getNomSignataire() {
6602 if (empty($this->metadonneesArrete)) {
6603 $this->getArreteMetadata();
6604 }
6605 return $this->metadonneesArrete["nomsignataire"];
6606 }
6607 /**
6608 * @return string qualité du signataire
6609 */
6610 function getQualiteSignataire() {
6611 if (empty($this->metadonneesArrete)) {
6612 $this->getArreteMetadata();
6613 }
6614 return $this->metadonneesArrete["qualitesignataire"];
6615 }
6616 /**
6617 * @return string numéro du terrain
6618 */
6619 function getAp_numRue() {
6620 if (empty($this->metadonneesArrete)) {
6621 $this->getArreteMetadata();
6622 }
6623 return $this->metadonneesArrete["ap_numrue"];
6624 }
6625 /**
6626 * @return string nom de la rue du terrain
6627 */
6628 function getAp_nomDeLaVoie() {
6629 if (empty($this->metadonneesArrete)) {
6630 $this->getArreteMetadata();
6631 }
6632 return $this->metadonneesArrete["ap_nomdelavoie"];
6633 }
6634 /**
6635 * @return string code postal du terrain
6636 */
6637 function getAp_codePostal() {
6638 if (empty($this->metadonneesArrete)) {
6639 $this->getArreteMetadata();
6640 }
6641 return $this->metadonneesArrete["ap_codepostal"];
6642 }
6643 /**
6644 * @return string ville du terrain
6645 */
6646 function getAp_ville() {
6647 if (empty($this->metadonneesArrete)) {
6648 $this->getArreteMetadata();
6649 }
6650 return $this->metadonneesArrete["ap_ville"];
6651 }
6652 /**
6653 * @return string activité
6654 */
6655 function getActivite() {
6656 return "Droit du sol";
6657 }
6658 /**
6659 * @return string date du retour de controle légalité
6660 */
6661 function getDateControleLegalite() {
6662 if (empty($this->metadonneesArrete)) {
6663 $this->getArreteMetadata();
6664 }
6665 return $this->metadonneesArrete["datecontrolelegalite"];
6666 }
6667
6668 // Fin des méthodes de récupération des métadonnées
6669 // }}}
6670
6671 /**
6672 * Méthode de récupération des métadonnées arrêtés dans la base de données,
6673 * les données sont stockés dans l'attribut $this->metadonneesArrete
6674 */
6675 function getArreteMetadata() {
6676
6677 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6678 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6679 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6680 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6681 "ap_codepostal"=>"", "ap_ville"=>"");
6682
6683 $qres = $this->f->get_all_results_from_db_query(
6684 sprintf(
6685 'SELECT
6686 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6687 signataire_arrete.qualite as qualitesignataire,
6688 instruction.etat as decisionarrete,
6689 instruction.date_retour_rar as datenotification,
6690 instruction.date_retour_signature as datesignaturearrete,
6691 instruction.date_retour_controle_legalite as datecontrolelegalite,
6692 dossier.terrain_adresse_voie_numero as ap_numrue,
6693 dossier.terrain_adresse_voie as ap_nomdelavoie,
6694 dossier.terrain_adresse_code_postal as ap_codepostal,
6695 dossier.terrain_adresse_localite as ap_ville
6696 FROM
6697 %1$sinstruction
6698 LEFT JOIN %1$ssignataire_arrete
6699 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6700 LEFT JOIN %1$sdossier
6701 ON instruction.dossier = dossier.dossier
6702 LEFT JOIN %1$sdonnees_techniques
6703 ON donnees_techniques.dossier_instruction = dossier.dossier
6704 WHERE
6705 instruction.instruction = %2$d',
6706 DB_PREFIXE,
6707 intval($this->getVal('instruction'))
6708 ),
6709 array(
6710 'origin' => __METHOD__
6711 )
6712 );
6713 $this->metadonneesArrete = array_shift($qres['result']);
6714 }
6715
6716 /**
6717 * CONDITION - has_an_edition.
6718 *
6719 * Condition pour afficher le bouton de visualisation de l'édition.
6720 *
6721 * @return boolean
6722 */
6723 function has_an_edition() {
6724 // Récupère la valeur du champ lettretype
6725 $lettretype = $this->getVal("lettretype");
6726 // Si le champ est vide
6727 if ($lettretype !== '' && $lettretype !== null) {
6728 //
6729 return true;
6730 }
6731
6732 //
6733 return false;
6734 }
6735
6736 /**
6737 * CONDITION - is_modifiable.
6738 *
6739 * Controle si l'évenement est modifiable.
6740 *
6741 * @return boolean
6742 */
6743 function is_evenement_modifiable() {
6744 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6745 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6746 }
6747
6748 /**
6749 * CONDITION - is_editable.
6750 *
6751 * Condition pour la modification.
6752 *
6753 * @return boolean
6754 */
6755 function is_editable() {
6756
6757 // XXX
6758 // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
6759 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6760
6761 // Contrôle si l'utilisateur possède un bypass
6762 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6763 //
6764 if ($bypass == true) {
6765 //
6766 return true;
6767 }
6768
6769 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6770 // que l'événement n'est pas identifié comme non verrouillable
6771 if ($this->f->isUserInstructeur()
6772 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6773 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6774 //
6775 return false;
6776 }
6777
6778 // Si l'utilisateur est un intructeur qui correspond à la division du
6779 // dossier
6780 if ($this->is_instructeur_from_division_dossier() === true) {
6781 //
6782 return true;
6783 }
6784
6785 // Si l'utilisateur est instructeur de la commune du dossier et que
6786 // l'instruction est créée par un instructeur de la commune
6787 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6788 $this->getVal('created_by_commune') === 't') {
6789 return true;
6790 }
6791
6792 //
6793 return false;
6794 }
6795
6796 /**
6797 * Vérifie si l'événement est supprimable ou pas.
6798 *
6799 * @return boolean
6800 */
6801 function is_evenement_supprimable() {
6802 // Controle si l'évenement est supprimable
6803 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6804 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6805 }
6806
6807 /**
6808 * CONDITION - is_deletable.
6809 *
6810 * Condition pour la suppression.
6811 *
6812 * @return boolean
6813 */
6814 function is_deletable() {
6815
6816 // XXX
6817 // Identifier si l'instruction est lié à une tâche depuis le champ object_id (mais aussi voir le log car object_id peut être modifié)
6818 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6819
6820 // Contrôle si l'utilisateur possède un bypass intégral
6821 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6822 //
6823 if ($bypass == true) {
6824
6825 //
6826 return true;
6827 }
6828
6829 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6830 // division du dossier et si l'utilisateur n'a pas la permission bypass
6831 // de la division
6832 if ($this->is_instructeur_from_division_dossier() === false
6833 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6834
6835 //
6836 return false;
6837 }
6838
6839 // l'événement est-il le dernier ?
6840 $dernier_evenement = false;
6841 // instanciation dossier
6842 $dossier = $this->f->get_inst__om_dbform(array(
6843 "obj" => "dossier",
6844 "idx" => $this->getVal('dossier'),
6845 ));
6846 // récupération dernier événement
6847 $id_dernier_evenement = $dossier->get_dernier_evenement();
6848 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6849 $dernier_evenement = true;
6850 }
6851
6852 // Si dossier cloturé ou si pas dernier événement
6853 // ou de type retour ou si une date est renseignée
6854 // ET utilisateur non administrateur
6855 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6856 || $dernier_evenement == false
6857 || $this->is_evenement_retour($this->getVal("evenement")) == true
6858 || $this->getVal('date_envoi_signature') != ''
6859 || $this->getVal('date_retour_signature') != ''
6860 || $this->getVal('date_envoi_rar') != ''
6861 || $this->getVal('date_retour_rar') != ''
6862 || $this->getVal('date_envoi_controle_legalite') != ''
6863 || $this->getVal('date_retour_controle_legalite') != '') {
6864 // pas le droit de supprimer
6865 return false;;
6866 }
6867
6868 //
6869 return true;
6870 }
6871
6872
6873 /**
6874 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6875 * dossier.
6876 *
6877 * @return, boolean true/false
6878 */
6879 function is_instructeur_from_collectivite_dossier() {
6880 if ($this->f->isUserInstructeur() === true &&
6881 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6882 return true;
6883 }
6884 return false;
6885 }
6886
6887 /**
6888 * CONDITION - is_addable.
6889 *
6890 * Condition pour afficher les boutons modifier et supprimer.
6891 *
6892 * @return boolean
6893 */
6894 function is_addable() {
6895 // Contrôle si l'utilisateur possède un bypass
6896 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6897 //
6898 if ($bypass == true) {
6899
6900 //
6901 return true;
6902 }
6903 // Si l'utilisateur est un intructeur qui correspond à la
6904 // division du dossier ou qu'il peut changer la décision
6905 if ($this->is_instructeur_from_division_dossier() === true ||
6906 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6907 //
6908 return true;
6909 }
6910
6911 //
6912 return false;
6913 }
6914
6915 /**
6916 * CONDITION - is_finalizable.
6917 *
6918 * Condition pour afficher le bouton.
6919 *
6920 * @return boolean
6921 */
6922 function is_finalizable() {
6923 // Contrôle si l'utilisateur possède un bypass
6924 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6925 //
6926 if ($bypass == true) {
6927 //
6928 return true;
6929 }
6930
6931 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6932 // que l'événement n'est pas identifié comme non verrouillable
6933 if ($this->f->isUserInstructeur()
6934 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6935 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6936 //
6937 return false;
6938 }
6939
6940 // Si l'utilisateur est un intructeur qui correspond à la division du
6941 // dossier
6942 if ($this->is_instructeur_from_division_dossier() === true) {
6943 //
6944 return true;
6945 }
6946
6947 // Si l'utilisateur est instructeur de la commune du dossier et que
6948 // l'instruction est créée par un instructeur de la commune
6949 if ($this->is_instructeur_from_collectivite_dossier() === true &&
6950 $this->getVal('created_by_commune') === 't') {
6951 return true;
6952 }
6953
6954 //
6955 return false;
6956 }
6957
6958 /**
6959 * CONDITION - is_finalize_without_bypass.
6960 *
6961 * Condition pour afficher le bouton sans le bypass.
6962 *
6963 * @return boolean [description]
6964 */
6965 function is_finalizable_without_bypass() {
6966 // Récupère la valeur du champ finalisé
6967 $om_final_instruction = $this->getVal('om_final_instruction');
6968
6969 // Si le rapport n'est pas finalisé
6970 if (empty($om_final_instruction)
6971 || $om_final_instruction == 'f') {
6972 //
6973 return true;
6974 }
6975
6976 //
6977 return false;
6978 }
6979
6980 /**
6981 * CONDITION - is_unfinalizable.
6982 *
6983 * Condition pour afficher le bouton.
6984 *
6985 * @return boolean
6986 */
6987 function is_unfinalizable(){
6988 // Contrôle si l'utilisateur possède un bypass
6989 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6990 //
6991 if ($bypass == true) {
6992 //
6993 return true;
6994 }
6995
6996 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6997 // que l'événement n'est pas identifié comme non verrouillable
6998 if ($this->f->isUserInstructeur()
6999 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
7000 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
7001 //
7002 return false;
7003 }
7004
7005 // Si l'utilisateur est un intructeur qui correspond à la division du
7006 // dossier
7007 if ($this->is_instructeur_from_division_dossier() === true) {
7008 //
7009 return true;
7010 }
7011
7012 // Si l'utilisateur est instructeur de la commune du dossier et que
7013 // l'instruction est créée par un instructeur de la commune
7014 if ($this->is_instructeur_from_collectivite_dossier() === true &&
7015 $this->getVal('created_by_commune') === 't') {
7016 return true;
7017 }
7018
7019 //
7020 return false;
7021 }
7022
7023 /**
7024 * CONDITION - is_unfinalizable_without_bypass.
7025 *
7026 * Condition pour afficher le bouton sans le bypass.
7027 *
7028 * @return boolean
7029 */
7030 function is_unfinalizable_without_bypass() {
7031 // Récupère la valeur du champ finalisé
7032 $om_final_instruction = $this->getVal('om_final_instruction');
7033
7034 // Si l'instruction est finalisée
7035 if ($om_final_instruction == 't') {
7036 //
7037 return true;
7038 }
7039
7040 //
7041 return false;
7042 }
7043
7044
7045 /**
7046 * Permet de définir si un instructeur commune peut editer une instruction
7047 *
7048 * @return boolean true si il peut
7049 */
7050 function isInstrCanChangeDecision($idx) {
7051
7052 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true ||
7053 $this->f->isUserInstructeur() !== true) {
7054 return false;
7055 }
7056
7057
7058
7059 // Sinon on vérifie l'éligibilité du dossier au changement de décision
7060 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
7061 // de décision :
7062 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
7063 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
7064 $sql = sprintf(
7065 'SELECT
7066 dossier.dossier
7067 FROM
7068 %1$sdossier
7069 JOIN %1$setat
7070 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
7071 JOIN %1$slien_dossier_demandeur
7072 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
7073 JOIN %1$sdossier_instruction_type
7074 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
7075 JOIN %1$sinstruction
7076 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
7077 ON instruction.instruction = (
7078 SELECT instruction
7079 FROM %1$sinstruction
7080 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
7081 AND evenement.retour IS FALSE
7082 WHERE instruction.dossier = dossier.dossier
7083 ORDER BY date_evenement DESC, instruction DESC
7084 LIMIT 1
7085 )
7086 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
7087 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
7088 -- non signée, non notifié, etc.
7089 AND (instruction.om_final_instruction IS TRUE
7090 OR instruction.created_by_commune IS TRUE)
7091 AND instruction.date_retour_signature IS NULL
7092 AND instruction.date_envoi_rar IS NULL
7093 AND instruction.date_retour_rar IS NULL
7094 AND instruction.date_envoi_controle_legalite IS NULL
7095 AND instruction.date_retour_controle_legalite IS NULL
7096 -- On vérifie que l instruction soit un arrêté ou un changement de décision
7097 JOIN %1$sevenement
7098 ON instruction.evenement=evenement.evenement
7099 AND (evenement.type = \'arrete\'
7100 OR evenement.type = \'changement_decision\')
7101 -- Recherche les informations du pétitionnaire principal pour l affichage
7102 JOIN %1$sdemandeur
7103 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7104 -- Recherche la collectivité rattachée à l instructeur
7105 JOIN %1$sinstructeur
7106 ON dossier.instructeur=instructeur.instructeur
7107 JOIN %1$sdivision
7108 ON instructeur.division=division.division
7109 JOIN %1$sdirection
7110 ON division.direction=direction.direction
7111 JOIN %1$som_collectivite
7112 ON direction.om_collectivite=om_collectivite.om_collectivite
7113 WHERE
7114 -- Vérification que la décision a été prise par l agglo
7115 om_collectivite.niveau = \'2\'
7116 AND dossier.dossier = \'%2$s\'
7117 ',
7118 DB_PREFIXE,
7119 $this->f->db->escapeSimple($idx)
7120 );
7121
7122
7123 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7124 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7125 $sql .= sprintf(
7126 ' AND dossier.om_collectivite = %1$d',
7127 intval($_SESSION['collectivite'])
7128 );
7129 }
7130 $qres = $this->f->get_one_result_from_db_query(
7131 $sql,
7132 array(
7133 "origin" => __METHOD__,
7134 )
7135 );
7136
7137 return $qres['result'] !== null;
7138 }
7139
7140
7141 /**
7142 * CONDITION - can_monitoring_dates.
7143 *
7144 * Condition pour afficher le bouton de suivi des dates.
7145 *
7146 * @return boolean
7147 */
7148 public function can_monitoring_dates() {
7149 // Récupère la valeur du champ finalisé
7150 $om_final_instruction = $this->getVal('om_final_instruction');
7151
7152 // Si l'instruction n'est pas finalisée
7153 if ($om_final_instruction !== 't') {
7154 //
7155 return false;
7156 }
7157
7158 // Contrôle si l'utilisateur possède un bypass
7159 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7160 if ($bypass === true) {
7161 return true;
7162 }
7163
7164 // Permission de modifier le suivi des dates sur un dossier cloturé pour
7165 // un utilisateur lié à un instructeur
7166 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7167
7168 // On vérifie en premier lieu que le DI n'est pas clôturé et que
7169 // l'utilisateur ne possède pas la permission de modifier le suivi des
7170 // dates sur un dossier clôturé
7171 $inst_dossier = $this->get_inst_dossier();
7172 if ($inst_dossier->getStatut() === 'cloture'
7173 && $perm_moni_dates_d_closed === false) {
7174 //
7175 return false;
7176 }
7177 // On récupère ses infos
7178 $coll_di = $inst_dossier->getVal('om_collectivite');
7179 $div_di = $this->getDivisionFromDossier();
7180 // et celles de son éventuel instructeur
7181 $instr_di = $inst_dossier->getVal('instructeur');
7182
7183 // Il faut disposer d'une entrée instructeur
7184 if ($this->f->isUserInstructeur() === false) {
7185 return false;
7186 }
7187
7188 // Par défaut on prétend que l'instructeur n'est pas multi
7189 $instr_di_coll_multi = false;
7190 // Si un instructeur est affecté au dossier
7191 if ($instr_di !== '' && $instr_di !== null) {
7192 // Vérifie si l'instructeur est de la collectivité de niveau 2
7193 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
7194 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
7195 //
7196 $instr_di_coll_multi = true;
7197 }
7198 }
7199
7200 // Il faut qu'il instruise le dossier ou soit de la même division
7201 if ($this->f->om_utilisateur['instructeur'] === $instr_di
7202 || $this->f->om_utilisateur['division'] === $div_di) {
7203 //
7204 return true;
7205 }
7206
7207 // On donne également le droit s'il est de la même collectivité que
7208 // le dossier ET si l'instruction est déléguée à la communauté
7209 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
7210 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
7211 && $instr_di_coll_multi === true) {
7212 //
7213 return true;
7214 }
7215
7216 // Si l'instructeur ne rentre pas dans les deux cas précédents
7217 return false;
7218 }
7219
7220
7221 /**
7222 * CONDITION - is_finalized.
7223 *
7224 * Condition pour vérifier si une instruction est finalisée.
7225 *
7226 * @return boolean
7227 */
7228 public function is_finalized() {
7229
7230 return $this->getVal('om_final_instruction') === "t";
7231 }
7232
7233 /**
7234 * CONDITION - is_not_date_retour_signature_set.
7235 *
7236 * Condition pour vérifier si une date de retour signature n'est pas définie.
7237 *
7238 * @return boolean
7239 */
7240 public function is_not_date_retour_signature_set() {
7241
7242 return $this->getVal('date_retour_signature') == null;
7243
7244 }
7245
7246
7247 /**
7248 * TREATMENT - finalize.
7249 *
7250 * Permet de finaliser un enregistrement.
7251 *
7252 * @param array $val valeurs soumises par le formulaire
7253 *
7254 * @return boolean
7255 */
7256 function finalize($val = array()) {
7257 // Cette méthode permet d'exécuter une routine en début des méthodes
7258 // dites de TREATMENT.
7259 $this->begin_treatment(__METHOD__);
7260 $message = '';
7261 $ev = $this->get_inst_evenement($this->getVal('evenement'));
7262
7263 $this->f->log(__METHOD__, 'BEGIN');
7264 $collectivite_di = null;
7265 $data = array('val' => &$val);
7266 $data['ev'] = $ev;
7267 $data['collectivite_di'] = $collectivite_di;
7268 $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7269
7270 // Controle du signataire
7271 if (! $this->controle_signataire($ev)) {
7272 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7273 // Termine le traitement
7274 return $this->end_treatment(__METHOD__, false);
7275 }
7276
7277 // Traitement de la finalisation
7278 $ret = $this->manage_finalizing("finalize", $val);
7279
7280 // Si le traitement retourne une erreur
7281 if ($ret !== true) {
7282
7283 // Termine le traitement
7284 return $this->end_treatment(__METHOD__, false);
7285 }
7286
7287 // Envoi des notifications aux demandeurs si la notification est automatique
7288 // et que la signature n'est pas requise
7289 if ($ev->getVal('notification') === 'notification_automatique') {
7290 // Préparation du message de log en cas d'erreur de notification
7291 $msgLog = sprintf(
7292 '%s %s : %d',
7293 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7294 __('Instruction notifiée'),
7295 $this->getVal($this->clePrimaire)
7296 );
7297 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7298 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7299 // Récupération de la liste des demandeurs à notifier et de la catégorie
7300 $categorie = $this->f->get_param_option_notification($collectivite_di);
7301 $isPortal = $categorie === PORTAL;
7302 $demandeursANotifie = $this->get_demandeurs_notifiable(
7303 $this->getVal('dossier'),
7304 $isPortal
7305 );
7306
7307 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7308 $demandeurPrincipalNotifie = false;
7309 if (count($demandeursANotifie) > 0) {
7310 foreach ($demandeursANotifie as $demandeur) {
7311 // Identifie si le demandeur principal a été notifié ou pas
7312 // et récupère ses informations
7313 if ($demandeur['petitionnaire_principal'] == 't') {
7314 $demandeurPrincipalNotifie = true;
7315 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7316 // son paramétrage, on effectue pas le traitement et on passe à l'itération
7317 // suivante. On le considère également comme non notifié pour gérer l'envoie
7318 // des messages d'erreurs
7319 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7320 // d'impact sur la notification
7321 $erreursParam = $this->get_info_notification_fail();
7322 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7323 $demandeurPrincipalNotifie = false;
7324 continue;
7325 }
7326 }
7327 //
7328 $msg_notif = '';
7329
7330 $option_bloquer_notif_auto_dln_types_evenements = $this->f->getParameter("option_bloquer_notif_auto_dln") !== null ? explode(';', $this->f->getParameter("option_bloquer_notif_auto_dln")) : null;
7331 // On vérifie l'existence du paramètre 'option_bloquer_notif_auto_dln',
7332 // On vérifie si la date limite est dépassée ou si le type d'événement est erroné
7333 if (! empty($option_bloquer_notif_auto_dln_types_evenements)
7334 && $this->is_type_evenement_autorise($ev, array('types_evenements_autorises'=> $option_bloquer_notif_auto_dln_types_evenements)) === true
7335 && $this->is_date_limite_notification_premier_mois_depasee() === true) {
7336 // Ajout de la notif et récupération de son id
7337 $idNotif = $this->ajouter_notification(
7338 $this->getVal($this->clePrimaire),
7339 $this->f->get_connected_user_login_name(),
7340 $demandeur,
7341 $collectivite_di,
7342 array(),
7343 true,
7344 'Echec',
7345 __('La date limite de notification au demandeur est dépassée')
7346 );
7347 if ($idNotif === false) {
7348 // Termine le traitement
7349 $this->addToLog(
7350 sprintf('%s() : %s', __METHOD__, $msgLog),
7351 DEBUG_MODE
7352 );
7353 return $this->end_treatment(__METHOD__, false);
7354 }
7355 $msg_notif = sprintf('%s<br/>%s', __("La notification n'a pas été générée, car la date limite de notification au demandeur est dépassée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7356 }
7357 else {
7358 // Ajout de la notif et récupération de son id
7359 $idNotif = $this->ajouter_notification(
7360 $this->getVal($this->clePrimaire),
7361 $this->f->get_connected_user_login_name(),
7362 $demandeur,
7363 $collectivite_di,
7364 array(),
7365 true
7366 );
7367 if ($idNotif === false) {
7368 // Termine le traitement
7369 $this->addToLog(
7370 sprintf('%s() : %s', __METHOD__, $msgLog),
7371 DEBUG_MODE
7372 );
7373 return $this->end_treatment(__METHOD__, false);
7374 }
7375 $notification_by_task = $this->notification_by_task(
7376 $idNotif,
7377 $this->getVal('dossier'),
7378 $categorie
7379 );
7380 if ($notification_by_task === false) {
7381 $this->addToLog(
7382 sprintf('%s() : %s', __METHOD__, $msgLog),
7383 DEBUG_MODE
7384 );
7385 $this->addToMessage(
7386 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7387 );
7388 // Termine le traitement
7389 return $this->end_treatment(__METHOD__, false);
7390 }
7391 $msg_notif = sprintf('%s<br/>%s', __("La notification a été générée."), __("Le suivi de la notification est disponible depuis l'instruction."));
7392 }
7393 }
7394 $this->addToMessage($message .= $msg_notif);
7395 }
7396 // Pour la notification par mail ou la notification via portal si le dossier a
7397 // été déposés via portal, si le demandeur principal n'est pas notifiable,
7398 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7399 // laquelle le demandeur principal n'a pas pu être notifié
7400 $depotPortal = $this->dossier_depose_sur_portail();
7401 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7402 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7403 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7404 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7405 $erreursParam = $this->get_info_notification_fail();
7406 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7407 // Ajout de la notif et récupération de son id
7408 $idNotif = $this->ajouter_notification(
7409 $this->valF[$this->clePrimaire],
7410 $this->f->get_connected_user_login_name(),
7411 $demandeurPrincipal,
7412 $collectivite_di,
7413 array(),
7414 true,
7415 'Echec',
7416 implode(' ', $erreursParam)
7417 );
7418 if ($idNotif === false) {
7419 $this->addToMessage(
7420 __('Erreur : la création de la notification a échouée.').
7421 __("Veuillez contacter votre administrateur.")
7422 );
7423 $this->addToLog(
7424 sprintf('%s() : %s', __METHOD__, $msgLog),
7425 DEBUG_MODE
7426 );
7427 return false;
7428 }
7429 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7430 // de l'échec de la notification
7431 $dossier_message = $this->get_inst_dossier_message(0);
7432 $dossier_message_val = array(
7433 'dossier' => $this->getVal('dossier'),
7434 'type' => __('erreur expedition'),
7435 'emetteur' => $this->f->get_connected_user_login_name(),
7436 'login' => $_SESSION['login'],
7437 'date_emission' => date('Y-m-d H:i:s'),
7438 'contenu' => __('Échec lors de la notification de l\'instruction ').
7439 $ev->getVal('libelle').
7440 '.<br>'.
7441 implode("\n", $erreursParam).
7442 '<br>'.
7443 __('Veuillez corriger ces informations avant de renvoyer la notification.')
7444 );
7445 $add = $dossier_message->add_notification_message($dossier_message_val, true);
7446 // Si une erreur se produit pendant l'ajout
7447 if ($add !== true) {
7448 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7449 return false;
7450 }
7451 }
7452 }
7453
7454 // Termine le traitement
7455 // Événement
7456 $data['ev'] = $ev;
7457 $data['collectivite_di'] = $collectivite_di;
7458 $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7459 $this->f->log(__METHOD__, 'END');
7460
7461 return $this->end_treatment(__METHOD__, true);
7462 }
7463
7464 /**
7465 * Récupère l'instance de dossier message.
7466 *
7467 * @param string $dossier_message Identifiant du message.
7468 *
7469 * @return object
7470 */
7471 private function get_inst_dossier_message($dossier_message = null) {
7472 //
7473 return $this->get_inst_common("dossier_message", $dossier_message);
7474 }
7475
7476 /**
7477 * Vérifie si le signataire est obligatoire pour finaliser
7478 * le document apartir du paramétrage de l'événement.
7479 * Si c'est le cas, vérifie si il y a bien un signataire
7480 * renseigné.
7481 * Si c'est le cas renvoie true, sinon renvoie false.
7482 *
7483 * @param evenement évenement de l'instruction permettant de
7484 * récupérer le paramétrage
7485 * @return boolean
7486 */
7487 protected function controle_signataire($evenement) {
7488 // Vérifie si le signataire est obligatoire et si c'est le cas
7489 // vérifie si il y a bien un signataire pour le document
7490 if ($evenement->is_signataire_obligatoire() &&
7491 ($this->getVal('signataire_arrete') === null ||
7492 $this->getVal('signataire_arrete') === '')) {
7493 return false;
7494 }
7495 return true;
7496 }
7497
7498 /**
7499 * TREATMENT - unfinalize.
7500 *
7501 * Permet de définaliser un enregistrement.
7502 *
7503 * @param array $val valeurs soumises par le formulaire
7504 *
7505 * @return boolean
7506 */
7507 function unfinalize($val = array()) {
7508
7509 // Cette méthode permet d'exécuter une routine en début des méthodes
7510 // dites de TREATMENT.
7511 $this->begin_treatment(__METHOD__);
7512
7513 // Traitement de la finalisation
7514 $ret = $this->manage_finalizing("unfinalize", $val);
7515
7516 // Si le traitement retourne une erreur
7517 if ($ret !== true) {
7518
7519 // Termine le traitement
7520 return $this->end_treatment(__METHOD__, false);
7521 }
7522
7523 // Termine le traitement
7524 return $this->end_treatment(__METHOD__, true);
7525 }
7526
7527 /**
7528 * VIEW - view_edition
7529 *
7530 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7531 *
7532 * @return null Si l'action est incorrecte
7533 */
7534 function view_edition() {
7535
7536 // Si l'instruction est finalisée
7537 if($this->getVal("om_final_instruction") == 't'
7538 && $this->getVal("om_final_instruction") != null) {
7539
7540 // Ouvre le document
7541 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7542 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7543 //
7544 header("Location: ".$lien);
7545 } else {
7546
7547 // Récupère la collectivite du dossier d'instruction
7548 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7549
7550 //
7551 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7552
7553 // Paramètre du PDF
7554 $params = array(
7555 "watermark" => true,
7556 "specific" => array(
7557 "mode" => "previsualisation",
7558 ),
7559 );
7560 // Si la rédaction libre est activée sur l'instruction
7561 if ($this->getVal("flag_edition_integrale") == 't') {
7562 $params["specific"]["corps"] = array(
7563 "mode" => "set",
7564 "value" => $this->getVal("corps_om_htmletatex"),
7565 );
7566 $params["specific"]["titre"] = array(
7567 "mode" => "set",
7568 "value" => $this->getVal("titre_om_htmletat"),
7569 );
7570 }
7571
7572 // Génération du PDF
7573 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7574 $result['filename'] = $this->determinate_name_doc_pdf();
7575 // Affichage du PDF
7576 $this->expose_pdf_output(
7577 $result['pdf_output'],
7578 $result['filename']
7579 );
7580 }
7581 }
7582
7583 /**
7584 * Récupère la collectivité du dossier d'instruction.
7585 *
7586 * @param string $dossier_instruction_id Identifiant du DI.
7587 *
7588 * @return integer
7589 */
7590 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7591
7592 // Si l'identifiant n'est pas renseigné
7593 if ($dossier_instruction_id === null) {
7594 // Récupère la valeur
7595 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7596 $dossier_instruction_id = $this->getVal('dossier');
7597 } elseif ($this->getParameter('idxformulaire') !== null
7598 && $this->getParameter('idxformulaire') !== '') {
7599 //
7600 $dossier_instruction_id = $this->getParameter('idxformulaire');
7601 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7602 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7603 //
7604 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7605 }
7606 }
7607
7608 //
7609 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7610 "obj" => "dossier_instruction",
7611 "idx" => $dossier_instruction_id,
7612 ));
7613
7614 //
7615 return $dossier_instruction->getVal('om_collectivite');
7616 }
7617
7618 /**
7619 * VIEW - view_bible
7620 *
7621 * Affiche la bible manuelle.
7622 *
7623 * @return void
7624 */
7625 function view_bible() {
7626 // Vérification de l'accessibilité sur l'élément
7627 $this->checkAccessibility();
7628
7629 /**
7630 * Affichage de la structure HTML
7631 */
7632 //
7633 if ($this->f->isAjaxRequest()) {
7634 //
7635 header("Content-type: text/html; charset=".HTTPCHARSET."");
7636 } else {
7637 //
7638 $this->f->setFlag("htmlonly");
7639 $this->f->display();
7640 }
7641 //
7642 $this->f->displayStartContent();
7643 //
7644 $this->f->setTitle(__("Liste des éléments de la bible en lien avec un evenement"));
7645 $this->f->displayTitle();
7646
7647 /**
7648 *
7649 */
7650 //
7651 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7652 $evenement = intval($evenement);
7653 //
7654 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7655 // Récupération du code du type de DA
7656 $code_da_type = '';
7657 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7658 $code_da_type = $matches[0];
7659 }
7660 //
7661 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7662
7663 // Récupération de la collectivité du dossier
7664 $dossier = $this->f->get_inst__om_dbform(array(
7665 "obj" => "dossier",
7666 "idx" => $idx,
7667 ));
7668
7669 $qres = $this->f->get_all_results_from_db_query(
7670 sprintf(
7671 'SELECT
7672 *,
7673 bible.libelle as bible_lib
7674 FROM
7675 %1$sbible
7676 LEFT OUTER JOIN %1$sdossier_autorisation_type
7677 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7678 LEFT JOIN %1$som_collectivite
7679 ON bible.om_collectivite = om_collectivite.om_collectivite
7680 WHERE
7681 (evenement = %2$d
7682 OR evenement IS NULL)
7683 AND (complement = %3$d
7684 OR complement IS NULL)
7685 AND (bible.dossier_autorisation_type IS NULL
7686 OR dossier_autorisation_type.code = \'%4$s\')
7687 AND (om_collectivite.niveau = \'2\'
7688 OR bible.om_collectivite = %5$d)
7689 ORDER BY
7690 bible_lib ASC',
7691 DB_PREFIXE,
7692 intval($evenement),
7693 intval($complement),
7694 $this->f->db->escapeSimple($code_da_type),
7695 intval($dossier->getVal("om_collectivite"))
7696 ),
7697 array(
7698 'origin' => __METHOD__
7699 )
7700 );
7701 //
7702 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7703 //
7704 if ($qres['row_count'] > 0) {
7705 //
7706 echo "\t<table id='tab-bible' width='100%'>\n";
7707 //
7708 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7709 echo "<th>".__("Choisir")."</th>";
7710 echo "<th>".__("Libelle")."</th>";
7711 echo "</tr>\n";
7712 //
7713 $i = 0;
7714 //
7715 foreach ($qres['result'] as $row) {
7716 //
7717 echo "\t\t<tr";
7718 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7719 echo ">";
7720 //
7721 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7722 // XXX utilisation de l'attribut titre pour afficher une infobulle
7723 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7724 //
7725 echo "</tr>\n";
7726 //
7727 $i++;
7728 }
7729 echo "\t</table>\n";
7730 //
7731 echo "<div class=\"formControls\">\n";
7732 $this->f->layout->display_form_button(array(
7733 "value" => __("Valider"),
7734 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7735 ));
7736 $this->f->displayLinkJsCloseWindow();
7737 echo "</div>\n";
7738
7739 } else {
7740 //
7741 $message_class = "error";
7742 $message = __("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7743 $this->f->displayMessage($message_class, $message);
7744 //
7745 echo "<div class=\"formControls\">\n";
7746 $this->f->displayLinkJsCloseWindow();
7747 echo "</div>\n";
7748 }
7749 //
7750 echo "</form>\n";
7751
7752 /**
7753 * Affichage de la structure HTML
7754 */
7755 //
7756 $this->f->displayEndContent();
7757 }
7758
7759 /**
7760 * VIEW - view_bible_auto
7761 *
7762 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7763 *
7764 * @return void
7765 */
7766 function view_bible_auto() {
7767 // Vérification de l'accessibilité sur l'élément
7768 $this->checkAccessibility();
7769 //
7770 $this->f->disableLog();
7771
7772 $formatDate="AAAA-MM-JJ";
7773
7774 // Récupération des paramètres
7775 $idx = $this->f->get_submitted_get_value('idx');
7776 $evenement = $this->f->get_submitted_get_value('ev');
7777
7778 // Initialisation de la variable de retour
7779 $retour['complement_om_html'] = '';
7780 $retour['complement2_om_html'] = '';
7781 $retour['complement3_om_html'] = '';
7782 $retour['complement4_om_html'] = '';
7783
7784 // Vérification d'une consultation liée à l'événement
7785 $instEvenement = $this->f->get_inst__om_dbform(array(
7786 "obj" => "evenement",
7787 "idx" => $evenement,
7788 ));
7789
7790 // Si consultation liée, récupération du retour d'avis
7791 if($instEvenement->getVal('consultation') == 'Oui'){
7792
7793 $qres = $this->f->get_all_results_from_db_query(
7794 sprintf(
7795 'SELECT
7796 date_retour,
7797 avis_consultation.libelle as avis_consultation,
7798 COALESCE(service.libelle, tiers_consulte.libelle) as service
7799 FROM
7800 %1$sconsultation
7801 LEFT JOIN %1$stiers_consulte
7802 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7803 LEFT JOIN %1$sservice
7804 ON consultation.service = service.service
7805 LEFT JOIN %1$savis_consultation
7806 ON consultation.avis_consultation = avis_consultation.avis_consultation
7807 WHERE
7808 dossier = \'%2$s\'
7809 AND consultation.visible',
7810 DB_PREFIXE,
7811 $this->f->db->escapeSimple($idx)
7812 ),
7813 array(
7814 'origin' => __METHOD__
7815 )
7816 );
7817 // Récupération des consultations
7818 foreach ($qres['result'] as $row) {
7819 $correct=false;
7820 // date retour
7821 if ($row['date_retour']<>""){
7822 if ($formatDate=="AAAA-MM-JJ"){
7823 $date = explode("-", $row['date_retour']);
7824 // controle de date
7825 if (count($date) == 3 &&
7826 checkdate($date[1], $date[2], $date[0])) {
7827 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7828 $correct=true;
7829 }else{
7830 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7831 $correct=false;
7832 }
7833 }
7834 }
7835 //
7836 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7837 if($correct == true){
7838 $temp=$temp." du ".$date_retour_f;
7839 }
7840 // Concaténation des retours d'avis de consultation
7841 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7842 } // while
7843
7844 } // consultation
7845 // Récupération des bibles automatiques pour le champ complement_om_html
7846 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7847 // Récupération des bibles automatiques pour le champ complement2_om_html
7848 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7849 // Récupération des bibles automatiques pour le champ complement3_om_html
7850 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7851 // Récupération des bibles automatiques pour le champ complement4_om_html
7852 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7853
7854
7855
7856 echo json_encode($retour);
7857 }
7858
7859 /**
7860 * VIEW - view_pdf_temp
7861 *
7862 * @return void
7863 */
7864 function view_pdf_temp() {
7865 $this->checkAccessibility();
7866 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7867 $this->f->set_submitted_value();
7868 $merge_fields = array();
7869 //
7870 if (array_key_exists('c1', $_POST) === true) {
7871 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7872 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7873 }
7874 if (array_key_exists('c2', $_POST) === true) {
7875 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7876 }
7877 if (array_key_exists('c3', $_POST) === true) {
7878 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7879 }
7880 if (array_key_exists('c4', $_POST) === true) {
7881 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7882 }
7883 $params = array(
7884 "watermark" => true,
7885 "specific" => array(
7886 "merge_fields" => $merge_fields,
7887 ),
7888 );
7889 //
7890 if (array_key_exists('corps', $_POST) === true) {
7891 $params["specific"]["corps"] = array(
7892 "mode" => "set",
7893 "value" => $_POST['corps'],
7894 );
7895 }
7896 if (array_key_exists('titre', $_POST) === true) {
7897 $params["specific"]["titre"] = array(
7898 "mode" => "set",
7899 "value" => $_POST['titre'],
7900 );
7901 }
7902 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7903 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7904 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7905 $retour = array(
7906 'base' => base64_encode($result['pdf_output']),
7907 );
7908 echo json_encode($retour);
7909 }
7910
7911 /**
7912 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7913 * PDF sans prise en compte de la valeur des compléments et le retourne en
7914 * base 64.
7915 *
7916 * @return string Rendu PDF converti en base 64.
7917 */
7918 function init_pdf_temp() {
7919 $params = array(
7920 "watermark" => true,
7921 );
7922 // Si la rédaction libre est activée sur l'instruction
7923 if ($this->getVal("flag_edition_integrale") == 't') {
7924 $params["specific"]["corps"] = array(
7925 "mode" => "set",
7926 "value" => $this->getVal("corps_om_htmletatex"),
7927 );
7928 $params["specific"]["titre"] = array(
7929 "mode" => "set",
7930 "value" => $this->getVal("titre_om_htmletat"),
7931 );
7932 }
7933 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7934 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7935 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7936
7937 return base64_encode($result['pdf_output']);
7938 }
7939
7940 /**
7941 * Récupération des éléments de bible.
7942 *
7943 * @param integer $event id de l'événement
7944 * @param string $idx id du dossier
7945 * @param integer $compnb numéro du champ complement
7946 * @param string $type types possibles : automatique ou precharge
7947 *
7948 * @return string Chaîne de texte à insérer dans le champ complement
7949 */
7950 function getBible($event, $idx, $compnb, $type = 'automatique') {
7951 // Récupération de la collectivité du dossier
7952 $dossier = $this->f->get_inst__om_dbform(array(
7953 "obj" => "dossier",
7954 "idx" => $idx,
7955 ));
7956 // Récupération du code du type de DA
7957 $code_da_type = '';
7958 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7959 $code_da_type = $matches[0];
7960 }
7961
7962 // Prépare le filtre de la requête selon le type de remplissage voulu
7963 $sql_filter_type = '';
7964 if ($type === 'automatique') {
7965 $sql_filter_type = "AND automatique = 'Oui'";
7966 } elseif ($type === 'precharge') {
7967 $sql_filter_type = "AND precharge IS TRUE";
7968 }
7969
7970 $qres = $this->f->get_all_results_from_db_query(
7971 sprintf(
7972 'SELECT
7973 *
7974 FROM
7975 %1$sbible
7976 LEFT OUTER JOIN %1$sdossier_autorisation_type
7977 ON bible.dossier_autorisation_type =
7978 dossier_autorisation_type.dossier_autorisation_type
7979 LEFT JOIN %1$som_collectivite
7980 ON bible.om_collectivite = om_collectivite.om_collectivite
7981 WHERE
7982 (evenement = %2$d
7983 OR evenement IS NULL)
7984 AND (complement = %3$d
7985 OR complement IS NULL)
7986 AND (dossier_autorisation_type.code = \'%4$s\'
7987 OR bible.dossier_autorisation_type IS NULL)
7988 AND (om_collectivite.niveau = \'2\'
7989 OR bible.om_collectivite = %5$d)
7990 %6$s',
7991 DB_PREFIXE,
7992 intval($event),
7993 intval($compnb),
7994 $this->f->db->escapeSimple($code_da_type),
7995 intval($dossier->getVal("om_collectivite")),
7996 $sql_filter_type
7997 ),
7998 array(
7999 "origin" => __METHOD__
8000 )
8001 );
8002 $temp = "";
8003 foreach ($qres['result'] as $row) {
8004 // Remplacement des retours à la ligne par des br
8005 $temp .= preg_replace(
8006 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
8007 );
8008 // Ajout d'un saut de ligne entre chaque bible.
8009 $temp .= '<br/>';
8010 } // fin while
8011 return $temp;
8012 }
8013
8014 /**
8015 * VIEW - view_suivi_bordereaux.
8016 *
8017 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
8018 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
8019 * collectivité des dossiers affichés.
8020 *
8021 * @return void
8022 */
8023 function view_suivi_bordereaux() {
8024 // Vérification de l'accessibilité sur l'élément
8025 $this->checkAccessibility();
8026
8027 /**
8028 * Validation du formulaire
8029 */
8030 // Si le formulaire a été validé
8031 if ($this->f->get_submitted_post_value("validation") !== null) {
8032 // Si un bordereau à été sélectionné
8033 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
8034 // Si aucun bordereau n'a été sélectionné
8035 $message_class = "error";
8036 $message = __("Veuillez selectionner un bordereau.");
8037 }
8038 // Sinon si les dates ne sont pas valide
8039 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
8040 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
8041 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
8042 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
8043 // Si aucune date n'a été saisie
8044 $message_class = "error";
8045 $message = __("Veuillez saisir une date valide.");
8046 }
8047 // Sinon si les dates ne sont pas valides
8048 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
8049 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
8050 // Si aucune date n'a été saisie
8051 $message_class = "error";
8052 $message = __("Erreur de parametrage. Contactez votre administrateur.");
8053 }
8054 // Affiche le message de validation
8055 else {
8056 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
8057 $etat = $this->f->get_inst__om_dbform(array(
8058 "obj" => "om_etat",
8059 "idx" => $this->f->get_submitted_post_value("bordereau")
8060 ));
8061 $qres = $this->f->get_one_result_from_db_query(
8062 sprintf(
8063 'SELECT
8064 om_etat.libelle
8065 FROM
8066 %som_etat
8067 WHERE
8068 om_etat.id = \'%s\'',
8069 DB_PREFIXE,
8070 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
8071 ),
8072 array(
8073 "origin" => __METHOD__,
8074 )
8075 );
8076
8077 //
8078 $message_class = "valid";
8079 $message = __("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
8080 $message .= " : <br/><br/>";
8081 $message .= "<a class='om-prev-icon pdf-16'";
8082 $message .= " title=\"".__("Bordereau")."\"";
8083 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
8084 $message .= "&action=220";
8085 $message .= "&idx=0";
8086 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
8087 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
8088 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
8089 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
8090 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
8091 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
8092 }
8093 $message .= "'"." target='_blank'>";
8094 $message .= $qres['result']." ".__("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
8095 ." ".__("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
8096 $message .= "</a>";
8097 }
8098 }
8099
8100 /**
8101 * Affichage des messages et du formulaire
8102 */
8103 // Affichage du message de validation ou d'erreur
8104 if (isset($message) && isset($message_class) && $message != "") {
8105 $this->f->displayMessage($message_class, $message);
8106 }
8107 // Ouverture du formulaire
8108 printf("\t<form");
8109 printf(" method=\"post\"");
8110 printf(" id=\"suivi_bordereaux_form\"");
8111 printf(" action=\"\"");
8112 printf(">\n");
8113 // Paramétrage des champs du formulaire
8114 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
8115 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
8116 // collectivité dans le formulaire
8117 if ($_SESSION["niveau"] == 2) {
8118 array_push($champs, "om_collectivite");
8119 }
8120 // Création d'un nouvel objet de type formulaire
8121 $form = $this->f->get_inst__om_formulaire(array(
8122 "validation" => 0,
8123 "maj" => 0,
8124 "champs" => $champs,
8125 ));
8126 // Paramétrage du champ date_bordereau_debut
8127 $form->setLib("date_bordereau_debut", __("date_bordereau_debut"));
8128 $form->setType("date_bordereau_debut", "date");
8129 $form->setTaille("date_bordereau_debut", 12);
8130 $form->setMax("date_bordereau_debut", 12);
8131 $form->setRequired("date_bordereau_debut");
8132 $form->setOnchange("date_bordereau_debut", "fdate(this)");
8133 $form->setVal("date_bordereau_debut", date("d/m/Y"));
8134 // Paramétrage du champ date_bordereau_fin
8135 $form->setLib("date_bordereau_fin", __("date_bordereau_fin"));
8136 $form->setType("date_bordereau_fin", "date");
8137 $form->setTaille("date_bordereau_fin", 12);
8138 $form->setMax("date_bordereau_fin", 12);
8139 $form->setRequired("date_bordereau_fin");
8140 $form->setOnchange("date_bordereau_fin", "fdate(this)");
8141 $form->setVal("date_bordereau_fin", date("d/m/Y"));
8142 // Paramétrage du champ bordereau
8143 $form->setLib("bordereau", __("bordereau"));
8144 $form->setType("bordereau", "select");
8145 $form->setRequired("bordereau");
8146 // Valeurs des champs
8147 if ($this->f->get_submitted_post_value("validation") !== null) {
8148 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
8149 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
8150 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
8151 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
8152 }
8153 // Données du select - On récupère ici la liste de tous les états disponibles
8154 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
8155 // 'bordereau_'
8156 $qres = $this->f->get_all_results_from_db_query(
8157 sprintf(
8158 'SELECT
8159 om_etat.id,
8160 om_etat.libelle
8161 FROM
8162 %1$som_etat
8163 WHERE
8164 om_etat.id LIKE \'bordereau_%%\'
8165 ORDER BY
8166 om_etat.id',
8167 DB_PREFIXE
8168 ),
8169 array(
8170 "origin" => __METHOD__
8171 )
8172 );
8173 // Données du select
8174 $contenu = array(
8175 0 => array("", ),
8176 1 => array(__("choisir bordereau")),
8177 );
8178 foreach ($qres['result'] as $row) {
8179 $contenu[0][] = $row['id'];
8180 $contenu[1][] = $row['libelle'];
8181 }
8182 $form->setSelect("bordereau", $contenu);
8183 //
8184 if ($_SESSION["niveau"] == 2) {
8185 $form->setLib("om_collectivite", __("collectivite"));
8186 $form->setType("om_collectivite", "select");
8187
8188 // Données du select - On récupère ici la liste de tous toutes les collectivités
8189 // de niveau 1
8190 $qres = $this->f->get_all_results_from_db_query(
8191 sprintf(
8192 'SELECT
8193 om_collectivite,
8194 libelle
8195 FROM
8196 %1$som_collectivite
8197 WHERE
8198 niveau = \'1\'
8199 ORDER BY
8200 libelle',
8201 DB_PREFIXE
8202 ),
8203 array(
8204 "origin" => __METHOD__
8205 )
8206 );
8207 // La valeur par défaut du select est Toutes
8208 $list_collectivites = array(
8209 0 => array("", ),
8210 1 => array(__("toutes"))
8211 );
8212
8213 $id_colls = "";
8214 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8215 // par des virgules, pour un traitement plus facile dans la requête de sous-état
8216 foreach ($qres['result'] as $row) {
8217 if ($id_colls != "") {
8218 $id_colls .= ",";
8219 }
8220 $id_colls .= $row['om_collectivite'];
8221 $list_collectivites[0][] = $row['om_collectivite'];
8222 $list_collectivites[1][] = $row['libelle'];
8223 }
8224 // On affecte la liste d'identifiants à l'option Toutes
8225 $list_collectivites[0][0] = $id_colls ;
8226 $form->setSelect("om_collectivite", $list_collectivites);
8227 }
8228 // Affichage du formulaire
8229 $form->entete();
8230 $form->afficher($champs, 0, false, false);
8231 $form->enpied();
8232 // Affichage du bouton
8233 printf("\t<div class=\"formControls\">\n");
8234 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8235 printf("\t</div>\n");
8236 // Fermeture du formulaire
8237 printf("\t</form>\n");
8238 }
8239
8240
8241 /**
8242 * VIEW - view_generate_suivi_bordereaux.
8243 *
8244 * Génère et affiche les bordereaux de suivi.
8245 *
8246 * @return [void]
8247 */
8248 function view_generate_suivi_bordereaux() {
8249 // Vérification de l'accessibilité sur l'élément
8250 $this->checkAccessibility();
8251 // Récupération du type de bordereau
8252 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
8253 // Génération du PDF
8254 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
8255 // Affichage du PDF
8256 $this->expose_pdf_output(
8257 $result['pdf_output'],
8258 $result['filename']
8259 );
8260 }
8261
8262
8263 /**
8264 * VIEW - view_suivi_envoi_lettre_rar.
8265 *
8266 * Vue pour imprimer les AR.
8267 *
8268 * @return void
8269 */
8270 function view_suivi_envoi_lettre_rar() {
8271 // Vérification de l'accessibilité sur l'élément
8272 $this->checkAccessibility();
8273
8274 //
8275 if ($this->f->get_submitted_post_value("date") !== null) {
8276 $date = $this->f->get_submitted_post_value("date");
8277 } else {
8278 $date = "";
8279 }
8280 //
8281 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8282 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8283 } else {
8284 $liste_code_barres_instruction = "";
8285 }
8286
8287 // Compteur du nombre de page générées
8288 $nbLettres = 0;
8289 // Liste d'id des instructions
8290 $id4Gen = array();
8291 //
8292 $error = "";
8293
8294 // Initialisation du tableau qui va contenir les DI pour lister les liens
8295 $dossierTab = array();
8296 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
8297 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
8298 $hasHidden = true;
8299 // S'il ne peut pas les consulter il aura des dossiers caché
8300 if ($isAccredited === true) {
8301 $hasHidden = false;
8302 }
8303
8304 /**
8305 * Validation du formulaire
8306 */
8307 // Si le formulaire a été validé
8308 if ($this->f->get_submitted_post_value('validation') !== null) {
8309 //
8310 if (empty($date) || empty($liste_code_barres_instruction)) {
8311 //
8312 $message_class = "error";
8313 $message = __("Tous les champs doivent etre remplis.");
8314 } else {
8315 // Création d'un tableau d'instruction
8316 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8317 //
8318 foreach ($liste as $code_barres) {
8319 // On enlève les éventuels espaces saisis
8320 $code_barres = trim($code_barres);
8321 // Vérification de l'existence de l'instruction
8322 if ($code_barres != "") {
8323 // Si la valeur transmise est numérique
8324 if (is_numeric($code_barres)) {
8325 //
8326 $sql = "SELECT count(*)
8327 FROM ".DB_PREFIXE."instruction
8328 INNER JOIN ".DB_PREFIXE."dossier
8329 ON dossier.dossier=instruction.dossier
8330 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8331 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8332 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8333 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8334 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8335 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8336 INNER JOIN ".DB_PREFIXE."groupe
8337 ON dossier_autorisation_type.groupe = groupe.groupe
8338 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8339
8340 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8341 $group_clause = array();
8342 foreach ($_SESSION["groupe"] as $key => $value) {
8343 $group_clause[$key] = "(groupe.code = '".$key."'";
8344 if($value["confidentiel"] !== true) {
8345 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8346 }
8347 $group_clause[$key] .= ")";
8348 }
8349 $conditions = implode(" OR ", $group_clause);
8350 $sql .= " AND (" . $conditions . ")";
8351
8352 $qres = $this->f->get_one_result_from_db_query(
8353 $sql,
8354 array(
8355 "origin" => __METHOD__,
8356 )
8357 );
8358
8359 if ($qres['result'] == "1") {
8360 // Récupération de la date d'envoi de l'instruction bippé
8361 $qres = $this->f->get_all_results_from_db_query(
8362 sprintf(
8363 'SELECT
8364 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8365 instruction
8366 FROM
8367 %1$sinstruction
8368 WHERE
8369 code_barres = \'%2$s\'',
8370 DB_PREFIXE,
8371 $this->f->db->escapeSimple($code_barres)
8372 ),
8373 array(
8374 'origin' => __METHOD__
8375 )
8376 );
8377 $row = array_shift($qres['result']);
8378 // Si pas de date ou correspond à la date du formulaire on
8379 // effectue le traitement
8380 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8381 $instr = $this->f->get_inst__om_dbform(array(
8382 "obj" => "instruction",
8383 "idx" => $row['instruction'],
8384 ));
8385 $valF = array();
8386 foreach($instr->champs as $id => $champ) {
8387 $valF[$champ] = $instr->val[$id];
8388 }
8389
8390 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8391 if ($isAccredited === true
8392 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8393 $dossier = $this->f->get_inst__om_dbform(array(
8394 "obj" => "dossier",
8395 "idx" => $instr->getVal("dossier"),
8396 ));
8397 if ($dossier->is_user_from_allowed_collectivite()){
8398 $dossierTab[$instr->getVal("dossier")] = $dossier;
8399 } else {
8400 $hasHidden = true;
8401 }
8402 }
8403
8404 $valF['date_evenement']=
8405 $instr->dateDBToForm($valF['date_evenement']);
8406 $valF['archive_date_complet']=
8407 $instr->dateDBToForm($valF['archive_date_complet']);
8408 $valF['archive_date_rejet']=
8409 $instr->dateDBToForm($valF['archive_date_rejet']);
8410 $valF['archive_date_limite']=
8411 $instr->dateDBToForm($valF['archive_date_limite']);
8412 $valF['archive_date_notification_delai']=
8413 $instr->dateDBToForm($valF['archive_date_notification_delai']);
8414 $valF['archive_date_decision']=
8415 $instr->dateDBToForm($valF['archive_date_decision']);
8416 $valF['archive_date_validite']=
8417 $instr->dateDBToForm($valF['archive_date_validite']);
8418 $valF['archive_date_achevement']=
8419 $instr->dateDBToForm($valF['archive_date_achevement']);
8420 $valF['archive_date_chantier']=
8421 $instr->dateDBToForm($valF['archive_date_chantier']);
8422 $valF['archive_date_conformite']=
8423 $instr->dateDBToForm($valF['archive_date_conformite']);
8424 $valF['archive_date_dernier_depot']=
8425 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8426 $valF['archive_date_limite_incompletude']=
8427 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8428 $valF['date_finalisation_courrier']=
8429 $instr->dateDBToForm($valF['date_finalisation_courrier']);
8430 $valF['date_envoi_signature']=
8431 $instr->dateDBToForm($valF['date_envoi_signature']);
8432 $valF['date_retour_signature']=
8433 $instr->dateDBToForm($valF['date_retour_signature']);
8434 $valF['date_envoi_rar']=
8435 $instr->dateDBToForm($valF['date_envoi_rar']);
8436 $valF['date_retour_rar']=
8437 $instr->dateDBToForm($valF['date_retour_rar']);
8438 $valF['date_envoi_controle_legalite']=
8439 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8440 $valF['date_retour_controle_legalite']=
8441 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8442 $valF['date_envoi_rar'] = $date;
8443
8444 // Vérification de la finalisation du document
8445 // correspondant au code barres
8446 if($instr->getVal("om_final_instruction") === 't') {
8447 $instr->setParameter('maj', 1);
8448 $instr->class_actions[1]["identifier"] =
8449 "envoi lettre RAR (depuis le menu suivi des pièces)";
8450 if ($instr->modifier($valF) == true) {
8451 $id4Gen[] = $code_barres;
8452 $nbLettres ++;
8453 } else {
8454 //
8455 if ($error != "") {
8456 $error .= "<br/>";
8457 }
8458 $error .= sprintf(__("Une erreur s'est produite lors de la modification de l'instruction %s."),
8459 $code_barres);
8460 $error .= " ";
8461 $error .= __("Veuillez contacter votre administrateur.");
8462 }
8463 } else {
8464 //
8465 if ($error != "") {
8466 $error .= "<br/>";
8467 }
8468 $error .= sprintf(__("Le document correspondant au
8469 code barres %s n'est pas finalise,
8470 le bordereau ne sera pas genere."),
8471 $code_barres);
8472 }
8473
8474 } else {
8475 //
8476 if ($error != "") {
8477 $error .= "<br/>";
8478 }
8479 $error .= __("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." ".__("a deja ete envoyee, le bordereau ne sera pas genere.");
8480 }
8481 } else {
8482 //
8483 if ($error != "") {
8484 $error .= "<br/>";
8485 }
8486 $error .= __("Le numero")." ".$code_barres." ".__("ne correspond a aucun code barres d'instruction.");
8487 }
8488 } else {
8489 //
8490 if ($error != "") {
8491 $error .= "<br/>";
8492 }
8493 $error .= __("Le code barres d'instruction")." ".$code_barres." ".__("n'est pas valide.");
8494 }
8495 }
8496 }
8497 }
8498 }
8499
8500 /**
8501 * Affichage des messages et du formulaire
8502 */
8503 // Affichage du message de validation ou d'erreur
8504 if (isset($message) && isset($message_class) && $message != "") {
8505 $this->f->displayMessage($message_class, $message);
8506 }
8507 // Affichage du message d'erreur
8508 if(!empty($error)) {
8509 $this->f->displayMessage("error", $error);
8510 }
8511 // Affichage du message de validation de la saisie
8512 if ($nbLettres > 0) {
8513 //
8514 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8515 echo "\n<p>";
8516 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8517 echo "\n<span class=\"text\">";
8518 echo __("Cliquez sur le lien ci-dessous pour telecharger votre document");
8519 echo " : \n<br/><br/>";
8520 echo "\n<a class='om-prev-icon pdf-16'";
8521 echo "\n title=\"".__("imprimer les AR")."\"";
8522 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8523 echo "\n target='_blank'>";
8524 echo __("Telecharger le document pour")." ".$nbLettres." ".__("AR");
8525 echo "\n</a>";
8526 echo "\n</span>";
8527 echo "\n</p>";
8528 echo "\n<br/>\n";
8529 if ($isAccredited === true) {
8530 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8531 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8532 echo __('Dossiers concernés par ce traitement');
8533 echo "\n</legend>";
8534 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8535
8536 if ($hasHidden === true) {
8537 echo "\n<br/>";
8538 echo "\n<p>";
8539 echo "\n<span class='text'>";
8540 echo __("Certains dossiers ont été omis de la liste ci-dessous car vous ne possédez pas les permissions nécessaires pour y accéder.");
8541 echo "</span>";
8542 echo "\n</p>";
8543 echo "\n<br/>";
8544 }
8545 foreach ($dossierTab as $dossier) {
8546
8547 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8548 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8549 $code_datd = $inst_datd->getVal('code');
8550
8551 $obj = "dossier_instruction";
8552 if ($code_datd === 'REC' || $code_datd === 'REG') {
8553 $obj = "dossier_contentieux_tous_recours";
8554 }
8555 if ($code_datd === 'IN') {
8556 $obj = "dossier_contentieux_toutes_infractions";
8557 }
8558
8559 echo "\n<div class=\"bloc group\">";
8560 echo "\n<div class=\"field field-type-text\">";
8561
8562 echo "\n<p>";
8563 echo "\n<span class='text'>";
8564 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . __('Consulter') . "\"";
8565 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8566 echo $dossier->getVal("dossier");
8567 echo "\">";
8568 echo "\n</a>";
8569
8570 echo "\n<a title=\"".__("Consulter")."\" style=\"vertical-align:middle;\"";
8571 echo " href=\"".OM_ROUTE_FORM."&obj=";
8572 echo $obj;
8573 echo "&action=3&idx=";
8574 echo $dossier->getVal("dossier");
8575 echo "\">";
8576 echo $dossier->getVal("dossier_libelle");
8577 echo "\n</a>";
8578 echo "\n</span>";
8579 echo "\n</p>";
8580
8581 echo "\n</div>";
8582 echo "\n</div>";
8583 }
8584 echo "\n</div>";
8585 echo "\n</fieldset>";
8586 }
8587 echo "\n</div>";
8588 echo "\n</div>";
8589 }
8590 // Ouverture du formulaire
8591 echo "\t<form";
8592 echo " method=\"post\"";
8593 echo " id=\"suivi_envoi_lettre_rar_form\"";
8594 echo " action=\"\"";
8595 echo ">\n";
8596 // Paramétrage des champs du formulaire
8597 $champs = array("date", "liste_code_barres_instruction");
8598 // Création d'un nouvel objet de type formulaire
8599 $form = $this->f->get_inst__om_formulaire(array(
8600 "validation" => 0,
8601 "maj" => 0,
8602 "champs" => $champs,
8603 ));
8604 // Paramétrage du champ date du formulaire
8605 $form->setLib("date", __("Date")."* :");
8606 $form->setType("date", "date");
8607 $form->setOnchange("date", "fdate(this)");
8608 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8609 $form->setTaille("date", 10);
8610 $form->setMax("date", 10);
8611 // Paramétrage du champ liste_code_barres_instruction du formulaire
8612 $form->setLib("liste_code_barres_instruction", __("Liste des codes barres d'instructions scannes")."* :");
8613 $form->setType("liste_code_barres_instruction", "textarea");
8614 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8615 $form->setTaille("liste_code_barres_instruction", 20);
8616 $form->setMax("liste_code_barres_instruction", 20);
8617 // Affichage du formulaire
8618 $form->entete();
8619 $form->afficher($champs, 0, false, false);
8620 $form->enpied();
8621 // Affichage du bouton
8622 echo "\t<div class=\"formControls\">\n";
8623 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
8624 echo "\t</div>\n";
8625 // Fermeture du formulaire
8626 echo "\t</form>\n";
8627 }
8628
8629 /**
8630 * VIEW - view_suivi_mise_a_jour_des_dates.
8631 *
8632 * Vu pour mettre à jour les dates de suivi de l'instruction.
8633 *
8634 * @return void
8635 */
8636 function view_suivi_mise_a_jour_des_dates() {
8637 // Vérification de l'accessibilité sur l'élément
8638 $this->checkAccessibility();
8639
8640 // Récupération des valeur passées en POST ou GET
8641 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8642 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8643 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8644 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8645 } else {
8646 $type_mise_a_jour = "";
8647 }
8648 if($this->f->get_submitted_post_value('date') !== null) {
8649 $date = $this->f->get_submitted_post_value('date');
8650 } elseif($this->f->get_submitted_get_value('date') !== null) {
8651 $date = $this->f->get_submitted_get_value('date');
8652 } else {
8653 $date = "";
8654 }
8655 if($this->f->get_submitted_post_value('code_barres') !== null) {
8656 $code_barres = $this->f->get_submitted_post_value('code_barres');
8657 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8658 $code_barres = $this->f->get_submitted_get_value('code_barres');
8659 } else {
8660 $code_barres = "";
8661 }
8662 // Booléen permettant de définir si un enregistrement à eu lieu
8663 $correct = false;
8664 // Booléen permettant de définir si les dates peuvent êtres enregistrées
8665 $date_error = false;
8666 // Champs date à mettre à jour
8667 $liste_champs=array();
8668
8669 // Si le formulaire a été validé
8670 if ($this->f->get_submitted_post_value('validation') !== null) {
8671 if(!empty($type_mise_a_jour) && !empty($date) && !empty($code_barres)) {
8672
8673 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8674 $group_clause = array();
8675 foreach ($_SESSION["groupe"] as $key => $value) {
8676 $group_clause[$key] = "(groupe.code = '".$key."'";
8677 if($value["confidentiel"] !== true) {
8678 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8679 }
8680 $group_clause[$key] .= ")";
8681 }
8682 $conditions = implode(" OR ", $group_clause);
8683 $groupFilter = " AND (" . $conditions . ")";
8684
8685 $qres = $this->f->get_all_results_from_db_query(
8686 sprintf(
8687 'SELECT
8688 instruction
8689 FROM
8690 %1$sinstruction
8691 INNER JOIN %1$sdossier
8692 ON dossier.dossier = instruction.dossier
8693 INNER JOIN %1$sdossier_instruction_type
8694 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8695 INNER JOIN %1$sdossier_autorisation_type_detaille
8696 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8697 INNER JOIN %1$sdossier_autorisation_type
8698 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8699 INNER JOIN %1$sgroupe
8700 ON dossier_autorisation_type.groupe = groupe.groupe
8701 WHERE
8702 code_barres = \'%2$s\'
8703 %3$s',
8704 DB_PREFIXE,
8705 $this->f->db->escapeSimple($code_barres),
8706 $groupFilter
8707 ),
8708 array(
8709 'origin' => __METHOD__
8710 )
8711 );
8712 if($qres['row_count'] === 1) {
8713 $liste_champs = explode(";", $type_mise_a_jour);
8714 $row = array_shift($qres['result']);
8715 $instr = $this->f->get_inst__om_dbform(array(
8716 "obj" => "instruction",
8717 "idx" => $row['instruction'],
8718 ));
8719 // Mise à jour des dates après l'écran de verification
8720 if($this->f->get_submitted_post_value('is_valid') !== null && $this->f->get_submitted_post_value('is_valid') == "true") {
8721 $valF = array();
8722 foreach($instr->champs as $id => $champ) {
8723 $valF[$champ] = $instr->val[$id];
8724 }
8725 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8726 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8727 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8728 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8729 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8730 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8731 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8732 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8733 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8734 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8735 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8736 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8737 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8738 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8739 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8740 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8741 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8742 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8743 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8744 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8745 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8746 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8747 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8748 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8749 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8750 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8751
8752 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8753 $valF[$maj_date]=$date;
8754 }
8755
8756 // Vérification de la finalisation du document
8757 // correspondant au code barres
8758 if($valF["om_final_instruction"] === 't' ||
8759 $valF["lettretype"] == '') {
8760 $code_barres = "";
8761
8762 //Désactivation de l'autocommit
8763 $this->f->db->autoCommit(false);
8764
8765 //On modifie les valeurs de l'instruction
8766 $instr->setParameter('maj', 170);
8767 $instr->class_actions[170]["identifier"] =
8768 "mise à jour des dates (depuis le menu suivi des pièces)";
8769 $retour = $instr->modifier($valF);
8770
8771 //Si une erreur s'est produite, on défait les modifications
8772 //qui ont été faites
8773 if (!$retour){
8774 $instr->undoValidation();
8775 }
8776 //Sinon, on valide en base de données les modifications
8777 else {
8778 $this->f->db->commit();
8779 }
8780
8781 // Variable correct retourné depuis la classe instruction
8782 $correct = $instr->correct;
8783
8784 // Si la modification sur l'instruction a échoué
8785 if ($correct === false) {
8786
8787 // Message d'erreur de la classe instruction
8788 $error = $instr->msg;
8789 }
8790
8791 } else {
8792 // Indique que le traitement est en erreur
8793 $correct = false;
8794 // Message d'erreur
8795 $error = sprintf(__("Le document n'est pas finalise."),
8796 "<span class='bold'>".$code_barres."</span>");
8797 }
8798 } else {
8799 // Récupération des infos du dossier
8800 $qres = $this->f->get_all_results_from_db_query(
8801 sprintf(
8802 'SELECT
8803 dossier.dossier_libelle,
8804 evenement.libelle as evenement,
8805 autorite_competente.code as autorite_competente_code,
8806 autorite_competente.libelle as autorite_competente,
8807 evenement.type as evenement_type,
8808 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8809 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8810 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8811 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8812 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8813 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8814 FROM
8815 %1$sinstruction
8816 INNER JOIN %1$sdossier
8817 ON dossier.dossier=instruction.dossier
8818 LEFT JOIN %1$sautorite_competente
8819 ON dossier.autorite_competente=autorite_competente.autorite_competente
8820 INNER JOIN %1$sevenement
8821 ON instruction.evenement=evenement.evenement
8822 WHERE
8823 code_barres = \'%2$s\'',
8824 DB_PREFIXE,
8825 $this->f->db->escapeSimple($code_barres)
8826 ),
8827 array(
8828 "origin" => __METHOD__
8829 )
8830 );
8831 $infos = array_shift($qres['result']);
8832
8833 // Vérification de la non modification des dates de suivi
8834 foreach(explode(";", $type_mise_a_jour) as $champ) {
8835 if ($champ === 'date_envoi_controle_legalite') {
8836 if ($instr->is_sent_to_cl() === true) {
8837 $error = __("Les dates de suivis ne peuvent etre modifiees");
8838 $date_error = true;
8839 break;
8840 }
8841 }
8842 if($infos[$champ] != "" && $infos[$champ] != $date) {
8843 $error = __("Les dates de suivis ne peuvent etre modifiees");
8844 $date_error = true;
8845 break;
8846 }
8847 }
8848 }
8849 } else {
8850 $error = __("Le numero saisi ne correspond a aucun code barres d'instruction.");
8851 }
8852
8853 } else {
8854 $error = __("Tous les champs doivent etre remplis.");
8855 }
8856 }
8857
8858 /**
8859 * Affichage des messages et du formulaire
8860 */
8861 // Affichage du message de validation ou d'erreur
8862 if (isset($message) && isset($message_class) && $message != "") {
8863 $this->f->displayMessage($message_class, $message);
8864 }
8865 // Affichage du message d'erreur
8866 if(!empty($error)) {
8867 $this->f->displayMessage("error", $error);
8868 }
8869
8870 // Affichage du message de validation de la saisie
8871 if($correct === true) {
8872 $this->f->displayMessage("ok", __("Saisie enregistree"));
8873 }
8874 // Ouverture du formulaire
8875 echo "\t<form";
8876 echo " method=\"post\"";
8877 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8878 echo " action=\"\"";
8879 echo ">\n";
8880 // Paramétrage des champs du formulaire
8881 if(isset($infos)) {
8882 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8883 , "autorite_competente", "date_envoi_signature",
8884 "date_retour_signature", "date_envoi_controle_legalite",
8885 "date_retour_controle_legalite", "date_envoi_rar",
8886 "date_retour_rar", "is_valid");
8887 } else {
8888 $champs = array("type_mise_a_jour", "date", "code_barres");
8889 }
8890 // Création d'un nouvel objet de type formulaire
8891 $form = $this->f->get_inst__om_formulaire(array(
8892 "validation" => 0,
8893 "maj" => 0,
8894 "champs" => $champs,
8895 ));
8896 // Paramétrage des champs du formulaire
8897 // Parametrage du champ type_mise_a_jour
8898 $form->setLib("type_mise_a_jour", __("Date a mettre a jour")."* :");
8899 if(isset($infos)) {
8900 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8901
8902 } else {
8903 $form->setType("type_mise_a_jour", "select");
8904
8905 }
8906 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8907 $contenu = array();
8908
8909 $contenu[0][0] = "date_envoi_signature";
8910 $contenu[1][0] = __("date d'envoi pour signature Mairie/Prefet");
8911
8912 $contenu[0][1] = "date_retour_signature";
8913 $contenu[1][1] = __("date de retour de signature Mairie/Prefet");
8914
8915 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8916 $contenu[1][2] = __("date de retour de signature + Envoi controle legalite");
8917
8918 $contenu[0][3] = "date_envoi_controle_legalite";
8919 $contenu[1][3] = __("date d'envoi au controle de legalite");
8920
8921 $contenu[0][4] = "date_retour_controle_legalite";
8922 $contenu[1][4] = __("date de retour de controle de legalite");
8923
8924 $contenu[0][5] = "date_retour_rar";
8925 $contenu[1][5] = __("date de notification du correspondant");
8926
8927 $form->setSelect("type_mise_a_jour", $contenu);
8928
8929 // Parametrage du champ date
8930 $form->setLib("date", __("Date")."* :");
8931 if(isset($infos)) {
8932 $form->setType("date", "hiddenstaticdate");
8933
8934 } else {
8935 $form->setType("date", "date");
8936 }
8937 $form->setVal("date", $date);
8938 $form->setTaille("date", 10);
8939 $form->setMax("date", 10);
8940
8941 // Parametrage du champ code_barres
8942 $form->setLib("code_barres", __("Code barres d'instruction")."* :");
8943 if(isset($infos)) {
8944 $form->setType("code_barres", "hiddenstatic");
8945 } else {
8946 $form->setType("code_barres", "text");
8947 }
8948 $form->setVal("code_barres", $code_barres);
8949 $form->setTaille("code_barres", 20);
8950 $form->setMax("code_barres", 20);
8951
8952 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8953 if(isset($infos)) {
8954
8955 // Tous les champs sont défini par defaut à static
8956 foreach ($infos as $key => $value) {
8957 $form->setType($key, "static");
8958 if(in_array($key, $liste_champs)) {
8959 $form->setVal($key, $date);
8960 } else {
8961 $form->setVal($key, $value);
8962 }
8963 }
8964
8965 // Les champs dont on viens de définir la valeur sont en gras
8966 foreach ($liste_champs as $value) {
8967 $form->setBloc($value,'DF',"",'bold');
8968 }
8969
8970 // Parametrage du champ dossier
8971 $form->setLib("dossier_libelle", __("dossier_libelle")." :");
8972 $form->setType("dossier_libelle", "static");
8973 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8974
8975 // Parametrage du champ evenement
8976 $form->setLib("evenement", __("evenement")." :");
8977 $form->setType("evenement", "static");
8978 $form->setVal("evenement", $infos['evenement']);
8979
8980 // Parametrage du champ autorite_competente
8981 $form->setLib("autorite_competente", __("Autorite competente")." :");
8982 $form->setType("autorite_competente", "static");
8983 $form->setVal("autorite_competente", $infos['autorite_competente']);
8984
8985 // Parametrage des libellés d'envoi avec AR
8986 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8987 $form->setLib("date_retour_rar", __("date_notification")." :");
8988
8989 $form->setLib("date_envoi_signature", __("date_envoi_signature")." :");
8990 $form->setLib("date_retour_signature", __("date_retour_signature")." :");
8991 $form->setLib("date_envoi_controle_legalite", __("date_envoi_controle_legalite")." :");
8992 $form->setLib("date_retour_controle_legalite", __("date_retour_controle_legalite")." :");
8993 // Configuration des libellé en fonction de l'autorité compétente
8994 if($infos['autorite_competente_code'] == 'ETAT') {
8995 $form->setType("date_envoi_controle_legalite", "hiddendate");
8996 $form->setType("date_retour_controle_legalite", "hiddendate");
8997 }
8998
8999 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
9000 $form->setLib("is_valid", __("Valide")." :");
9001 $form->setType("is_valid", "hidden");
9002 $form->setVal("is_valid", 'true');
9003
9004 $form->setFieldset('dossier_libelle','D',_('Synthese'));
9005 $form->setFieldset('is_valid','F');
9006
9007 }
9008
9009
9010 // Création du fieldset regroupant les champs permettant la mise à jour des date
9011 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
9012 $form->setFieldset('code_barres','F');
9013 // Affichage du formulaire
9014 $form->entete();
9015 $form->afficher($champs, 0, false, false);
9016 $form->enpied();
9017 // Affichage du bouton
9018 echo "\t<div class=\"formControls\">\n";
9019 //
9020 if(!$date_error) {
9021 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9022 }
9023 // Si pas sur l'écran de validation
9024 if(isset($infos)) {
9025 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
9026 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
9027 echo "\">Retour</a>";
9028 }
9029 echo "\t</div>\n";
9030 // Fermeture du formulaire
9031 echo "\t</form>\n";
9032 }
9033
9034 /**
9035 * [view_pdf_lettre_rar description]
9036 *
9037 * @return [type] [description]
9038 */
9039 function view_pdf_lettre_rar() {
9040 // Vérification de l'accessibilité sur l'élément
9041 $this->checkAccessibility();
9042 //
9043 $this->f->disableLog();
9044
9045 if($this->f->get_submitted_get_value('liste') != null) {
9046 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
9047
9048 // Classe permettant la mise en page de l'édition pdf
9049 require_once "../obj/pdf_lettre_rar.class.php";
9050 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
9051 // Initialisation de la mise en page
9052 $pdf_lettre_rar->init($this->f);
9053
9054 foreach ($listeCodeBarres as $code_barres) {
9055
9056 // On récupère le dossier
9057 $qres = $this->f->get_one_result_from_db_query(
9058 sprintf(
9059 'SELECT
9060 dossier
9061 FROM
9062 %1$sinstruction
9063 WHERE
9064 code_barres = \'%2$s\'',
9065 DB_PREFIXE,
9066 $this->f->db->escapeSimple($code_barres)
9067 ),
9068 array(
9069 "origin" => __METHOD__,
9070 )
9071 );
9072
9073 $inst_dossier = $this->f->get_inst__om_dbform(array(
9074 "obj" => "dossier",
9075 "idx" => $qres['result'],
9076 ));
9077
9078 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
9079 $groupe = $inst_dossier->get_type_affichage_formulaire();
9080 switch ($groupe) {
9081 case 'CTX IN':
9082 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
9083 break;
9084 case 'CTX RE':
9085 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
9086 break;
9087 case 'ADS':
9088 case 'DPC':
9089 case 'CONSULTATION ENTRANTE':
9090 default:
9091 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
9092 break;
9093 }
9094
9095 // Test si l'evenement est de type arrete et si un délégataire a été nommé
9096 $qres = $this->f->get_all_results_from_db_query(
9097 sprintf(
9098 'SELECT
9099 dossier.dossier_libelle,
9100 evenement.type,
9101 count(lien_dossier_demandeur) as nbdemandeur,
9102 CASE
9103 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
9104 THEN CONCAT(phase.code, \' - \', division.libelle)
9105 ELSE
9106 phase.code
9107 END AS code_phase
9108 FROM
9109 %1$sinstruction
9110 LEFT JOIN %1$sdossier
9111 ON instruction.dossier = dossier.dossier
9112 LEFT JOIN %1$sdivision
9113 ON dossier.division = division.division
9114 INNER JOIN %1$sevenement
9115 ON instruction.evenement=evenement.evenement
9116 LEFT JOIN %1$sphase
9117 ON evenement.phase = phase.phase
9118 inner JOIN %1$slien_dossier_demandeur
9119 ON instruction.dossier=lien_dossier_demandeur.dossier
9120 inner join %1$sdemandeur
9121 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
9122 WHERE
9123 code_barres = \'%2$s\'
9124 AND %3$s
9125 GROUP BY
9126 dossier.dossier_libelle,
9127 evenement.type,
9128 phase.code,
9129 division.libelle',
9130 DB_PREFIXE,
9131 $this->f->db->escapeSimple($code_barres),
9132 $sql_demandeur
9133 ),
9134 array(
9135 "origin" => __METHOD__
9136 )
9137 );
9138 $testDemandeur = array_shift($qres['result']);
9139
9140
9141 // Recuperation de l'adresse de destination
9142 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
9143 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
9144 if($testDemandeur['type'] != 'arrete' && $testDemandeur['nbdemandeur'] > 1) {
9145 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
9146 }
9147
9148 $qres = $this->f->get_all_results_from_db_query(
9149 sprintf(
9150 'SELECT
9151 CASE WHEN demandeur.qualite = \'particulier\'
9152 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
9153 ELSE TRIM(demandeur.personne_morale_denomination)
9154 END as ligne1,
9155 CASE WHEN demandeur.qualite = \'personne_morale\'
9156 THEN TRIM(demandeur.personne_morale_raison_sociale)
9157 ELSE \'\'
9158 END as ligne1_1,
9159 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9160 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9161 ELSE \'\'
9162 END as ligne1_2,
9163 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9164 CASE demandeur.complement
9165 WHEN null THEN \'\'
9166 ELSE trim(demandeur.complement)
9167 END as ligne3,
9168 CASE demandeur.lieu_dit
9169 WHEN null THEN \'\'
9170 ELSE trim(demandeur.lieu_dit)
9171 END as ligne4,
9172 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9173 (CASE WHEN demandeur.bp IS NOT NULL
9174 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9175 ELSE \'\'
9176 END),
9177 (CASE WHEN demandeur.cedex IS NOT NULL
9178 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9179 ELSE \'\'
9180 END))
9181 as ligne5,
9182 code_barres as code_barres
9183 FROM
9184 %1$sinstruction
9185 INNER JOIN %1$sdossier
9186 ON dossier.dossier = instruction.dossier
9187 INNER JOIN %1$slien_dossier_demandeur
9188 ON dossier.dossier = lien_dossier_demandeur.dossier
9189 INNER JOIN %1$sdemandeur
9190 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9191 LEFT OUTER JOIN %1$scivilite AS pc
9192 ON demandeur.particulier_civilite = pc.civilite
9193 OR demandeur.personne_morale_civilite = pc.civilite
9194 WHERE
9195 instruction.code_barres = \'%2$s\'
9196 %3$s',
9197 DB_PREFIXE,
9198 $this->f->db->escapeSimple($code_barres),
9199 $sqlAdresse
9200 ),
9201 array(
9202 "origin" => __METHOD__
9203 )
9204 );
9205 $adresse_dest = array_shift($qres['result']);
9206
9207 // Création adresse destinataire sans ligne vide
9208 $adresse_destinataire = array();
9209 if (!empty($adresse_dest['ligne1'])) {
9210 $adresse_destinataire[] = $adresse_dest['ligne1'];
9211 }
9212 if (!empty($adresse_dest['ligne1_1'])) {
9213 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
9214 }
9215 if (!empty($adresse_dest['ligne1_2'])) {
9216 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
9217 }
9218 $adresse_destinataire[] = $adresse_dest['ligne2'];
9219 if (!empty($adresse_dest['ligne3'])) {
9220 $adresse_destinataire[] = $adresse_dest['ligne3'];
9221 }
9222 if (!empty($adresse_dest['ligne4'])) {
9223 $adresse_destinataire[] = $adresse_dest['ligne4'];
9224 }
9225 $adresse_destinataire[] = $adresse_dest['ligne5'];
9226
9227 // Création du champ specifique
9228 $specifique_content = array();
9229 $specifique_content[] = $adresse_dest['ligne1'];
9230 $specifique_content[] = $adresse_dest['ligne1_1'];
9231 $specifique_content[] = $adresse_dest['ligne1_2'];
9232 $specifique_content[] = $testDemandeur['dossier_libelle'];
9233 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9234 unset($adresse_dest['code_barres']);
9235 // Ajout d'une page aux pdf
9236 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9237
9238 }
9239 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9240 $om_edition = $this->f->get_inst__om_edition();
9241 $om_edition->set_object_linked($this);
9242 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9243 }
9244 }
9245
9246 /**
9247 * VIEW - view_bordereau_envoi_maire.
9248 *
9249 * Formulaire demandant :
9250 * - le code-barres de l'événement d'instruction
9251 * - la date d'envoi du courrier pour signature par le maire
9252 *
9253 * Lors de la validation :
9254 * => met à jour cette date dans l'événement d'instruction
9255 * => crée un lien permettant de générer en PDF le bordereau
9256 *
9257 * @return void
9258 */
9259 function view_bordereau_envoi_maire() {
9260 // Vérification de l'accessibilité sur l'élément
9261 $this->checkAccessibility();
9262
9263 // Récupération des valeur passées en POST ou GET
9264 $code_barres = "";
9265 if($this->f->get_submitted_post_value('code_barres') !== null) {
9266 $code_barres = $this->f->get_submitted_post_value('code_barres');
9267 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
9268 $code_barres = $this->f->get_submitted_get_value('code_barres');
9269 }
9270 $date = "";
9271 if($this->f->get_submitted_post_value('date') !== null) {
9272 $date = $this->f->get_submitted_post_value('date');
9273 } elseif($this->f->get_submitted_get_value('date') !== null) {
9274 $date = $this->f->get_submitted_get_value('date');
9275 }
9276 $validation = 0;
9277 if($this->f->get_submitted_post_value('validation') !== null) {
9278 $validation = $this->f->get_submitted_post_value('validation');
9279 } elseif($this->f->get_submitted_get_value('validation') !== null) {
9280 $validation = $this->f->get_submitted_get_value('validation');
9281 }
9282
9283 // Si le formulaire a été validé
9284 if ($this->f->get_submitted_post_value('validation') !== null) {
9285 // Tous les champs doivent obligatoirement être remplis
9286 if (!empty($date) && !empty($code_barres)) {
9287 $date_en = $this->dateDB($date);
9288 // Si date valide
9289 if ($date_en != "") {
9290 $id_instruction = $this->get_instruction_by_barcode($code_barres);
9291 // Si un événement d'instruction a été trouvé pour ce code-barres
9292 if ($id_instruction !== null) {
9293 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9294 // Si mise à jour réussie de la date d'envoi du courrier
9295 // pour signature par l'autorité compétente
9296 if($ret === true) {
9297 // Message de validation avec lien PDF
9298 $message_class = "valid";
9299 $message = '&bullet; '.__("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9300 $message .= " : <br/><br/>";
9301 $message .= "<a class='om-prev-icon pdf-16'";
9302 $message .= " id=\"generer_bordereau_envoi_maire\"";
9303 $message .= " title=\"".__("Bordereau")."\"";
9304 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9305 $message .= "&action=200";
9306 $message .= "&idx=".$id_instruction."'";
9307 $message .= " target='_blank'>";
9308 $message .= __("Bordereau d'envoi au maire");
9309 $message .= "</a><br/><br/>";
9310 $message .= '&bullet; '.__("Rappel des informations saisies")." :<br/><br/>";
9311 $message .= __("Code du courrier")." : ".$code_barres."<br/>";
9312 $message .= __("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9313
9314 } else {
9315 // Message d'erreur
9316 $message_class = "error";
9317 $message = sprintf(__("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9318 $code_barres);
9319 }
9320 }
9321 else {
9322 $message_class = "error";
9323 $message = __("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9324 }
9325 }
9326 else {
9327 $message_class = "error";
9328 $message = __("La date est invalide.");
9329 }
9330 } else {
9331 $message_class = "error";
9332 $message = __("Tous les champs doivent etre remplis.");
9333 }
9334 }
9335
9336 /**
9337 * Affichage des messages et du formulaire
9338 */
9339
9340 // Affichage du message de validation ou d'erreur
9341 if (isset($message) && isset($message_class) && $message != "") {
9342 $this->f->displayMessage($message_class, $message);
9343 }
9344
9345 // Ouverture du formulaire
9346 $datasubmit = $this->getDataSubmit();
9347 echo "\n<!-- ########## START DBFORM ########## -->\n";
9348 echo "<form";
9349 echo " id=\"bordereau_envoi_maire\"";
9350 echo " method=\"post\"";
9351 echo " name=\"f1\"";
9352 echo " action=\"";
9353 echo $datasubmit;
9354 echo "\"";
9355 echo ">\n";
9356
9357 // Paramétrage des champs du formulaire
9358 $champs = array("code_barres","date");
9359
9360 // Création d'un nouvel objet de type formulaire
9361 $form = $this->f->get_inst__om_formulaire(array(
9362 "validation" => 0,
9363 "maj" => 0,
9364 "champs" => $champs,
9365 ));
9366
9367 $template_required_label = '%s *';
9368 // Parametrage du champ code_barres
9369 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
9370 $form->setType("code_barres", "text");
9371 $form->setVal("code_barres", $code_barres);
9372 $form->setTaille("code_barres", 20);
9373 $form->setMax("code_barres", 20);
9374 // Parametrage du champ date
9375 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
9376 $form->setType("date", "date") ;
9377 if (empty($date)) {
9378 $date = date('d/m/Y');
9379 }
9380 $form->setVal("date", $date);
9381 $form->setTaille("date", 10);
9382 $form->setMax("date", 10);
9383
9384 // Création du bloc regroupant les champs
9385 $form->setBloc('code_barres','D');
9386 $form->setBloc('date','F');
9387 // Affichage du formulaire
9388 $form->entete();
9389 $form->afficher($champs, 0, false, false);
9390 $form->enpied();
9391 // Affichage du bouton
9392 printf("\t<div class=\"formControls\">\n");
9393 //
9394 $this->f->layout->display_form_button(array("value" => __("Valider"), "name" => "validation"));
9395 printf("\t</div>\n");
9396 // Fermeture du formulaire
9397 printf("\t</form>\n");
9398 }
9399
9400 /**
9401 * VIEW - view_bordereau_envoi_maire.
9402 *
9403 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9404 *
9405 * @return [void]
9406 */
9407 function view_generate_bordereau_envoi_maire() {
9408 // Vérification de l'accessibilité sur l'élément
9409 $this->checkAccessibility();
9410 // Récupération de la collectivité du dossier d'instruction
9411 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9412 // Récupération de ses paramètres
9413 $collectivite = $this->f->getCollectivite($collectivite_di);
9414 // Génération du PDF
9415 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9416 // Affichage du PDF
9417 $this->expose_pdf_output(
9418 $result['pdf_output'],
9419 $result['filename']
9420 );
9421 }
9422
9423 /**
9424 * VIEW - view_rapport_instruction.
9425 *
9426 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9427 * Cette action est bindée pour utiliser la fonction popUpIt.
9428 *
9429 * @return void
9430 */
9431 function view_overlay_notification_manuelle() {
9432
9433 // Vérification de l'accessibilité sur l'élément
9434 $this->checkAccessibility();
9435
9436 printf(
9437 '<script type="text/javascript" >
9438 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9439 </script>',
9440 'instruction_notification_manuelle',
9441 OM_ROUTE_SOUSFORM,
9442 $this->getVal($this->clePrimaire),
9443 $this->getVal('dossier')
9444 );
9445 }
9446
9447 /**
9448 * VIEW - view_overlay_notification_service_consulte.
9449 *
9450 * Ouvre le sous-formulaire de notification des services consulte
9451 * en ajaxIt dans un overlay.
9452 * Cette action est bindée pour utiliser la fonction popUpIt.
9453 *
9454 * @return void
9455 */
9456 function view_overlay_notification_service_consulte() {
9457
9458 // Vérification de l'accessibilité sur l'élément
9459 $this->checkAccessibility();
9460
9461 printf(
9462 '<script type="text/javascript" >
9463 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9464 </script>',
9465 'instruction_notification_manuelle',
9466 OM_ROUTE_SOUSFORM,
9467 $this->getVal($this->clePrimaire),
9468 $this->getVal('dossier')
9469 );
9470 }
9471
9472 /**
9473 * VIEW - overlay_notification_tiers_consulte.
9474 *
9475 * Ouvre le sous-formulaire de notification des tiers consulte
9476 * en ajaxIt dans un overlay.
9477 * Cette action est bindée pour utiliser la fonction popUpIt.
9478 *
9479 * @return void
9480 */
9481 function view_overlay_notification_tiers_consulte() {
9482
9483 // Vérification de l'accessibilité sur l'élément
9484 $this->checkAccessibility();
9485
9486 printf(
9487 '<script type="text/javascript" >
9488 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9489 </script>',
9490 'instruction_notification_manuelle',
9491 OM_ROUTE_SOUSFORM,
9492 $this->getVal($this->clePrimaire),
9493 $this->getVal('dossier')
9494 );
9495 }
9496
9497 /**
9498 * VIEW - view_modale_selection_document_signe
9499 *
9500 * Ouvre le sous-formulaire de notification des services consulte
9501 * en ajaxIt dans un overlay.
9502 * Cette action est bindée pour utiliser la fonction popUpIt.
9503 *
9504 * @return void
9505 */
9506 function view_modale_selection_document_signe() {
9507
9508 // Vérification de l'accessibilité sur l'élément
9509 $this->checkAccessibility();
9510
9511 printf(
9512 '<script type="text/javascript" >
9513 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9514 </script>',
9515 'instruction_modale',
9516 OM_ROUTE_SOUSFORM,
9517 $this->getVal($this->clePrimaire),
9518 $this->getVal('dossier')
9519 );
9520 }
9521
9522 /**
9523 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9524 * pour exclure les dossiers du groupe contentieux.
9525 *
9526 * @param [string] $barcode numéro du code-barres
9527 * @return [mixed] ID de son instruction ou null si aucun code
9528 */
9529 function get_instruction_by_barcode($barcode) {
9530 // Begin
9531 $this->begin_treatment(__METHOD__);
9532
9533 // Vérification de l'existence de l'événement d'instruction
9534 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9535 $qres = $this->f->get_one_result_from_db_query(
9536 sprintf(
9537 'SELECT
9538 instruction
9539 FROM
9540 %1$sinstruction
9541 INNER JOIN %1$sdossier
9542 ON dossier.dossier=instruction.dossier
9543 INNER JOIN %1$sdossier_instruction_type
9544 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9545 INNER JOIN %1$sdossier_autorisation_type_detaille
9546 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9547 INNER JOIN %1$sdossier_autorisation_type
9548 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9549 INNER JOIN %1$sgroupe
9550 ON dossier_autorisation_type.groupe = groupe.groupe
9551 AND groupe.code != \'CTX\'
9552 WHERE
9553 code_barres = \'%2$s\'',
9554 DB_PREFIXE,
9555 $this->f->db->escapeSimple($barcode)
9556 ),
9557 array(
9558 "origin" => __METHOD__,
9559 )
9560 );
9561
9562 // Retourne résultat
9563 return $this->end_treatment(__METHOD__, $qres['result']);
9564 }
9565
9566 /**
9567 * Met à jour le champ date d'envoi signature
9568 * avec la date fournie et pour l'instruction donnée
9569 *
9570 * @param [string] $id ID de l'événement d'instruction
9571 * @param [string] $date date au format EN
9572 * @return [boolean] true si mise à jour avec succès
9573 */
9574 function update_date_envoi_signature($id, $date) {
9575 // Préparation du tableau
9576 $valF = array();
9577 $valF['date_envoi_signature'] = $date;
9578 // Begin
9579 $this->begin_treatment(__METHOD__);
9580 // Requête
9581 $res = $this->f->db->autoexecute(
9582 DB_PREFIXE.$this->table,
9583 $valF,
9584 DB_AUTOQUERY_UPDATE,
9585 $this->getCle($id)
9586 );
9587 $this->addToLog(
9588 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9589 VERBOSE_MODE
9590 );
9591 if ($this->f->isDatabaseError($res, true) !== false) {
9592 $this->end_treatment(__METHOD__, false);
9593 }
9594 //
9595 return $this->end_treatment(__METHOD__, true);
9596 }
9597
9598 /**
9599 * Méthode permettant de définir des valeurs à envoyer en base après
9600 * validation du formulaire d'ajout.
9601 * @param array $val tableau des valeurs retournées par le formulaire
9602 */
9603 function setValFAjout($val = array()) {
9604 // Mise à jour du flag created_by_commune lors d'un changement de décision
9605 // par un utilisateur de commune sur un dossier instruit par la comcom
9606 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9607 $this->valF['created_by_commune'] = true;
9608 }
9609
9610 //
9611 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9612 if (isset($this->valF['flag_edition_integrale']) === true) {
9613 unset($this->valF['flag_edition_integrale']);
9614 }
9615 if (isset($this->valF['signataire_arrete']) === true) {
9616 unset($this->valF['signataire_arrete']);
9617 }
9618 }
9619 }
9620
9621
9622 /**
9623 * Récupère l'instance d'un événement de workflow.
9624 *
9625 * @param mixed $evenement Identifiant de l'événement.
9626 *
9627 * @return object
9628 */
9629 function get_inst_evenement($evenement = null) {
9630 //
9631 return $this->get_inst_common("evenement", $evenement);
9632 }
9633
9634 /**
9635 * Logue l'action de l'instruction dans son DI.
9636 *
9637 * @param string $id Clé primaire de l'instruction.
9638 * @param array $val Valeurs de l'instruction.
9639 *
9640 * @return bool Vrai si traitement effectué avec succès
9641 */
9642 private function add_log_to_dossier($id, array $val) {
9643 $maj = $this->getParameter("maj");
9644 // Action = Trace par défaut
9645 $action = $this->get_backtrace();
9646 // Action = Identifant de l'action si contexte connu
9647 if (empty($maj) === false
9648 || (empty($maj) === true && $maj === 0)) {
9649 $action = $this->get_action_param($maj, 'identifier');
9650 if ($action === 'modifier_suivi') {
9651 $action = "modifier (via l'action suivi des dates)";
9652 }
9653 if ($action === 'notifier_commune'
9654 && isset($val['mails_destinataires']) === true) {
9655 $action = "notification de la commune (courriels : ";
9656 $action .= $val['mails_destinataires'].")";
9657 }
9658 }
9659 // Création du log
9660 $log = array(
9661 'date' => date('Y-m-d H:i:s'),
9662 'user' => $_SESSION['login'],
9663 'action' => $action,
9664 'values' => array(
9665 'date_evenement' => $this->dateDB($val['date_evenement']),
9666 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9667 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9668 'evenement' => $val['evenement'],
9669 'action' => $val['action'],
9670 'instruction' => $id,
9671 'etat' => $val['etat'],
9672 ),
9673 );
9674 // Ajout du log
9675 $di = $this->get_inst_dossier($val['dossier']);
9676 $ret = $di->add_log_instructions($log);
9677 if ($ret === false) {
9678 $this->correct = false;
9679 $this->msg = '';
9680 $this->addToMessage($di->msg);
9681 }
9682 return $ret;
9683 }
9684
9685
9686 /**
9687 * Retourne le contexte de déboguage formaté en HTML.
9688 *
9689 * @return string Une ligne par trace
9690 */
9691 private function get_backtrace() {
9692 $trace = debug_backtrace();
9693 $backtrace = '';
9694 $i = 1;
9695 foreach ($trace as $key => $value) {
9696 $func = $trace[$key]['function'];
9697 // On ne s'autolog pas
9698 if ($func === 'get_backtrace'
9699 || $func === 'add_log_to_dossier') {
9700 continue;
9701 }
9702 $backtrace .= $i.') ';
9703 // Si dans une classe
9704 if (isset($trace[$key]['class']) === true
9705 && empty($trace[$key]['class']) === false) {
9706 $backtrace .= $trace[$key]['class'].'->'.$func;
9707 }
9708 // Si procédural
9709 else {
9710 $file = $trace[$key]['file'];
9711 $line = $trace[$key]['line'];
9712 $truncated_file = $this->f->get_relative_path($file);
9713 if ($truncated_file !== false) {
9714 $file = $truncated_file;
9715 }
9716 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9717 }
9718 $backtrace .= '<br/>';
9719 $i++;
9720 }
9721 return $backtrace;
9722 }
9723
9724 /**
9725 * CONDITION - is_notifiable.
9726 *
9727 * Condition pour afficher l'action notifier_commune.
9728 *
9729 * @return boolean
9730 */
9731 public function is_notifiable() {
9732 // L'instruction doit être finalisée, ce qui revient à dire
9733 // définalisable sans bypass
9734 if ($this->is_unfinalizable_without_bypass() === false) {
9735 return false;
9736 }
9737 // La collectivité de l'utilisateur doit être de niveau multi
9738 if ($this->f->has_collectivite_multi() === false) {
9739 return false;
9740 }
9741 // Le paramètre multi de l'objet du courriel doit exister
9742 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9743 return false;
9744 }
9745 // Le paramètre multi du modèle du courriel doit exister
9746 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9747 return false;
9748 }
9749 // A ce stade toutes les conditions sont satisfaites
9750 return true;
9751 }
9752
9753 /**
9754 * TREATMENT - notifier_commune.
9755 *
9756 * Notifie aux communes et par courriel la finalisation d'une instruction.
9757 *
9758 * @return boolean
9759 */
9760 public function notifier_commune() {
9761 // Cette méthode permet d'exécuter une routine en début des méthodes
9762 // dites de TREATMENT.
9763 $this->begin_treatment(__METHOD__);
9764 $message = __('Erreur de paramétrage :');
9765 $erreurParametrage = false;
9766 // Récupération du paramétrage de la collectivité du dossier
9767 $id_di = $this->getVal('dossier');
9768 $di = $this->get_inst_dossier($id_di);
9769 $collectivite_di = $di->getVal('om_collectivite');
9770 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9771 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9772 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9773 $erreurParametrage = true;
9774 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9775 }
9776
9777 // Récupération de la liste des mails
9778 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9779 if (empty($adresses)) {
9780 $erreurParametrage = true;
9781 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9782 }
9783
9784 // Vérification du paramétrage des mails
9785 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9786 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9787 $erreurParametrage = true;
9788 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9789 }
9790 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9791 $erreurParametrage = true;
9792 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9793 }
9794
9795 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9796 // un message a destination de l'utilisateur est affiché
9797 if ($erreurParametrage) {
9798 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9799 $this->addToMessage($message);
9800 return $this->end_treatment(__METHOD__, false);
9801 }
9802
9803 // Création d'un notification et de sa tâche associé pour chaque mail
9804 foreach ($adresses as $adresse) {
9805 // Ajout de la notif et récupération de son id
9806 $destinataire = array(
9807 'destinataire' => $adresse,
9808 'courriel' => $adresse
9809 );
9810 $idNotif = $this->ajouter_notification(
9811 $this->getVal($this->clePrimaire),
9812 $this->f->get_connected_user_login_name(),
9813 $destinataire,
9814 $collectivite_di
9815 );
9816 if ($idNotif === false) {
9817 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9818 return $this->end_treatment(__METHOD__, false);
9819 }
9820 // Création de la tache en lui donnant l'id de la notification
9821 $notification_by_task = $this->notification_by_task(
9822 $idNotif,
9823 $this->getVal('dossier'),
9824 'mail',
9825 'notification_commune'
9826 );
9827 if ($notification_by_task === false) {
9828 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9829 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9830 return $this->end_treatment(__METHOD__, false);
9831 }
9832 }
9833 $this->addToMessage(__('La commune a été notifiée.'));
9834 return $this->end_treatment(__METHOD__, true);
9835 }
9836
9837 /**
9838 * Récupère l'instance de l'instructeur
9839 *
9840 * @param integer $instructeur Identifiant de l'instructeur.
9841 *
9842 * @return object
9843 */
9844 protected function get_inst_instructeur($instructeur) {
9845 //
9846 return $this->get_inst_common("instructeur", $instructeur);
9847 }
9848
9849
9850 /**
9851 * Récupère l'instance de l'utilisateur
9852 *
9853 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9854 *
9855 * @return object
9856 */
9857 protected function get_inst_om_utilisateur($om_utilisateur) {
9858 //
9859 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9860 }
9861
9862
9863 /**
9864 * Récupère l'instance de la division.
9865 *
9866 * @param integer $division Identifiant de la division.
9867 *
9868 * @return object
9869 */
9870 protected function get_inst_division($division) {
9871 //
9872 return $this->get_inst_common("division", $division);
9873 }
9874
9875
9876 /**
9877 * Récupère l'instance de la direction.
9878 *
9879 * @param integer $direction Identifiant de la direction.
9880 *
9881 * @return object
9882 */
9883 protected function get_inst_direction($direction) {
9884 //
9885 return $this->get_inst_common("direction", $direction);
9886 }
9887
9888
9889 /**
9890 * Récupère la collectivité d'un instructeur en passant par sa division puis
9891 * par sa direction.
9892 *
9893 * @param integer $instructeur Identifiant de l'instructeur.
9894 *
9895 * @return integer
9896 */
9897 protected function get_instructeur_om_collectivite($instructeur) {
9898 // Chemin vers la collectivité d'un instructeur
9899 $inst_instr = $this->get_inst_instructeur($instructeur);
9900 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9901 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9902
9903 // Collectivité
9904 $om_collectivite = $inst_direction->getVal('om_collectivite');
9905
9906 //
9907 return $om_collectivite;
9908 }
9909
9910 /*
9911 * CONDITION - can_user_access_dossier_contexte_ajout
9912 *
9913 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9914 * formulaire d'ajout.
9915 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9916 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9917 *
9918 */
9919 function can_user_access_dossier_contexte_ajout() {
9920
9921 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9922 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9923 //
9924 if ($id_dossier !== "") {
9925 $dossier = $this->f->get_inst__om_dbform(array(
9926 "obj" => "dossier_instruction",
9927 "idx" => $id_dossier,
9928 ));
9929 //
9930 return $dossier->can_user_access_dossier();
9931 }
9932 return false;
9933 }
9934
9935 /*
9936 * CONDITION - can_user_access_dossier
9937 *
9938 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9939 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9940 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9941 *
9942 */
9943 function can_user_access_dossier_contexte_modification() {
9944
9945 $id_dossier = $this->getVal('dossier');
9946 //
9947 if ($id_dossier !== "" && $id_dossier !== null) {
9948 $dossier = $this->f->get_inst__om_dbform(array(
9949 "obj" => "dossier_instruction",
9950 "idx" => $id_dossier,
9951 ));
9952 //
9953 return $dossier->can_user_access_dossier();
9954 }
9955 return false;
9956 }
9957
9958 /**
9959 * TREATMENT - envoyer_a_signature_sans_relecture
9960 *
9961 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9962 *
9963 * @return boolean true si l'envoi a été effectué avec succès false sinon
9964 */
9965 function envoyer_a_signature_sans_relecture() {
9966 return $this->envoyer_a_signature();
9967 }
9968
9969 /**
9970 * TREATMENT - envoyer_a_signature_avec_relecture
9971 *
9972 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9973 *
9974 * @return boolean true si l'envoi a été effectué avec succès false sinon
9975 */
9976 function envoyer_a_signature_avec_relecture() {
9977 $is_forced_view_files = true;
9978 return $this->envoyer_a_signature($is_forced_view_files);
9979 }
9980
9981 /**
9982 * TREATMENT - envoyer_a_signature
9983 *
9984 * Permet d'envoyer le document de l'instruction au parapheur pour signature
9985 *
9986 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9987 *
9988 * @return boolean true si l'envoi a été effectué avec succès false sinon
9989 */
9990 function envoyer_a_signature($is_forced_view_files = false) {
9991 $this->begin_treatment(__METHOD__);
9992 $this->correct = true;
9993
9994 // Instanciation de l'objet signataire_arrete
9995 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9996 'obj' => 'signataire_arrete',
9997 'idx' => $this->getVal('signataire_arrete'),
9998 ));
9999
10000 // Instanciation de l'objet dossier
10001 $inst_dossier = $this->f->get_inst__om_dbform(array(
10002 'obj' => 'dossier',
10003 'idx' => $this->getVal('dossier'),
10004 ));
10005
10006 //Instanciation de la classe electronicsignature
10007 $inst_es = $this->get_electronicsignature_instance();
10008 if ($inst_es === false) {
10009 $this->correct = false;
10010 return $this->end_treatment(__METHOD__, false);
10011 }
10012
10013 // Vérifie si la notification se fait via l'application ou via le parapheur
10014 try {
10015 $notification_required = $inst_es->signer_notification_is_delegated();
10016 } catch(electronicsignature_connector_method_not_implemented_exception $_) {
10017 // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
10018 $notification_required = false;
10019 }
10020
10021 // Si la notification est faite par l'application vérifie que l'adresse mail du
10022 // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
10023 // au parapheur car il ne sera pas accessible sans le lien transmis dans la
10024 // notification
10025 if ($notification_required === true) {
10026 $signer_mail = $inst_signataire_arrete->getVal('email');
10027 $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
10028
10029 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
10030
10031 if (empty($signer_mail)) {
10032 $this->correct = false;
10033 $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
10034 $this->addToMessage($err_msg.$err_detail);
10035 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10036 return $this->end_treatment(__METHOD__, false);
10037 }
10038 if (! $this->f->checkValidEmailAddress($signer_mail)) {
10039 $this->correct = false;
10040 $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
10041 $this->addToMessage($err_msg.$err_detail);
10042 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
10043 return $this->end_treatment(__METHOD__, false);
10044 }
10045 }
10046
10047 // Récupération du document à signer
10048 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
10049 if ($file === OP_FAILURE) {
10050 $this->correct = false;
10051 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
10052 // Termine le traitement
10053 return $this->end_treatment(__METHOD__, false);
10054 }
10055
10056 // Initialisation des paramètre à passer pour l'envoi en signature
10057 $this->f->getUserInfos();
10058 $data = array(
10059 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
10060 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
10061 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
10062 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
10063 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
10064 // Permet d'envoyer en signature l'instruction le jour de la date limite
10065 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
10066 "dossier" => $this->getVal('dossier'),
10067 "is_forced_view_files" => $is_forced_view_files,
10068 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null,
10069 'instruction' => $this->getVal($this->clePrimaire),
10070 'last_statut_signature' => $this->getVal('statut_signature'),
10071 'last_commentaire_signature' => $this->getVal('commentaire_signature'),
10072 );
10073
10074 // Initialisation des métadonnées
10075 $metadonnee_dossier = $file['metadata'];
10076 // Récupération du libellé du document transmis au parapheur
10077 $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
10078 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
10079
10080 $metadonnee_dossier['url_di'] = sprintf(
10081 '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
10082 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
10083 $this->getVal('dossier')
10084 );
10085
10086 $optional_data = null;
10087 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
10088 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
10089 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
10090 if (json_last_error() !== JSON_ERROR_NONE) {
10091 $this->correct = false;
10092 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
10093 $this->addToLog(__METHOD__."(): ".
10094 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
10095 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
10096 );
10097 // Termine le traitement
10098 return $this->end_treatment(__METHOD__, false);
10099 }
10100 }
10101
10102 // Appel de la méthode de l'abstracteur send_for_signature()
10103 // Cette méthode doit retourner un tableau de valeur
10104 try {
10105 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
10106 } catch (electronicsignature_exception $e) {
10107 $this->handle_electronicsignature_exception($e);
10108 return $this->end_treatment(__METHOD__, false);
10109 }
10110
10111 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10112 $valF = array();
10113
10114 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10115 foreach($this->champs as $identifiant => $champ) {
10116 $valF[$champ] = $this->val[$identifiant];
10117 }
10118 // On fait ensuite nos modifications spécifiques
10119 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
10120 $valF['statut_signature'] = $result['statut'];
10121 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10122 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
10123 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10124 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
10125 $this->setParameter("maj", 1);
10126 $ret = $this->modifier($valF);
10127
10128 if ($ret === false) {
10129 $this->correct = false;
10130 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10131 // Termine le traitement
10132 return $this->end_treatment(__METHOD__, false);
10133 }
10134
10135 // Notification du signataire
10136 if ($notification_required === true) {
10137 if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
10138 $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
10139 $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
10140 $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
10141 // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
10142 // precedemment
10143 $this->init_record_data($this->getVal($this->clePrimaire));
10144 $this->annuler_envoi_en_signature();
10145 $this->correct = false;
10146 return $this->end_treatment(__METHOD__, true);
10147 }
10148 }
10149
10150 // Message
10151 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
10152 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
10153 && array_key_exists('signature_page_url', $result) === true) {
10154 $this->addToMessage(sprintf(
10155 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
10156 $result['signature_page_url'],
10157 __("Signez directement le document")
10158 ));
10159 }
10160 if ($notification_required !== true) {
10161 $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10162 }
10163
10164 // Tout s'est bien passé, on termine le traitement
10165 return $this->end_treatment(__METHOD__, true);
10166 }
10167
10168 /**
10169 * Notifie le signataire d'un document à signer.
10170 * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10171 * En cas d'erreur ajoute une ligne dans les logs de l'application.
10172 *
10173 * @param string $signer_name Nom du signataire
10174 * @param string $signer_mail Mail du signataire
10175 * @param string $user_name Nom de l'utilisateur openADS courant
10176 *
10177 * @return boolean true si succés, false si erreur
10178 */
10179 protected function notify_signer($signer_name, $signer_mail, $user_name) {
10180 // message d'erreur
10181 $err_msg_log = sprintf(
10182 __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10183 $signer_name,
10184 $signer_mail,
10185 $this->getVal($this->clePrimaire)
10186 );
10187 $err_msg = sprintf(
10188 '%s %s (%s)"',
10189 __("Échec de la notification du signataire"),
10190 $signer_name,
10191 $signer_mail
10192 );
10193
10194 // vérification des informations requises
10195 if (empty($signer_name)) {
10196 $err_detail = __("le nom du signataire est vide");
10197 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10198 $this->addToMessage($err_msg.', '.$err_detail);
10199 return false;
10200 }
10201 if (empty($signer_mail)) {
10202 $err_detail = __("le courriel du signataire est vide");
10203 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10204 $this->addToMessage($err_msg.', '.$err_detail);
10205 return false;
10206 }
10207 if (empty($this->getVal('dossier'))) {
10208 $err_detail = __("l'identifiant du dossier est vide");
10209 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10210 $this->addToMessage($err_msg.', '.$err_detail);
10211 return false;
10212 }
10213
10214 // ajout de la notification à la liste des notifications de l'instruction
10215 $instruction_id = $this->getVal($this->clePrimaire);
10216 $inst_notif = $this->f->get_inst__om_dbform(array(
10217 "obj" => "instruction_notification",
10218 "idx" => "]",
10219 ));
10220 $notif_val = array(
10221 'instruction_notification' => null,
10222 'instruction' => $instruction_id,
10223 'automatique' => true,
10224 'emetteur' => $user_name,
10225 'date_envoi' => null,
10226 'destinataire' => "$signer_name <$signer_mail>",
10227 'courriel' => $signer_mail,
10228 'date_premier_acces' => null,
10229 'statut' => '',
10230 'commentaire' => ''
10231 );
10232 $add_notif = $inst_notif->ajouter($notif_val);
10233 if ($add_notif === false) {
10234 $err_detail = __("Échec de l'ajout de la notification.");
10235 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10236 $this->addToMessage($err_msg);
10237 return false;
10238 }
10239 $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10240
10241 // ajout d'une tâche de notification (envoi du mail)
10242 $notification_task = $this->notification_by_task(
10243 $notification_id,
10244 $this->getVal('dossier'),
10245 'mail',
10246 'notification_signataire'
10247 );
10248 if ($notification_task === false) {
10249 $err_detail = sprintf(
10250 __("Échec de l'ajout de la tâche de notification (notification %s)."),
10251 $notification_id);
10252 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10253 $this->addToMessage($err_msg);
10254 return false;
10255 }
10256
10257 // Vérification de la réussite de l'envoi du mail
10258 // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10259 // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10260 // qui viens d'être créée.
10261 // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10262 $qres = $this->f->get_one_result_from_db_query(
10263 sprintf(
10264 'SELECT
10265 state
10266 FROM
10267 %1$stask
10268 WHERE
10269 type = \'notification_signataire\'
10270 AND category = \'mail\'
10271 AND dossier = \'%2$s\'
10272 ORDER BY
10273 task DESC
10274 LIMIT 1',
10275 DB_PREFIXE,
10276 $this->f->db->escapeSimple($this->getVal('dossier'))
10277 ),
10278 array(
10279 'origin' => __METHOD__
10280 )
10281 );
10282 if ($qres['result'] === 'error') {
10283 $err_detail = sprintf(
10284 __("Échec de l'envoi du mail de notification (notification %s)."),
10285 $notification_id);
10286 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10287 $this->addToMessage($err_msg);
10288 return false;
10289 }
10290 // TODO gérer les autres cas (gestion d'erreur)
10291
10292 // succès de la planification de la notification
10293 $this->addToMessage(sprintf(
10294 __('Le signataire "%s (%s)" sera notifié prochainement'),
10295 $signer_name,
10296 $signer_mail));
10297 return true;
10298 }
10299
10300 /**
10301 * Permet de récupérer la bonne date limite en fonction de si l'instruction
10302 * est en incomplet notifié ou non.
10303 * On peut ajouter des jours à cette date grâce au paramètre "delay".
10304 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10305 * l'instruction en signature le jour de la date limite.
10306 *
10307 * @param int $delay Le nombre de jour à ajouter à la date limite.
10308 *
10309 * @return string $date_limite la date limite calculé ou false
10310 */
10311 private function compute_date_limite($delay) {
10312 // Instanciation de l'objet dossier
10313 $inst_dossier = $this->f->get_inst__om_dbform(array(
10314 'obj' => 'dossier',
10315 'idx' => $this->getVal('dossier'),
10316 ));
10317
10318 $date_to_compute = null;
10319 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10320 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10321 } else {
10322 $date_to_compute = $inst_dossier->getVal('date_limite');
10323 }
10324 if ($date_to_compute != null) {
10325 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10326 }
10327
10328 return null;
10329 }
10330
10331 /**
10332 * Permet de récupérer la traduction de la valeur de statut_signature
10333 *
10334 * @return string la valeur de statut_signature traduite | false
10335 */
10336 function get_trad_for_statut($value_to_trad){
10337 $statut_signature_tab = array(
10338 'waiting' => __('en préparation'),
10339 'in_progress' => __('en cours de signature'),
10340 'canceled' => __('signature annulée'),
10341 'expired' => __('délai de signature expiré'),
10342 'finished' => __('signé')
10343 );
10344 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10345 return $statut_signature_tab[$value_to_trad];
10346 }
10347
10348 return false;
10349 }
10350
10351 /**
10352 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10353 *
10354 * @return string (json) la valeur de historique_signature mis à jour | false
10355 */
10356 function get_updated_historique_signature($historique_signature_values) {
10357
10358 $historique_signature_value_tab = $this->get_historique_signature_decoded();
10359
10360 if ($historique_signature_value_tab === false) {
10361 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10362 return false;
10363 }
10364
10365 $last_val_historique_signature = array();
10366
10367 // Si la tableau récupéré n'est pas vide alors
10368 // on récupère la dernière ligne du tableau
10369 if (empty($historique_signature_value_tab) === false) {
10370 $last_val_historique_signature = end($historique_signature_value_tab);
10371 }
10372
10373 $format_date = '';
10374 $format_date_hour = '';
10375 $date_converted=array();
10376
10377 $date_to_convert = array(
10378 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10379 'date_limite_instruction' => $this->compute_date_limite(0),
10380 'date_retour_signature' => $historique_signature_values['date_retour_signature']
10381 );
10382
10383 // Conversion des dates en fonction de leur format
10384 foreach ($date_to_convert as $key => $value) {
10385 $date_converted[$key] = null;
10386 if ($value != null) {
10387 $format_date = 'd/m/Y';
10388 $format_date_hour = 'd/m/Y H:i:s';
10389 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10390 }
10391 }
10392
10393 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10394 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10395 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10396 $tab_for_columns_trad = array(
10397 __('entry_date'),
10398 __('id_parapheur_signature'),
10399 __('emetteur'),
10400 __('signataire'),
10401 __('date_envoi'),
10402 __('date_limite'),
10403 __('date_retour'),
10404 __('statut_signature'),
10405 __('commentaire_signature')
10406 );
10407
10408 array_push($historique_signature_value_tab, array(
10409 'entry_date' => date('d/m/Y H:i:s'),
10410 'id_parapheur_signature' => $historique_signature_values['id_parapheur_signature'] == null ? (isset($last_val_historique_signature['id_parapheur_signature']) === true ? $last_val_historique_signature['id_parapheur_signature'] : null) : $historique_signature_values['id_parapheur_signature'],
10411 'emetteur' => $historique_signature_values['om_utilisateur_email'] == null ? (isset($last_val_historique_signature['emetteur']) === true ? $last_val_historique_signature['emetteur'] : null) : $historique_signature_values['om_utilisateur_email'],
10412 'signataire' => $historique_signature_values['signataire_arrete_email'] == null ? (isset($last_val_historique_signature['signataire']) === true ? $last_val_historique_signature['signataire'] : null) : $historique_signature_values['signataire_arrete_email'],
10413 'date_envoi' => $historique_signature_values['date_envoi_signature'] == null ? (isset($last_val_historique_signature['date_envoi']) === true ? $last_val_historique_signature['date_envoi'] : null) : $date_converted['date_envoi_signature'],
10414 'date_limite' => $historique_signature_values['date_limite_instruction'] == null ? (isset($last_val_historique_signature['date_limite']) === true ? $last_val_historique_signature['date_limite'] : null) : $date_converted['date_limite_instruction'],
10415 'date_retour' => $historique_signature_values['date_retour_signature'] == null ? (isset($last_val_historique_signature['date_retour']) === true ? $last_val_historique_signature['date_retour'] : null) : $date_converted['date_retour_signature'],
10416 'statut_signature' => $historique_signature_values['statut'] == null ? (isset($last_val_historique_signature['statut_signature']) === true ? $last_val_historique_signature['statut_signature'] : null) : $this->get_trad_for_statut($historique_signature_values['statut']),
10417 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10418 ));
10419
10420 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10421 }
10422
10423 /**
10424 * TREATMENT - annuler_envoi_en_signature
10425 *
10426 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10427 *
10428 * @return boolean true si l'annulation a été effectué avec succès false sinon
10429 */
10430 function annuler_envoi_en_signature() {
10431 $this->begin_treatment(__METHOD__);
10432 $this->correct = true;
10433
10434 //Instanciation de la classe electronicsignature
10435 $inst_es = $this->get_electronicsignature_instance();
10436 if ($inst_es === false) {
10437 $this->correct = false;
10438 return $this->end_treatment(__METHOD__, false);
10439 }
10440
10441 $data = array();
10442 if (! empty($this->getVal('id_parapheur_signature'))) {
10443 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10444 } else {
10445 $this->correct = false;
10446 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10447 return $this->end_treatment(__METHOD__, false);
10448 }
10449
10450 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10451 // Cette méthode doit retourner un tableau de valeur
10452 try {
10453 $result = $inst_es->cancel_send_for_signature($data);
10454 } catch (electronicsignature_exception $e) {
10455 $this->handle_electronicsignature_exception($e);
10456 return $this->end_treatment(__METHOD__, false);
10457 }
10458
10459 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10460 $valF = array();
10461
10462 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10463 foreach($this->champs as $identifiant => $champ) {
10464 $valF[$champ] = $this->val[$identifiant];
10465 }
10466 // On fait ensuite nos modifications spécifiques
10467 $valF['id_parapheur_signature'] = null;
10468 $valF['statut_signature'] = $result['statut'];
10469 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10470 $valF['date_envoi_signature'] = null;
10471 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10472
10473 $this->setParameter("maj", 1);
10474 $ret = $this->modifier($valF);
10475
10476 if ($ret === false) {
10477 $this->correct = false;
10478 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10479 // Termine le traitement
10480 return $this->end_treatment(__METHOD__, false);
10481 }
10482
10483 // Message
10484 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10485
10486 // Tout s'est bien passé, on termine le traitement
10487 return $this->end_treatment(__METHOD__, true);
10488 }
10489
10490
10491 /**
10492 * Récupère le contenu du champ historique_signature et le converti en tableau
10493 *
10494 * @return array sinon false en cas d'erreur
10495 */
10496 protected function get_historique_signature_decoded() {
10497 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10498 if ($val === '' || $val == 'false') {
10499 $val = json_encode(array());
10500 }
10501 if($this->isJson($val) === false) {
10502 return false;
10503 }
10504 return json_decode($val, true);
10505 }
10506
10507 /**
10508 * Récupère les informations à afficher dans le tableau de suivi à l'aide
10509 * d'une requête sql. Stocke ces informations dans un tableau.
10510 * Converti le tableau au format json et renvoi le json obtenu.
10511 *
10512 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10513 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10514 * La clause where de la requête est construite à partir du tableau contenant les types
10515 * de tâches fourni en paramètre.
10516 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10517 *
10518 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10519 * la date de premier accès ne sera pas affichée.
10520 *
10521 * @param array liste des tâches permettant d'identifier quelles notification afficher
10522 * @param boolean permet d'afficher les notifications non liées à des tâches
10523 * @return json
10524 */
10525 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10526 $whereTypeTache = '';
10527 $sqlTaskNull = 'INNER';
10528
10529 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10530 $listeChampsTrad = array(
10531 __('emetteur'),
10532 __('date_envoi'),
10533 __('destinataire'),
10534 __('date_premier_acces'),
10535 __('instruction'),
10536 __('annexes'),
10537 __('statut'),
10538 __('commentaire')
10539 );
10540 $listeChamps = array(
10541 'emetteur',
10542 'date_envoi',
10543 'destinataire',
10544 'date_premier_acces',
10545 'instruction',
10546 'annexes',
10547 'statut',
10548 'commentaire'
10549 );
10550
10551 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10552 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10553 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10554 // paramétrage
10555 if(is_bool($nonLieTache) && $nonLieTache === true) {
10556 $sqlTaskNull = 'LEFT';
10557 }
10558 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10559 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10560 // tiers consulté
10561 if (is_array($typeTache) && $typeTache != array()) {
10562 if (is_array($typeTache)) {
10563 $whereTypeTache = sprintf(
10564 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10565 "'".implode("', '", $typeTache)."'"
10566 );
10567 }
10568 // La date de premier accès n'a pas besoin d'être renseigné pour
10569 // les notifications des demandeurs via le portail citoyen.
10570 // Les notifications des demandeurs sont liés à 3 types de tâches
10571 // notification_recepisse, notification_instruction, notification_decision
10572 // Si le suivi de la notification concerne un de ces types de tâches on
10573 // considère que c'est une notification de demandeurs.
10574 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10575 // via le portail. Par défaut si rien n'est paramétré on considère que la
10576 // notification est faite via le portail
10577 if ((in_array('notification_recepisse', $typeTache) ||
10578 in_array('notification_instruction', $typeTache) ||
10579 in_array('notification_decision', $typeTache))) {
10580 $dossier = $this->getVal('dossier');
10581 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10582 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10583 if ($modeNotification === PORTAL) {
10584 $listeChamps = array(
10585 'emetteur',
10586 'date_envoi',
10587 'destinataire',
10588 'instruction',
10589 'annexes',
10590 'statut',
10591 'commentaire'
10592 );
10593 }
10594 }
10595 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10596 // de les afficher dans le suivi
10597 if (in_array('notification_depot_demat', $typeTache)) {
10598 $listeChamps = array(
10599 'emetteur',
10600 'date_envoi',
10601 'destinataire',
10602 'instruction',
10603 'statut',
10604 'commentaire'
10605 );
10606 }
10607 }
10608
10609 $valSuivi = array();
10610 // Récupération des infos nécessaires à l'affichage du tableau
10611 $sql = sprintf(
10612 'SELECT DISTINCT
10613 instruction_notification.instruction_notification,
10614 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10615 CASE WHEN instruction_notification.automatique = TRUE
10616 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10617 ELSE instruction_notification.emetteur
10618 END as emetteur,
10619 date_envoi,
10620 instruction_notification.destinataire,
10621 instruction_notification.date_premier_acces,
10622 evenement.libelle as instruction,
10623 instruction_notification.statut,
10624 instruction_notification.commentaire,
10625 annexes.instruction_annexe as annexes
10626 FROM
10627 %1$sinstruction_notification
10628 LEFT JOIN %1$sinstruction
10629 ON instruction.instruction = instruction_notification.instruction
10630 LEFT JOIN %1$sevenement
10631 ON instruction.evenement = evenement.evenement
10632 LEFT JOIN %1$sinstruction_notification_document
10633 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10634 AND instruction_notification_document.annexe = true
10635 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10636 %4$s JOIN %1$stask
10637 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10638 AND task.type LIKE \'notification%%\'
10639 -- Récupération de la liste des annexes sous la forme d une liste
10640 LEFT JOIN (
10641 SELECT
10642 instruction_notification,
10643 -- Récupère la liste des annexes de la notification
10644 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10645 -- à l affichage du lien vers les annexes
10646 CONCAT(
10647 \'[\',
10648 STRING_AGG(
10649 -- Affiche le nom du fichier selon le type de document/pièce
10650 CASE
10651 WHEN instruction_notification_document.document_type = \'instruction\'
10652 THEN CONCAT(
10653 \'{
10654 "obj" : "instruction",
10655 "champs" : "om_fichier_instruction",
10656 "label" : "\', evenement.libelle, \'",
10657 "id" : "\', instruction.instruction,\'"
10658 }\'
10659 )
10660 WHEN instruction_notification_document.document_type = \'consultation\'
10661 THEN CONCAT(
10662 \'{
10663 "obj" : "consultation",
10664 "champs" : "fichier",
10665 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10666 "id" : "\', consultation.consultation, \'"
10667 }\'
10668 )
10669 ELSE
10670 CONCAT(
10671 \'{
10672 "obj" : "document_numerise",
10673 "champs" : "uid",
10674 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10675 "id" : "\', document_numerise.document_numerise,\'"
10676 }\'
10677 )
10678 END,
10679 \', \'),
10680 \']\'
10681 ) AS instruction_annexe
10682 FROM
10683 %1$sinstruction_notification_document
10684 LEFT JOIN %1$sinstruction
10685 ON instruction_notification_document.instruction = instruction.instruction
10686 LEFT JOIN %1$sevenement
10687 ON instruction.evenement = evenement.evenement
10688 LEFT JOIN %1$sconsultation
10689 ON instruction_notification_document.document_id = consultation.consultation
10690 LEFT JOIN %1$sservice
10691 ON consultation.service = service.service
10692 LEFT JOIN %1$sdocument_numerise
10693 ON instruction_notification_document.document_id = document_numerise.document_numerise
10694 LEFT JOIN %1$sdocument_numerise_type
10695 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10696 WHERE
10697 instruction_notification_document.annexe = \'t\'
10698 GROUP BY
10699 instruction_notification
10700 ) AS annexes
10701 ON
10702 annexes.instruction_notification = instruction_notification.instruction_notification
10703 WHERE
10704 instruction.instruction = %2$s
10705 %3$s
10706 ORDER BY
10707 date_envoi ASC, instruction_notification.destinataire ASC',
10708 DB_PREFIXE,
10709 intval($this->getVal('instruction')),
10710 $whereTypeTache,
10711 $sqlTaskNull
10712 );
10713 $qres = $this->f->get_all_results_from_db_query($sql, array(
10714 "origin" => __METHOD__
10715 )
10716 );
10717 // Préparation du lien de téléchargement des annexes
10718 $htmlList =
10719 '<style>
10720 #content .gridjs-td a.lien_annexe {
10721 text-decoration : underline dotted 1px;
10722 }
10723 #content a.lien_annexe:hover {
10724 text-decoration : underline solid 1px;
10725 color : #46aede;
10726 }
10727 ol {padding-left : 10px;}
10728 </style>
10729 <ol>%1$s</ol>';
10730 $lienTelechargement =
10731 '<a class="lien_annexe" href="../app/index.php?module=form&amp;snippet=file&amp;obj=%1$s&amp;champ=%2$s&amp;id=%3$s" target="blank" title="%4$s">
10732 Annexe
10733 </a>';
10734 // Stockage des infos de chaque notification dans un tableau
10735 foreach ($qres['result'] as $row) {
10736 $valNotif = array();
10737 foreach($listeChamps as $champ) {
10738 $valNotif[$champ] = $row[$champ];
10739 if (($champ === 'date_envoi'
10740 || $champ === 'date_premier_acces')
10741 && $row[$champ] !== null
10742 && $row[$champ] !== '') {
10743 //
10744 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10745 } else if ($champ === 'annexes') {
10746 $listeAnnexe = '';
10747 $infoAnnexes = json_decode($row[$champ], true);
10748 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10749 // A partir des infos récupérées prépare le code html du lien vers chacune
10750 // des annexes et ajoute un élément de liste par annexe
10751 foreach($infoAnnexes as $annexe) {
10752 $listeAnnexe .= sprintf(
10753 '<li>%s</li>',
10754 sprintf($lienTelechargement,
10755 $annexe['obj'],
10756 $annexe['champs'],
10757 $annexe['id'],
10758 $annexe['label']
10759 )
10760 );
10761 }
10762 // Construction de la liste des annexes
10763 $valNotif[$champ] = sprintf(
10764 $htmlList,
10765 $listeAnnexe
10766 );
10767 }
10768 }
10769 }
10770 array_push($valSuivi, $valNotif);
10771 }
10772
10773 // Passage du tableau au format json
10774 return json_encode($valSuivi, JSON_HEX_APOS);
10775 }
10776
10777 /**
10778 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10779 *
10780 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10781 *
10782 * @return void
10783 */
10784 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10785 $this->correct = false;
10786 $this->addToMessage($exception->getMessage());
10787 }
10788
10789
10790 /**
10791 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10792 *
10793 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10794 * @return electronicsignature Instance de l'abstracteur.
10795 */
10796 public function get_electronicsignature_instance($with_handle_error = true) {
10797 if(isset($this->electronicsignature_instance)) {
10798 return $this->electronicsignature_instance;
10799 }
10800 // Instanciation du connecteur electronicsignature
10801 try {
10802 require_once "electronicsignature.class.php";
10803 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10804 $extra_params = array(
10805 "inst_framework" => $this->f,
10806 );
10807 $this->electronicsignature_instance = new electronicsignature($collectivites, $extra_params);
10808 } catch (electronicsignature_exception $e) {
10809 if ($with_handle_error === true) {
10810 $this->handle_electronicsignature_exception($e);
10811 }
10812 return false;
10813 }
10814 return $this->electronicsignature_instance;
10815 }
10816
10817 /**
10818 * TREATMENT - envoyer_au_controle_de_legalite
10819 *
10820 * Ajoute la tâche envoi_CL.
10821 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10822 *
10823 * @return [type] [description]
10824 */
10825 function envoyer_au_controle_de_legalite() {
10826 $this->begin_treatment(__METHOD__);
10827 $this->correct = true;
10828
10829 //
10830 if ($this->can_be_sent_to_cl() === true) {
10831 // Création de la task 'envoi_CL'
10832 $inst_task = $this->f->get_inst__om_dbform(array(
10833 "obj" => "task",
10834 "idx" => 0,
10835 ));
10836 $task_val = array(
10837 'type' => 'envoi_CL',
10838 'object_id' => $this->getVal('instruction'),
10839 'dossier' => $this->getVal('dossier'),
10840 );
10841 // Change l'état de la tâche de notification en fonction de l'état de
10842 // transmission du dossier d'instruction
10843 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10844 if ($this->f->is_option_mode_service_consulte_enabled() === false
10845 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10846 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10847 //
10848 $task_val['state'] = task::STATUS_DRAFT;
10849 }
10850 $add_task = $inst_task->add_task(array('val' => $task_val));
10851 if ($add_task === false) {
10852 $this->addToMessage(sprintf('%s %s',
10853 __("Une erreur s'est produite lors de la création tâche."),
10854 __("Veuillez contacter votre administrateur.")
10855 ));
10856 $this->correct = false;
10857 return $this->end_treatment(__METHOD__, false);
10858 }
10859 // Mise à jour du champs 'envoye_cl_platau'
10860 $instr_val = array(
10861 'envoye_cl_platau' => 't',
10862 );
10863 $res = $this->f->db->autoExecute(
10864 DB_PREFIXE.$this->table,
10865 $instr_val,
10866 DB_AUTOQUERY_UPDATE,
10867 $this->getCle($this->getVal($this->clePrimaire))
10868 );
10869 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->getVal($this->clePrimaire))."\");", VERBOSE_MODE);
10870 if ($this->f->isDatabaseError($res, true) === true) {
10871 $this->addToMessage(sprintf('%s %s',
10872 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10873 __("Veuillez contacter votre administrateur.")
10874 ));
10875 $this->correct = false;
10876 return $this->end_treatment(__METHOD__, false);
10877 }
10878 // Message de validation à l'utilisateur
10879 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10880 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10881 }
10882 //
10883 return $this->end_treatment(__METHOD__, true);
10884 }
10885
10886
10887 /**
10888 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10889 *
10890 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10891 * la vue 'sousformulaire'.
10892 *
10893 * @return string
10894 */
10895 function get_back_link($view = "formulaire") {
10896 //
10897 $href = parent::get_back_link($view);
10898 //
10899 $crud = $this->get_action_crud();
10900
10901 // Redirection vers le formulaire de modification à la validation du
10902 // formulaire d'ajout si l'événement associé possède une lettre type
10903 if (($crud === 'create'
10904 || ($crud === null
10905 && $this->getParameter('maj') == 0))
10906 && $this->correct == true
10907 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10908
10909 // On instancie l'instruction
10910 $inst_instruction = $this->f->get_inst__om_dbform(array(
10911 "obj" => "instruction",
10912 "idx" => $this->valF[$this->clePrimaire],
10913 ));
10914
10915 // Si l'instruction n'est pas finalisée automatiquement
10916 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10917 $href = str_replace("&action=3", "&action=1", $href);
10918 //
10919 if (strpos($href, "&retour=tab") !== false) {
10920 $href = str_replace("&retour=tab", "&retour= form", $href);
10921 } else {
10922 $href .= "&retour=form";
10923 }
10924 }
10925 }
10926
10927 //
10928 return $href;
10929 }
10930
10931 public function view_json_data() {
10932 $this->checkAccessibility();
10933 $this->f->disableLog();
10934 $view = $this->get_json_data();
10935 printf(json_encode($view));
10936 }
10937
10938 public function get_json_data() {
10939 $val = array_combine($this->champs, $this->val);
10940 foreach ($val as $key => $value) {
10941 $val[$key] = strip_tags($value);
10942 }
10943 $val['tacite'] = 'f';
10944 $inst_ad = $this->f->get_inst__om_dbform(array(
10945 "obj" => "avis_decision",
10946 "idx" => $val['avis_decision'],
10947 ));
10948 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10949 $val['tacite'] = 't';
10950 }
10951 return $val;
10952 }
10953
10954 /**
10955 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10956 * comme événement lié le suivant définit dans l'événement de l'instruction
10957 * instanciée.
10958 *
10959 * @param string $next_type Correspond aux trois déclenchement automatique
10960 * de création d'instruction paramétré sur un événement.
10961 * @param integer $instruction Identifiant de l'instruction à instancier.
10962 * @return mixed Identifiant de l'instruction recherchée ou false.
10963 */
10964 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10965 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10966 return false;
10967 }
10968 $result = array();
10969 $evenements = array();
10970 if ($instruction === null) {
10971 $instruction = $this->getVal($this->clePrimaire);
10972 $evenement = $this->getVal('evenement');
10973 $dossier = $this->getVal('dossier');
10974 } else {
10975 $inst = $this->f->get_inst__om_dbform(array(
10976 "obj" => "instruction",
10977 "idx" => $instruction,
10978 ));
10979 $evenement = $inst->getVal('evenement');
10980 $dossier = $inst->getVal('dossier');
10981 }
10982 // Récupération de l'identifiant de l'événement paramétré comme suivant
10983 // sur l'instruction instanciée
10984 $qres = $this->f->get_one_result_from_db_query(
10985 sprintf(
10986 'SELECT
10987 evenement_%3$s
10988 FROM
10989 %1$sevenement
10990 WHERE
10991 evenement = %2$s',
10992 DB_PREFIXE,
10993 intval($evenement),
10994 $next_type
10995 ),
10996 array(
10997 "origin" => __METHOD__,
10998 "force_return" => true,
10999 )
11000 );
11001 if ($qres["code"] !== "OK") {
11002 return false;
11003 }
11004 $ev_next = $qres["result"];
11005 // Récupération de l'instruction dans le dossier utilisant l'événement
11006 // suivant identifié dans la requête précédente
11007 $qres = $this->f->get_one_result_from_db_query(
11008 sprintf(
11009 'SELECT
11010 MAX(instruction.instruction) as instruction
11011 FROM
11012 %1$sinstruction
11013 WHERE
11014 dossier = \'%3$s\'
11015 AND evenement = %2$s',
11016 DB_PREFIXE,
11017 intval($ev_next),
11018 $this->f->db->escapeSimple($dossier)
11019 ),
11020 array(
11021 "origin" => __METHOD__,
11022 "force_return" => true,
11023 )
11024 );
11025 if ($qres["code"] !== "OK") {
11026 return false;
11027 }
11028 return $qres["result"];
11029 }
11030
11031 public function get_related_instructions($instruction = null) {
11032 $result = array();
11033 $evenements = array();
11034 if ($instruction === null) {
11035 $instruction = $this->getVal($this->clePrimaire);
11036 $evenement = $this->getVal('evenement');
11037 $dossier = $this->getVal('dossier');
11038 } else {
11039 $inst = $this->f->get_inst__om_dbform(array(
11040 "obj" => "instruction",
11041 "idx" => $instruction,
11042 ));
11043 $evenement = $inst->getVal('evenement');
11044 $dossier = $inst->getVal('dossier');
11045 }
11046 //
11047 $qres = $this->f->get_one_result_from_db_query(
11048 sprintf(
11049 'SELECT
11050 evenement
11051 FROM
11052 %1$sevenement
11053 WHERE
11054 evenement_retour_ar = %2$s
11055 OR evenement_retour_signature = %2$s',
11056 DB_PREFIXE,
11057 intval($evenement)
11058 ),
11059 array(
11060 "origin" => __METHOD__,
11061 "force_return" => true,
11062 )
11063 );
11064 if ($qres["code"] !== "OK") {
11065 return false;
11066 }
11067 $ev_parent = $qres["result"];
11068 //
11069 $qres = $this->f->get_one_result_from_db_query(
11070 sprintf(
11071 'SELECT
11072 MAX(instruction.instruction) as instruction
11073 FROM
11074 %1$sinstruction
11075 WHERE
11076 dossier = \'%3$s\'
11077 AND evenement = %2$s',
11078 DB_PREFIXE,
11079 intval($ev_parent),
11080 $this->f->db->escapeSimple($dossier)
11081 ),
11082 array(
11083 "origin" => __METHOD__,
11084 "force_return" => true,
11085 )
11086 );
11087 if ($qres["code"] !== "OK") {
11088 return false;
11089 }
11090 $result[] = $qres["result"];
11091 //
11092 $qres = $this->f->get_one_result_from_db_query(
11093 sprintf(
11094 'SELECT
11095 evenement_retour_ar
11096 FROM
11097 %1$sevenement
11098 WHERE
11099 evenement = %2$d
11100 AND evenement_retour_ar != %3$d',
11101 DB_PREFIXE,
11102 intval($ev_parent),
11103 intval($evenement)
11104 ),
11105 array(
11106 "origin" => __METHOD__,
11107 "force_return" => true,
11108 )
11109 );
11110 if ($qres["code"] !== "OK") {
11111 return false;
11112 }
11113 $evenements[] = $qres["result"];
11114 //
11115 $qres = $this->f->get_one_result_from_db_query(
11116 sprintf(
11117 'SELECT
11118 evenement_retour_signature
11119 FROM
11120 %1$sevenement
11121 WHERE
11122 evenement = %2$s
11123 AND evenement_retour_signature != %3$s
11124 ',
11125 DB_PREFIXE,
11126 intval($ev_parent),
11127 intval($evenement)
11128 ),
11129 array(
11130 "origin" => __METHOD__,
11131 "force_return" => true,
11132 )
11133 );
11134 if ($qres["code"] !== "OK") {
11135 return false;
11136 }
11137 $evenements[] = $qres["result"];
11138 foreach ($evenements as $value) {
11139 if ($value !== null) {
11140 $qres = $this->f->get_one_result_from_db_query(
11141 sprintf(
11142 'SELECT
11143 MAX(instruction.instruction) as instruction
11144 FROM
11145 %1$sinstruction
11146 WHERE
11147 dossier = \'%3$s\'
11148 AND evenement = %2$s',
11149 DB_PREFIXE,
11150 intval($value),
11151 $this->f->db->escapeSimple($dossier)
11152 ),
11153 array(
11154 "origin" => __METHOD__,
11155 "force_return" => true,
11156 )
11157 );
11158 if ($qres["code"] !== "OK") {
11159 return false;
11160 }
11161 $result[] = $qres["result"];
11162 }
11163 }
11164 return $result;
11165 }
11166
11167 protected function getDocumentType($champ = null) {
11168 $evenementId = $this->getVal('evenement');
11169 if (! empty($evenementId)) {
11170 $evenement = $this->f->findObjectById('evenement', $evenementId);
11171 if (! empty($evenement)) {
11172 return __("Instruction").':'.$evenement->getVal('libelle');
11173 }
11174 }
11175 return parent::getDocumentType();
11176 }
11177
11178 /**
11179 * Récupère à l'aide d'une requête sql la liste des demandeurs
11180 * pouvant être notifié. C'est à dire les demandeurs acceptant
11181 * les notifications et pour lesquels une adresse mail existe.
11182 *
11183 * Dans le cas, d'une notification pour le portail citoyen, seul
11184 * le pétitionnaire principal doit être notifier et uniquement si
11185 * il a une adress mail et qu'il accepte les notifications.
11186 *
11187 * @param string identifiant du dossier
11188 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11189 * pour une notification de categorie portail
11190 * @return array liste des demandeurs pouvant être notifié
11191 */
11192 public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11193 if ($idDossier === null) {
11194 $idDossier = $this->getVal('dossier');
11195 }
11196 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11197 // pour une notification depuis le portail citoyen
11198 $sqlPetitionnairePrincipal = '';
11199 // Gestion des champs nécessaires pour la notification d'un demandeur
11200 $condition_demandeur = "AND demandeur.notification = 't'
11201 AND demandeur.courriel IS NOT NULL";
11202 if ($portail === true) {
11203 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11204 $condition_demandeur = "AND (
11205 (notification = 't' AND courriel IS NOT NULL)
11206 OR demande.source_depot = 'portal'
11207 )";
11208 }
11209
11210 $listeDemandeursNotifiable = array();
11211
11212 // Requête de récupération des demandeurs
11213 $qres = $this->f->get_all_results_from_db_query(
11214 sprintf(
11215 'SELECT
11216 demandeur.demandeur,
11217 CASE
11218 WHEN demandeur.qualite=\'particulier\'
11219 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11220 ELSE
11221 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11222 END AS destinataire,
11223 demandeur.courriel,
11224 petitionnaire_principal
11225 FROM
11226 %1$sdossier
11227 INNER JOIN %1$slien_dossier_demandeur
11228 ON dossier.dossier = lien_dossier_demandeur.dossier
11229 INNER JOIN %1$sdemandeur
11230 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11231 -- Récupération de la plus ancienne demande associée au dossier (la demande
11232 -- de création du dossier)
11233 INNER JOIN (
11234 SELECT
11235 demande,
11236 dossier_instruction,
11237 source_depot
11238 FROM
11239 %1$sdemande
11240 WHERE
11241 dossier_instruction = \'%2$s\'
11242 ORDER BY
11243 demande ASC
11244 LIMIT 1
11245 ) as demande
11246 ON dossier.dossier = demande.dossier_instruction
11247 WHERE
11248 dossier.dossier = \'%2$s\'
11249 %3$s
11250 %4$s',
11251 DB_PREFIXE,
11252 $this->f->db->escapeSimple($idDossier),
11253 $condition_demandeur,
11254 $sqlPetitionnairePrincipal
11255 ),
11256 array(
11257 "origin" => __METHOD__
11258 )
11259 );
11260 // Récupération des infos des demandeurs et stockage dans un tableau
11261 // ayant pour clé les id des demandeurs
11262 foreach ($qres['result'] as $row) {
11263 $listeDemandeursNotifiable[$row['demandeur']] = $row;
11264 }
11265
11266 return $listeDemandeursNotifiable;
11267 }
11268
11269 /**
11270 * Renvoie la liste des notifications liées à l'instruction
11271 *
11272 * @param integer id de l'instruction dont on cherche les notifications
11273 * @return array liste des instruction_notification liés à l'instruction
11274 */
11275 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11276 // Compose la clause définissant dans la requête le type de tâche attendus
11277 $clause_type_tache = '';
11278 if ($typeNotification != null) {
11279 if (is_array($typeNotification)) {
11280 $clause_type_tache = sprintf(
11281 'AND task.type IN (\'%1$s\')',
11282 implode("', '", $typeNotification),
11283 );
11284 } else {
11285 $clause_type_tache = sprintf(
11286 'AND task.type = \'%1$s\'',
11287 $typeNotification
11288 );
11289 }
11290 }
11291
11292 // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11293 $qres = $this->f->get_all_results_from_db_query(
11294 sprintf('
11295 SELECT
11296 instruction_notification.instruction_notification
11297 FROM
11298 %1$sinstruction_notification
11299 INNER JOIN %1$stask
11300 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11301 %3$s
11302 WHERE
11303 instruction = %2$s',
11304 DB_PREFIXE,
11305 intval($id_instruction),
11306 $clause_type_tache
11307 ),
11308 array(
11309 "origin" => __METHOD__,
11310 'log_level' => DEBUG_MODE
11311 )
11312 );
11313 $listeInstrNotif = array();
11314 foreach ($qres['result'] as $row) {
11315 $listeInstrNotif[] = $row['instruction_notification'];
11316 }
11317
11318 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11319 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11320 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11321 // paramétrage
11322 if(is_bool($nonLieTache) && $nonLieTache === true) {
11323 $qres = $this->f->get_all_results_from_db_query(
11324 sprintf('
11325 SELECT
11326 instruction_notification.instruction_notification
11327 FROM
11328 %1$sinstruction_notification
11329 LEFT JOIN %1$stask
11330 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11331 AND task.type LIKE \'%%notification%%\'
11332 WHERE
11333 instruction = %2$s
11334 AND task.task IS NULL',
11335 DB_PREFIXE,
11336 intval($id_instruction)
11337 ),
11338 array(
11339 "origin" => __METHOD__
11340 )
11341 );
11342
11343 foreach ($qres['result'] as $row) {
11344 $listeInstrNotif[] = $row['instruction_notification'];
11345 }
11346 }
11347
11348 return $listeInstrNotif;
11349 }
11350
11351 /**
11352 * Crée une clé d'accès unique permettant à un utilisateur
11353 * anonyme de récupérer le document.
11354 *
11355 * @return string clé d'accès du document
11356 */
11357 function getCleAccesDocument() {
11358 // Initialisation d'un tableau
11359 $number_list = array();
11360
11361 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11362 for ($i = 0; $i < 4; $i++) {
11363 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11364 }
11365
11366 // Transformation en chaîne tout en séparant les nombres par un "-"
11367 $result = implode('-', $number_list);
11368
11369 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11370 if ($this->getUidDocumentInstructionWithKey($result) != null) {
11371 return $this->getCleAccesDocument();
11372 }
11373
11374 //
11375 return $result;
11376 }
11377
11378 /**
11379 * Récupère une clé et renvoie l'uid du document liée à cette
11380 * clé. Si la clé n'existe pas renvoie null.
11381 *
11382 * @param string $cleGen clé dont on cherche l'instruction
11383 * @return integer|null
11384 */
11385 protected function getUidDocumentInstructionWithKey($cleGen) {
11386 $qres = $this->f->get_one_result_from_db_query(
11387 sprintf(
11388 'SELECT
11389 instruction.om_fichier_instruction
11390 FROM
11391 %1$sinstruction_notification_document
11392 LEFT JOIN %1$sinstruction
11393 ON instruction_notification_document.instruction = instruction.instruction
11394 WHERE
11395 instruction_notification_document.cle = \'%2$s\'',
11396 DB_PREFIXE,
11397 $this->f->db->escapeSimple($cleGen)
11398 ),
11399 array(
11400 "origin" => __METHOD__,
11401 )
11402 );
11403
11404 return $qres['result'];
11405 }
11406
11407 /**
11408 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11409 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11410 *
11411 * @param string $cleGen
11412 * @return instruction_notification
11413 */
11414 protected function getInstanceNotificationWithKey($key) {
11415 $qres = $this->f->get_one_result_from_db_query(
11416 sprintf(
11417 'SELECT
11418 instruction_notification
11419 FROM
11420 %1$sinstruction_notification_document
11421 WHERE
11422 cle = \'%2$s\'',
11423 DB_PREFIXE,
11424 $this->f->db->escapeSimple($key)
11425 ),
11426 array(
11427 "origin" => __METHOD__,
11428 )
11429 );
11430
11431 // Récupération de l'instance de notification
11432 $instNotif = $this->f->get_inst__om_dbform(array(
11433 "obj" => "instruction_notification",
11434 "idx" => $qres['result'],
11435 ));
11436 return $instNotif;
11437 }
11438
11439
11440 /**
11441 * Affiche la page de téléchargement du document de la notification.
11442 *
11443 * @param boolean $content_only Affiche le contenu seulement.
11444 *
11445 * @return void
11446 */
11447 public function view_telecharger_document_anonym() {
11448 // Par défaut on considère qu'on va afficher le formulaire
11449 $idx = 0;
11450 // Flag d'erreur
11451 $error = false;
11452 // Message d'erreur
11453 $message = '';
11454
11455 // Paramètres GET : récupération de la clé d'accès
11456 $cle_acces_document = $this->f->get_submitted_get_value('key');
11457 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11458 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11459 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11460 if ($uidFichier != null) {
11461 // Récupération du document
11462 $file = $this->f->storage->get($uidFichier);
11463
11464 // Headers
11465 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11466 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11467 header("Content-Type: ".$file['metadata']['mimetype']);
11468 header("Accept-Ranges: bytes");
11469 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11470 // Affichage du document
11471 echo $file['file_content'];
11472
11473 // Récupération de la date de premier accès et maj du suivi uniquement
11474 // si la date de 1er accès n'a pas encore été remplis
11475 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11476 if ($inst_notif->getVal('date_premier_acces') == null ||
11477 $inst_notif->getVal('date_premier_acces') == '') {
11478 $notif_val = array();
11479 foreach ($inst_notif->champs as $champ) {
11480 $notif_val[$champ] = $inst_notif->getVal($champ);
11481 }
11482 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11483 $notif_val['statut'] = 'vu';
11484 $notif_val['commentaire'] = 'Le document a été vu';
11485 $suivi_notif = $inst_notif->modifier($notif_val);
11486 }
11487
11488 } else {
11489 // Page vide 404
11490 printf('Ressource inexistante');
11491 header('HTTP/1.0 404 Not Found');
11492 }
11493 }
11494
11495 /**
11496 * Récupère le titre du document envoyé au parapheur
11497 */
11498 protected function getDocumentTitre($champ = null) {
11499 $title = $this->getTitle();
11500 $dossier = $this->getDossier();
11501 return $dossier.' '.$title;
11502 }
11503
11504 /**
11505 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11506 * l'overlay de notification des demandeurs.
11507 */
11508 function getSubFormTitle($ent) {
11509 $actionSansPath = array('411', '420', '430');
11510 if (in_array($this->getParameter('maj'), $actionSansPath)) {
11511 return '';
11512 }
11513 return parent::getSubFormTitle($ent);
11514 }
11515
11516 /**
11517 * Traitement de la notification automatique des tiers consulté.
11518 *
11519 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11520 * récupérées ajoute une notification et une tâche de notification par mail.
11521 * La création de la tâche de notification par mail déclenchera l'envoi du mail
11522 * et la mise à jour du suivi.
11523 *
11524 * Les tiers notifiables sont ceux :
11525 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11526 * - ayant une habilitation dont le type est listé dans les paramètres de
11527 * notification de l’événement,
11528 * - intervenant sur la commune ou le département du dossier
11529 * - ayant au moins une adresse mail valide
11530 *
11531 * @param evenement instance de l'événement associée à l'instruction
11532 * @param dossier instance du dossier de l'instruction
11533 * @return boolean indique si le traitement à réussi
11534 */
11535 public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11536 // Récupération de l'identifiant plat'au du service consultant
11537 $consultationEntrante = $dossier->get_inst_consultation_entrante();
11538 // Récupération de la liste des types d'habilitations autorisées pour
11539 // cette notification
11540 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11541 // Récupération du département et de la commune du dossier
11542 $commune = $dossier->getVal('commune');
11543 // Le département est récupéré à partir de la commune du dossier donc si la
11544 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11545 $idDepartement = null;
11546 if (! empty($commune)) {
11547 $departement = $dossier->get_inst_departement_dossier();
11548 $idDepartement = $departement->getVal($departement->clePrimaire);
11549 }
11550 // Récupération des courriels des tiers notifiables
11551 $tiersANotifier = $this->get_courriels_tiers_notifiable(
11552 $typesHabilitationsNotifiable,
11553 $consultationEntrante->getVal('service_consultant_id'),
11554 $commune,
11555 $idDepartement
11556 );
11557 // Traitement de chacune des listes de diffusion pour extraire les
11558 // courriels, vérifier la validité des courriels et envoyer la
11559 // notification
11560 $notificationSend = false;
11561 if (empty($tiersANotifier)) {
11562 $this->addToLog(
11563 sprintf(
11564 '%s() : %s %s : %s',
11565 __METHOD__,
11566 __("La récupération des tiers à échoué."),
11567 __('Paramétrage'),
11568 var_export(
11569 array(
11570 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11571 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11572 'id_commune' => $commune,
11573 'id_departement' => $idDepartement
11574 ),
11575 true
11576 )
11577 ),
11578 DEBUG_MODE
11579 );
11580 return false;
11581 }
11582 foreach($tiersANotifier as $tierANotifier) {
11583 // Découpe la liste de diffusion pour stocker les adresses mails
11584 // des tiers dans un tableau
11585 $courriels =
11586 array_filter(
11587 array_map(
11588 'trim',
11589 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11590
11591 foreach ($courriels as $courriel) {
11592 // Pour chaque adresse mail vérifie si l'adresse est valide
11593 if (! $this->f->checkValidEmailAddress($courriel)) {
11594 continue;
11595 }
11596 $destinataire = array(
11597 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11598 'courriel' => $courriel
11599 );
11600 // Si l'adresse est valide ajoute une nouvelle notification
11601 // et une tâche d'envoi de mails
11602 $idNotif = $this->ajouter_notification(
11603 $this->getVal($this->clePrimaire),
11604 $this->f->get_connected_user_login_name(),
11605 $destinataire,
11606 $this->get_dossier_instruction_om_collectivite(),
11607 array(),
11608 true
11609 );
11610 if ($idNotif === false) {
11611 $this->addToLog(
11612 __METHOD__.
11613 __("L'ajout de la notification a échoué."),
11614 DEBUG_MODE
11615 );
11616 return false;
11617 }
11618 // Création de la tache en lui donnant l'id de la notification
11619 $notification_by_task = $this->notification_by_task(
11620 $idNotif,
11621 $dossier->getVal('dossier'),
11622 'mail',
11623 'notification_tiers_consulte'
11624 );
11625 if ($notification_by_task === false) {
11626 $this->addToLog(
11627 __METHOD__.
11628 __("L'ajout de la tâche de notification a échoué."),
11629 DEBUG_MODE
11630 );
11631 $this->addToMessage(
11632 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11633 );
11634 return false;
11635 }
11636 $notificationSend = true;
11637 }
11638 }
11639 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11640 // valide, affiche un message dans les logs pour avoir un suivi.
11641 if (! $notificationSend) {
11642 $this->addToLog(
11643 sprintf(
11644 '%s %s : %s %s : %s',
11645 __METHOD__,
11646 __("Il n'y a pas de tiers notifiable pour l'instruction"),
11647 $evenement->getVal('libelle'),
11648 __("du dossier"),
11649 $this->getVal('dossier')
11650 ),
11651 DEBUG_MODE
11652 );
11653 }
11654 return true;
11655 }
11656
11657 /**
11658 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11659 * respectant les conditions suvantes :
11660 * - le tiers consulté dois accepté les notifications
11661 * - la liste de diffusion ne dois pas être vide
11662 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11663 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11664 * du tiers
11665 * - le type d'habilitation des tiers dois appartenir à la liste
11666 * fournie en paramètre
11667 * - le tiers dois être associé à la commune ou au département passé
11668 * en paramètre
11669 *
11670 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11671 * pouvant être notifiée
11672 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11673 * @param integer $commune identifiant de la commune du dossier
11674 * @param integer $departement identifiant du département du dossier
11675 *
11676 * @return array listes de diffusion des tiers notifiable
11677 */
11678 public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11679 // Si paramètre non renseigné alors ne renvoie rien
11680 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11681 return false;
11682 }
11683 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11684 $filtreServiceConsulteDI = '';
11685 if (! empty($idPlatau)) {
11686 $filtreServiceConsulteDI = sprintf(
11687 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11688 -- en charge du dossier
11689 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11690 OR tiers_consulte.uid_platau_acteur IS NULL)",
11691 $this->f->db->escapeSimple($idPlatau)
11692 );
11693 }
11694 $rst = $this->f->get_all_results_from_db_query(
11695 sprintf(
11696 'SELECT
11697 -- Tiers notifiables lié à la commune du dossier
11698 tiers_consulte.liste_diffusion,
11699 tiers_consulte.libelle
11700 FROM
11701 %1$shabilitation_tiers_consulte
11702 LEFT JOIN %1$stiers_consulte
11703 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11704 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11705 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11706 -- Conservation uniquement des tiers acteur de dossiers
11707 JOIN %1$slien_dossier_tiers
11708 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11709 WHERE
11710 tiers_consulte.accepte_notification_email IS TRUE
11711 AND tiers_consulte.liste_diffusion IS NOT NULL
11712 %3$s
11713 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11714 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11715 -- Filtre sur les tiers acteur du dossier
11716 AND lien_dossier_tiers.dossier = \'%6$s\'
11717 UNION
11718 SELECT
11719 -- Tiers notifiables lié au département du dossier
11720 tiers_consulte.liste_diffusion,
11721 tiers_consulte.libelle
11722 FROM
11723 %1$shabilitation_tiers_consulte
11724 LEFT JOIN %1$stiers_consulte
11725 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11726 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11727 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11728 -- Conservation uniquement des tiers acteur de dossiers
11729 JOIN %1$slien_dossier_tiers
11730 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11731 WHERE
11732 tiers_consulte.accepte_notification_email IS TRUE
11733 AND tiers_consulte.liste_diffusion IS NOT NULL
11734 %3$s
11735 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11736 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11737 -- Filtre sur les tiers acteur du dossier
11738 AND lien_dossier_tiers.dossier = \'%6$s\'',
11739 DB_PREFIXE,
11740 implode(', ', $typesHabilitations),
11741 $filtreServiceConsulteDI,
11742 intval($commune),
11743 intval($departement),
11744 $this->f->db->escapeSimple($this->getVal('dossier'))
11745 ),
11746 array(
11747 "origin" => __METHOD__
11748 )
11749 );
11750 // Faire un order by sur un union ne fonctionne pas. A la place
11751 // c'est le tableau des résultats qui est ordonné.
11752 usort($rst['result'], function($a, $b) {
11753 return strcmp($a['libelle'], $b['libelle']);
11754 });
11755 return $rst['result'];
11756 }
11757
11758 /**
11759 * Gestion spécifique de l'affichage des documents dans le tableau des
11760 * documents d'instruction.
11761 * Prend en compte qu'une instruction peut également avoir un document lié
11762 * dans la table storage.
11763 *
11764 * @return void
11765 */
11766 public function view_telecharger_editions() {
11767 // Récupère l'identifiant du document dans l'URL appelant l'action
11768 $idx = $this->f->get_submitted_get_value('idx');
11769 $obj = $this->table;
11770 $champ = 'om_fichier_instruction';
11771 // Cas d'un document historisé (dans la table storage)
11772 if (strpos($idx, 'STORAGE_') !== false) {
11773 $idx = substr($idx, 8);
11774 $obj = 'storage';
11775 $champ = 'uid';
11776 }
11777 // Ouvre le document
11778 $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11779 header("Location: ".$lien);
11780 }
11781 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26