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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 18407 - (show annotations)
Thu Aug 8 16:18:08 2024 UTC (3 months, 3 weeks ago) by softime
File size: 510421 byte(s)
chore(branch): fusion de la branche d'intégration 6.6.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_sended_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_sended_to_cl
1586 *
1587 * Vérifie que le contrôle de légalité est disponible
1588 *
1589 * @return boolean
1590 */
1591 function can_be_sended_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] != "" AND !$this->f->user_is_admin) {
2238 // si l'utilisateur n'est pas un admin
2239 if($this->getVal($champ) != "" AND $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 * Calcul des règle d'action selon leur type.
3086 *
3087 * Types de règle :
3088 * - date
3089 * - numeric
3090 * - text
3091 * - bool
3092 * - specific
3093 * - technical_data
3094 *
3095 * @param string $rule Règle d'action.
3096 * @param string $rule_name Nom de la règle.
3097 * @param string $type Type de la règle.
3098 *
3099 * @return mixed Résultat de la règle
3100 */
3101 public function regle($rule, $rule_name, $type = null) {
3102
3103 // Supprime tous les espaces de la chaîne de caractère
3104 $rule = str_replace(' ', '', $rule);
3105 // On force les minuscules
3106 $rule = strtolower($rule);
3107 // Coupe la chaîne au niveau de l'opérateur
3108 $operands = explode ("+", $rule);
3109 // Nombre d'opérande
3110 $nb_operands = count($operands);
3111
3112 // Règle à null
3113 if ($rule == "null") {
3114 return null;
3115 }
3116
3117 // Tableau des champs de type date
3118 $rule_type_date = array(
3119 "regle_date_limite",
3120 "regle_date_notification_delai",
3121 "regle_date_complet",
3122 "regle_date_validite",
3123 "regle_date_decision",
3124 "regle_date_chantier",
3125 "regle_date_achevement",
3126 "regle_date_conformite",
3127 "regle_date_rejet",
3128 "regle_date_dernier_depot",
3129 "regle_date_limite_incompletude",
3130 "regle_date_cloture_instruction",
3131 "regle_date_premiere_visite",
3132 "regle_date_derniere_visite",
3133 "regle_date_contradictoire",
3134 "regle_date_retour_contradictoire",
3135 "regle_date_ait",
3136 "regle_date_transmission_parquet",
3137 "regle_date_affichage",
3138 "duree_validite",
3139 "duree_validite_parametrage",
3140 );
3141 // Tableau des champs de type numérique
3142 $rule_type_numeric = array(
3143 );
3144 // Tableau des champs de type text
3145 $rule_type_time_delai = array(
3146 "regle_delai",
3147 "regle_delai_incompletude",
3148 );
3149 // Tableau des champs de type text
3150 $rule_type_text = array(
3151 );
3152 // Tableau des champs de type booléen
3153 $rule_type_bool = array(
3154 "regle_a_qualifier",
3155 "regle_incompletude",
3156 "regle_incomplet_notifie",
3157 "regle_evenement_suivant_tacite_incompletude",
3158 );
3159 // Tableau des champs spécifiques
3160 $rule_type_specific = array(
3161 "regle_autorite_competente",
3162 "regle_etat",
3163 "regle_accord_tacite",
3164 "regle_avis",
3165 "regle_pec_metier",
3166 "regle_etat_pendant_incompletude",
3167 );
3168 // Tableau des champs de données techniques
3169 $rule_type_technical_data = array(
3170 'regle_donnees_techniques1',
3171 'regle_donnees_techniques2',
3172 'regle_donnees_techniques3',
3173 'regle_donnees_techniques4',
3174 'regle_donnees_techniques5',
3175 );
3176 // Tableau des champs simple
3177 $rule_type_simple = array(
3178 "regle_dossier_instruction_type",
3179 );
3180
3181 // Définit le type du champ
3182 if (in_array($rule_name, $rule_type_date) == true) {
3183 $type = "date";
3184 }
3185 if (in_array($rule_name, $rule_type_numeric) == true) {
3186 $type = "numeric";
3187 }
3188 if (in_array($rule_name, $rule_type_text) === true) {
3189 $type = "text";
3190 }
3191 if (in_array($rule_name, $rule_type_bool) === true) {
3192 $type = "bool";
3193 }
3194 if (in_array($rule_name, $rule_type_specific) === true) {
3195 $type = "specific";
3196 }
3197 if (in_array($rule_name, $rule_type_technical_data) === true) {
3198 $type = 'technical_text';
3199 }
3200 if (in_array($rule_name, $rule_type_simple) === true) {
3201 $type = 'simple';
3202 }
3203 if (in_array($rule_name, $rule_type_time_delai) === true) {
3204 $type = "time_delai";
3205 }
3206
3207 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3208 // Récupère directement la valeur de l'opérande
3209 if ($type === 'specific') {
3210 //
3211 return $this->get_value_for_rule($rule);
3212 }
3213
3214 // Initialisation des variables
3215 $total_numeric = 0;
3216 $res_text = '';
3217 $final_date = null;
3218
3219 // Pour chaque opérande
3220 foreach ($operands as $key => $operand) {
3221 // Si c'est une règle de type date
3222 if ($type == 'date') {
3223 if (is_numeric($operand) === false){
3224 $rule_value = $this->get_value_for_rule($operand);
3225 if (
3226 $rule_value !== null
3227 && (
3228 strpos($operand, 'mois') !== false
3229 || strpos($operand, 'jour') !== false
3230 )
3231 ){
3232 $rule_value = $operand;
3233 }
3234 if ($rule_value !== null){
3235 // Vérifie si l'opérande est une date
3236 if ($this->f->check_date($rule_value) == true) {
3237 // Affecte la date
3238 $final_date = $rule_value;
3239 }else{
3240 // Gère les opérandes
3241 preg_match_all('/(\d+) *([a-zA-Z]*)/', $rule_value, $matches, PREG_OFFSET_CAPTURE);
3242
3243 // Ajoute l'opérande au total
3244 foreach ($matches[1] as $matche_key => $matche_value) {
3245 $timelength = $matches[1][$matche_key][0];
3246 $timetype = 'mois';
3247 if ( $matches[2][$matche_key][0] != ''){
3248 $timetype = $matches[2][$matche_key][0];
3249 }
3250 // Ajout au calcul de la date
3251 $final_date = $this->f->mois_date(
3252 $final_date,
3253 $timelength,
3254 "+",
3255 $timetype
3256 );
3257 }
3258 }
3259 }
3260 }
3261 // Les autres opérandes doivent être que des numériques
3262 if (is_numeric($operand) == true) {
3263 // Ajoute l'opérande au total
3264 // Ajout au calcul de la date
3265 $final_date = $this->f->mois_date($final_date,
3266 $operand, "+");
3267 }
3268 }
3269
3270 // Si c'est une règle de type numérique
3271 if ($type == 'numeric') {
3272 // Les opérandes doivent être que des numériques
3273 if (is_numeric($operand) == true) {
3274 // Ajoute l'opérande au total
3275 $total_numeric += $operand;
3276 }
3277 if (is_numeric($operand) === false
3278 && $this->get_value_for_rule($operand) !== null
3279 && is_numeric($this->get_value_for_rule($operand)) == true) {
3280 // Ajoute l'opérande au total
3281 $total_numeric += $this->get_value_for_rule($operand);
3282 }
3283 }
3284
3285 // Si c'est une règle de type text
3286 if ($type === 'text' || $type === 'technical_text') {
3287 // Concatène toutes les chaînes de caractère
3288 $res_text .= $this->get_value_for_rule($operand);
3289 }
3290
3291 // Si c'est une règle de type time_delai
3292 if ($type === 'time_delai') {
3293 $rule_value = $this->get_value_for_rule($operand);
3294 if ( strlen($res_text) != 0) {
3295 $res_text .= "+";
3296 }
3297 if ($rule_value != null && $rule_value != ''){
3298 // Supprime tous les espaces de la chaîne de caractère
3299 // Concatène toutes les chaînes de caractère
3300 $res_text .= $rule_value;
3301 } else {
3302 $res_text .= $operand;
3303 }
3304 }
3305
3306 }
3307
3308 // Résultat pour une règle de type date
3309 if ($type == 'date') {
3310 // Retourne la date
3311 return $final_date;
3312 }
3313
3314 // Résultat pour une règle de type numérique
3315 if ($type == 'numeric') {
3316 // Retourne le calcul
3317 return $total_numeric;
3318 }
3319
3320 // Résultat pour une règle de type text
3321 if (in_array($type, array('text', 'technical_text')) === true) {
3322 // Retourne la chaîne de caractère
3323 return $res_text;
3324 }
3325
3326 // Résultat pour une règle de type text
3327 if (in_array($type, array('time_delai')) === true) {
3328 // Traitement de la valeur à afficher
3329 $res_text = str_replace(' ', '', $res_text);
3330 $res_text = preg_replace('/(\d+)/', '$1 ', $res_text);
3331 $res_text = preg_replace('/(\+)/', ' $1 ', $res_text);
3332 $res_text = trim(preg_replace('/\s\s+/', ' ', strtolower($res_text)));
3333 return $res_text;
3334 }
3335
3336 if ($type === 'simple' || $type === 'bool') {
3337 // Retourne la valeur du champs rule
3338 return $rule;
3339 }
3340 }
3341
3342
3343 /**
3344 * Récupère la valeur du champs dans l'instruction ou dans les données
3345 * techniques.
3346 * Spécifique au calcul des règles.
3347 *
3348 * @param string $field Champ
3349 *
3350 * @return mixed Valeur du champ
3351 */
3352 private function get_value_for_rule($field) {
3353 // Si le champ n'existe pas dans la table instruction
3354 if (array_key_exists($field, $this->valF) === false) {
3355 // Récupère l'instance de la classe donnees_techniques
3356 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3357 // Retourne la valeur de la donnée technique
3358 return $inst_donnees_techniques->getVal($field);
3359 }
3360
3361 //
3362 return $this->valF[$field];
3363 }
3364
3365
3366 /**
3367 * Cette méthode permet de générer le nom de fichier lors de la génération du PDF
3368 * (Édition et finalisation) en fonction de l'existence ou non du type de document.
3369 *
3370 * 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é
3371 * sinon on utilise l'id de la lettretype en lien avec l'évènement.
3372 *
3373 * @return string : le nom du fichier générer
3374 */
3375 function determinate_name_doc_pdf(){
3376 $id_DI = $this->getVal("dossier");
3377 $date = date('Ymd');
3378 $data = "";
3379
3380 // Récupération de l'id de la lettre type associée à l'instruction
3381 $data = $this->getVal("lettretype");
3382
3383 // Récupération de l'id de l'instruction
3384 $id_instr = $this->getVal("instruction");
3385
3386 // Si il existe un type de document associé à l'instruction, on le prend à la place de l'id de la lettretype
3387 if(!empty($this->get_type_document_linked_with_instruction())){
3388 $data = strtolower(str_replace(" ", "-", $this->get_type_document_linked_with_instruction()));
3389 }
3390
3391 // On retourne le nom du fichier généré
3392 return $this->f->normalize_string(
3393 sprintf(
3394 "%s_%s_%s_%s",
3395 $id_DI,
3396 $id_instr,
3397 $date,
3398 $data
3399 )
3400 );
3401 }
3402
3403
3404 /**
3405 * [get_inst_donnees_techniques description]
3406 *
3407 * @param [type] $donnees_techniques [description]
3408 *
3409 * @return [type] [description]
3410 */
3411 function get_inst_donnees_techniques($donnees_techniques = null) {
3412 //
3413 if (isset($this->inst_donnees_techniques) === false or
3414 $this->inst_donnees_techniques === null) {
3415 //
3416 if (is_null($donnees_techniques)) {
3417 $donnees_techniques = $this->getDonneesTechniques();
3418 }
3419 //
3420 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3421 "obj" => "donnees_techniques",
3422 "idx" => $donnees_techniques,
3423 ));
3424 }
3425 //
3426 return $this->inst_donnees_techniques;
3427 }
3428
3429
3430 /**
3431 * Retourne l'identifiant des données techniques liées du dossier
3432 * @return string L'identifiant des données techniques liées du dossier
3433 */
3434 function getDonneesTechniques() {
3435
3436 $qres = $this->f->get_one_result_from_db_query(
3437 sprintf(
3438 'SELECT
3439 donnees_techniques
3440 FROM
3441 %1$sdonnees_techniques
3442 WHERE
3443 dossier_instruction = \'%2$s\'',
3444 DB_PREFIXE,
3445 $this->f->db->escapeSimple($this->valF["dossier"])
3446 ),
3447 array(
3448 "origin" => __METHOD__,
3449 )
3450 );
3451
3452 return $qres['result'];
3453 }
3454
3455 /**
3456 * TRIGGER - triggerajouterapres.
3457 *
3458 * - Mise à jour des informations liées au workflow sur le dossier
3459 * - Interface avec le référentiel ERP [105][111]
3460 * - Mise à jour du DA
3461 * - Historisation de la vie du DI
3462 *
3463 * @return boolean
3464 */
3465 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3466 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3467
3468 $parent_res = parent::triggerajouterapres($id, $dnu1, $val);
3469 if ($parent_res === false) return $parent_res;
3470
3471 $data = array('val' => &$val, 'id' => $id, 'parent_res' => &$parent_res);
3472 $this->f->module_manager->run_hooks('triggerajouterapres_override_pre', $this, $data);
3473
3474 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3475 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3476 // Instance de la classe evenement
3477 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3478 // Instance de l'état courant du dossier d'instruction
3479 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3480 "obj" => "etat",
3481 "idx" => $inst_di->get_id_etat(),
3482 ));
3483
3484 /**
3485 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3486 * par l'action
3487 */
3488 // état de complétude actuel du dossier
3489 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3490 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3491 $ev_suiv_tacite_incompletude = false;
3492 // Initialisation
3493 $valF = array();
3494 $valF_dt = array();
3495 //
3496 // Récupération des paramètres de l'action
3497 // TODO : remplacer cette requête par l'instanciation de l'action
3498 $qres = $this->f->get_all_results_from_db_query(
3499 sprintf(
3500 'SELECT
3501 *
3502 FROM
3503 %1$saction
3504 WHERE
3505 action = \'%2$s\'',
3506 DB_PREFIXE,
3507 $this->f->db->escapeSimple($this->valF['action'])
3508 ),
3509 array(
3510 "origin" => __METHOD__
3511 )
3512 );
3513 foreach ($qres['result'] as $row) {
3514
3515 // pour chacune des regles, on applique la regle
3516 if ($row['regle_delai'] != '') {
3517 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3518 }
3519 if ($row['regle_accord_tacite'] != '') {
3520 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3521 }
3522 if ($row['regle_avis'] != '') {
3523 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3524 }
3525 if ($row['regle_date_limite'] != '') {
3526 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3527 }
3528 if ($row['regle_date_complet'] != '') {
3529 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3530 }
3531 if ($row['regle_date_dernier_depot'] != '') {
3532 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3533 }
3534 if ($row['regle_date_notification_delai'] != '') {
3535 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3536 }
3537 if ($row['regle_date_decision'] != '') {
3538 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3539 }
3540 if ($row['regle_date_rejet'] != '') {
3541 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3542 }
3543 if ($row['regle_date_validite'] != '') {
3544 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3545 }
3546 if ($row['regle_date_chantier'] != '') {
3547 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3548 }
3549 if ($row['regle_date_achevement'] != '') {
3550 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3551 }
3552 if ($row['regle_date_conformite'] != '') {
3553 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3554 }
3555 if ($row['regle_date_limite_incompletude'] != '') {
3556 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3557 }
3558 if ($row['regle_delai_incompletude'] != '') {
3559 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3560 }
3561 if ($row['regle_autorite_competente'] != '') {
3562 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3563 }
3564 if ($row['regle_etat'] != '') {
3565 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3566 }
3567 if ($row['regle_date_cloture_instruction'] !== '') {
3568 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3569 }
3570 if ($row['regle_date_premiere_visite'] !== '') {
3571 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3572 }
3573 if ($row['regle_date_derniere_visite'] !== '') {
3574 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3575 }
3576 if ($row['regle_date_contradictoire'] !== '') {
3577 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3578 }
3579 if ($row['regle_date_retour_contradictoire'] !== '') {
3580 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3581 }
3582 if ($row['regle_date_ait'] !== '') {
3583 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3584 }
3585 if ($row['regle_donnees_techniques1'] !== '') {
3586 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3587 }
3588 if ($row['regle_donnees_techniques2'] !== '') {
3589 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3590 }
3591 if ($row['regle_donnees_techniques3'] !== '') {
3592 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3593 }
3594 if ($row['regle_donnees_techniques4'] !== '') {
3595 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3596 }
3597 if ($row['regle_donnees_techniques5'] !== '') {
3598 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3599 }
3600 if ($row['regle_date_transmission_parquet'] !== '') {
3601 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3602 }
3603 if ($row['regle_dossier_instruction_type'] !== '') {
3604 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3605 }
3606 // La date d'affichage est modifiée seulement si le champ n'est pas
3607 // renseigné
3608 if ($row['regle_date_affichage'] !== ''
3609 && ($inst_di->getVal('date_affichage') === ''
3610 || $inst_di->getVal('date_affichage') === null)) {
3611 //
3612 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3613 }
3614 //
3615 if ($row['regle_pec_metier'] != '') {
3616 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3617 }
3618 if ($row['regle_a_qualifier'] != '') {
3619 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3620 }
3621 //
3622 if ($row['regle_incompletude'] != '') {
3623 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3624 }
3625 if ($row['regle_incomplet_notifie'] != '') {
3626 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3627 }
3628 if ($row['regle_etat_pendant_incompletude'] != '') {
3629 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3630 }
3631 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3632 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3633 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3634 $ev_suiv_tacite_incompletude = true;
3635 }
3636 }
3637 }
3638
3639 // Si l'événement a un événement suivant tacite
3640 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3641 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3642 // pas associé de le même façon au dossier d'instruction
3643 if ($ev_suiv_tacite_incompletude === false) {
3644 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3645 }
3646 if ($ev_suiv_tacite_incompletude === true) {
3647 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3648 }
3649 }
3650 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3651 if (count($valF_dt) > 0) {
3652 $dt_id = $this->getDonneesTechniques();
3653 // On met à jour le dossier
3654 $cle = " donnees_techniques='".$dt_id."'";
3655 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3656 $this->addToLog(
3657 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3658 VERBOSE_MODE
3659 );
3660 $this->f->isDatabaseError($res1);
3661 // Affichage d'informations à l'utilisateur
3662 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3663 }
3664 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3665 if (count($valF) > 0) {
3666 //
3667 $inst_dossier = $this->f->get_inst__om_dbform(array(
3668 "obj" => "dossier",
3669 "idx" => $this->valF['dossier'],
3670 ));
3671 $valF['instruction'] = $id;
3672 $valF['crud'] = 'create';
3673 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3674 if ($update_by_instruction === false) {
3675 $this->cleanMessage();
3676 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3677 return false;
3678 }
3679 // Affichage d'informations à l'utilisateur
3680 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3681 }
3682
3683 /**
3684 * Interface avec le référentiel ERP.
3685 *
3686 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3687 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3688 * Déclencheur :
3689 * - L'option ERP est activée
3690 * - Le dossier est marqué comme "connecté au référentiel ERP"
3691 * - Le dossier est de type PC
3692 * - Le formulaire d'ajout d'un événement d'instruction est validé
3693 * avec un événement pour lequel les services ERP doivent être
3694 * informé
3695 */
3696 //
3697 if ($this->f->is_option_referentiel_erp_enabled() === true
3698 && $inst_di->is_connected_to_referentiel_erp() === true
3699 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3700 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3701 //
3702 $infos = array(
3703 "dossier_instruction" => $this->valF['dossier'],
3704 "decision" => $inst_evenement->getVal("libelle"),
3705 );
3706 //
3707 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3708 if ($ret !== true) {
3709 $this->cleanMessage();
3710 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3711 return false;
3712 }
3713 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3714 }
3715
3716 // Si le mode en rédaction intégrale est activé
3717 if (isset($this->valF['flag_edition_integrale']) === true
3718 && $this->valF['flag_edition_integrale'] === true) {
3719 $redactionIntegraleValF = array();
3720
3721 // Récupère la collectivite du dossier d'instruction
3722 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3723 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3724 // Récupère le corps de la lettre type
3725 $params = array(
3726 "specific" => array(
3727 "corps" => array(
3728 "mode" => "get",
3729 )
3730 ),
3731 );
3732 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3733 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3734 // Récupère le titre de la lettre type
3735 $params = array(
3736 "specific" => array(
3737 "titre" => array(
3738 "mode" => "get",
3739 )
3740 ),
3741 );
3742 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3743 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3744
3745 // mise à jour en base de données
3746 $res = $this->f->db->autoExecute(
3747 DB_PREFIXE.$this->table,
3748 $redactionIntegraleValF,
3749 DB_AUTOQUERY_UPDATE,
3750 $this->clePrimaire."=".$id
3751 );
3752 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3753 if ($this->f->isDatabaseError($res, true) === true) {
3754 return false;
3755 }
3756 }
3757
3758 /**
3759 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3760 */
3761 // Si la finalisation automatique de l'événement est activée
3762 // ET si l'instruction n'a pas déjà été finalisée
3763 // ET s'il existe une lettre type associée
3764 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3765 && $inst_evenement->getVal('om_final_instruction') !== 't'
3766 && $inst_evenement->getVal('lettretype') !== ''
3767 && $inst_evenement->getVal('lettretype') !== null) {
3768
3769 // On instancie l'instruction
3770 $inst_instruction = $this->f->get_inst__om_dbform(array(
3771 "obj" => "instruction",
3772 "idx" => $this->valF[$this->clePrimaire],
3773 ));
3774
3775 // On finalise l'instruction dans le contexte de finalisation : action 100
3776 $inst_instruction->setParameter('maj', 100);
3777 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3778
3779 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3780 // et dans le message d'erreur
3781 if ($finalize === false) {
3782 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3783 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3784 return false;
3785 }
3786 }
3787
3788 /**
3789 * Finalisation automatique des instructions tacites ou retours.
3790 */
3791 // Si l'option de finalisation automatique des instructions tacites ou
3792 // retours est activée et l'événement d'instruction a une lettre type
3793 // associée
3794 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3795 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3796 && $inst_evenement->getVal('lettretype') !== ''
3797 && $inst_evenement->getVal('lettretype') !== null) {
3798
3799 // Rècupère l'identifiant de l'événement
3800 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3801
3802 // Si l'événement d'instruction est identifié comme un événement
3803 // retour
3804 // OU l'événement d'instruction est l'événement suivant tacite du
3805 // dossier d'instruction (incomplétude prise en compte)
3806 // ET l'événement d'instruction n'a pas déjà été finalisé
3807 if (($inst_evenement->getVal("retour") === 't'
3808 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3809 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3810 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3811
3812 // Finalise l'instruction
3813 $inst_instruction = $this->f->get_inst__om_dbform(array(
3814 "obj" => "instruction",
3815 "idx" => $this->valF[$this->clePrimaire],
3816 ));
3817 $inst_instruction->setParameter('maj', 100);
3818 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3819 if ($finalize === false) {
3820 //
3821 return false;
3822 }
3823 }
3824 }
3825
3826 /**
3827 * Mise à jour de la version de clôture *version_clos* du dossier si et
3828 * seulement si l'instruction met à jour l'état du dossier.
3829 */
3830 if (isset($valF['etat']) === true
3831 && $valF['etat'] !== null
3832 && $valF['etat'] !== '') {
3833 // Instanciation de l'état appliqué sur le dossier par l'instruction
3834 $inst_etat = $this->f->get_inst__om_dbform(array(
3835 "obj" => "etat",
3836 "idx" => $valF['etat'],
3837 ));
3838 //
3839 $update_version_clos = null;
3840 // En cas d'instruction qui clôture le dossier
3841 if ($inst_etat->getVal('statut') === 'cloture') {
3842 $update_version_clos = $inst_di->update_version_clos('up');
3843 }
3844 // En cas d'instruction qui rouvre le dossier
3845 if ($inst_current_etat->getVal('statut') === 'cloture'
3846 && $inst_etat->getVal('statut') !== 'cloture') {
3847 //
3848 $update_version_clos = $inst_di->update_version_clos('down');
3849 //
3850 $params = array(
3851 'di_reopened' => true,
3852 );
3853 }
3854 //
3855 if ($update_version_clos === false) {
3856 $this->f->addToLog(sprintf(
3857 "%s() : ERREUR - %s %s",
3858 __METHOD__,
3859 sprintf(
3860 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3861 $inst_di->getVal($inst_di->clePrimaire)
3862 ),
3863 sprintf(
3864 __("L'instruction tente d'appliquer l'état %s."),
3865 $inst_etat->getVal($inst_etat->clePrimaire)
3866 )
3867 ));
3868 $this->addToMessage(sprintf(
3869 "%s %s",
3870 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3871 __("Veuillez contacter votre administrateur.")
3872 ));
3873 return false;
3874 }
3875 }
3876
3877 /**
3878 * Notification automatique
3879 */
3880 // Notification automatique à l'ajout de l'instruction si la notification
3881 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3882 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3883 ($inst_evenement->getVal('lettretype') === null ||
3884 $inst_evenement->getVal('lettretype') === '')) {
3885 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3886 $msgLog = sprintf(
3887 '%s %s : %d',
3888 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3889 __('Instruction notifiée'),
3890 $id
3891 );
3892
3893 // Récupération de la liste des demandeurs à notifier et de la catégorie
3894 $categorie = $this->f->get_param_option_notification($collectivite_di);
3895 $isPortal = $categorie === PORTAL;
3896 $demandeursANotifie = $this->get_demandeurs_notifiable(
3897 $this->valF['dossier'],
3898 $isPortal
3899 );
3900
3901 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3902 $demandeurPrincipalNotifie = false;
3903 foreach ($demandeursANotifie as $demandeur) {
3904 // Identifie si le demandeur principal a été notifié ou pas
3905 // et récupère ses informations
3906 if ($demandeur['petitionnaire_principal'] == 't') {
3907 $demandeurPrincipalNotifie = true;
3908 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3909 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3910 // suivante. On le considère également comme non notifié pour gérer l'envoie
3911 // des messages d'erreurs
3912 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3913 // d'impact sur la notification
3914 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3915 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3916 $demandeurPrincipalNotifie = false;
3917 continue;
3918 }
3919 }
3920 // Ajout de la notif et récupération de son id
3921 $idNotif = $this->ajouter_notification(
3922 $this->valF[$this->clePrimaire],
3923 $this->f->get_connected_user_login_name(),
3924 $demandeur,
3925 $collectivite_di,
3926 array(),
3927 true
3928 );
3929 if ($idNotif === false) {
3930 $this->addToLog(
3931 sprintf('%s() : %s', __METHOD__, $msgLog),
3932 DEBUG_MODE
3933 );
3934 return false;
3935 }
3936 // Création de la tache en lui donnant l'id de la notification
3937 $notification_by_task = $this->notification_by_task(
3938 $idNotif,
3939 $this->valF['dossier'],
3940 $categorie
3941 );
3942 if ($notification_by_task === false) {
3943 $this->addToLog(
3944 sprintf('%s() : %s', __METHOD__, $msgLog),
3945 DEBUG_MODE
3946 );
3947 $this->addToMessage(
3948 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3949 );
3950 return false;
3951 }
3952 }
3953 // Pour la notification par mail ou la notification via portal si le dossier a
3954 // été déposés via portal, si le demandeur principal n'est pas notifiable,
3955 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3956 // laquelle le demandeur principal n'a pas pu être notifié
3957 $depotPortal = $this->dossier_depose_sur_portail();
3958 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3959 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3960 // ' ' permet de mettre un espace entre les 2 msg de log.
3961 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3962 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3963 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3964 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3965 // Ajout de la notif et récupération de son id
3966 $idNotif = $this->ajouter_notification(
3967 $this->valF[$this->clePrimaire],
3968 $this->f->get_connected_user_login_name(),
3969 $demandeurPrincipal,
3970 $collectivite_di,
3971 array(),
3972 true,
3973 'Echec',
3974 implode(' ', $erreursParam)
3975 );
3976 if ($idNotif === false) {
3977 $this->addToLog(
3978 sprintf('%s() : %s', __METHOD__, $msgLog),
3979 DEBUG_MODE
3980 );
3981 $this->addToMessage(
3982 __('Erreur : la création de la notification a échouée.').
3983 __("Veuillez contacter votre administrateur.")
3984 );
3985 return false;
3986 }
3987 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3988 // de l'échec de la notification
3989 $dossier_message = $this->get_inst_dossier_message(0);
3990 $dossier_message_val = array(
3991 'dossier' => $val['dossier'],
3992 'type' => _('erreur expedition'),
3993 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3994 'login' => $_SESSION['login'],
3995 'date_emission' => date('Y-m-d H:i:s'),
3996 'contenu' => _('Échec lors de la notification de l\'instruction ').
3997 $inst_evenement->getVal('libelle').
3998 '.<br>'.
3999 implode("\n", $erreursParam).
4000 '<br>'.
4001 _('Veuillez corriger ces informations avant de renvoyer la notification.')
4002 );
4003 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4004 // Si une erreur se produit pendant l'ajout
4005 if ($add !== true) {
4006 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4007 return false;
4008 }
4009 }
4010 $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.")));
4011 }
4012
4013 // Notification automatique en cas de dépôt de dossier dématérialisé
4014 // Vérifie si l'option de notification est active et si il s'agit bien d'une
4015 // instruction de récépissé
4016 if (
4017 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
4018 && $this->is_instruction_recepisse()
4019 ) {
4020 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4021 $msgLog = sprintf(
4022 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
4023 $val['dossier']
4024 );
4025 // Récupère l'instance de la demande
4026 $demande = $inst_di->get_inst_demande();
4027 // Vérifie que le dossier a été déposé via platau ou portal
4028 if (
4029 ($demande->getVal('source_depot') == PLATAU ||
4030 $demande->getVal('source_depot') == PORTAL)
4031 ) {
4032 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
4033 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
4034 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
4035 if (empty($listeEmails)) {
4036 $this->addToLog(
4037 sprintf(
4038 '%s(): %s %s',
4039 __METHOD__,
4040 $msgLog,
4041 __('Aucun courriel paramétré.')
4042 ),
4043 DEBUG_MODE
4044 );
4045 } else {
4046 foreach ($listeEmails as $email) {
4047 // Ajout de la notif et récupération de son id
4048 $destinataire = array(
4049 'destinataire' => $email,
4050 'courriel' => $email
4051 );
4052 $idNotif = $this->ajouter_notification(
4053 $this->valF[$this->clePrimaire],
4054 $this->f->get_connected_user_login_name(),
4055 $destinataire,
4056 $collectivite_di,
4057 array(),
4058 true
4059 );
4060 if ($idNotif === false) {
4061 $this->addToLog(
4062 sprintf('%s(): %s', __METHOD__, $msgLog),
4063 DEBUG_MODE
4064 );
4065 return false;
4066 }
4067 // Création de la tache en lui donnant l'id de la notification
4068 $notification_by_task = $this->notification_by_task(
4069 $idNotif,
4070 $this->valF['dossier'],
4071 'mail',
4072 'notification_depot_demat'
4073 );
4074 if ($notification_by_task === false) {
4075 $this->addToMessage(
4076 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
4077 );
4078 $this->addToLog(
4079 sprintf('%s(): %s', __METHOD__, $msgLog),
4080 DEBUG_MODE
4081 );
4082 return false;
4083 }
4084 }
4085 }
4086 }
4087 }
4088
4089 /**
4090 * Mise à jour de la date de dernière modification du dossier
4091 */
4092 $inst_di->update_last_modification_date();
4093
4094 /**
4095 * Mise à jour des données du DA.
4096 */
4097 $inst_da = $inst_di->get_inst_dossier_autorisation();
4098 $params['di_id'] = $this->valF['dossier'];
4099 if ($inst_da->majDossierAutorisation($params) === false) {
4100 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4101 $this->correct = false;
4102 return false;
4103 }
4104
4105 /**
4106 * Historisation de la vie du DI.
4107 */
4108
4109 $res = $this->add_log_to_dossier($id, array_merge($val, $this->valF));
4110
4111 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
4112 $this->f->module_manager->run_hooks('triggerajouterapres_override_post', $this, $data);
4113 return $res;
4114 }
4115
4116 /**
4117 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
4118 * sont remplies.
4119 * Les conditions vérifiées sont les suivantes :
4120 * - L'option de notification *option_notification* doit être définie
4121 * - Le petitionnaire principal doit accepter les notifications
4122 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
4123 * - Le pétitionnaire principal doit avoir une adresse mail correcte
4124 * Pour chaque vérification effectué un message d'erreur est ajouté si la
4125 * condition n'est pas remplie.
4126 * Renvoie le message d'erreur en sortie.
4127 *
4128 * @param string identifiant du dossier sur lequel les notifications ont échouée
4129 * @return string
4130 */
4131 public function get_info_notification_fail($dossier = null) {
4132 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
4133 // utilise celui associé à l'instruction
4134 if ($dossier == null) {
4135 $dossier = $this->getVal('dossier');
4136 }
4137 // Tableau contenant la liste des messages d'erreur
4138 $errorMessage = array();
4139 // Récupère l'option de notification
4140 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4141 $option_notification = $this->f->get_param_option_notification($collectivite_di);
4142 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
4143 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
4144 }
4145 // Récupère les informations du demandeurs principal
4146 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
4147 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
4148 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
4149 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
4150 }
4151 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
4152 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
4153 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
4154 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
4155 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
4156 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
4157 $infoPetitionnaire['courriel'].
4158 '.';
4159 }
4160 } else {
4161 // Si le courriel du pétitionnaire principal
4162 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
4163 }
4164
4165 return $errorMessage;
4166 }
4167
4168 /**
4169 * Méthode servant à vérifier si un dossier a été déposé sur
4170 * le portail citoyen ou pas.
4171 * La verification se fait via une requête sql dans laquelle
4172 * on va chercher un dossier ayant pour id l'identifiant de
4173 * dossier associé à l'instruction et pour lequel la demande
4174 * associée la plus ancienne est une demande de création de
4175 * dossier via portail
4176 *
4177 * @param string identifiant du dossier. Si non renseigné c'est le dossier
4178 * associé à l'instruction qui est utilisé
4179 * @return boolean|void true : dossier déposé via portail, false : dossier
4180 * non déposé via portail et null : erreur de base de données.
4181 */
4182 protected function dossier_depose_sur_portail($dossier = null) {
4183 if (empty($dossier)) {
4184 $dossier = $this->getVal('dossier');
4185 }
4186 $qres = $this->f->get_one_result_from_db_query(
4187 sprintf(
4188 'SELECT
4189 dossier
4190 FROM
4191 %1$sdossier
4192 -- Récuperation de la première demande associée au dossier
4193 LEFT JOIN (
4194 SELECT
4195 demande,
4196 dossier_instruction,
4197 source_depot
4198 FROM
4199 %1$sdemande
4200 WHERE
4201 dossier_instruction = \'%2$s\'
4202 ORDER BY
4203 demande ASC
4204 LIMIT 1
4205 ) AS demande
4206 ON dossier.dossier = demande.dossier_instruction
4207 WHERE
4208 dossier.dossier = \'%2$s\'
4209 AND demande.source_depot = \'portal\'',
4210 DB_PREFIXE,
4211 $this->f->db->escapeSimple($dossier)
4212 ),
4213 array(
4214 "origin" => __METHOD__,
4215 "force_return" => true,
4216 )
4217 );
4218 if ($qres["code"] !== "OK") {
4219 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
4220 return;
4221 }
4222 // Si on a un résultat c'est que le dossier a été déposé via le portail
4223 return ! empty($qres["result"]);
4224 }
4225
4226 public function is_service_notifiable() {
4227 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4228
4229 // Si l'instruction a une édition non finalisé quel que soit
4230 // le type de notification, il n'est pas notifiable
4231 if ($this->has_an_edition() === true) {
4232 if ($this->is_unfinalizable_without_bypass() === false) {
4233 return false;
4234 }
4235 }
4236 // Vérifie si la notification des tiers est active pour l'évènement
4237 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
4238 }
4239
4240 public function is_tiers_notifiable() {
4241 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
4242
4243 // Si l'instruction a une édition non finalisé quel que soit
4244 // le type de notification, il n'est pas notifiable
4245 if ($this->has_an_edition() === true) {
4246 if ($this->is_unfinalizable_without_bypass() === false) {
4247 return false;
4248 }
4249 }
4250 // Vérifie si la notification des tiers est active pour l'évènement
4251 return ! empty($evenement->getVal('notification_tiers'));
4252 }
4253
4254 /**
4255 * Méthode permettant de savoir si une instruction peut
4256 * être notifiée manuellement selon les différents types
4257 * de notification.
4258 *
4259 * Si l'instruction a une édition non finalisée alors elle n'est pas
4260 * manuellement notifiable.
4261 * Si l'instruction est associé à un événement de notification pour
4262 * lequel un retour signature est recquis, elle n'est notifiable que
4263 * si la date de retour de signature est remplie.
4264 * Par défaut si le type de notification n'est pas connu alors l'instruction
4265 * n'est pas notifiable.
4266 * Pour tous les autres cas l'instruction est manuellement notifiable.
4267 *
4268 * @return boolean true : notifiable | false : non notifiable
4269 */
4270 public function is_notifiable_by_task_manual() {
4271 $ev = $this->get_inst_evenement($this->getVal('evenement'));
4272
4273 // Si l'instruction a une édition non finalisé quel que soit
4274 // le type de notification, il n'est pas notifiable
4275 if ($this->has_an_edition() === true) {
4276 if ($this->is_unfinalizable_without_bypass() === false) {
4277 return false;
4278 }
4279 }
4280
4281 // Gestion des différents cas selon la valeur du champs notification
4282 if ($ev->getVal('notification') == 'notification_manuelle' ||
4283 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4284 $ev->getVal('notification') == 'notification_automatique'
4285 ) {
4286 return true;
4287 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4288 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4289 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4290 $this->getVal('date_retour_signature') != null &&
4291 $this->getVal('date_retour_signature') != ''
4292 ) {
4293 return true ;
4294 }
4295 return false;
4296 }
4297
4298 /**
4299 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4300 * pour le demandeur principal.
4301 *
4302 * @return boolean true si le traitement à réussi
4303 */
4304 protected function notifier_demandeur_principal_via_portal() {
4305 $this->begin_treatment(__METHOD__);
4306 $message = '';
4307 // Récupération des informations concernant le demandeur
4308 $dossier = $this->getVal('dossier');
4309 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4310 $demandeur = $this->get_demandeurs_notifiable(
4311 $dossier,
4312 true
4313 );
4314 if ($demandeur !== array()) {
4315 $destinataire = array_values($demandeur);
4316 // Ajout de la notif et récupération de son id
4317 $idNotification = $this->ajouter_notification(
4318 $this->getVal($this->clePrimaire),
4319 $this->f->get_connected_user_login_name(),
4320 $destinataire[0],
4321 $collectivite_di,
4322 array(),
4323 true
4324 );
4325 if ($idNotification === false) {
4326 return $this->end_treatment(__METHOD__, false);
4327 }
4328 // Création de la tâche en lui donnant l'id de la notification
4329 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4330 if ($notification_by_task === false) {
4331 $this->addToMessage(
4332 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4333 );
4334 return $this->end_treatment(__METHOD__, false);
4335 }
4336 $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.")));
4337 return $this->end_treatment(__METHOD__, true);
4338 }
4339 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4340 return $this->end_treatment(__METHOD__, false);
4341 }
4342
4343 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4344 // Si le type n'est pas correctement spécifié, alors il est calculé
4345 if ($type !== 'notification_recepisse'
4346 && $type !== 'notification_instruction'
4347 && $type !== 'notification_decision'
4348 && $type !== 'notification_service_consulte'
4349 && $type !== 'notification_tiers_consulte'
4350 && $type !== 'notification_depot_demat'
4351 && $type !== 'notification_commune'
4352 && $type !== 'notification_signataire') {
4353 //
4354 $type = 'notification_instruction';
4355 // Vérifie si l'instruction est un récépissé
4356 if ($this->is_instruction_recepisse()) {
4357 $type = 'notification_recepisse';
4358
4359 }
4360 // Vérifie si l'instruction est une décision
4361 if ($type !== 'notification_recepisse') {
4362 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4363 if ($avis_decision !== null && $avis_decision !== '') {
4364 $type = 'notification_decision';
4365 }
4366 }
4367 }
4368 // Préparation des valeurs de la tâche
4369 $task_val = array(
4370 'type' => $type,
4371 'object_id' => $object_id,
4372 'dossier' => $dossier,
4373 'category' => $category,
4374 );
4375 // Préparation de la tache de notification
4376 $inst_task = $this->f->get_inst__om_dbform(array(
4377 "obj" => "task",
4378 "idx" => 0,
4379 ));
4380
4381 $add_task = $inst_task->add_task(array('val' => $task_val));
4382 if ($add_task === false) {
4383 $this->addToLog(
4384 sprintf(
4385 '%s(): %s %s : %s',
4386 __METHOD__,
4387 __('Echec de l\'ajout de la tâche de notification.'),
4388 __('Paramétrage de la tâche'),
4389 var_export($task_val, true)
4390 ),
4391 DEBUG_MODE
4392 );
4393 return false;
4394 }
4395
4396 return true;
4397 }
4398
4399 /**
4400 * Cette méthode permet de savoir si l'instruction est une instruction
4401 * de recepisse (instruction lié à l'ajout du dossier).
4402 *
4403 * Pour cela, on récupère la liste des actions qui ont menées à la création
4404 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4405 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4406 * l'instruction et donc qu'il s'agit d'un recepisse.
4407 *
4408 * @return boolean
4409 */
4410 protected function is_instruction_recepisse() {
4411 // Récupère la liste des actions qui ont mené à la création de
4412 // l'instruction
4413 $trace = debug_backtrace();
4414 // Parcours la liste des actions et si une de ces actions est lié
4415 // à la classe demande on cosidère que l'instruction est un recepisse
4416 foreach ($trace as $key => $value) {
4417 if (isset($trace[$key]['class']) === true
4418 && empty($trace[$key]['class']) === false) {
4419 if (strtolower($trace[$key]['class']) === 'demande') {
4420 return true;
4421 }
4422 }
4423 }
4424 return false;
4425 }
4426
4427 /**
4428 * A partir des informations passée en argument ajoute un nouvel élément
4429 * dans la table instruction_notification.
4430 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4431 * paramètre si le paramétrage attendus est ok.
4432 * Ajoute également un nouvel élement dans instruction_notification_document
4433 * si l'instruction possède une lettretype.
4434 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4435 * élement dans la table instruction_notification_document qui correspondra
4436 * à l'annexe de la notification.
4437 *
4438 * @param integer identifiant de l'instruction notifiée
4439 * @param string information concernant l'emetteur
4440 * @param array tableau contenant 2 entrées
4441 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4442 * - courriel : adresse mail de la personne à notifier
4443 * @param integer identifiant de la collectivité permettant de récupèrer les
4444 * paramètres à valider
4445 * @param boolean indique si la notification est automatique ou manuelle
4446 * @param integer identifiant d'une instruction dont l'édition sera annexé
4447 * à la notification
4448 *
4449 * @return integer|boolean identifiant de la notification créée si le traitement
4450 * a réussie, false sinon.
4451 */
4452 protected function ajouter_notification(
4453 $idInstruction,
4454 $emetteur,
4455 $destinataire,
4456 $collectiviteId,
4457 $annexes = array(),
4458 $demandeAuto = false,
4459 $statut = 'en cours d\'envoi',
4460 $commentaire = 'Notification en cours de traitement'
4461 ) {
4462 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4463 // de créer la notification
4464 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4465 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4466 $this->addToMessage($msgErreur);
4467 $this->addToLog(
4468 sprintf('%s() : %s', __METHOD__, $msgErreur),
4469 DEBUG_MODE
4470 );
4471 return false;
4472 }
4473 // Préparation de la notification
4474 $inst_notif = $this->f->get_inst__om_dbform(array(
4475 "obj" => "instruction_notification",
4476 "idx" => "]",
4477 ));
4478 $notif_val = array(
4479 'instruction_notification' => null,
4480 'instruction' => $idInstruction,
4481 'automatique' => $demandeAuto,
4482 'emetteur' => $emetteur,
4483 'date_envoi' => null,
4484 'destinataire' => $destinataire['destinataire'],
4485 'courriel' => $destinataire['courriel'],
4486 'date_premier_acces' => null,
4487 'statut' => $statut,
4488 'commentaire' => $commentaire
4489 );
4490
4491 // Création de la notification
4492 $add_notif = $inst_notif->ajouter($notif_val);
4493 if ($add_notif === false) {
4494 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4495 $this->addToLog(
4496 sprintf(
4497 '%s() : %s %s : %s',
4498 __METHOD__,
4499 __("Echec de l'ajout de la notification en base de données."),
4500 __('Paramétrage de la notification'),
4501 var_export($notif_val, true)
4502 ),
4503 DEBUG_MODE
4504 );
4505 return false;
4506 }
4507
4508 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4509 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4510 $add_notif_doc = $this->ajouter_notification_document(
4511 $inst_notif->getVal($inst_notif->clePrimaire),
4512 $this->getVal($this->clePrimaire),
4513 'instruction'
4514 );
4515 if ($add_notif_doc === false) {
4516 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4517 return false;
4518 }
4519 }
4520 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4521 if (! empty($annexes) && is_array($annexes)) {
4522 $add_notif_annexe = $this->ajouter_notification_document_multiple(
4523 $inst_notif->getVal($inst_notif->clePrimaire),
4524 $annexes
4525 );
4526 if ($add_notif_annexe === false) {
4527 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4528 return false;
4529 }
4530 }
4531
4532 // Renvoie l'id de la nouvelle instance de instruction_notification
4533 return $inst_notif->getVal($inst_notif->clePrimaire);
4534 }
4535
4536 /**
4537 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4538 * instance dans la table instruction_notification_document lié a la
4539 * notification dont l'id est passé en paramètre.
4540 *
4541 * @param array tableau contenant les informations nécessaires pour créer les annexes
4542 *
4543 * @return integer|boolean identifiant de la notification créée si le traitement
4544 * a réussie, false sinon.
4545 */
4546 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4547 foreach ($listeDocument as $paramDoc) {
4548 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4549 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4550 return false;
4551 }
4552 }
4553 return true;
4554 }
4555
4556 /**
4557 * Ajoute un élément dans la table instruction_notification_document en utilisant
4558 * les éléments fourni en paramètre
4559 *
4560 * @param integer $idNotification : id de la notification à laquelle on associe le document
4561 * @param integer $idDocument : id de l'objet auquel est rattaché le document
4562 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4563 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4564 *
4565 * @return boolean indique si le traitement a réussi
4566 */
4567 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4568 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4569 "obj" => "instruction_notification_document",
4570 "idx" => "]",
4571 ));
4572 // l'attribut instruction doit obligatoirement être renseigné
4573 // pour éviter toutes confusion avec d'autres instruction l'id
4574 // 0 est donné au document n'appartenant pas aux instructions
4575 $notif_doc_val = array(
4576 'instruction_notification_document' => null,
4577 'instruction_notification' => $idNotification,
4578 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4579 'document_type' => $tableDocument,
4580 'document_id' => $idDocument,
4581 'cle' => $this->getCleAccesDocument(),
4582 'annexe' => $isAnnexe
4583 );
4584
4585 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4586 if ($add_notif_doc === false) {
4587 $this->addToLog(
4588 sprintf(
4589 '%s() : %s %s : %s',
4590 __METHOD__,
4591 __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4592 __('Paramétrage du document'),
4593 var_export($notif_doc_val, true)
4594 ),
4595 DEBUG_MODE
4596 );
4597 return false;
4598 }
4599 return true;
4600 }
4601
4602 /**
4603 * Récupère via une requête la liste des identifiants des éléments de la table
4604 * parametrage_annexe liés à une instruction.
4605 * Boucle sur cette liste pour instancier le parametrage_annexe correspondant
4606 * et lui appliquer le traitement de suppression.
4607 *
4608 * @param integer identifiant d'une instruction
4609 * @return boolean état du traitement. True : OK, False : Echec
4610 */
4611 function supprimer_parametrage_annexe($id_instruction) {
4612 // Récupère la liste des parametrage_annexe associés à l'instruction
4613 $qres = $this->f->get_all_results_from_db_query(sprintf(
4614 'SELECT parametrage_annexe
4615 FROM %sparametrage_annexe
4616 WHERE parametrage_annexe.instruction = %d',
4617 DB_PREFIXE,
4618 intval($id_instruction)),
4619 array('origin' => __METHOD__));
4620 // Instancie puis supprime chacun des éléments de la liste
4621 foreach ($qres['result'] as $res) {
4622 $parametrage_annexe = $this->f->get_inst__om_dbform(array(
4623 'obj' => 'parametrage_annexe',
4624 'idx' => $res['parametrage_annexe']
4625 ));
4626 foreach ($parametrage_annexe->champs as $champ) {
4627 $val[$champ] = $parametrage_annexe->getVal($champ);
4628 }
4629 $suppression = $parametrage_annexe->supprimer($val);
4630 // En cas d'échec arrête le traitement et renvoie false
4631 if ($suppression === false) {
4632 return false;
4633 }
4634 }
4635 return true;
4636 }
4637
4638 /**
4639 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4640 *
4641 * @param integer identifiant de la collectivité
4642 * @return boolean
4643 */
4644 protected function is_parametrage_notification_correct($collectiviteId) {
4645 $categorie = $this->f->get_param_option_notification($collectiviteId);
4646 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4647 if ($categorie === 'mail' && $urlAccesNotif === null) {
4648 return false;
4649 }
4650 return true;
4651 }
4652
4653 /**
4654 * TRIGGER - triggermodifierapres.
4655 *
4656 * @return boolean
4657 */
4658 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4659 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4660 $data = array('val' => &$val, 'id' => $id);
4661 $this->f->module_manager->run_hooks('triggermodifierapres_pre', $this, $data);
4662 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4663 $message = '';
4664
4665 // Définit si le dossier d'instruction doit être mis à jour
4666 $update_dossier = true;
4667 // Les actions de mise à jour des dates ne doivent pas appliquer
4668 // l'action de l'événement et donc ne pas mettre à jour le dossier
4669 if ($this->getParameter("maj") == 125
4670 || $this->getParameter("maj") == 170
4671 || $this->getParameter("maj") == 175) {
4672 $update_dossier = false;
4673 }
4674
4675 // Traitement en cas de mise à jour du dossier
4676 if ($update_dossier === true) {
4677 /**
4678 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4679 * si la date de l'evenement est modifiee
4680 */
4681 // Initialisation
4682 $valF = array();
4683 $valF_dt = array();
4684 // Initialisation du type d'événement
4685 $type_evmt = "";
4686 // Récupération de l'action correspondante à l'événement
4687 $evenement = $this->f->get_inst__om_dbform(array(
4688 "obj" => "evenement",
4689 "idx" => $this->valF['evenement']
4690 ));
4691
4692 // Récupération des paramètres de l'action
4693 // TODO : remplacer cette requête par l'instanciation de l'action
4694 $qres = $this->f->get_all_results_from_db_query(
4695 sprintf(
4696 'SELECT
4697 *
4698 FROM
4699 %1$saction
4700 WHERE
4701 action = \'%2$s\'',
4702 DB_PREFIXE,
4703 $this->f->db->escapeSimple($evenement->getVal('action'))
4704 ),
4705 array(
4706 "origin" => __METHOD__
4707 )
4708 );
4709 foreach ($qres['result'] as $row) {
4710 // application des regles sur le courrier + delai
4711 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4712 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4713 }
4714 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4715 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4716 }
4717 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4718 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4719 }
4720 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4721 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4722 }
4723 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4724 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4725 }
4726 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4727 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4728 }
4729 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4730 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4731 }
4732 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4733 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4734 }
4735 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4736 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4737 }
4738 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4739 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4740 }
4741 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4742 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4743 }
4744 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4745 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4746 }
4747 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4748 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4749 }
4750 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4751 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4752 }
4753 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4754 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4755 }
4756 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4757 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4758 }
4759 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4760 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4761 }
4762 if ($row['regle_donnees_techniques1'] !== '') {
4763 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4764 }
4765 if ($row['regle_donnees_techniques2'] !== '') {
4766 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4767 }
4768 if ($row['regle_donnees_techniques3'] !== '') {
4769 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4770 }
4771 if ($row['regle_donnees_techniques4'] !== '') {
4772 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4773 }
4774 if ($row['regle_donnees_techniques5'] !== '') {
4775 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4776 }
4777 if ($row['regle_dossier_instruction_type'] !== '') {
4778 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4779 }
4780 }
4781 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4782 if (count($valF_dt) > 0) {
4783 $dt_id = $this->getDonneesTechniques();
4784 // On met à jour le dossier
4785 $cle = " donnees_techniques='".$dt_id."'";
4786 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4787 $this->addToLog(
4788 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4789 VERBOSE_MODE
4790 );
4791 $this->f->isDatabaseError($res1);
4792 // Affichage d'informations à l'utilisateur
4793 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4794 }
4795 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4796 if (count($valF) > 0) {
4797 $inst_dossier = $this->f->get_inst__om_dbform(array(
4798 "obj" => "dossier",
4799 "idx" => $this->valF['dossier'],
4800 ));
4801 $valF['instruction'] = $id;
4802 $valF['crud'] = 'update';
4803 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4804 if ($update_by_instruction === false) {
4805 $this->cleanMessage();
4806 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4807 return false;
4808 }
4809 // Affichage d'informations à l'utilisateur
4810 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4811 }
4812 }
4813
4814 // Par défaut les instructions à ajouter suite à la saisie d'une date
4815 // de retour signature ou de notification, utilisent l'action 0
4816 // Si la création d'événement d'instruction suivant est déclenchée par
4817 // une notification suite au traitement d'une tâche (démat') alors l'ajout
4818 // de la nouvelle instruction se fait avec l'action 176
4819 // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4820 // nouvelle instruction, depuis la méthode verifier()
4821 $code_action_add = 0;
4822 if ($this->getParameter("maj") == 175) {
4823 $code_action_add = 176;
4824 }
4825 $restriction = $this->get_restriction($val['evenement']);
4826 $this->restriction_valid = $this->restrictionIsValid($restriction);
4827
4828 if($restriction == "" || $this->restriction_valid ){
4829 // Récupération de tous les paramètres de l'événement sélectionné
4830 // TODO : remplacer cette requête par l'instanciation de l'evenement
4831 $qres = $this->f->get_all_results_from_db_query(
4832 sprintf(
4833 'SELECT
4834 *
4835 FROM
4836 %1$sevenement
4837 WHERE
4838 evenement = %2$d',
4839 DB_PREFIXE,
4840 intval($this->valF['evenement'])
4841 ),
4842 array(
4843 "origin" => __METHOD__
4844 )
4845 );
4846 $current_id = $this->getVal($this->clePrimaire);
4847 foreach ($qres['result'] as $row) {
4848 // Si la date de retour signature est éditée
4849 if (
4850 $this->getVal('date_retour_signature') == "" AND
4851 $this->valF['date_retour_signature'] != ""
4852 ){
4853 // On Lance le hook
4854 $data = array('val' => $this->valF);
4855 $data['dossier'] = $this->valF['dossier'];
4856 $this->f->module_manager->run_hooks('update_date_retour_signature_pre', $this, $data);
4857
4858 // On vérifie si il existe un événement automatique
4859 if (
4860 $row['evenement_retour_signature'] != ""
4861 ) {
4862 $new_instruction = $this->f->get_inst__om_dbform(array(
4863 "obj" => "instruction",
4864 "idx" => "]",
4865 ));
4866 // Création d'un tableau avec la liste des champs de l'instruction
4867 foreach($new_instruction->champs as $champ) {
4868 $valNewInstr[$champ] = "";
4869 }
4870 // Définition des valeurs de la nouvelle instruction
4871 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4872 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4873 $valNewInstr["dossier"] = $this->valF['dossier'];
4874 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4875 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4876 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4877 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4878 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4879 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4880 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4881 $new_instruction->setParameter("maj", $code_action_add);
4882 $new_instruction->class_actions[$code_action_add]["identifier"] =
4883 sprintf(
4884 __("Ajout suite au retour signature de l'instruction %s"),
4885 $current_id
4886 );
4887 $retour = $new_instruction->ajouter($valNewInstr);
4888
4889 //Si une erreur s'est produite et qu'il s'agit d'un problème
4890 //de restriction
4891 if ($retour == false && !$new_instruction->restriction_valid){
4892 $error_message = $this->get_restriction_error_message($restriction);
4893 $this->f->displayMessage("error", $error_message);
4894 $this->addToLog(__METHOD__."(): evenement retour ".
4895 "instruction ".$this->valF[$this->clePrimaire]." : ".
4896 $new_instruction->msg);
4897 }
4898 //Si une erreur s'est produite après le test de la restriction
4899 elseif ($retour == false && $new_instruction->restriction_valid){
4900 $this->correct = false ;
4901 $this->msg .= $new_instruction->msg;
4902 return false;
4903 }
4904 }
4905
4906 $this->f->module_manager->run_hooks('update_date_retour_signature_post', $this, $data);
4907 }
4908
4909 // Si la date de retour AR est éditée
4910 if (
4911 $this->getVal('date_retour_rar') == "" AND
4912 $this->valF['date_retour_rar'] != ""
4913 ){
4914 // On Lance le hook Notification/Date retour Accusée Reception
4915 $data = array('val' => $this->valF);
4916 $data['dossier'] = $this->valF['dossier'];
4917 $this->f->module_manager->run_hooks('update_date_retour_rar_pre', $this, $data);
4918
4919 // On vérifie si il existe un événement automatique
4920 if ( $row['evenement_retour_ar'] != "" ) {
4921 $new_instruction = $this->f->get_inst__om_dbform(array(
4922 "obj" => "instruction",
4923 "idx" => "]",
4924 ));
4925 // Création d'un tableau avec la liste des champs de l'instruction
4926 foreach($new_instruction->champs as $champ) {
4927 $valNewInstr[$champ] = "";
4928 }
4929 // Définition des valeurs de la nouvelle instruction
4930 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4931 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4932 $valNewInstr["dossier"] = $this->valF['dossier'];
4933 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4934 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4935 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4936 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4937 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4938 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4939 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4940 $new_instruction->setParameter("maj", $code_action_add);
4941 $new_instruction->class_actions[$code_action_add]["identifier"] =
4942 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4943 $retour = $new_instruction->ajouter($valNewInstr);
4944
4945 //Si une erreur s'est produite et qu'il s'agit d'un problème
4946 //de restriction
4947 if ($retour == false && !$new_instruction->restriction_valid) {
4948 $error_message = $this->get_restriction_error_message($restriction);
4949 $this->f->displayMessage("error", $error_message);
4950 $this->addToLog(
4951 __METHOD__."(): evenement retour instruction ".
4952 $this->valF[$this->clePrimaire]." : ".
4953 $new_instruction->msg
4954 );
4955 }
4956 //Si une erreur s'est produite après le test de la restriction
4957 elseif ($retour == false && $new_instruction->restriction_valid){
4958 $this->correct = false ;
4959 $this->msg .= $new_instruction->msg;
4960 return false;
4961 }
4962 }
4963 $this->f->module_manager->run_hooks('update_date_retour_rar_post', $this, $data);
4964 }
4965
4966 // Si la date_envoi_signature est éditée
4967 if (
4968 $this->getVal('date_envoi_signature') == "" AND
4969 $this->valF['date_envoi_signature'] != ""
4970 ){
4971 // On Lance le hook
4972 $data = array('val' => $this->valF);
4973 $data['dossier'] = $this->valF['dossier'];
4974 $this->f->module_manager->run_hooks('update_date_envoi_signature', $this, $data);
4975 }
4976 // Si la date de envoi AR est éditée
4977 if (
4978 $this->getVal('date_envoi_rar') == "" AND
4979 $this->valF['date_envoi_rar'] != ""
4980 ){
4981 // On Lance le hook
4982 $data = array('val' => $this->valF);
4983 $data['dossier'] = $this->valF['dossier'];
4984 $this->f->module_manager->run_hooks('update_date_envoi_rar', $this, $data);
4985 }
4986 // Si la date de envoi controle legalite est éditée
4987 if (
4988 $this->getVal('date_envoi_controle_legalite') == "" AND
4989 $this->valF['date_envoi_controle_legalite'] != ""
4990 ){
4991 // On Lance le hook
4992 $data = array('val' => $this->valF);
4993 $data['dossier'] = $this->valF['dossier'];
4994 $this->f->module_manager->run_hooks('update_date_envoi_controle_legalite', $this, $data);
4995 }
4996 // Si la date de retour controle legalite est éditée
4997 if (
4998 $this->getVal('date_retour_controle_legalite') == "" AND
4999 $this->valF['date_retour_controle_legalite'] != ""
5000 ){
5001 // On Lance le hook
5002 $data = array('val' => $this->valF);
5003 $data['dossier'] = $this->valF['dossier'];
5004 $this->f->module_manager->run_hooks('update_date_retour_controle_legalite', $this, $data);
5005 }
5006 }
5007 }
5008
5009 // Traitement en cas de mise à jour du dossier
5010 if ($update_dossier === true) {
5011 /**
5012 * Mise à jour de la date de dernière modification du dossier
5013 * d'instruction
5014 */
5015 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5016 $inst_di->update_last_modification_date();
5017
5018 // Mise à jour des données du dossier d'autorisation
5019 $da = $this->f->get_inst__om_dbform(array(
5020 "obj" => "dossier_autorisation",
5021 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
5022 ));
5023 $params = array(
5024 'di_id' => $this->getVal('dossier'),
5025 );
5026 if($da->majDossierAutorisation($params) === false) {
5027 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5028 $this->correct = false;
5029 return false;
5030 }
5031 }
5032
5033 // mise à jour des métadonnées issues des dates de suivi
5034 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
5035 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
5036 if ($dateRetourSignatureModified || $dateRetourRARModified) {
5037
5038 // Calculs des nouvelles métadonnées
5039 $metadata = $this->getMetadata("om_fichier_instruction");
5040
5041 // On vérifie si l'instruction à finaliser a un événement de type arrete
5042 // TODO : A voir pour remplacer par une instanciation de l'événement.
5043 // Voir également si l'événement ne dois pas être instancié en début de
5044 // méthode pour pouvoir être réutilisé.
5045 $qres = $this->f->get_one_result_from_db_query(
5046 sprintf(
5047 'SELECT
5048 type
5049 FROM
5050 %1$sevenement
5051 WHERE
5052 evenement = \'%2$d\'',
5053 DB_PREFIXE,
5054 intval($this->getVal("evenement"))
5055 ),
5056 array(
5057 "origin" => __METHOD__,
5058 "force_return" => true,
5059 )
5060 );
5061
5062 if ($qres["code"] !== "OK") {
5063 $this->correct = false;
5064 $this->addToMessage(__("Erreur de traitement de fichier."));
5065 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
5066 return false;
5067 }
5068
5069 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5070 if ($qres['result'] == 'arrete'){
5071 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
5072 }
5073
5074 // Filtre pour conserver uniquement les métadonnées liées aux dates
5075 $metadataToKeep = array(
5076 "statutAutorisation",
5077 "dateEvenementDocument",
5078 'date_cloture_metier',
5079 "NotificationArrete",
5080 "dateNotificationArrete",
5081 "controleLegalite",
5082 "dateSignature",
5083 "nomSignataire",
5084 "qualiteSignataire",
5085 "dateControleLegalite",
5086 );
5087 $metadata = array_filter(
5088 $metadata,
5089 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
5090 ARRAY_FILTER_USE_KEY
5091 );
5092
5093 // Mise à jour des métadonnées du document en GED
5094 $docUid = $this->getVal("om_fichier_instruction");
5095 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
5096 if ($operationOrUID == 'OP_FAILURE') {
5097 $this->correct = false;
5098 $this->addToMessage(__("Erreur de traitement de fichier."));
5099 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
5100 return false;
5101 }
5102
5103 // mise à jour de l'UID du document en BDD
5104 else {
5105 $valF = array('om_fichier_instruction' => $operationOrUID);
5106 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
5107 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
5108 if ($this->f->isDatabaseError($res, true) === true) {
5109 $this->correct = false;
5110 $this->addToMessage(__("Erreur de traitement de fichier."));
5111 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
5112 return false;
5113 }
5114 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
5115 }
5116 }
5117
5118 // Déclenchement des notifications automatique après finalisation et
5119 // retour de signature
5120 if ($dateRetourSignatureModified === true
5121 && $this->valF['date_retour_signature'] !== ''
5122 && $this->valF['date_retour_signature'] !== null) {
5123
5124 // Message à afficher dans les logs pour indiquer quelle notification a échouée
5125 $msgLog = sprintf(
5126 '%s %s : %d',
5127 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
5128 __('Instruction notifiée'),
5129 $id
5130 );
5131
5132 // Récupération de l'instance de l'événement pour accéder au paramètrage
5133 // des notifications
5134 $ev = $this->get_inst_evenement($this->valF['evenement']);
5135 // Si la notification automatique des tiers consulté est active
5136 // déclenche le traitement de notification.
5137 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
5138 $typeNotifTiers = $ev->getVal('notification_tiers');
5139 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5140 if ($typeNotifTiers === 'notification_automatique') {
5141 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
5142 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
5143 $this->correct = false;
5144 }
5145 }
5146
5147 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
5148 // Récupération de la liste des demandeurs à notifier et de la catégorie
5149 $categorie = $this->f->get_param_option_notification($collectivite_di);
5150 $isPortal = $categorie === PORTAL;
5151 $demandeursANotifie = $this->get_demandeurs_notifiable(
5152 $this->valF['dossier'],
5153 $isPortal
5154 );
5155
5156 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
5157 $demandeurPrincipalNotifie = false;
5158 foreach ($demandeursANotifie as $demandeur) {
5159 // Identifie si le demandeur principal a été notifié ou pas
5160 // et récupère ses informations
5161 if ($demandeur['petitionnaire_principal'] == 't') {
5162 $demandeurPrincipalNotifie = true;
5163 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
5164 // son paramétrage, on effectue pas le traitement et on passe à l'itération
5165 // suivante. On le considère également comme non notifié pour gérer l'envoie
5166 // des messages d'erreurs
5167 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
5168 // d'impact sur la notification
5169 $erreursParam = $this->get_info_notification_fail();
5170 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
5171 $demandeurPrincipalNotifie = false;
5172 continue;
5173 }
5174 }
5175 // Ajout de la notif et récupération de son id
5176 $idNotif = $this->ajouter_notification(
5177 $this->valF[$this->clePrimaire],
5178 $this->f->get_connected_user_login_name(),
5179 $demandeur,
5180 $collectivite_di,
5181 array(),
5182 true
5183 );
5184 if ($idNotif === false) {
5185 $this->addToLog(
5186 sprintf('%s() : %s',__METHOD__, $msgLog),
5187 DEBUG_MODE
5188 );
5189 return false;
5190 }
5191 // Création de la tache en lui donnant l'id de la notification
5192 $notification_by_task = $this->notification_by_task(
5193 $idNotif,
5194 $this->valF['dossier'],
5195 $categorie
5196 );
5197 if ($notification_by_task === false) {
5198 $this->addToLog(
5199 sprintf('%s() : %s',__METHOD__, $msgLog),
5200 DEBUG_MODE
5201 );
5202 $this->addToMessage(
5203 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
5204 );
5205 return false;
5206 }
5207 }
5208 // Pour la notification par mail ou la notification via portal si le dossier a
5209 // été déposés via portal, si le demandeur principal n'est pas notifiable,
5210 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
5211 // laquelle le demandeur principal n'a pas pu être notifié
5212 $depotPortal = $this->dossier_depose_sur_portail();
5213 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
5214 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
5215 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
5216 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
5217 $erreursParam = $this->get_info_notification_fail();
5218 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
5219 // Ajout de la notif et récupération de son id
5220 $idNotif = $this->ajouter_notification(
5221 $this->valF[$this->clePrimaire],
5222 $this->f->get_connected_user_login_name(),
5223 $demandeurPrincipal,
5224 $collectivite_di,
5225 array(),
5226 true,
5227 'Echec',
5228 implode(' ', $erreursParam)
5229 );
5230 if ($idNotif === false) {
5231 $this->addToLog(
5232 sprintf('%s() : %s', __METHOD__, $msgLog),
5233 DEBUG_MODE
5234 );
5235 $this->addToMessage(
5236 __('Erreur : la création de la notification a échouée.').
5237 __("Veuillez contacter votre administrateur.")
5238 );
5239 return false;
5240 }
5241 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
5242 // de l'échec de la notification
5243 $dossier_message = $this->get_inst_dossier_message(0);
5244 $dossier_message_val = array(
5245 'dossier' => $this->getVal('dossier'),
5246 'type' => _('erreur expedition'),
5247 'emetteur' => $this->f->get_connected_user_login_name(),
5248 'login' => $_SESSION['login'],
5249 'date_emission' => date('Y-m-d H:i:s'),
5250 'contenu' => _('Échec lors de la notification de l\'instruction ').
5251 $ev->getVal('libelle').
5252 '.<br>'.
5253 implode("\n", $erreursParam).
5254 '<br>'.
5255 _('Veuillez corriger ces informations avant de renvoyer la notification.')
5256 );
5257 $add = $dossier_message->add_notification_message($dossier_message_val, true);
5258 // Si une erreur se produit pendant l'ajout
5259 if ($add !== true) {
5260 $this->addToLog(
5261 sprintf(
5262 '%s() : %s',
5263 __METHOD__,
5264 __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
5265 ),
5266 DEBUG_MODE
5267 );
5268 return false;
5269 }
5270 }
5271 $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.")));
5272 }
5273 }
5274
5275 $res = $this->add_log_to_dossier($id, $val);
5276 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5277 $this->f->module_manager->run_hooks('triggermodifierapres_post', $this, $data);
5278 return $res;
5279 }
5280
5281 /**
5282 * TRIGGER - triggersupprimer.
5283 *
5284 * @return boolean
5285 */
5286 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5287 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5288 $data = array('val' => &$val, 'id' => $id);
5289 $this->f->module_manager->run_hooks('triggersupprimer_pre', $this, $data);
5290 /**
5291 * L'objectif ici est de repositionner les valeurs récupérées en
5292 * archive dans le dossier d'instruction avant de supprimer l'événement
5293 * d'instruction si les valeurs du dossier sont différentes
5294 */
5295 $valF = array();
5296 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5297 foreach ($inst_di->champs as $key => $champ) {
5298 // Si le champ du DI à une archive dans l'instruction
5299 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
5300 // Si la valeur entre le champ du DI et son archive dans instruction
5301 // est différente
5302 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
5303 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
5304 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
5305 // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
5306 if ($champ === "accord_tacite" && $valF[$champ] === null) {
5307 $valF[$champ] = ' ';
5308 }
5309 }
5310 }
5311 }
5312 // Spécificité du champ avis_decision dont le champ archive est nommé
5313 // différemment
5314 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
5315 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
5316 }
5317 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
5318 // par l'archive
5319 unset($valF['date_affichage']);
5320
5321 /**
5322 * Mise à jour de la version de clôture *version_clos* du dossier si et
5323 * seulement si l'instruction met à jour l'état du dossier.
5324 */
5325 if (isset($valF['etat']) === true
5326 && $valF['etat'] !== null
5327 && $valF['etat'] !== '') {
5328 // Récupère l'état actuel du dossier d'instruction
5329 $inst_current_etat = $this->f->get_inst__om_dbform(array(
5330 "obj" => "etat",
5331 "idx" => $inst_di->get_id_etat(),
5332 ));
5333 // Instanciation de l'état archivé appliqué sur le dossier
5334 $inst_etat = $this->f->get_inst__om_dbform(array(
5335 "obj" => "etat",
5336 "idx" => $valF['etat'],
5337 ));
5338 //
5339 $update_version_clos = null;
5340 // En cas de clôture du dossier par l'état archivé
5341 if ($inst_etat->getVal('statut') === 'cloture') {
5342 $update_version_clos = $inst_di->update_version_clos('up');
5343 }
5344 // En cas de réouverture du dossier par l'état archivé
5345 if ($inst_current_etat->getVal('statut') === 'cloture'
5346 && $inst_etat->getVal('statut') !== 'cloture') {
5347 //
5348 $update_version_clos = $inst_di->update_version_clos('down');
5349 //
5350 $this->set_att_di_reopened(true);
5351 }
5352 //
5353 if ($update_version_clos === false) {
5354 $this->f->addToLog(sprintf(
5355 "%s() : ERREUR - %s %s",
5356 __METHOD__,
5357 sprintf(
5358 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
5359 $inst_di->getVal($inst_di->clePrimaire)
5360 ),
5361 sprintf(
5362 __("L'instruction tente d'appliquer l'état %s."),
5363 $inst_etat->getVal($inst_etat->clePrimaire)
5364 )
5365 ));
5366 $this->addToMessage(sprintf(
5367 "%s %s",
5368 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
5369 __("Veuillez contacter votre administrateur.")
5370 ));
5371 return false;
5372 }
5373 }
5374 // On supprime toutes les notications liées à l'instruction
5375 $notifASupprimer = $this->get_instruction_notification(
5376 $this->getVal($this->clePrimaire),
5377 array(
5378 'notification_recepisse',
5379 'notification_instruction',
5380 'notification_decision',
5381 'notification_service_consulte',
5382 'notification_tiers_consulte',
5383 'notification_depot_demat',
5384 'notification_commune',
5385 'notification_signataire'
5386 ),
5387 true
5388 );
5389
5390 foreach ($notifASupprimer as $idNotif) {
5391 $inst_notif = $this->f->get_inst__om_dbform(array(
5392 "obj" => "instruction_notification",
5393 "idx" => $idNotif,
5394 ));
5395 $val_notif = array();
5396 foreach ($inst_notif->champs as $champ) {
5397 $val_notif[$champ] = $inst_notif->getVal($champ);
5398 }
5399 // La suppression des notifications entrainera la suppression des tâches qui y sont
5400 // liées
5401 $supprNotif = $inst_notif->supprimer($val_notif);
5402 if ($supprNotif == false) {
5403 $this->addToMessage(sprintf(
5404 "%s %s",
5405 __("Erreur lors de la suppression des notifications de l'instruction."),
5406 __("Veuillez contacter votre administrateur.")
5407 ));
5408 return false;
5409 }
5410 }
5411
5412 // Suppression du paramétrage de l'annexe lié à l'évènement
5413 if ($this->supprimer_parametrage_annexe($this->getVal($this->clePrimaire)) === false) {
5414 $this->addToLog(sprintf(
5415 "%s %s",
5416 __("Erreur lors de la suppression du paramétrage des annexes de l'instruction."),
5417 __("Veuillez contacter votre administrateur.")
5418 ), DEBUG_MODE);
5419 return false;
5420 }
5421
5422 // On met à jour le dossier
5423 $valF['instruction'] = $id;
5424 $valF['crud'] = 'delete';
5425 $update_by_instruction = $inst_di->update_by_instruction($valF);
5426 if ($update_by_instruction === false) {
5427 $this->cleanMessage();
5428 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5429 return false;
5430 }
5431
5432 // Affichage d'informations à l'utilisateur
5433 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
5434
5435 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5436
5437 $res = true;
5438 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5439 $this->f->module_manager->run_hooks('triggersupprimer_post', $this, $data);
5440 return $res;
5441 }
5442
5443 /**
5444 * TRIGGER - triggersupprimerapres.
5445 *
5446 * @return boolean
5447 */
5448 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5449 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5450 $data = array('val' => &$val, 'id' => $id);
5451 $this->f->module_manager->run_hooks('triggersupprimerapres_pre', $this, $data);
5452 /**
5453 * Mise à jour de la date de dernière modification du dossier
5454 * d'instruction
5455 */
5456 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5457 $inst_di->update_last_modification_date();
5458
5459 /**
5460 * Mise à jour des données du dossier d'autorisation
5461 */
5462 $da = $this->f->get_inst__om_dbform(array(
5463 "obj" => "dossier_autorisation",
5464 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5465 ));
5466 $params = array(
5467 'di_id' => $this->getVal('dossier'),
5468 'di_reopened' => $this->get_att_di_reopened(),
5469 );
5470 if($da->majDossierAutorisation($params) === false) {
5471 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5472 $this->correct = false;
5473 return false;
5474 }
5475
5476 /**
5477 * Gestion des tâches pour la dématérialisation
5478 */
5479 $inst_task_empty = $this->f->get_inst__om_dbform(array(
5480 "obj" => "task",
5481 "idx" => 0,
5482 ));
5483 foreach ($inst_di->task_types as $task_type) {
5484 $task_exists = $inst_task_empty->task_exists($task_type, $id);
5485 if ($task_exists !== false) {
5486 $inst_task = $this->f->get_inst__om_dbform(array(
5487 "obj" => "task",
5488 "idx" => $task_exists,
5489 ));
5490 if ($inst_task->getVal('state') === task::STATUS_NEW || $inst_task->getVal('state') === task::STATUS_DRAFT) {
5491 $task_val = array(
5492 'state' => task::STATUS_CANCELED,
5493 );
5494 $update_task = $inst_task->update_task(array('val' => $task_val));
5495 if ($update_task === false) {
5496 $this->addToMessage(sprintf('%s %s',
5497 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5498 __("Veuillez contacter votre administrateur.")
5499 ));
5500 $this->correct = false;
5501 return false;
5502 }
5503 }
5504 }
5505 }
5506
5507 //
5508 $val['evenement'] = $this->getVal('evenement');
5509 $res = $this->add_log_to_dossier($id, $val);
5510 $data = array('val' => &$val, 'id' => $id, 'result' => &$res);
5511 $this->f->module_manager->run_hooks('triggersupprimerapres_post', $this, $data);
5512 return $res;
5513 }
5514
5515 /**
5516 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5517 * "di_reopened".
5518 *
5519 * @param boolean $val
5520 */
5521 function set_att_di_reopened($val) {
5522 $this->di_reopened = $val;
5523 }
5524
5525 /**
5526 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5527 *
5528 * @return boolean
5529 */
5530 function get_att_di_reopened() {
5531 return $this->di_reopened;
5532 }
5533
5534 /**
5535 * Permet de composer un message d'erreur sur restriction non valide en
5536 * fonction du contexte.
5537 *
5538 * @param string $restriction formule de la restriction
5539 *
5540 * @return string message d'erreur
5541 */
5542 function get_restriction_error_message($restriction) {
5543 // Affichage du message si la restriction s'applique
5544 // Contexte du suivi des dates (message simple)
5545 $message_restrict = _("Probleme de dates :");
5546 // Split restriction
5547 $champs_restrict = preg_split(
5548 '/(\W+)/',
5549 $restriction,
5550 null,
5551 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5552 );
5553 $formated_restrict = "";
5554 // Ajout des chaînes à traduire
5555 foreach ($champs_restrict as $value) {
5556 $formated_restrict .= _($value)." ";
5557 }
5558 $formated_restrict = substr($formated_restrict, 0, -1);
5559 // Message d'erreur dans le contexte du suivi des dates
5560 if($this->getParameter("maj") == 170) {
5561 $message_restrict .= " "._("contactez l'instructeur du dossier");
5562 $message_restrict .= "<br/>(".$formated_restrict.")";
5563 } else {
5564 // Affichage du message si la restriction s'applique
5565 // Contexte instruction
5566 $message_restrict .= "<br/>".$formated_restrict;
5567 }
5568
5569 return $message_restrict;
5570 }
5571
5572 /**
5573 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5574 * les vérifications suivantes :
5575 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5576 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5577 * le message d'erreur associé à la restriction
5578 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5579 * et / ou la modification et affiche un message d'erreur
5580 * -
5581 * -
5582 * -
5583 * -
5584 * -
5585 * -
5586 *
5587 * @param array val : tableau contenant les valeurs issues du formulaire.
5588 * @param - dnu1 : Paramètre déprécié et non utilisé.
5589 * @param - dnu2 : Paramètre déprécié et non utilisé.
5590 *
5591 * @return void
5592 */
5593 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5594 parent::verifier($val);
5595 //
5596 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5597 $restriction = $this->get_restriction($val['evenement']);
5598
5599 //Test qu'une restriction est présente
5600 if ($restriction != "" ){
5601
5602 // Vérifie le contexte de la modification et test si la restriction est valide.
5603 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5604 // Il n'est donc pas nécessaire de vérifier les restrictions.
5605 $this->restriction_valid = $this->restrictionIsValid($restriction);
5606 if ($this->getParameter("maj") != 176
5607 && !$this->restriction_valid) {
5608
5609 // Affichage du message si la restriction s'applique
5610 $this->addToMessage(
5611 $this->get_restriction_error_message($restriction)
5612 );
5613 $this->correct=false;
5614 return false;
5615 }
5616
5617 // Liste des opérateurs possible
5618 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5619 // Supprime tous les espaces de la chaîne de caractère
5620 $restriction = str_replace(' ', '', $restriction);
5621
5622 // Met des espace avant et après les opérateurs puis transforme la
5623 // chaine en un tableau
5624 $tabRestriction = str_replace($operateurs, " ", $restriction);
5625 // Tableau des champ
5626 $tabRestriction = explode(" ", $tabRestriction);
5627 // Supprime les numériques du tableau
5628 foreach ($tabRestriction as $key => $value) {
5629 if (is_numeric($value)) {
5630 unset($tabRestriction[$key]);
5631 }
5632 }
5633
5634 // Vérifie les champs utilisés pour la restriction
5635 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5636 if ($check_field_exist !== true) {
5637
5638 // Liste des champs en erreur
5639 $string_error_fields = implode(", ", $check_field_exist);
5640
5641 // Message d'erreur
5642 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5643 if (count($check_field_exist) > 1) {
5644 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5645 }
5646
5647 // Affiche l'erreur
5648 $this->correct=false;
5649 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5650 $this->addToMessage(_("Veuillez contacter votre administrateur."));
5651 }
5652 }
5653
5654 }
5655 if(!$this->updateDate("date_envoi_signature")) {
5656 return false;
5657 }
5658 if(!$this->updateDate("date_retour_signature")) {
5659 return false;
5660 }
5661 if(!$this->updateDate("date_envoi_rar")) {
5662 return false;
5663 }
5664 if(!$this->updateDate("date_retour_rar")) {
5665 return false;
5666 }
5667 if(!$this->updateDate("date_envoi_controle_legalite")) {
5668 return false;
5669 }
5670 if(!$this->updateDate("date_retour_controle_legalite")) {
5671 return false;
5672 }
5673
5674 }
5675
5676 /**
5677 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5678 * principal du dossier auquel appartiens l'instruction.
5679 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5680 *
5681 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5682 * et affiche un message dans les logs.
5683 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5684 *
5685 * @param string identifiant du dossier
5686 * @return array|boolean
5687 */
5688 public function get_info_petitionnaire_principal_dossier($dossier = null) {
5689 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5690 // l'objet courant
5691 if (empty($dossier)) {
5692 $dossier = $this->getVal('dossier');
5693 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5694 // false et on affiche un message d'erreur dans les logs
5695 if (empty($dossier)) {
5696 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5697 return false;
5698 }
5699 }
5700
5701 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5702 // principal
5703 $qres = $this->f->get_all_results_from_db_query(
5704 sprintf(
5705 'SELECT
5706 -- Récupère toutes les informations du demandeur principal
5707 demandeur.*,
5708 CASE
5709 WHEN demandeur.qualite=\'particulier\'
5710 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5711 ELSE
5712 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5713 END AS destinataire
5714 FROM
5715 %1$sdossier
5716 LEFT JOIN %1$slien_dossier_demandeur
5717 ON lien_dossier_demandeur.dossier = dossier.dossier
5718 LEFT JOIN %1$sdemandeur
5719 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5720 WHERE
5721 dossier.dossier = \'%2$s\'
5722 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5723 DB_PREFIXE,
5724 $this->f->db->escapeSimple($dossier)
5725 ),
5726 array(
5727 "origin" => __METHOD__,
5728 )
5729 );
5730 if (is_array($qres["result"]) === true
5731 && array_key_exists(0, $qres["result"]) === true) {
5732 //
5733 return $qres["result"][0];
5734 }
5735 return null;
5736 }
5737
5738
5739
5740 /**
5741 * Finalisation des documents.
5742 * @param string $champ champ du fichier à finaliser
5743 * @param booleen $status permet de définir si on finalise ou définalise
5744 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5745 */
5746 function manage_finalizing($mode = null, $val = array()) {
5747 //
5748 $this->begin_treatment(__METHOD__);
5749
5750 //
5751 $id_inst = $this->getVal($this->clePrimaire);
5752
5753 //
5754 $admin_msg_error = _("Veuillez contacter votre administrateur.");
5755 $file_msg_error = _("Erreur de traitement de fichier.")
5756 ." ".$admin_msg_error;
5757 $bdd_msg_error = _("Erreur de base de données.")
5758 ." ".$admin_msg_error;
5759 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5760
5761 // Si on finalise le document
5762 if ($mode == "finalize"){
5763 //
5764 $etat = _('finalisation');
5765
5766 // Récupère la collectivite du dossier d'instruction
5767 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5768
5769 //
5770 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5771
5772 //
5773 $params = array(
5774 "specific" => array(),
5775 );
5776 // Si la rédaction libre est activée sur l'instruction
5777 if ($this->getVal("flag_edition_integrale") == 't') {
5778 $params["specific"]["corps"] = array(
5779 "mode" => "set",
5780 "value" => $this->getVal("corps_om_htmletatex"),
5781 );
5782 $params["specific"]["titre"] = array(
5783 "mode" => "set",
5784 "value" => $this->getVal("titre_om_htmletat"),
5785 );
5786 }
5787 // Génération du PDF
5788 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5789 $pdf_output = $result['pdf_output'];
5790
5791 //Métadonnées du document
5792 $metadata = array(
5793 'filename' => $this->determinate_name_doc_pdf().'.pdf',
5794 'mimetype' => 'application/pdf',
5795 'size' => strlen($pdf_output)
5796 );
5797
5798 // Récupération des métadonnées calculées après validation
5799 $spe_metadata = $this->getMetadata("om_fichier_instruction");
5800
5801 //On vérifie si l'instruction à finaliser a un événement de type arrete
5802 // TODO : A voir pour remplacer par une instanciation de l'événement.
5803 // Voir également si l'événement ne dois pas être instancié en début de
5804 // méthode pour pouvoir être réutilisé.
5805 $qres = $this->f->get_one_result_from_db_query(
5806 sprintf(
5807 'SELECT
5808 type
5809 FROM
5810 %1$sevenement
5811 WHERE
5812 evenement = \'%2$d\'',
5813 DB_PREFIXE,
5814 intval($this->getVal("evenement"))
5815 ),
5816 array(
5817 "origin" => __METHOD__,
5818 "force_return" => true,
5819 )
5820 );
5821
5822 if ($qres["code"] !== "OK") {
5823 $this->correct = false;
5824 $this->addToMessage($bdd_msg_error);
5825 return $this->end_treatment(__METHOD__, false);
5826 }
5827
5828 //Initialisation de la variable
5829 $arrete_metadata = array();
5830 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5831 if ($qres['result'] === 'arrete'){
5832 $arrete_metadata = $this->getMetadata("arrete");
5833 }
5834
5835 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5836
5837 // Mise à jour du nom du fichier en bdd suite à la finalisation de l'instruction
5838 $res = $this->f->db->autoExecute(
5839 DB_PREFIXE.$this->table,
5840 ['fichier_instruction_name' => $metadata['filename']],
5841 DB_AUTOQUERY_UPDATE,
5842 "instruction='".$this->getVal("instruction")."'"
5843 );
5844
5845 // Si le document a déjà été finalisé on le met à jour
5846 // en conservant son UID
5847 if ($this->getVal("om_fichier_instruction") != ''){
5848 $uid = $this->f->storage->update(
5849 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata
5850 );
5851 }
5852 // Sinon on crée un nouveau document et dont on récupère l'UID
5853 else {
5854 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5855 }
5856 }
5857
5858 // Si on définalise le document
5859 if ($mode == "unfinalize") {
5860 //
5861 $etat = _('définalisation');
5862 // Récupération de l'uid du document finalisé
5863 $uid = $this->getVal("om_fichier_instruction");
5864 }
5865
5866 // Si on définalise l'UID doit être défini
5867 // Si on finalise la création/modification du fichier doit avoir réussi
5868 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5869 $this->correct = false;
5870 $this->addToMessage($file_msg_error);
5871 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5872 return $this->end_treatment(__METHOD__, false);
5873 }
5874
5875 //
5876 foreach ($this->champs as $key => $champ) {
5877 //
5878 $val[$champ] = $this->val[$key];
5879 }
5880
5881 //
5882 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5883 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5884 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5885 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5886 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5887 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5888 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5889 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5890 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5891 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5892 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5893 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5894 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5895 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5896 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5897 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5898 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5899 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5900 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5901 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5902 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5903 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5904 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5905 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5906 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5907 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5908 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5909 $this->setvalF($val);
5910
5911 // Verification de la validite des donnees
5912 $this->verifier($this->val);
5913 // Si les verifications precedentes sont correctes, on procede a
5914 // la modification, sinon on ne fait rien et on retourne une erreur
5915 if ($this->correct === true) {
5916 //
5917 $valF = array(
5918 "om_fichier_instruction" => $uid,
5919 "date_finalisation_courrier" => date('Y-m-d')
5920 );
5921 //
5922 if($mode=="finalize") {
5923 // état finalisé vrai
5924 $valF["om_final_instruction"] = true;
5925 // ajout log utilisateur
5926 $login = $_SESSION['login'];
5927 $nom = "";
5928 $this->f->getUserInfos();
5929 if (isset($this->f->om_utilisateur["nom"])
5930 && !empty($this->f->om_utilisateur["nom"])) {
5931 $nom = $this->f->om_utilisateur["nom"];
5932 }
5933 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5934 if ($nom != "") {
5935 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5936 }
5937 } else {
5938 // état finalisé faux
5939 $valF["om_final_instruction"] = false;
5940 // suppression log utilisateur
5941 $valF["om_final_instruction_utilisateur"] = '';
5942 }
5943
5944 // Execution de la requête de modification des donnees de l'attribut
5945 // valF de l'objet dans l'attribut table de l'objet
5946 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5947 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5948 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5949 //
5950 if ($this->f->isDatabaseError($res, true) === true) {
5951 $this->correct = false;
5952 $this->addToMessage($bdd_msg_error);
5953 return $this->end_treatment(__METHOD__, false);
5954 }
5955
5956 //
5957 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5958 //
5959 if ($this->add_log_to_dossier($id_inst, $val) === false) {
5960 return $this->end_treatment(__METHOD__, false);
5961 }
5962 //
5963 return $this->end_treatment(__METHOD__, true);
5964 }
5965 // L'appel de verifier() a déjà positionné correct à false
5966 // et défini un message d'erreur.
5967 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5968 return $this->end_treatment(__METHOD__, false);
5969 }
5970
5971 /**
5972 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5973 * @return string numéro de dossier d'instruction
5974 */
5975 protected function getDossier($champ = null) {
5976 if(empty($this->specificMetadata)) {
5977 $this->getSpecificMetadata();
5978 }
5979 return $this->specificMetadata->dossier;
5980 }
5981 /**
5982 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5983 * @return int Version
5984 */
5985 protected function getDossierVersion() {
5986 if(empty($this->specificMetadata)) {
5987 $this->getSpecificMetadata();
5988 }
5989 return $this->specificMetadata->version;
5990 }
5991 /**
5992 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5993 * @return string numéro de dossier d'autorisation
5994 */
5995 protected function getNumDemandeAutor() {
5996 if(empty($this->specificMetadata)) {
5997 $this->getSpecificMetadata();
5998 }
5999 return $this->specificMetadata->dossier_autorisation;
6000 }
6001 /**
6002 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
6003 * @return date de la demande initiale
6004 */
6005 protected function getAnneemoisDemandeAutor() {
6006 if(empty($this->specificMetadata)) {
6007 $this->getSpecificMetadata();
6008 }
6009 return $this->specificMetadata->date_demande_initiale;
6010 }
6011 /**
6012 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
6013 * @return string type du dossier d'instruction
6014 */
6015 protected function getTypeInstruction() {
6016 if(empty($this->specificMetadata)) {
6017 $this->getSpecificMetadata();
6018 }
6019 return $this->specificMetadata->dossier_instruction_type;
6020 }
6021 /**
6022 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
6023 * @return string avis
6024 */
6025 protected function getStatutAutorisation() {
6026 if(empty($this->specificMetadata)) {
6027 $this->getSpecificMetadata();
6028 }
6029 return $this->specificMetadata->statut;
6030 }
6031 /**
6032 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
6033 * @return string type du dossier d'autorisation
6034 */
6035 protected function getTypeAutorisation() {
6036 if(empty($this->specificMetadata)) {
6037 $this->getSpecificMetadata();
6038 }
6039 return $this->specificMetadata->dossier_autorisation_type;
6040 }
6041 /**
6042 * Récupération de la date d'ajout de document à ajouter aux métadonnées
6043 * @return date de l'évènement
6044 */
6045 protected function getDateEvenementDocument() {
6046 return date("Y-m-d");
6047 }
6048 /**
6049 * Récupération du groupe d'instruction à ajouter aux métadonnées
6050 * @return string Groupe d'instruction
6051 */
6052 protected function getGroupeInstruction() {
6053 if(empty($this->specificMetadata)) {
6054 $this->getSpecificMetadata();
6055 }
6056 return $this->specificMetadata->groupe_instruction;
6057 }
6058 /**
6059 * Récupération du libellé du type du document à ajouter aux métadonnées
6060 * @return string Groupe d'instruction
6061 */
6062 protected function getTitle() {
6063
6064 // Récupère le champ événement
6065 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
6066 $evenement = $this->valF["evenement"];
6067 } else {
6068 $evenement = $this->getVal("evenement");
6069 }
6070
6071 // Requête sql
6072 $evenement = $this->f->get_inst__om_dbform(array(
6073 "obj" => "evenement",
6074 "idx" => $evenement
6075 ));
6076
6077 // Retourne le libelle de l'événement
6078 return $evenement->getVal('libelle');
6079 }
6080
6081
6082 /**
6083 * Récupération du champ ERP du dossier d'instruction.
6084 *
6085 * @return boolean
6086 */
6087 public function get_concerne_erp() {
6088 //
6089 if(empty($this->specificMetadata)) {
6090 $this->getSpecificMetadata();
6091 }
6092 //
6093 return $this->specificMetadata->erp;
6094 }
6095
6096
6097 /**
6098 * Cette méthode permet de stocker en attribut toutes les métadonnées
6099 * nécessaire à l'ajout d'un document.
6100 */
6101 public function getSpecificMetadata() {
6102 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
6103 $dossier = $this->valF["dossier"];
6104 } else {
6105 $dossier = $this->getVal("dossier");
6106 }
6107 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
6108 $qres = $this->f->get_all_results_from_db_query(
6109 sprintf(
6110 'SELECT
6111 dossier.dossier AS dossier,
6112 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
6113 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
6114 dossier_instruction_type.code AS dossier_instruction_type,
6115 etat_dossier_autorisation.libelle AS statut,
6116 dossier_autorisation_type.code AS dossier_autorisation_type,
6117 groupe.code AS groupe_instruction,
6118 CASE WHEN dossier.erp IS TRUE
6119 THEN \'true\'
6120 ELSE \'false\'
6121 END AS erp
6122 FROM
6123 %1$sdossier
6124 LEFT JOIN %1$sdossier_instruction_type
6125 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6126 LEFT JOIN %1$sdossier_autorisation
6127 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
6128 LEFT JOIN %1$setat_dossier_autorisation
6129 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
6130 LEFT JOIN %1$sdossier_autorisation_type_detaille
6131 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6132 LEFT JOIN %1$sdossier_autorisation_type
6133 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6134 LEFT JOIN %1$sgroupe
6135 ON dossier_autorisation_type.groupe = groupe.groupe
6136 WHERE
6137 dossier.dossier = \'%2$s\'',
6138 DB_PREFIXE,
6139 $this->f->db->escapeSimple($dossier)
6140 ),
6141 array(
6142 "origin" => __METHOD__,
6143 )
6144 );
6145 $row = array_shift($qres['result']);
6146
6147 //Si il y a un résultat
6148 if (! empty($row)) {
6149
6150 // Instrance de la classe dossier
6151 $inst_dossier = $this->get_inst_dossier($dossier);
6152 // TODO : améliorer ce code
6153 //
6154 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
6155 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
6156 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
6157 // valeurs issues de la requête en objet.
6158 $metadata = (object)$row;
6159 // Insère l'attribut version à l'objet
6160 $metadata->version = $inst_dossier->get_di_numero_suffixe();
6161
6162 //Alors on créé l'objet dossier_instruction
6163 $this->specificMetadata = $metadata;
6164
6165 }
6166 }
6167
6168 /**
6169 * Retourne le statut du dossier d'instruction
6170 * @param string $idx Identifiant du dossier d'instruction
6171 * @return string Le statut du dossier d'instruction
6172 */
6173 function getStatutAutorisationDossier($idx){
6174
6175 $statut = '';
6176
6177 //Si l'identifiant du dossier d'instruction fourni est correct
6178 if ( $idx != '' ){
6179
6180 //On récupère le statut de l'état du dossier à partir de l'identifiant du
6181 //dossier
6182 $qres = $this->f->get_one_result_from_db_query(
6183 sprintf(
6184 'SELECT
6185 etat.statut
6186 FROM
6187 %1$sdossier
6188 LEFT JOIN
6189 %1$setat
6190 ON
6191 dossier.etat = etat.etat
6192 WHERE
6193 dossier = \'%2$s\'',
6194 DB_PREFIXE,
6195 $this->f->db->escapeSimple($idx)
6196 ),
6197 array(
6198 "origin" => __METHOD__,
6199 )
6200 );
6201 }
6202
6203 return $qres['result'];
6204 }
6205
6206 /**
6207 * Récupère les données du dossier
6208 * @return array
6209 */
6210 function get_dossier_actual() {
6211
6212 // Initialisation de la valeur de retour
6213 $return = array();
6214
6215 // Récupération de toutes les valeurs du dossier d'instruction en cours
6216 // TODO : remplacer cette requête par une instanciation de l'objet
6217 $qres = $this->f->get_all_results_from_db_query(
6218 sprintf(
6219 'SELECT
6220 *
6221 FROM
6222 %1$sdossier
6223 WHERE
6224 dossier = \'%2$s\'',
6225 DB_PREFIXE,
6226 $this->f->db->escapeSimple($this->valF['dossier'])
6227 ),
6228 array(
6229 'origin' => __METHOD__
6230 )
6231 );
6232
6233 foreach ($qres['result'] as $row) {
6234
6235 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6236 // de l'état et de l'avis du dossier d'instruction
6237 $return['archive_delai'] = $row['delai'];
6238 $return['archive_accord_tacite'] = $row['accord_tacite'];
6239 $return['archive_etat'] = $row['etat'];
6240 $return['archive_avis'] = $row['avis_decision'];
6241 // Récupération de la valeur actuelle des dates du dossier
6242 // d'instruction
6243 $return['archive_date_complet'] = $row['date_complet'];
6244 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
6245 $return['archive_date_rejet'] = $row['date_rejet'];
6246 $return['archive_date_limite'] = $row['date_limite'];
6247 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
6248 $return['archive_date_decision'] = $row['date_decision'];
6249 $return['archive_date_validite'] = $row['date_validite'];
6250 $return['archive_date_achevement'] = $row['date_achevement'];
6251 $return['archive_date_chantier'] = $row['date_chantier'];
6252 $return['archive_date_conformite'] = $row['date_conformite'];
6253 $return['archive_incompletude'] = $row['incompletude'];
6254 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
6255 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
6256 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
6257 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
6258 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
6259 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
6260 $return['archive_autorite_competente'] = $row['autorite_competente'];
6261 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
6262 $return['duree_validite'] = $row['duree_validite'];
6263 $return['date_depot'] = $row['date_depot'];
6264 $return['date_depot_mairie'] = $row['date_depot_mairie'];
6265 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
6266 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
6267 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
6268 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
6269 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
6270 $return['archive_date_ait'] = $row['date_ait'];
6271 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
6272 $return['archive_date_affichage'] = $row['date_affichage'];
6273 $return['archive_pec_metier'] = $row['pec_metier'];
6274 $return['archive_a_qualifier'] = $row['a_qualifier'];
6275 }
6276
6277 // Retour de la fonction
6278 return $return;
6279
6280 }
6281
6282 /**
6283 * Permet de vérifier qu'un événement est verrouillable
6284 * @param integer $idx Identifiant de l'instruction
6285 * @return boolean
6286 */
6287 function checkEvenementNonVerrouillable($idx) {
6288 // Si la condition n'est pas vide
6289 if ($idx != "") {
6290
6291 // Requête SQL
6292 $qres = $this->f->get_one_result_from_db_query(
6293 sprintf(
6294 'SELECT
6295 evenement.non_verrouillable
6296 FROM
6297 %1$sevenement
6298 LEFT JOIN %1$sinstruction
6299 ON instruction.evenement = evenement.evenement
6300 WHERE
6301 instruction.instruction = \'%2$s\'',
6302 DB_PREFIXE,
6303 intval($idx)
6304 ),
6305 array(
6306 "origin" => __METHOD__,
6307 )
6308 );
6309 }
6310
6311 // Si on a un résultat et que ce résultat indique que l'événement n'est
6312 // pas vérrouillable renvoie true, sinon renvoie false
6313 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
6314 }
6315
6316 /**
6317 * Mise à jour des champs archive_*
6318 * @param mixed $row La ligne de données
6319 */
6320 public function updateArchiveData($row){
6321
6322 // Récupération de la valeur actuelle du délai, de l'accord tacite,
6323 // de l'état et de l'avis du dossier d'instruction
6324 $this->valF['archive_delai']=$row['delai'];
6325 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
6326 $this->valF['archive_etat']=$row['etat'];
6327 $this->valF['archive_avis']=$row['avis_decision'];
6328 // Récupération de la valeur actuelle des 9 dates du dossier
6329 // d'instruction
6330 if ($row['date_complet'] != '') {
6331 $this->valF['archive_date_complet']=$row['date_complet'];
6332 }
6333 if ($row['date_dernier_depot'] != '') {
6334 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
6335 }
6336 if ($row['date_rejet'] != '') {
6337 $this->valF['archive_date_rejet']= $row['date_rejet'];
6338 }
6339 if ($row['date_limite'] != '') {
6340 $this->valF['archive_date_limite']= $row['date_limite'];
6341 }
6342 if ($row['date_notification_delai'] != '') {
6343 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
6344 }
6345 if ($row['date_decision'] != '') {
6346 $this->valF['archive_date_decision']= $row['date_decision'];
6347 }
6348 if ($row['date_validite'] != '') {
6349 $this->valF['archive_date_validite']= $row['date_validite'];
6350 }
6351 if ($row['date_achevement'] != '') {
6352 $this->valF['archive_date_achevement']= $row['date_achevement'];
6353 }
6354 if ($row['date_chantier'] != '') {
6355 $this->valF['archive_date_chantier']= $row['date_chantier'];
6356 }
6357 if ($row['date_conformite'] != '') {
6358 $this->valF['archive_date_conformite']= $row['date_conformite'];
6359 }
6360 if ($row['incompletude'] != '') {
6361 $this->valF['archive_incompletude']= $row['incompletude'];
6362 }
6363 if ($row['incomplet_notifie'] != '') {
6364 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
6365 }
6366 if ($row['evenement_suivant_tacite'] != '') {
6367 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
6368 }
6369 if ($row['evenement_suivant_tacite_incompletude'] != '') {
6370 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
6371 }
6372 if ($row['etat_pendant_incompletude'] != '') {
6373 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
6374 }
6375 if ($row['date_limite_incompletude'] != '') {
6376 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
6377 }
6378 if ($row['delai_incompletude'] != '') {
6379 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
6380 }
6381 if ($row['autorite_competente'] != '') {
6382 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
6383 }
6384 if ($row['duree_validite'] != '') {
6385 $this->valF['duree_validite']= $row['duree_validite'];
6386 }
6387 if ($row['date_depot'] != '') {
6388 $this->valF['date_depot']= $row['date_depot'];
6389 }
6390 if ($row['date_depot_mairie'] != '') {
6391 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
6392 }
6393 // Dates concernant les dossiers contentieux
6394 if ($row['date_cloture_instruction'] != '') {
6395 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
6396 }
6397 if ($row['date_premiere_visite'] != '') {
6398 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
6399 }
6400 if ($row['date_derniere_visite'] != '') {
6401 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
6402 }
6403 if ($row['date_contradictoire'] != '') {
6404 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
6405 }
6406 if ($row['date_retour_contradictoire'] != '') {
6407 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
6408 }
6409 if ($row['date_ait'] != '') {
6410 $this->valF['archive_date_ait']= $row['date_ait'];
6411 }
6412 if ($row['date_transmission_parquet'] != '') {
6413 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6414 }
6415 //
6416 if ($row['dossier_instruction_type'] != '') {
6417 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6418 }
6419 if ($row['date_affichage'] != '') {
6420 $this->valF['archive_date_affichage']= $row['date_affichage'];
6421 }
6422 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6423 $this->valF['archive_pec_metier']= $row['pec_metier'];
6424 }
6425 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6426 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6427 }
6428 }
6429
6430 // {{{
6431 // Méthodes de récupération des métadonnées arrêté
6432 /**
6433 * @return string Retourne le numéro d'arrêté
6434 */
6435 function getNumArrete() {
6436 return $this->getVal("numero_arrete");
6437 }
6438 /**
6439 * @return chaîne vide
6440 */
6441 function getReglementaireArrete() {
6442 return 'true';
6443 }
6444 /**
6445 * @return boolean de notification au pétitionnaire
6446 */
6447 function getNotificationArrete() {
6448 return 'true';
6449 }
6450 /**
6451 * @return date de notification au pétitionnaire
6452 */
6453 function getDateNotificationArrete() {
6454 if (empty($this->metadonneesArrete)) {
6455 $this->getArreteMetadata();
6456 }
6457 return $this->metadonneesArrete["datenotification"];
6458 }
6459 /**
6460 * @return boolean check si le document est passé au contrôle de légalité
6461 */
6462 function getControleLegalite() {
6463 return 'true';
6464 }
6465 /**
6466 * @return date de signature de l'arrêté
6467 */
6468 function getDateSignature() {
6469 if (empty($this->metadonneesArrete)) {
6470 $this->getArreteMetadata();
6471 }
6472 return $this->metadonneesArrete["datesignaturearrete"];
6473 }
6474 /**
6475 * @return string nom du signataire
6476 */
6477 function getNomSignataire() {
6478 if (empty($this->metadonneesArrete)) {
6479 $this->getArreteMetadata();
6480 }
6481 return $this->metadonneesArrete["nomsignataire"];
6482 }
6483 /**
6484 * @return string qualité du signataire
6485 */
6486 function getQualiteSignataire() {
6487 if (empty($this->metadonneesArrete)) {
6488 $this->getArreteMetadata();
6489 }
6490 return $this->metadonneesArrete["qualitesignataire"];
6491 }
6492 /**
6493 * @return string numéro du terrain
6494 */
6495 function getAp_numRue() {
6496 if (empty($this->metadonneesArrete)) {
6497 $this->getArreteMetadata();
6498 }
6499 return $this->metadonneesArrete["ap_numrue"];
6500 }
6501 /**
6502 * @return string nom de la rue du terrain
6503 */
6504 function getAp_nomDeLaVoie() {
6505 if (empty($this->metadonneesArrete)) {
6506 $this->getArreteMetadata();
6507 }
6508 return $this->metadonneesArrete["ap_nomdelavoie"];
6509 }
6510 /**
6511 * @return string code postal du terrain
6512 */
6513 function getAp_codePostal() {
6514 if (empty($this->metadonneesArrete)) {
6515 $this->getArreteMetadata();
6516 }
6517 return $this->metadonneesArrete["ap_codepostal"];
6518 }
6519 /**
6520 * @return string ville du terrain
6521 */
6522 function getAp_ville() {
6523 if (empty($this->metadonneesArrete)) {
6524 $this->getArreteMetadata();
6525 }
6526 return $this->metadonneesArrete["ap_ville"];
6527 }
6528 /**
6529 * @return string activité
6530 */
6531 function getActivite() {
6532 return "Droit du sol";
6533 }
6534 /**
6535 * @return string date du retour de controle légalité
6536 */
6537 function getDateControleLegalite() {
6538 if (empty($this->metadonneesArrete)) {
6539 $this->getArreteMetadata();
6540 }
6541 return $this->metadonneesArrete["datecontrolelegalite"];
6542 }
6543
6544 // Fin des méthodes de récupération des métadonnées
6545 // }}}
6546
6547 /**
6548 * Méthode de récupération des métadonnées arrêtés dans la base de données,
6549 * les données sont stockés dans l'attribut $this->metadonneesArrete
6550 */
6551 function getArreteMetadata() {
6552
6553 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6554 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6555 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6556 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6557 "ap_codepostal"=>"", "ap_ville"=>"");
6558
6559 $qres = $this->f->get_all_results_from_db_query(
6560 sprintf(
6561 'SELECT
6562 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6563 signataire_arrete.qualite as qualitesignataire,
6564 instruction.etat as decisionarrete,
6565 instruction.date_retour_rar as datenotification,
6566 instruction.date_retour_signature as datesignaturearrete,
6567 instruction.date_retour_controle_legalite as datecontrolelegalite,
6568 dossier.terrain_adresse_voie_numero as ap_numrue,
6569 dossier.terrain_adresse_voie as ap_nomdelavoie,
6570 dossier.terrain_adresse_code_postal as ap_codepostal,
6571 dossier.terrain_adresse_localite as ap_ville
6572 FROM
6573 %1$sinstruction
6574 LEFT JOIN %1$ssignataire_arrete
6575 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6576 LEFT JOIN %1$sdossier
6577 ON instruction.dossier = dossier.dossier
6578 LEFT JOIN %1$sdonnees_techniques
6579 ON donnees_techniques.dossier_instruction = dossier.dossier
6580 WHERE
6581 instruction.instruction = %2$d',
6582 DB_PREFIXE,
6583 intval($this->getVal('instruction'))
6584 ),
6585 array(
6586 'origin' => __METHOD__
6587 )
6588 );
6589 $this->metadonneesArrete = array_shift($qres['result']);
6590 }
6591
6592 /**
6593 * CONDITION - has_an_edition.
6594 *
6595 * Condition pour afficher le bouton de visualisation de l'édition.
6596 *
6597 * @return boolean
6598 */
6599 function has_an_edition() {
6600 // Récupère la valeur du champ lettretype
6601 $lettretype = $this->getVal("lettretype");
6602 // Si le champ est vide
6603 if ($lettretype !== '' && $lettretype !== null) {
6604 //
6605 return true;
6606 }
6607
6608 //
6609 return false;
6610 }
6611
6612 /**
6613 * CONDITION - is_modifiable.
6614 *
6615 * Controle si l'évenement est modifiable.
6616 *
6617 * @return boolean
6618 */
6619 function is_evenement_modifiable() {
6620 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6621 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6622 }
6623
6624 /**
6625 * CONDITION - is_editable.
6626 *
6627 * Condition pour la modification.
6628 *
6629 * @return boolean
6630 */
6631 function is_editable() {
6632
6633 // XXX
6634 // 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é)
6635 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6636
6637 // Contrôle si l'utilisateur possède un bypass
6638 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6639 //
6640 if ($bypass == true) {
6641 //
6642 return true;
6643 }
6644
6645 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6646 // que l'événement n'est pas identifié comme non verrouillable
6647 if ($this->f->isUserInstructeur()
6648 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6649 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6650 //
6651 return false;
6652 }
6653
6654 // Si l'utilisateur est un intructeur qui correspond à la division du
6655 // dossier
6656 if ($this->is_instructeur_from_division_dossier() === true) {
6657 //
6658 return true;
6659 }
6660
6661 // Si l'utilisateur est instructeur de la commune du dossier et que
6662 // l'instruction est créée par un instructeur de la commune
6663 if ($this->is_instructeur_from_collectivite_dossier() === true and
6664 $this->getVal('created_by_commune') === 't') {
6665 return true;
6666 }
6667
6668 //
6669 return false;
6670 }
6671
6672 /**
6673 * Vérifie si l'événement est supprimable ou pas.
6674 *
6675 * @return boolean
6676 */
6677 function is_evenement_supprimable() {
6678 // Controle si l'évenement est supprimable
6679 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6680 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6681 }
6682
6683 /**
6684 * CONDITION - is_deletable.
6685 *
6686 * Condition pour la suppression.
6687 *
6688 * @return boolean
6689 */
6690 function is_deletable() {
6691
6692 // XXX
6693 // 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é)
6694 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6695
6696 // Contrôle si l'utilisateur possède un bypass intégral
6697 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6698 //
6699 if ($bypass == true) {
6700
6701 //
6702 return true;
6703 }
6704
6705 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6706 // division du dossier et si l'utilisateur n'a pas la permission bypass
6707 // de la division
6708 if ($this->is_instructeur_from_division_dossier() === false
6709 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6710
6711 //
6712 return false;
6713 }
6714
6715 // l'événement est-il le dernier ?
6716 $dernier_evenement = false;
6717 // instanciation dossier
6718 $dossier = $this->f->get_inst__om_dbform(array(
6719 "obj" => "dossier",
6720 "idx" => $this->getVal('dossier'),
6721 ));
6722 // récupération dernier événement
6723 $id_dernier_evenement = $dossier->get_dernier_evenement();
6724 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6725 $dernier_evenement = true;
6726 }
6727
6728 // Si dossier cloturé ou si pas dernier événement
6729 // ou de type retour ou si une date est renseignée
6730 // ET utilisateur non administrateur
6731 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6732 || $dernier_evenement == false
6733 || $this->is_evenement_retour($this->getVal("evenement")) == true
6734 || $this->getVal('date_envoi_signature') != ''
6735 || $this->getVal('date_retour_signature') != ''
6736 || $this->getVal('date_envoi_rar') != ''
6737 || $this->getVal('date_retour_rar') != ''
6738 || $this->getVal('date_envoi_controle_legalite') != ''
6739 || $this->getVal('date_retour_controle_legalite') != '') {
6740 // pas le droit de supprimer
6741 return false;;
6742 }
6743
6744 //
6745 return true;
6746 }
6747
6748
6749 /**
6750 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6751 * dossier.
6752 *
6753 * @return, boolean true/false
6754 */
6755 function is_instructeur_from_collectivite_dossier() {
6756 if ($this->f->isUserInstructeur() === true and
6757 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6758 return true;
6759 }
6760 return false;
6761 }
6762
6763 /**
6764 * CONDITION - is_addable.
6765 *
6766 * Condition pour afficher les boutons modifier et supprimer.
6767 *
6768 * @return boolean
6769 */
6770 function is_addable() {
6771 // Contrôle si l'utilisateur possède un bypass
6772 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6773 //
6774 if ($bypass == true) {
6775
6776 //
6777 return true;
6778 }
6779 // Si l'utilisateur est un intructeur qui correspond à la
6780 // division du dossier ou qu'il peut changer la décision
6781 if ($this->is_instructeur_from_division_dossier() === true or
6782 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6783 //
6784 return true;
6785 }
6786
6787 //
6788 return false;
6789 }
6790
6791 /**
6792 * CONDITION - is_finalizable.
6793 *
6794 * Condition pour afficher le bouton.
6795 *
6796 * @return boolean
6797 */
6798 function is_finalizable() {
6799 // Contrôle si l'utilisateur possède un bypass
6800 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6801 //
6802 if ($bypass == true) {
6803 //
6804 return true;
6805 }
6806
6807 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6808 // que l'événement n'est pas identifié comme non verrouillable
6809 if ($this->f->isUserInstructeur()
6810 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6811 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6812 //
6813 return false;
6814 }
6815
6816 // Si l'utilisateur est un intructeur qui correspond à la division du
6817 // dossier
6818 if ($this->is_instructeur_from_division_dossier() === true) {
6819 //
6820 return true;
6821 }
6822
6823 // Si l'utilisateur est instructeur de la commune du dossier et que
6824 // l'instruction est créée par un instructeur de la commune
6825 if ($this->is_instructeur_from_collectivite_dossier() === true and
6826 $this->getVal('created_by_commune') === 't') {
6827 return true;
6828 }
6829
6830 //
6831 return false;
6832 }
6833
6834 /**
6835 * CONDITION - is_finalize_without_bypass.
6836 *
6837 * Condition pour afficher le bouton sans le bypass.
6838 *
6839 * @return boolean [description]
6840 */
6841 function is_finalizable_without_bypass() {
6842 // Récupère la valeur du champ finalisé
6843 $om_final_instruction = $this->getVal('om_final_instruction');
6844
6845 // Si le rapport n'est pas finalisé
6846 if (empty($om_final_instruction)
6847 || $om_final_instruction == 'f') {
6848 //
6849 return true;
6850 }
6851
6852 //
6853 return false;
6854 }
6855
6856 /**
6857 * CONDITION - is_unfinalizable.
6858 *
6859 * Condition pour afficher le bouton.
6860 *
6861 * @return boolean
6862 */
6863 function is_unfinalizable(){
6864 // Contrôle si l'utilisateur possède un bypass
6865 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6866 //
6867 if ($bypass == true) {
6868 //
6869 return true;
6870 }
6871
6872 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6873 // que l'événement n'est pas identifié comme non verrouillable
6874 if ($this->f->isUserInstructeur()
6875 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6876 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6877 //
6878 return false;
6879 }
6880
6881 // Si l'utilisateur est un intructeur qui correspond à la division du
6882 // dossier
6883 if ($this->is_instructeur_from_division_dossier() === true) {
6884 //
6885 return true;
6886 }
6887
6888 // Si l'utilisateur est instructeur de la commune du dossier et que
6889 // l'instruction est créée par un instructeur de la commune
6890 if ($this->is_instructeur_from_collectivite_dossier() === true and
6891 $this->getVal('created_by_commune') === 't') {
6892 return true;
6893 }
6894
6895 //
6896 return false;
6897 }
6898
6899 /**
6900 * CONDITION - is_unfinalizable_without_bypass.
6901 *
6902 * Condition pour afficher le bouton sans le bypass.
6903 *
6904 * @return boolean
6905 */
6906 function is_unfinalizable_without_bypass() {
6907 // Récupère la valeur du champ finalisé
6908 $om_final_instruction = $this->getVal('om_final_instruction');
6909
6910 // Si l'instruction est finalisée
6911 if ($om_final_instruction == 't') {
6912 //
6913 return true;
6914 }
6915
6916 //
6917 return false;
6918 }
6919
6920
6921 /**
6922 * Permet de définir si un instructeur commune peut editer une instruction
6923 *
6924 * @return boolean true si il peut
6925 */
6926 function isInstrCanChangeDecision($idx) {
6927
6928 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6929 $this->f->isUserInstructeur() !== true) {
6930 return false;
6931 }
6932
6933
6934
6935 // Sinon on vérifie l'éligibilité du dossier au changement de décision
6936 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6937 // de décision :
6938 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6939 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6940 $sql = sprintf(
6941 'SELECT
6942 dossier.dossier
6943 FROM
6944 %1$sdossier
6945 JOIN %1$setat
6946 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6947 JOIN %1$slien_dossier_demandeur
6948 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6949 JOIN %1$sdossier_instruction_type
6950 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6951 JOIN %1$sinstruction
6952 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6953 ON instruction.instruction = (
6954 SELECT instruction
6955 FROM %1$sinstruction
6956 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6957 AND evenement.retour IS FALSE
6958 WHERE instruction.dossier = dossier.dossier
6959 ORDER BY date_evenement DESC, instruction DESC
6960 LIMIT 1
6961 )
6962 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6963 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6964 -- non signée, non notifié, etc.
6965 AND (instruction.om_final_instruction IS TRUE
6966 OR instruction.created_by_commune IS TRUE)
6967 AND instruction.date_retour_signature IS NULL
6968 AND instruction.date_envoi_rar IS NULL
6969 AND instruction.date_retour_rar IS NULL
6970 AND instruction.date_envoi_controle_legalite IS NULL
6971 AND instruction.date_retour_controle_legalite IS NULL
6972 -- On vérifie que l instruction soit un arrêté ou un changement de décision
6973 JOIN %1$sevenement
6974 ON instruction.evenement=evenement.evenement
6975 AND (evenement.type = \'arrete\'
6976 OR evenement.type = \'changement_decision\')
6977 -- Recherche les informations du pétitionnaire principal pour l affichage
6978 JOIN %1$sdemandeur
6979 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6980 -- Recherche la collectivité rattachée à l instructeur
6981 JOIN %1$sinstructeur
6982 ON dossier.instructeur=instructeur.instructeur
6983 JOIN %1$sdivision
6984 ON instructeur.division=division.division
6985 JOIN %1$sdirection
6986 ON division.direction=direction.direction
6987 JOIN %1$som_collectivite
6988 ON direction.om_collectivite=om_collectivite.om_collectivite
6989 WHERE
6990 -- Vérification que la décision a été prise par l agglo
6991 om_collectivite.niveau = \'2\'
6992 AND dossier.dossier = \'%2$s\'
6993 ',
6994 DB_PREFIXE,
6995 $this->f->db->escapeSimple($idx)
6996 );
6997
6998
6999 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
7000 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
7001 $sql .= sprintf(
7002 ' AND dossier.om_collectivite = %1$d',
7003 intval($_SESSION['collectivite'])
7004 );
7005 }
7006 $qres = $this->f->get_one_result_from_db_query(
7007 $sql,
7008 array(
7009 "origin" => __METHOD__,
7010 )
7011 );
7012
7013 return $qres['result'] !== null;
7014 }
7015
7016
7017 /**
7018 * CONDITION - can_monitoring_dates.
7019 *
7020 * Condition pour afficher le bouton de suivi des dates.
7021 *
7022 * @return boolean
7023 */
7024 public function can_monitoring_dates() {
7025 // Récupère la valeur du champ finalisé
7026 $om_final_instruction = $this->getVal('om_final_instruction');
7027
7028 // Si l'instruction n'est pas finalisée
7029 if ($om_final_instruction !== 't') {
7030 //
7031 return false;
7032 }
7033
7034 // Contrôle si l'utilisateur possède un bypass
7035 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
7036 if ($bypass === true) {
7037 return true;
7038 }
7039
7040 // Permission de modifier le suivi des dates sur un dossier cloturé pour
7041 // un utilisateur lié à un instructeur
7042 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
7043
7044 // On vérifie en premier lieu que le DI n'est pas clôturé et que
7045 // l'utilisateur ne possède pas la permission de modifier le suivi des
7046 // dates sur un dossier clôturé
7047 $inst_dossier = $this->get_inst_dossier();
7048 if ($inst_dossier->getStatut() === 'cloture'
7049 && $perm_moni_dates_d_closed === false) {
7050 //
7051 return false;
7052 }
7053 // On récupère ses infos
7054 $coll_di = $inst_dossier->getVal('om_collectivite');
7055 $div_di = $this->getDivisionFromDossier();
7056 // et celles de son éventuel instructeur
7057 $instr_di = $inst_dossier->getVal('instructeur');
7058
7059 // Il faut disposer d'une entrée instructeur
7060 if ($this->f->isUserInstructeur() === false) {
7061 return false;
7062 }
7063
7064 // Par défaut on prétend que l'instructeur n'est pas multi
7065 $instr_di_coll_multi = false;
7066 // Si un instructeur est affecté au dossier
7067 if ($instr_di !== '' && $instr_di !== null) {
7068 // Vérifie si l'instructeur est de la collectivité de niveau 2
7069 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
7070 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
7071 //
7072 $instr_di_coll_multi = true;
7073 }
7074 }
7075
7076 // Il faut qu'il instruise le dossier ou soit de la même division
7077 if ($this->f->om_utilisateur['instructeur'] === $instr_di
7078 || $this->f->om_utilisateur['division'] === $div_di) {
7079 //
7080 return true;
7081 }
7082
7083 // On donne également le droit s'il est de la même collectivité que
7084 // le dossier ET si l'instruction est déléguée à la communauté
7085 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
7086 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
7087 && $instr_di_coll_multi === true) {
7088 //
7089 return true;
7090 }
7091
7092 // Si l'instructeur ne rentre pas dans les deux cas précédents
7093 return false;
7094 }
7095
7096
7097 /**
7098 * CONDITION - is_finalized.
7099 *
7100 * Condition pour vérifier si une instruction est finalisée.
7101 *
7102 * @return boolean
7103 */
7104 public function is_finalized() {
7105
7106 return $this->getVal('om_final_instruction') === "t";
7107 }
7108
7109 /**
7110 * CONDITION - is_not_date_retour_signature_set.
7111 *
7112 * Condition pour vérifier si une date de retour signature n'est pas définie.
7113 *
7114 * @return boolean
7115 */
7116 public function is_not_date_retour_signature_set() {
7117
7118 return $this->getVal('date_retour_signature') == null;
7119
7120 }
7121
7122
7123 /**
7124 * TREATMENT - finalize.
7125 *
7126 * Permet de finaliser un enregistrement.
7127 *
7128 * @param array $val valeurs soumises par le formulaire
7129 *
7130 * @return boolean
7131 */
7132 function finalize($val = array()) {
7133 // Cette méthode permet d'exécuter une routine en début des méthodes
7134 // dites de TREATMENT.
7135 $this->begin_treatment(__METHOD__);
7136 $message = '';
7137 $ev = $this->get_inst_evenement($this->getVal('evenement'));
7138
7139 $this->f->log(__METHOD__, 'BEGIN');
7140 $collectivite_di = null;
7141 $data = array('val' => &$val);
7142 $data['ev'] = $ev;
7143 $data['collectivite_di'] = $collectivite_di;
7144 $this->f->module_manager->run_hooks('finalize_pre', $this, $data);
7145
7146 // Controle du signataire
7147 if (! $this->controle_signataire($ev)) {
7148 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
7149 // Termine le traitement
7150 return $this->end_treatment(__METHOD__, false);
7151 }
7152
7153 // Traitement de la finalisation
7154 $ret = $this->manage_finalizing("finalize", $val);
7155
7156 // Si le traitement retourne une erreur
7157 if ($ret !== true) {
7158
7159 // Termine le traitement
7160 return $this->end_treatment(__METHOD__, false);
7161 }
7162
7163 // Envoi des notifications aux demandeurs si la notification est automatique
7164 // et que la signature n'est pas requise
7165 if ($ev->getVal('notification') === 'notification_automatique') {
7166 // Préparation du message de log en cas d'erreur de notification
7167 $msgLog = sprintf(
7168 '%s %s : %d',
7169 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
7170 __('Instruction notifiée'),
7171 $this->getVal($this->clePrimaire)
7172 );
7173 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
7174 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
7175 // Récupération de la liste des demandeurs à notifier et de la catégorie
7176 $categorie = $this->f->get_param_option_notification($collectivite_di);
7177 $isPortal = $categorie === PORTAL;
7178 $demandeursANotifie = $this->get_demandeurs_notifiable(
7179 $this->getVal('dossier'),
7180 $isPortal
7181 );
7182
7183 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
7184 $demandeurPrincipalNotifie = false;
7185 if (count($demandeursANotifie) > 0) {
7186 foreach ($demandeursANotifie as $demandeur) {
7187 // Identifie si le demandeur principal a été notifié ou pas
7188 // et récupère ses informations
7189 if ($demandeur['petitionnaire_principal'] == 't') {
7190 $demandeurPrincipalNotifie = true;
7191 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
7192 // son paramétrage, on effectue pas le traitement et on passe à l'itération
7193 // suivante. On le considère également comme non notifié pour gérer l'envoie
7194 // des messages d'erreurs
7195 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
7196 // d'impact sur la notification
7197 $erreursParam = $this->get_info_notification_fail();
7198 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
7199 $demandeurPrincipalNotifie = false;
7200 continue;
7201 }
7202 }
7203 // Ajout de la notif et récupération de son id
7204 $idNotif = $this->ajouter_notification(
7205 $this->getVal($this->clePrimaire),
7206 $this->f->get_connected_user_login_name(),
7207 $demandeur,
7208 $collectivite_di,
7209 array(),
7210 true
7211 );
7212 if ($idNotif === false) {
7213 // Termine le traitement
7214 $this->addToLog(
7215 sprintf('%s() : %s', __METHOD__, $msgLog),
7216 DEBUG_MODE
7217 );
7218 return $this->end_treatment(__METHOD__, false);
7219 }
7220 $notification_by_task = $this->notification_by_task(
7221 $idNotif,
7222 $this->getVal('dossier'),
7223 $categorie
7224 );
7225 if ($notification_by_task === false) {
7226 $this->addToLog(
7227 sprintf('%s() : %s', __METHOD__, $msgLog),
7228 DEBUG_MODE
7229 );
7230 $this->addToMessage(
7231 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
7232 );
7233 // Termine le traitement
7234 return $this->end_treatment(__METHOD__, false);
7235 }
7236 $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.")));
7237 }
7238 }
7239 // Pour la notification par mail ou la notification via portal si le dossier a
7240 // été déposés via portal, si le demandeur principal n'est pas notifiable,
7241 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
7242 // laquelle le demandeur principal n'a pas pu être notifié
7243 $depotPortal = $this->dossier_depose_sur_portail();
7244 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
7245 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
7246 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
7247 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
7248 $erreursParam = $this->get_info_notification_fail();
7249 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
7250 // Ajout de la notif et récupération de son id
7251 $idNotif = $this->ajouter_notification(
7252 $this->valF[$this->clePrimaire],
7253 $this->f->get_connected_user_login_name(),
7254 $demandeurPrincipal,
7255 $collectivite_di,
7256 array(),
7257 true,
7258 'Echec',
7259 implode(' ', $erreursParam)
7260 );
7261 if ($idNotif === false) {
7262 $this->addToMessage(
7263 __('Erreur : la création de la notification a échouée.').
7264 __("Veuillez contacter votre administrateur.")
7265 );
7266 $this->addToLog(
7267 sprintf('%s() : %s', __METHOD__, $msgLog),
7268 DEBUG_MODE
7269 );
7270 return false;
7271 }
7272 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
7273 // de l'échec de la notification
7274 $dossier_message = $this->get_inst_dossier_message(0);
7275 $dossier_message_val = array(
7276 'dossier' => $this->getVal('dossier'),
7277 'type' => _('erreur expedition'),
7278 'emetteur' => $this->f->get_connected_user_login_name(),
7279 'login' => $_SESSION['login'],
7280 'date_emission' => date('Y-m-d H:i:s'),
7281 'contenu' => _('Échec lors de la notification de l\'instruction ').
7282 $ev->getVal('libelle').
7283 '.<br>'.
7284 implode("\n", $erreursParam).
7285 '<br>'.
7286 _('Veuillez corriger ces informations avant de renvoyer la notification.')
7287 );
7288 $add = $dossier_message->add_notification_message($dossier_message_val, true);
7289 // Si une erreur se produit pendant l'ajout
7290 if ($add !== true) {
7291 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
7292 return false;
7293 }
7294 }
7295 }
7296
7297 // Termine le traitement
7298 // Événement
7299 $data['ev'] = $ev;
7300 $data['collectivite_di'] = $collectivite_di;
7301 $this->f->module_manager->run_hooks('finalize_post', $this, $data);
7302 $this->f->log(__METHOD__, 'END');
7303
7304 return $this->end_treatment(__METHOD__, true);
7305 }
7306
7307 /**
7308 * Récupère l'instance de dossier message.
7309 *
7310 * @param string $dossier_message Identifiant du message.
7311 *
7312 * @return object
7313 */
7314 private function get_inst_dossier_message($dossier_message = null) {
7315 //
7316 return $this->get_inst_common("dossier_message", $dossier_message);
7317 }
7318
7319 /**
7320 * Vérifie si le signataire est obligatoire pour finaliser
7321 * le document apartir du paramétrage de l'événement.
7322 * Si c'est le cas, vérifie si il y a bien un signataire
7323 * renseigné.
7324 * Si c'est le cas renvoie true, sinon renvoie false.
7325 *
7326 * @param evenement évenement de l'instruction permettant de
7327 * récupérer le paramétrage
7328 * @return boolean
7329 */
7330 protected function controle_signataire($evenement) {
7331 // Vérifie si le signataire est obligatoire et si c'est le cas
7332 // vérifie si il y a bien un signataire pour le document
7333 if ($evenement->is_signataire_obligatoire() &&
7334 ($this->getVal('signataire_arrete') === null ||
7335 $this->getVal('signataire_arrete') === '')) {
7336 return false;
7337 }
7338 return true;
7339 }
7340
7341 /**
7342 * TREATMENT - unfinalize.
7343 *
7344 * Permet de définaliser un enregistrement.
7345 *
7346 * @param array $val valeurs soumises par le formulaire
7347 *
7348 * @return boolean
7349 */
7350 function unfinalize($val = array()) {
7351
7352 // Cette méthode permet d'exécuter une routine en début des méthodes
7353 // dites de TREATMENT.
7354 $this->begin_treatment(__METHOD__);
7355
7356 // Traitement de la finalisation
7357 $ret = $this->manage_finalizing("unfinalize", $val);
7358
7359 // Si le traitement retourne une erreur
7360 if ($ret !== true) {
7361
7362 // Termine le traitement
7363 return $this->end_treatment(__METHOD__, false);
7364 }
7365
7366 // Termine le traitement
7367 return $this->end_treatment(__METHOD__, true);
7368 }
7369
7370 /**
7371 * VIEW - view_edition
7372 *
7373 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
7374 *
7375 * @return null Si l'action est incorrecte
7376 */
7377 function view_edition() {
7378
7379 // Si l'instruction est finalisée
7380 if($this->getVal("om_final_instruction") == 't'
7381 && $this->getVal("om_final_instruction") != null) {
7382
7383 // Ouvre le document
7384 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
7385 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
7386 //
7387 header("Location: ".$lien);
7388 } else {
7389
7390 // Récupère la collectivite du dossier d'instruction
7391 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7392
7393 //
7394 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7395
7396 // Paramètre du PDF
7397 $params = array(
7398 "watermark" => true,
7399 "specific" => array(
7400 "mode" => "previsualisation",
7401 ),
7402 );
7403 // Si la rédaction libre est activée sur l'instruction
7404 if ($this->getVal("flag_edition_integrale") == 't') {
7405 $params["specific"]["corps"] = array(
7406 "mode" => "set",
7407 "value" => $this->getVal("corps_om_htmletatex"),
7408 );
7409 $params["specific"]["titre"] = array(
7410 "mode" => "set",
7411 "value" => $this->getVal("titre_om_htmletat"),
7412 );
7413 }
7414
7415 // Génération du PDF
7416 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
7417 $result['filename'] = $this->determinate_name_doc_pdf();
7418 // Affichage du PDF
7419 $this->expose_pdf_output(
7420 $result['pdf_output'],
7421 $result['filename']
7422 );
7423 }
7424 }
7425
7426 /**
7427 * Récupère la collectivité du dossier d'instruction.
7428 *
7429 * @param string $dossier_instruction_id Identifiant du DI.
7430 *
7431 * @return integer
7432 */
7433 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7434
7435 // Si l'identifiant n'est pas renseigné
7436 if ($dossier_instruction_id === null) {
7437 // Récupère la valeur
7438 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7439 $dossier_instruction_id = $this->getVal('dossier');
7440 } elseif ($this->getParameter('idxformulaire') !== null
7441 && $this->getParameter('idxformulaire') !== '') {
7442 //
7443 $dossier_instruction_id = $this->getParameter('idxformulaire');
7444 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7445 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7446 //
7447 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7448 }
7449 }
7450
7451 //
7452 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7453 "obj" => "dossier_instruction",
7454 "idx" => $dossier_instruction_id,
7455 ));
7456
7457 //
7458 return $dossier_instruction->getVal('om_collectivite');
7459 }
7460
7461 /**
7462 * VIEW - view_bible
7463 *
7464 * Affiche la bible manuelle.
7465 *
7466 * @return void
7467 */
7468 function view_bible() {
7469 // Vérification de l'accessibilité sur l'élément
7470 $this->checkAccessibility();
7471
7472 /**
7473 * Affichage de la structure HTML
7474 */
7475 //
7476 if ($this->f->isAjaxRequest()) {
7477 //
7478 header("Content-type: text/html; charset=".HTTPCHARSET."");
7479 } else {
7480 //
7481 $this->f->setFlag("htmlonly");
7482 $this->f->display();
7483 }
7484 //
7485 $this->f->displayStartContent();
7486 //
7487 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
7488 $this->f->displayTitle();
7489
7490 /**
7491 *
7492 */
7493 //
7494 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7495 $evenement = intval($evenement);
7496 //
7497 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7498 // Récupération du code du type de DA
7499 $code_da_type = '';
7500 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7501 $code_da_type = $matches[0];
7502 }
7503 //
7504 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7505
7506 // Récupération de la collectivité du dossier
7507 $dossier = $this->f->get_inst__om_dbform(array(
7508 "obj" => "dossier",
7509 "idx" => $idx,
7510 ));
7511
7512 $qres = $this->f->get_all_results_from_db_query(
7513 sprintf(
7514 'SELECT
7515 *,
7516 bible.libelle as bible_lib
7517 FROM
7518 %1$sbible
7519 LEFT OUTER JOIN %1$sdossier_autorisation_type
7520 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7521 LEFT JOIN %1$som_collectivite
7522 ON bible.om_collectivite = om_collectivite.om_collectivite
7523 WHERE
7524 (evenement = %2$d
7525 OR evenement IS NULL)
7526 AND (complement = %3$d
7527 OR complement IS NULL)
7528 AND (bible.dossier_autorisation_type IS NULL
7529 OR dossier_autorisation_type.code = \'%4$s\')
7530 AND (om_collectivite.niveau = \'2\'
7531 OR bible.om_collectivite = %5$d)
7532 ORDER BY
7533 bible_lib ASC',
7534 DB_PREFIXE,
7535 intval($evenement),
7536 intval($complement),
7537 $this->f->db->escapeSimple($code_da_type),
7538 intval($dossier->getVal("om_collectivite"))
7539 ),
7540 array(
7541 'origin' => __METHOD__
7542 )
7543 );
7544 //
7545 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7546 //
7547 if ($qres['row_count'] > 0) {
7548 //
7549 echo "\t<table id='tab-bible' width='100%'>\n";
7550 //
7551 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7552 echo "<th>"._("Choisir")."</th>";
7553 echo "<th>"._("Libelle")."</th>";
7554 echo "</tr>\n";
7555 //
7556 $i = 0;
7557 //
7558 foreach ($qres['result'] as $row) {
7559 //
7560 echo "\t\t<tr";
7561 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7562 echo ">";
7563 //
7564 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7565 // XXX utilisation de l'attribut titre pour afficher une infobulle
7566 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7567 //
7568 echo "</tr>\n";
7569 //
7570 $i++;
7571 }
7572 echo "\t</table>\n";
7573 //
7574 echo "<div class=\"formControls\">\n";
7575 $this->f->layout->display_form_button(array(
7576 "value" => _("Valider"),
7577 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7578 ));
7579 $this->f->displayLinkJsCloseWindow();
7580 echo "</div>\n";
7581
7582 } else {
7583 //
7584 $message_class = "error";
7585 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7586 $this->f->displayMessage($message_class, $message);
7587 //
7588 echo "<div class=\"formControls\">\n";
7589 $this->f->displayLinkJsCloseWindow();
7590 echo "</div>\n";
7591 }
7592 //
7593 echo "</form>\n";
7594
7595 /**
7596 * Affichage de la structure HTML
7597 */
7598 //
7599 $this->f->displayEndContent();
7600 }
7601
7602 /**
7603 * VIEW - view_bible_auto
7604 *
7605 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7606 *
7607 * @return void
7608 */
7609 function view_bible_auto() {
7610 // Vérification de l'accessibilité sur l'élément
7611 $this->checkAccessibility();
7612 //
7613 $this->f->disableLog();
7614
7615 $formatDate="AAAA-MM-JJ";
7616
7617 // Récupération des paramètres
7618 $idx = $this->f->get_submitted_get_value('idx');
7619 $evenement = $this->f->get_submitted_get_value('ev');
7620
7621 // Initialisation de la variable de retour
7622 $retour['complement_om_html'] = '';
7623 $retour['complement2_om_html'] = '';
7624 $retour['complement3_om_html'] = '';
7625 $retour['complement4_om_html'] = '';
7626
7627 // Vérification d'une consultation liée à l'événement
7628 $instEvenement = $this->f->get_inst__om_dbform(array(
7629 "obj" => "evenement",
7630 "idx" => $evenement,
7631 ));
7632
7633 // Si consultation liée, récupération du retour d'avis
7634 if($instEvenement->getVal('consultation') == 'Oui'){
7635
7636 $qres = $this->f->get_all_results_from_db_query(
7637 sprintf(
7638 'SELECT
7639 date_retour,
7640 avis_consultation.libelle as avis_consultation,
7641 COALESCE(service.libelle, tiers_consulte.libelle) as service
7642 FROM
7643 %1$sconsultation
7644 LEFT JOIN %1$stiers_consulte
7645 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7646 LEFT JOIN %1$sservice
7647 ON consultation.service = service.service
7648 LEFT JOIN %1$savis_consultation
7649 ON consultation.avis_consultation = avis_consultation.avis_consultation
7650 WHERE
7651 dossier = \'%2$s\'
7652 AND consultation.visible',
7653 DB_PREFIXE,
7654 $this->f->db->escapeSimple($idx)
7655 ),
7656 array(
7657 'origin' => __METHOD__
7658 )
7659 );
7660 // Récupération des consultations
7661 foreach ($qres['result'] as $row) {
7662 $correct=false;
7663 // date retour
7664 if ($row['date_retour']<>""){
7665 if ($formatDate=="AAAA-MM-JJ"){
7666 $date = explode("-", $row['date_retour']);
7667 // controle de date
7668 if (count($date) == 3 and
7669 checkdate($date[1], $date[2], $date[0])) {
7670 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7671 $correct=true;
7672 }else{
7673 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7674 $correct=false;
7675 }
7676 }
7677 }
7678 //
7679 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7680 if($correct == true){
7681 $temp=$temp." du ".$date_retour_f;
7682 }
7683 // Concaténation des retours d'avis de consultation
7684 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7685 } // while
7686
7687 } // consultation
7688 // Récupération des bibles automatiques pour le champ complement_om_html
7689 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7690 // Récupération des bibles automatiques pour le champ complement2_om_html
7691 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7692 // Récupération des bibles automatiques pour le champ complement3_om_html
7693 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7694 // Récupération des bibles automatiques pour le champ complement4_om_html
7695 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7696
7697
7698
7699 echo json_encode($retour);
7700 }
7701
7702 /**
7703 * VIEW - view_pdf_temp
7704 *
7705 * @return void
7706 */
7707 function view_pdf_temp() {
7708 $this->checkAccessibility();
7709 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7710 $this->f->set_submitted_value();
7711 $merge_fields = array();
7712 //
7713 if (array_key_exists('c1', $_POST) === true) {
7714 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7715 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7716 }
7717 if (array_key_exists('c2', $_POST) === true) {
7718 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7719 }
7720 if (array_key_exists('c3', $_POST) === true) {
7721 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7722 }
7723 if (array_key_exists('c4', $_POST) === true) {
7724 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7725 }
7726 $params = array(
7727 "watermark" => true,
7728 "specific" => array(
7729 "merge_fields" => $merge_fields,
7730 ),
7731 );
7732 //
7733 if (array_key_exists('corps', $_POST) === true) {
7734 $params["specific"]["corps"] = array(
7735 "mode" => "set",
7736 "value" => $_POST['corps'],
7737 );
7738 }
7739 if (array_key_exists('titre', $_POST) === true) {
7740 $params["specific"]["titre"] = array(
7741 "mode" => "set",
7742 "value" => $_POST['titre'],
7743 );
7744 }
7745 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7746 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7747 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7748 $retour = array(
7749 'base' => base64_encode($result['pdf_output']),
7750 );
7751 echo json_encode($retour);
7752 }
7753
7754 /**
7755 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7756 * PDF sans prise en compte de la valeur des compléments et le retourne en
7757 * base 64.
7758 *
7759 * @return string Rendu PDF converti en base 64.
7760 */
7761 function init_pdf_temp() {
7762 $params = array(
7763 "watermark" => true,
7764 );
7765 // Si la rédaction libre est activée sur l'instruction
7766 if ($this->getVal("flag_edition_integrale") == 't') {
7767 $params["specific"]["corps"] = array(
7768 "mode" => "set",
7769 "value" => $this->getVal("corps_om_htmletatex"),
7770 );
7771 $params["specific"]["titre"] = array(
7772 "mode" => "set",
7773 "value" => $this->getVal("titre_om_htmletat"),
7774 );
7775 }
7776 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7777 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7778 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7779
7780 return base64_encode($result['pdf_output']);
7781 }
7782
7783 /**
7784 * Récupération des éléments de bible.
7785 *
7786 * @param integer $event id de l'événement
7787 * @param string $idx id du dossier
7788 * @param integer $compnb numéro du champ complement
7789 * @param string $type types possibles : automatique ou precharge
7790 *
7791 * @return string Chaîne de texte à insérer dans le champ complement
7792 */
7793 function getBible($event, $idx, $compnb, $type = 'automatique') {
7794 // Récupération de la collectivité du dossier
7795 $dossier = $this->f->get_inst__om_dbform(array(
7796 "obj" => "dossier",
7797 "idx" => $idx,
7798 ));
7799 // Récupération du code du type de DA
7800 $code_da_type = '';
7801 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7802 $code_da_type = $matches[0];
7803 }
7804
7805 // Prépare le filtre de la requête selon le type de remplissage voulu
7806 $sql_filter_type = '';
7807 if ($type === 'automatique') {
7808 $sql_filter_type = "AND automatique = 'Oui'";
7809 } elseif ($type === 'precharge') {
7810 $sql_filter_type = "AND precharge IS TRUE";
7811 }
7812
7813 $qres = $this->f->get_all_results_from_db_query(
7814 sprintf(
7815 'SELECT
7816 *
7817 FROM
7818 %1$sbible
7819 LEFT OUTER JOIN %1$sdossier_autorisation_type
7820 ON bible.dossier_autorisation_type =
7821 dossier_autorisation_type.dossier_autorisation_type
7822 LEFT JOIN %1$som_collectivite
7823 ON bible.om_collectivite = om_collectivite.om_collectivite
7824 WHERE
7825 (evenement = %2$d
7826 OR evenement IS NULL)
7827 AND (complement = %3$d
7828 OR complement IS NULL)
7829 AND (dossier_autorisation_type.code = \'%4$s\'
7830 OR bible.dossier_autorisation_type IS NULL)
7831 AND (om_collectivite.niveau = \'2\'
7832 OR bible.om_collectivite = %5$d)
7833 %6$s',
7834 DB_PREFIXE,
7835 intval($event),
7836 intval($compnb),
7837 $this->f->db->escapeSimple($code_da_type),
7838 intval($dossier->getVal("om_collectivite")),
7839 $sql_filter_type
7840 ),
7841 array(
7842 "origin" => __METHOD__
7843 )
7844 );
7845 $temp = "";
7846 foreach ($qres['result'] as $row) {
7847 // Remplacement des retours à la ligne par des br
7848 $temp .= preg_replace(
7849 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7850 );
7851 // Ajout d'un saut de ligne entre chaque bible.
7852 $temp .= '<br/>';
7853 } // fin while
7854 return $temp;
7855 }
7856
7857 /**
7858 * VIEW - view_suivi_bordereaux.
7859 *
7860 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7861 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7862 * collectivité des dossiers affichés.
7863 *
7864 * @return void
7865 */
7866 function view_suivi_bordereaux() {
7867 // Vérification de l'accessibilité sur l'élément
7868 $this->checkAccessibility();
7869
7870 /**
7871 * Validation du formulaire
7872 */
7873 // Si le formulaire a été validé
7874 if ($this->f->get_submitted_post_value("validation") !== null) {
7875 // Si un bordereau à été sélectionné
7876 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7877 // Si aucun bordereau n'a été sélectionné
7878 $message_class = "error";
7879 $message = _("Veuillez selectionner un bordereau.");
7880 }
7881 // Sinon si les dates ne sont pas valide
7882 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7883 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7884 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7885 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7886 // Si aucune date n'a été saisie
7887 $message_class = "error";
7888 $message = _("Veuillez saisir une date valide.");
7889 }
7890 // Sinon si les dates ne sont pas valides
7891 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7892 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7893 // Si aucune date n'a été saisie
7894 $message_class = "error";
7895 $message = _("Erreur de parametrage. Contactez votre administrateur.");
7896 }
7897 // Affiche le message de validation
7898 else {
7899 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7900 $etat = $this->f->get_inst__om_dbform(array(
7901 "obj" => "om_etat",
7902 "idx" => $this->f->get_submitted_post_value("bordereau")
7903 ));
7904 $qres = $this->f->get_one_result_from_db_query(
7905 sprintf(
7906 'SELECT
7907 om_etat.libelle
7908 FROM
7909 %som_etat
7910 WHERE
7911 om_etat.id = \'%s\'',
7912 DB_PREFIXE,
7913 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7914 ),
7915 array(
7916 "origin" => __METHOD__,
7917 )
7918 );
7919
7920 //
7921 $message_class = "valid";
7922 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7923 $message .= " : <br/><br/>";
7924 $message .= "<a class='om-prev-icon pdf-16'";
7925 $message .= " title=\""._("Bordereau")."\"";
7926 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7927 $message .= "&action=220";
7928 $message .= "&idx=0";
7929 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7930 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7931 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7932 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7933 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7934 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7935 }
7936 $message .= "'"." target='_blank'>";
7937 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7938 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7939 $message .= "</a>";
7940 }
7941 }
7942
7943 /**
7944 * Affichage des messages et du formulaire
7945 */
7946 // Affichage du message de validation ou d'erreur
7947 if (isset($message) && isset($message_class) && $message != "") {
7948 $this->f->displayMessage($message_class, $message);
7949 }
7950 // Ouverture du formulaire
7951 printf("\t<form");
7952 printf(" method=\"post\"");
7953 printf(" id=\"suivi_bordereaux_form\"");
7954 printf(" action=\"\"");
7955 printf(">\n");
7956 // Paramétrage des champs du formulaire
7957 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7958 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7959 // collectivité dans le formulaire
7960 if ($_SESSION["niveau"] == 2) {
7961 array_push($champs, "om_collectivite");
7962 }
7963 // Création d'un nouvel objet de type formulaire
7964 $form = $this->f->get_inst__om_formulaire(array(
7965 "validation" => 0,
7966 "maj" => 0,
7967 "champs" => $champs,
7968 ));
7969 // Paramétrage du champ date_bordereau_debut
7970 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7971 $form->setType("date_bordereau_debut", "date");
7972 $form->setTaille("date_bordereau_debut", 12);
7973 $form->setMax("date_bordereau_debut", 12);
7974 $form->setRequired("date_bordereau_debut");
7975 $form->setOnchange("date_bordereau_debut", "fdate(this)");
7976 $form->setVal("date_bordereau_debut", date("d/m/Y"));
7977 // Paramétrage du champ date_bordereau_fin
7978 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7979 $form->setType("date_bordereau_fin", "date");
7980 $form->setTaille("date_bordereau_fin", 12);
7981 $form->setMax("date_bordereau_fin", 12);
7982 $form->setRequired("date_bordereau_fin");
7983 $form->setOnchange("date_bordereau_fin", "fdate(this)");
7984 $form->setVal("date_bordereau_fin", date("d/m/Y"));
7985 // Paramétrage du champ bordereau
7986 $form->setLib("bordereau", _("bordereau"));
7987 $form->setType("bordereau", "select");
7988 $form->setRequired("bordereau");
7989 // Valeurs des champs
7990 if ($this->f->get_submitted_post_value("validation") !== null) {
7991 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7992 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7993 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7994 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7995 }
7996 // Données du select - On récupère ici la liste de tous les états disponibles
7997 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7998 // 'bordereau_'
7999 $qres = $this->f->get_all_results_from_db_query(
8000 sprintf(
8001 'SELECT
8002 om_etat.id,
8003 om_etat.libelle
8004 FROM
8005 %1$som_etat
8006 WHERE
8007 om_etat.id LIKE \'bordereau_%%\'
8008 ORDER BY
8009 om_etat.id',
8010 DB_PREFIXE
8011 ),
8012 array(
8013 "origin" => __METHOD__
8014 )
8015 );
8016 // Données du select
8017 $contenu = array(
8018 0 => array("", ),
8019 1 => array(_("choisir bordereau")),
8020 );
8021 foreach ($qres['result'] as $row) {
8022 $contenu[0][] = $row['id'];
8023 $contenu[1][] = $row['libelle'];
8024 }
8025 $form->setSelect("bordereau", $contenu);
8026 //
8027 if ($_SESSION["niveau"] == 2) {
8028 $form->setLib("om_collectivite", _("collectivite"));
8029 $form->setType("om_collectivite", "select");
8030
8031 // Données du select - On récupère ici la liste de tous toutes les collectivités
8032 // de niveau 1
8033 $qres = $this->f->get_all_results_from_db_query(
8034 sprintf(
8035 'SELECT
8036 om_collectivite,
8037 libelle
8038 FROM
8039 %1$som_collectivite
8040 WHERE
8041 niveau = \'1\'
8042 ORDER BY
8043 libelle',
8044 DB_PREFIXE
8045 ),
8046 array(
8047 "origin" => __METHOD__
8048 )
8049 );
8050 // La valeur par défaut du select est Toutes
8051 $list_collectivites = array(
8052 0 => array("", ),
8053 1 => array(_("toutes"))
8054 );
8055
8056 $id_colls = "";
8057 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
8058 // par des virgules, pour un traitement plus facile dans la requête de sous-état
8059 foreach ($qres['result'] as $row) {
8060 if ($id_colls != "") {
8061 $id_colls .= ",";
8062 }
8063 $id_colls .= $row['om_collectivite'];
8064 $list_collectivites[0][] = $row['om_collectivite'];
8065 $list_collectivites[1][] = $row['libelle'];
8066 }
8067 // On affecte la liste d'identifiants à l'option Toutes
8068 $list_collectivites[0][0] = $id_colls ;
8069 $form->setSelect("om_collectivite", $list_collectivites);
8070 }
8071 // Affichage du formulaire
8072 $form->entete();
8073 $form->afficher($champs, 0, false, false);
8074 $form->enpied();
8075 // Affichage du bouton
8076 printf("\t<div class=\"formControls\">\n");
8077 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8078 printf("\t</div>\n");
8079 // Fermeture du formulaire
8080 printf("\t</form>\n");
8081 }
8082
8083
8084 /**
8085 * VIEW - view_generate_suivi_bordereaux.
8086 *
8087 * Génère et affiche les bordereaux de suivi.
8088 *
8089 * @return [void]
8090 */
8091 function view_generate_suivi_bordereaux() {
8092 // Vérification de l'accessibilité sur l'élément
8093 $this->checkAccessibility();
8094 // Récupération du type de bordereau
8095 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
8096 // Génération du PDF
8097 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
8098 // Affichage du PDF
8099 $this->expose_pdf_output(
8100 $result['pdf_output'],
8101 $result['filename']
8102 );
8103 }
8104
8105
8106 /**
8107 * VIEW - view_suivi_envoi_lettre_rar.
8108 *
8109 * Vue pour imprimer les AR.
8110 *
8111 * @return void
8112 */
8113 function view_suivi_envoi_lettre_rar() {
8114 // Vérification de l'accessibilité sur l'élément
8115 $this->checkAccessibility();
8116
8117 //
8118 if ($this->f->get_submitted_post_value("date") !== null) {
8119 $date = $this->f->get_submitted_post_value("date");
8120 } else {
8121 $date = "";
8122 }
8123 //
8124 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
8125 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
8126 } else {
8127 $liste_code_barres_instruction = "";
8128 }
8129
8130 // Compteur du nombre de page générées
8131 $nbLettres = 0;
8132 // Liste d'id des instructions
8133 $id4Gen = array();
8134 //
8135 $error = "";
8136
8137 // Initialisation du tableau qui va contenir les DI pour lister les liens
8138 $dossierTab = array();
8139 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
8140 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
8141 $hasHidden = true;
8142 // S'il ne peut pas les consulter il aura des dossiers caché
8143 if ($isAccredited === true) {
8144 $hasHidden = false;
8145 }
8146
8147 /**
8148 * Validation du formulaire
8149 */
8150 // Si le formulaire a été validé
8151 if ($this->f->get_submitted_post_value('validation') !== null) {
8152 //
8153 if (empty($date) || empty($liste_code_barres_instruction)) {
8154 //
8155 $message_class = "error";
8156 $message = _("Tous les champs doivent etre remplis.");
8157 } else {
8158 // Création d'un tableau d'instruction
8159 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
8160 //
8161 foreach ($liste as $code_barres) {
8162 // On enlève les éventuels espaces saisis
8163 $code_barres = trim($code_barres);
8164 // Vérification de l'existence de l'instruction
8165 if ($code_barres != "") {
8166 // Si la valeur transmise est numérique
8167 if (is_numeric($code_barres)) {
8168 //
8169 $sql = "SELECT count(*)
8170 FROM ".DB_PREFIXE."instruction
8171 INNER JOIN ".DB_PREFIXE."dossier
8172 ON dossier.dossier=instruction.dossier
8173 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8174 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8175 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8176 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8177 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8178 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8179 INNER JOIN ".DB_PREFIXE."groupe
8180 ON dossier_autorisation_type.groupe = groupe.groupe
8181 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
8182
8183 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8184 $group_clause = array();
8185 foreach ($_SESSION["groupe"] as $key => $value) {
8186 $group_clause[$key] = "(groupe.code = '".$key."'";
8187 if($value["confidentiel"] !== true) {
8188 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8189 }
8190 $group_clause[$key] .= ")";
8191 }
8192 $conditions = implode(" OR ", $group_clause);
8193 $sql .= " AND (" . $conditions . ")";
8194
8195 $qres = $this->f->get_one_result_from_db_query(
8196 $sql,
8197 array(
8198 "origin" => __METHOD__,
8199 )
8200 );
8201
8202 if ($qres['result'] == "1") {
8203 // Récupération de la date d'envoi de l'instruction bippé
8204 $qres = $this->f->get_all_results_from_db_query(
8205 sprintf(
8206 'SELECT
8207 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
8208 instruction
8209 FROM
8210 %1$sinstruction
8211 WHERE
8212 code_barres = \'%2$s\'',
8213 DB_PREFIXE,
8214 $this->f->db->escapeSimple($code_barres)
8215 ),
8216 array(
8217 'origin' => __METHOD__
8218 )
8219 );
8220 $row = array_shift($qres['result']);
8221 // Si pas de date ou correspond à la date du formulaire on
8222 // effectue le traitement
8223 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
8224 $instr = $this->f->get_inst__om_dbform(array(
8225 "obj" => "instruction",
8226 "idx" => $row['instruction'],
8227 ));
8228 $valF = array();
8229 foreach($instr->champs as $id => $champ) {
8230 $valF[$champ] = $instr->val[$id];
8231 }
8232
8233 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
8234 if ($isAccredited === true
8235 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
8236 $dossier = $this->f->get_inst__om_dbform(array(
8237 "obj" => "dossier",
8238 "idx" => $instr->getVal("dossier"),
8239 ));
8240 if ($dossier->is_user_from_allowed_collectivite()){
8241 $dossierTab[$instr->getVal("dossier")] = $dossier;
8242 } else {
8243 $hasHidden = true;
8244 }
8245 }
8246
8247 $valF['date_evenement']=
8248 $instr->dateDBToForm($valF['date_evenement']);
8249 $valF['archive_date_complet']=
8250 $instr->dateDBToForm($valF['archive_date_complet']);
8251 $valF['archive_date_rejet']=
8252 $instr->dateDBToForm($valF['archive_date_rejet']);
8253 $valF['archive_date_limite']=
8254 $instr->dateDBToForm($valF['archive_date_limite']);
8255 $valF['archive_date_notification_delai']=
8256 $instr->dateDBToForm($valF['archive_date_notification_delai']);
8257 $valF['archive_date_decision']=
8258 $instr->dateDBToForm($valF['archive_date_decision']);
8259 $valF['archive_date_validite']=
8260 $instr->dateDBToForm($valF['archive_date_validite']);
8261 $valF['archive_date_achevement']=
8262 $instr->dateDBToForm($valF['archive_date_achevement']);
8263 $valF['archive_date_chantier']=
8264 $instr->dateDBToForm($valF['archive_date_chantier']);
8265 $valF['archive_date_conformite']=
8266 $instr->dateDBToForm($valF['archive_date_conformite']);
8267 $valF['archive_date_dernier_depot']=
8268 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8269 $valF['archive_date_limite_incompletude']=
8270 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8271 $valF['date_finalisation_courrier']=
8272 $instr->dateDBToForm($valF['date_finalisation_courrier']);
8273 $valF['date_envoi_signature']=
8274 $instr->dateDBToForm($valF['date_envoi_signature']);
8275 $valF['date_retour_signature']=
8276 $instr->dateDBToForm($valF['date_retour_signature']);
8277 $valF['date_envoi_rar']=
8278 $instr->dateDBToForm($valF['date_envoi_rar']);
8279 $valF['date_retour_rar']=
8280 $instr->dateDBToForm($valF['date_retour_rar']);
8281 $valF['date_envoi_controle_legalite']=
8282 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8283 $valF['date_retour_controle_legalite']=
8284 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8285 $valF['date_envoi_rar'] = $date;
8286
8287 // Vérification de la finalisation du document
8288 // correspondant au code barres
8289 if($instr->getVal("om_final_instruction") === 't') {
8290 $instr->setParameter('maj', 1);
8291 $instr->class_actions[1]["identifier"] =
8292 "envoi lettre RAR (depuis le menu suivi des pièces)";
8293 if ($instr->modifier($valF) == true) {
8294 $id4Gen[] = $code_barres;
8295 $nbLettres ++;
8296 } else {
8297 //
8298 if ($error != "") {
8299 $error .= "<br/>";
8300 }
8301 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
8302 $code_barres);
8303 $error .= " ";
8304 $error .= _("Veuillez contacter votre administrateur.");
8305 }
8306 } else {
8307 //
8308 if ($error != "") {
8309 $error .= "<br/>";
8310 }
8311 $error .= sprintf(_("Le document correspondant au
8312 code barres %s n'est pas finalise,
8313 le bordereau ne sera pas genere."),
8314 $code_barres);
8315 }
8316
8317 } else {
8318 //
8319 if ($error != "") {
8320 $error .= "<br/>";
8321 }
8322 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
8323 }
8324 } else {
8325 //
8326 if ($error != "") {
8327 $error .= "<br/>";
8328 }
8329 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
8330 }
8331 } else {
8332 //
8333 if ($error != "") {
8334 $error .= "<br/>";
8335 }
8336 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
8337 }
8338 }
8339 }
8340 }
8341 }
8342
8343 /**
8344 * Affichage des messages et du formulaire
8345 */
8346 // Affichage du message de validation ou d'erreur
8347 if (isset($message) && isset($message_class) && $message != "") {
8348 $this->f->displayMessage($message_class, $message);
8349 }
8350 // Affichage du message d'erreur
8351 if(!empty($error)) {
8352 $this->f->displayMessage("error", $error);
8353 }
8354 // Affichage du message de validation de la saisie
8355 if ($nbLettres > 0) {
8356 //
8357 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
8358 echo "\n<p>";
8359 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
8360 echo "\n<span class=\"text\">";
8361 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
8362 echo " : \n<br/><br/>";
8363 echo "\n<a class='om-prev-icon pdf-16'";
8364 echo "\n title=\""._("imprimer les AR")."\"";
8365 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
8366 echo "\n target='_blank'>";
8367 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
8368 echo "\n</a>";
8369 echo "\n</span>";
8370 echo "\n</p>";
8371 echo "\n<br/>\n";
8372 if ($isAccredited === true) {
8373 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
8374 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
8375 echo _('Dossiers concernés par ce traitement');
8376 echo "\n</legend>";
8377 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
8378
8379 if ($hasHidden === true) {
8380 echo "\n<br/>";
8381 echo "\n<p>";
8382 echo "\n<span class='text'>";
8383 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.");
8384 echo "</span>";
8385 echo "\n</p>";
8386 echo "\n<br/>";
8387 }
8388 foreach ($dossierTab as $dossier) {
8389
8390 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
8391 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
8392 $code_datd = $inst_datd->getVal('code');
8393
8394 $obj = "dossier_instruction";
8395 if ($code_datd === 'REC' OR $code_datd === 'REG') {
8396 $obj = "dossier_contentieux_tous_recours";
8397 }
8398 if ($code_datd === 'IN') {
8399 $obj = "dossier_contentieux_toutes_infractions";
8400 }
8401
8402 echo "\n<div class=\"bloc group\">";
8403 echo "\n<div class=\"field field-type-text\">";
8404
8405 echo "\n<p>";
8406 echo "\n<span class='text'>";
8407 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
8408 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
8409 echo $dossier->getVal("dossier");
8410 echo "\">";
8411 echo "\n</a>";
8412
8413 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
8414 echo " href=\"".OM_ROUTE_FORM."&obj=";
8415 echo $obj;
8416 echo "&action=3&idx=";
8417 echo $dossier->getVal("dossier");
8418 echo "\">";
8419 echo $dossier->getVal("dossier_libelle");
8420 echo "\n</a>";
8421 echo "\n</span>";
8422 echo "\n</p>";
8423
8424 echo "\n</div>";
8425 echo "\n</div>";
8426 }
8427 echo "\n</div>";
8428 echo "\n</fieldset>";
8429 }
8430 echo "\n</div>";
8431 echo "\n</div>";
8432 }
8433 // Ouverture du formulaire
8434 echo "\t<form";
8435 echo " method=\"post\"";
8436 echo " id=\"suivi_envoi_lettre_rar_form\"";
8437 echo " action=\"\"";
8438 echo ">\n";
8439 // Paramétrage des champs du formulaire
8440 $champs = array("date", "liste_code_barres_instruction");
8441 // Création d'un nouvel objet de type formulaire
8442 $form = $this->f->get_inst__om_formulaire(array(
8443 "validation" => 0,
8444 "maj" => 0,
8445 "champs" => $champs,
8446 ));
8447 // Paramétrage du champ date du formulaire
8448 $form->setLib("date", _("Date")."* :");
8449 $form->setType("date", "date");
8450 $form->setOnchange("date", "fdate(this)");
8451 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8452 $form->setTaille("date", 10);
8453 $form->setMax("date", 10);
8454 // Paramétrage du champ liste_code_barres_instruction du formulaire
8455 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
8456 $form->setType("liste_code_barres_instruction", "textarea");
8457 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8458 $form->setTaille("liste_code_barres_instruction", 20);
8459 $form->setMax("liste_code_barres_instruction", 20);
8460 // Affichage du formulaire
8461 $form->entete();
8462 $form->afficher($champs, 0, false, false);
8463 $form->enpied();
8464 // Affichage du bouton
8465 echo "\t<div class=\"formControls\">\n";
8466 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8467 echo "\t</div>\n";
8468 // Fermeture du formulaire
8469 echo "\t</form>\n";
8470 }
8471
8472 /**
8473 * VIEW - view_suivi_mise_a_jour_des_dates.
8474 *
8475 * Vu pour mettre à jour les dates de suivi de l'instruction.
8476 *
8477 * @return void
8478 */
8479 function view_suivi_mise_a_jour_des_dates() {
8480 // Vérification de l'accessibilité sur l'élément
8481 $this->checkAccessibility();
8482
8483 // Récupération des valeur passées en POST ou GET
8484 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8485 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8486 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8487 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8488 } else {
8489 $type_mise_a_jour = "";
8490 }
8491 if($this->f->get_submitted_post_value('date') !== null) {
8492 $date = $this->f->get_submitted_post_value('date');
8493 } elseif($this->f->get_submitted_get_value('date') !== null) {
8494 $date = $this->f->get_submitted_get_value('date');
8495 } else {
8496 $date = "";
8497 }
8498 if($this->f->get_submitted_post_value('code_barres') !== null) {
8499 $code_barres = $this->f->get_submitted_post_value('code_barres');
8500 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8501 $code_barres = $this->f->get_submitted_get_value('code_barres');
8502 } else {
8503 $code_barres = "";
8504 }
8505 // Booléen permettant de définir si un enregistrement à eu lieu
8506 $correct = false;
8507 // Booléen permettant de définir si les dates peuvent êtres enregistrées
8508 $date_error = false;
8509 // Champs date à mettre à jour
8510 $liste_champs=array();
8511
8512 // Si le formulaire a été validé
8513 if ($this->f->get_submitted_post_value('validation') !== null) {
8514 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8515
8516 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8517 $group_clause = array();
8518 foreach ($_SESSION["groupe"] as $key => $value) {
8519 $group_clause[$key] = "(groupe.code = '".$key."'";
8520 if($value["confidentiel"] !== true) {
8521 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8522 }
8523 $group_clause[$key] .= ")";
8524 }
8525 $conditions = implode(" OR ", $group_clause);
8526 $groupFilter = " AND (" . $conditions . ")";
8527
8528 $qres = $this->f->get_all_results_from_db_query(
8529 sprintf(
8530 'SELECT
8531 instruction
8532 FROM
8533 %1$sinstruction
8534 INNER JOIN %1$sdossier
8535 ON dossier.dossier = instruction.dossier
8536 INNER JOIN %1$sdossier_instruction_type
8537 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8538 INNER JOIN %1$sdossier_autorisation_type_detaille
8539 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8540 INNER JOIN %1$sdossier_autorisation_type
8541 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8542 INNER JOIN %1$sgroupe
8543 ON dossier_autorisation_type.groupe = groupe.groupe
8544 WHERE
8545 code_barres = \'%2$s\'
8546 %3$s',
8547 DB_PREFIXE,
8548 $this->f->db->escapeSimple($code_barres),
8549 $groupFilter
8550 ),
8551 array(
8552 'origin' => __METHOD__
8553 )
8554 );
8555 if($qres['row_count'] === 1) {
8556 $liste_champs = explode(";", $type_mise_a_jour);
8557 $row = array_shift($qres['result']);
8558 $instr = $this->f->get_inst__om_dbform(array(
8559 "obj" => "instruction",
8560 "idx" => $row['instruction'],
8561 ));
8562 // Mise à jour des dates après l'écran de verification
8563 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8564 $valF = array();
8565 foreach($instr->champs as $id => $champ) {
8566 $valF[$champ] = $instr->val[$id];
8567 }
8568 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8569 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8570 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8571 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8572 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8573 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8574 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8575 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8576 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8577 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8578 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8579 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8580 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8581 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8582 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8583 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8584 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8585 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8586 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8587 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8588 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8589 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8590 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8591 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8592 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8593 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8594
8595 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8596 $valF[$maj_date]=$date;
8597 }
8598
8599 // Vérification de la finalisation du document
8600 // correspondant au code barres
8601 if($valF["om_final_instruction"] === 't' or
8602 $valF["lettretype"] == '') {
8603 $code_barres = "";
8604
8605 //Désactivation de l'autocommit
8606 $this->f->db->autoCommit(false);
8607
8608 //On modifie les valeurs de l'instruction
8609 $instr->setParameter('maj', 170);
8610 $instr->class_actions[170]["identifier"] =
8611 "mise à jour des dates (depuis le menu suivi des pièces)";
8612 $retour = $instr->modifier($valF);
8613
8614 //Si une erreur s'est produite, on défait les modifications
8615 //qui ont été faites
8616 if (!$retour){
8617 $instr->undoValidation();
8618 }
8619 //Sinon, on valide en base de données les modifications
8620 else {
8621 $this->f->db->commit();
8622 }
8623
8624 // Variable correct retourné depuis la classe instruction
8625 $correct = $instr->correct;
8626
8627 // Si la modification sur l'instruction a échoué
8628 if ($correct === false) {
8629
8630 // Message d'erreur de la classe instruction
8631 $error = $instr->msg;
8632 }
8633
8634 } else {
8635 // Indique que le traitement est en erreur
8636 $correct = false;
8637 // Message d'erreur
8638 $error = sprintf(_("Le document n'est pas finalise."),
8639 "<span class='bold'>".$code_barres."</span>");
8640 }
8641 } else {
8642 // Récupération des infos du dossier
8643 $qres = $this->f->get_all_results_from_db_query(
8644 sprintf(
8645 'SELECT
8646 dossier.dossier_libelle,
8647 evenement.libelle as evenement,
8648 autorite_competente.code as autorite_competente_code,
8649 autorite_competente.libelle as autorite_competente,
8650 evenement.type as evenement_type,
8651 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8652 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8653 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8654 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8655 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8656 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8657 FROM
8658 %1$sinstruction
8659 INNER JOIN %1$sdossier
8660 ON dossier.dossier=instruction.dossier
8661 LEFT JOIN %1$sautorite_competente
8662 ON dossier.autorite_competente=autorite_competente.autorite_competente
8663 INNER JOIN %1$sevenement
8664 ON instruction.evenement=evenement.evenement
8665 WHERE
8666 code_barres = \'%2$s\'',
8667 DB_PREFIXE,
8668 $this->f->db->escapeSimple($code_barres)
8669 ),
8670 array(
8671 "origin" => __METHOD__
8672 )
8673 );
8674 $infos = array_shift($qres['result']);
8675
8676 // Vérification de la non modification des dates de suivi
8677 foreach(explode(";", $type_mise_a_jour) as $champ) {
8678 if ($champ === 'date_envoi_controle_legalite') {
8679 if ($instr->is_sent_to_cl() === true) {
8680 $error = __("Les dates de suivis ne peuvent etre modifiees");
8681 $date_error = true;
8682 break;
8683 }
8684 }
8685 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8686 $error = _("Les dates de suivis ne peuvent etre modifiees");
8687 $date_error = true;
8688 break;
8689 }
8690 }
8691 }
8692 } else {
8693 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8694 }
8695
8696 } else {
8697 $error = _("Tous les champs doivent etre remplis.");
8698 }
8699 }
8700
8701 /**
8702 * Affichage des messages et du formulaire
8703 */
8704 // Affichage du message de validation ou d'erreur
8705 if (isset($message) && isset($message_class) && $message != "") {
8706 $this->f->displayMessage($message_class, $message);
8707 }
8708 // Affichage du message d'erreur
8709 if(!empty($error)) {
8710 $this->f->displayMessage("error", $error);
8711 }
8712
8713 // Affichage du message de validation de la saisie
8714 if($correct === true) {
8715 $this->f->displayMessage("ok", _("Saisie enregistree"));
8716 }
8717 // Ouverture du formulaire
8718 echo "\t<form";
8719 echo " method=\"post\"";
8720 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8721 echo " action=\"\"";
8722 echo ">\n";
8723 // Paramétrage des champs du formulaire
8724 if(isset($infos)) {
8725 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8726 , "autorite_competente", "date_envoi_signature",
8727 "date_retour_signature", "date_envoi_controle_legalite",
8728 "date_retour_controle_legalite", "date_envoi_rar",
8729 "date_retour_rar", "is_valid");
8730 } else {
8731 $champs = array("type_mise_a_jour", "date", "code_barres");
8732 }
8733 // Création d'un nouvel objet de type formulaire
8734 $form = $this->f->get_inst__om_formulaire(array(
8735 "validation" => 0,
8736 "maj" => 0,
8737 "champs" => $champs,
8738 ));
8739 // Paramétrage des champs du formulaire
8740 // Parametrage du champ type_mise_a_jour
8741 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8742 if(isset($infos)) {
8743 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8744
8745 } else {
8746 $form->setType("type_mise_a_jour", "select");
8747
8748 }
8749 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8750 $contenu = array();
8751
8752 $contenu[0][0] = "date_envoi_signature";
8753 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8754
8755 $contenu[0][1] = "date_retour_signature";
8756 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8757
8758 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8759 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8760
8761 $contenu[0][3] = "date_envoi_controle_legalite";
8762 $contenu[1][3] = _("date d'envoi au controle de legalite");
8763
8764 $contenu[0][4] = "date_retour_controle_legalite";
8765 $contenu[1][4] = _("date de retour de controle de legalite");
8766
8767 $contenu[0][5] = "date_retour_rar";
8768 $contenu[1][5] = __("date de notification du correspondant");
8769
8770 $form->setSelect("type_mise_a_jour", $contenu);
8771
8772 // Parametrage du champ date
8773 $form->setLib("date", _("Date")."* :");
8774 if(isset($infos)) {
8775 $form->setType("date", "hiddenstaticdate");
8776
8777 } else {
8778 $form->setType("date", "date");
8779 }
8780 $form->setVal("date", $date);
8781 $form->setTaille("date", 10);
8782 $form->setMax("date", 10);
8783
8784 // Parametrage du champ code_barres
8785 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8786 if(isset($infos)) {
8787 $form->setType("code_barres", "hiddenstatic");
8788 } else {
8789 $form->setType("code_barres", "text");
8790 }
8791 $form->setVal("code_barres", $code_barres);
8792 $form->setTaille("code_barres", 20);
8793 $form->setMax("code_barres", 20);
8794
8795 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8796 if(isset($infos)) {
8797
8798 // Tous les champs sont défini par defaut à static
8799 foreach ($infos as $key => $value) {
8800 $form->setType($key, "static");
8801 if(in_array($key, $liste_champs)) {
8802 $form->setVal($key, $date);
8803 } else {
8804 $form->setVal($key, $value);
8805 }
8806 }
8807
8808 // Les champs dont on viens de définir la valeur sont en gras
8809 foreach ($liste_champs as $value) {
8810 $form->setBloc($value,'DF',"",'bold');
8811 }
8812
8813 // Parametrage du champ dossier
8814 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8815 $form->setType("dossier_libelle", "static");
8816 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8817
8818 // Parametrage du champ evenement
8819 $form->setLib("evenement", _("evenement")." :");
8820 $form->setType("evenement", "static");
8821 $form->setVal("evenement", $infos['evenement']);
8822
8823 // Parametrage du champ autorite_competente
8824 $form->setLib("autorite_competente", _("Autorite competente")." :");
8825 $form->setType("autorite_competente", "static");
8826 $form->setVal("autorite_competente", $infos['autorite_competente']);
8827
8828 // Parametrage des libellés d'envoi avec AR
8829 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8830 $form->setLib("date_retour_rar", __("date_notification")." :");
8831
8832 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8833 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8834 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8835 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8836 // Configuration des libellé en fonction de l'autorité compétente
8837 if($infos['autorite_competente_code'] == 'ETAT') {
8838 $form->setType("date_envoi_controle_legalite", "hiddendate");
8839 $form->setType("date_retour_controle_legalite", "hiddendate");
8840 }
8841
8842 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8843 $form->setLib("is_valid", _("Valide")." :");
8844 $form->setType("is_valid", "hidden");
8845 $form->setVal("is_valid", 'true');
8846
8847 $form->setFieldset('dossier_libelle','D',_('Synthese'));
8848 $form->setFieldset('is_valid','F');
8849
8850 }
8851
8852
8853 // Création du fieldset regroupant les champs permettant la mise à jour des date
8854 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8855 $form->setFieldset('code_barres','F');
8856 // Affichage du formulaire
8857 $form->entete();
8858 $form->afficher($champs, 0, false, false);
8859 $form->enpied();
8860 // Affichage du bouton
8861 echo "\t<div class=\"formControls\">\n";
8862 //
8863 if(!$date_error) {
8864 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8865 }
8866 // Si pas sur l'écran de validation
8867 if(isset($infos)) {
8868 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8869 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8870 echo "\">Retour</a>";
8871 }
8872 echo "\t</div>\n";
8873 // Fermeture du formulaire
8874 echo "\t</form>\n";
8875 }
8876
8877 /**
8878 * [view_pdf_lettre_rar description]
8879 *
8880 * @return [type] [description]
8881 */
8882 function view_pdf_lettre_rar() {
8883 // Vérification de l'accessibilité sur l'élément
8884 $this->checkAccessibility();
8885 //
8886 $this->f->disableLog();
8887
8888 if($this->f->get_submitted_get_value('liste') != null) {
8889 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8890
8891 // Classe permettant la mise en page de l'édition pdf
8892 require_once "../obj/pdf_lettre_rar.class.php";
8893 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8894 // Initialisation de la mise en page
8895 $pdf_lettre_rar->init($this->f);
8896
8897 foreach ($listeCodeBarres as $code_barres) {
8898
8899 // On récupère le dossier
8900 $qres = $this->f->get_one_result_from_db_query(
8901 sprintf(
8902 'SELECT
8903 dossier
8904 FROM
8905 %1$sinstruction
8906 WHERE
8907 code_barres = \'%2$s\'',
8908 DB_PREFIXE,
8909 $this->f->db->escapeSimple($code_barres)
8910 ),
8911 array(
8912 "origin" => __METHOD__,
8913 )
8914 );
8915
8916 $inst_dossier = $this->f->get_inst__om_dbform(array(
8917 "obj" => "dossier",
8918 "idx" => $qres['result'],
8919 ));
8920
8921 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8922 $groupe = $inst_dossier->get_type_affichage_formulaire();
8923 switch ($groupe) {
8924 case 'CTX IN':
8925 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8926 break;
8927 case 'CTX RE':
8928 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8929 break;
8930 case 'ADS':
8931 case 'DPC':
8932 case 'CONSULTATION ENTRANTE':
8933 default:
8934 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8935 break;
8936 }
8937
8938 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8939 $qres = $this->f->get_all_results_from_db_query(
8940 sprintf(
8941 'SELECT
8942 dossier.dossier_libelle,
8943 evenement.type,
8944 count(lien_dossier_demandeur) as nbdemandeur,
8945 CASE
8946 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8947 THEN CONCAT(phase.code, \' - \', division.libelle)
8948 ELSE
8949 phase.code
8950 END AS code_phase
8951 FROM
8952 %1$sinstruction
8953 LEFT JOIN %1$sdossier
8954 ON instruction.dossier = dossier.dossier
8955 LEFT JOIN %1$sdivision
8956 ON dossier.division = division.division
8957 INNER JOIN %1$sevenement
8958 ON instruction.evenement=evenement.evenement
8959 LEFT JOIN %1$sphase
8960 ON evenement.phase = phase.phase
8961 inner JOIN %1$slien_dossier_demandeur
8962 ON instruction.dossier=lien_dossier_demandeur.dossier
8963 inner join %1$sdemandeur
8964 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8965 WHERE
8966 code_barres = \'%2$s\'
8967 AND %3$s
8968 GROUP BY
8969 dossier.dossier_libelle,
8970 evenement.type,
8971 phase.code,
8972 division.libelle',
8973 DB_PREFIXE,
8974 $this->f->db->escapeSimple($code_barres),
8975 $sql_demandeur
8976 ),
8977 array(
8978 "origin" => __METHOD__
8979 )
8980 );
8981 $testDemandeur = array_shift($qres['result']);
8982
8983
8984 // Recuperation de l'adresse de destination
8985 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8986 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8987 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8988 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8989 }
8990
8991 $qres = $this->f->get_all_results_from_db_query(
8992 sprintf(
8993 'SELECT
8994 CASE WHEN demandeur.qualite = \'particulier\'
8995 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8996 ELSE TRIM(demandeur.personne_morale_denomination)
8997 END as ligne1,
8998 CASE WHEN demandeur.qualite = \'personne_morale\'
8999 THEN TRIM(demandeur.personne_morale_raison_sociale)
9000 ELSE \'\'
9001 END as ligne1_1,
9002 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
9003 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
9004 ELSE \'\'
9005 END as ligne1_2,
9006 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
9007 CASE demandeur.complement
9008 WHEN null THEN \'\'
9009 ELSE trim(demandeur.complement)
9010 END as ligne3,
9011 CASE demandeur.lieu_dit
9012 WHEN null THEN \'\'
9013 ELSE trim(demandeur.lieu_dit)
9014 END as ligne4,
9015 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
9016 (CASE WHEN demandeur.bp IS NOT NULL
9017 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
9018 ELSE \'\'
9019 END),
9020 (CASE WHEN demandeur.cedex IS NOT NULL
9021 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
9022 ELSE \'\'
9023 END))
9024 as ligne5,
9025 code_barres as code_barres
9026 FROM
9027 %1$sinstruction
9028 INNER JOIN %1$sdossier
9029 ON dossier.dossier = instruction.dossier
9030 INNER JOIN %1$slien_dossier_demandeur
9031 ON dossier.dossier = lien_dossier_demandeur.dossier
9032 INNER JOIN %1$sdemandeur
9033 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9034 LEFT OUTER JOIN %1$scivilite AS pc
9035 ON demandeur.particulier_civilite = pc.civilite
9036 OR demandeur.personne_morale_civilite = pc.civilite
9037 WHERE
9038 instruction.code_barres = \'%2$s\'
9039 %3$s',
9040 DB_PREFIXE,
9041 $this->f->db->escapeSimple($code_barres),
9042 $sqlAdresse
9043 ),
9044 array(
9045 "origin" => __METHOD__
9046 )
9047 );
9048 $adresse_dest = array_shift($qres['result']);
9049
9050 // Création adresse destinataire sans ligne vide
9051 $adresse_destinataire = array();
9052 if (!empty($adresse_dest['ligne1'])) {
9053 $adresse_destinataire[] = $adresse_dest['ligne1'];
9054 }
9055 if (!empty($adresse_dest['ligne1_1'])) {
9056 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
9057 }
9058 if (!empty($adresse_dest['ligne1_2'])) {
9059 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
9060 }
9061 $adresse_destinataire[] = $adresse_dest['ligne2'];
9062 if (!empty($adresse_dest['ligne3'])) {
9063 $adresse_destinataire[] = $adresse_dest['ligne3'];
9064 }
9065 if (!empty($adresse_dest['ligne4'])) {
9066 $adresse_destinataire[] = $adresse_dest['ligne4'];
9067 }
9068 $adresse_destinataire[] = $adresse_dest['ligne5'];
9069
9070 // Création du champ specifique
9071 $specifique_content = array();
9072 $specifique_content[] = $adresse_dest['ligne1'];
9073 $specifique_content[] = $adresse_dest['ligne1_1'];
9074 $specifique_content[] = $adresse_dest['ligne1_2'];
9075 $specifique_content[] = $testDemandeur['dossier_libelle'];
9076 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
9077 unset($adresse_dest['code_barres']);
9078 // Ajout d'une page aux pdf
9079 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
9080
9081 }
9082 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
9083 $om_edition = $this->f->get_inst__om_edition();
9084 $om_edition->set_object_linked($this);
9085 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
9086 }
9087 }
9088
9089 /**
9090 * VIEW - view_bordereau_envoi_maire.
9091 *
9092 * Formulaire demandant :
9093 * - le code-barres de l'événement d'instruction
9094 * - la date d'envoi du courrier pour signature par le maire
9095 *
9096 * Lors de la validation :
9097 * => met à jour cette date dans l'événement d'instruction
9098 * => crée un lien permettant de générer en PDF le bordereau
9099 *
9100 * @return void
9101 */
9102 function view_bordereau_envoi_maire() {
9103 // Vérification de l'accessibilité sur l'élément
9104 $this->checkAccessibility();
9105
9106 // Récupération des valeur passées en POST ou GET
9107 $code_barres = "";
9108 if($this->f->get_submitted_post_value('code_barres') !== null) {
9109 $code_barres = $this->f->get_submitted_post_value('code_barres');
9110 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
9111 $code_barres = $this->f->get_submitted_get_value('code_barres');
9112 }
9113 $date = "";
9114 if($this->f->get_submitted_post_value('date') !== null) {
9115 $date = $this->f->get_submitted_post_value('date');
9116 } elseif($this->f->get_submitted_get_value('date') !== null) {
9117 $date = $this->f->get_submitted_get_value('date');
9118 }
9119 $validation = 0;
9120 if($this->f->get_submitted_post_value('validation') !== null) {
9121 $validation = $this->f->get_submitted_post_value('validation');
9122 } elseif($this->f->get_submitted_get_value('validation') !== null) {
9123 $validation = $this->f->get_submitted_get_value('validation');
9124 }
9125
9126 // Si le formulaire a été validé
9127 if ($this->f->get_submitted_post_value('validation') !== null) {
9128 // Tous les champs doivent obligatoirement être remplis
9129 if (!empty($date) && !empty($code_barres)) {
9130 $date_en = $this->dateDB($date);
9131 // Si date valide
9132 if ($date_en != "") {
9133 $id_instruction = $this->get_instruction_by_barcode($code_barres);
9134 // Si un événement d'instruction a été trouvé pour ce code-barres
9135 if ($id_instruction !== null) {
9136 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
9137 // Si mise à jour réussie de la date d'envoi du courrier
9138 // pour signature par l'autorité compétente
9139 if($ret === true) {
9140 // Message de validation avec lien PDF
9141 $message_class = "valid";
9142 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
9143 $message .= " : <br/><br/>";
9144 $message .= "<a class='om-prev-icon pdf-16'";
9145 $message .= " id=\"generer_bordereau_envoi_maire\"";
9146 $message .= " title=\""._("Bordereau")."\"";
9147 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
9148 $message .= "&action=200";
9149 $message .= "&idx=".$id_instruction."'";
9150 $message .= " target='_blank'>";
9151 $message .= _("Bordereau d'envoi au maire");
9152 $message .= "</a><br/><br/>";
9153 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
9154 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
9155 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
9156
9157 } else {
9158 // Message d'erreur
9159 $message_class = "error";
9160 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
9161 $code_barres);
9162 }
9163 }
9164 else {
9165 $message_class = "error";
9166 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
9167 }
9168 }
9169 else {
9170 $message_class = "error";
9171 $message = _("La date est invalide.");
9172 }
9173 } else {
9174 $message_class = "error";
9175 $message = _("Tous les champs doivent etre remplis.");
9176 }
9177 }
9178
9179 /**
9180 * Affichage des messages et du formulaire
9181 */
9182
9183 // Affichage du message de validation ou d'erreur
9184 if (isset($message) && isset($message_class) && $message != "") {
9185 $this->f->displayMessage($message_class, $message);
9186 }
9187
9188 // Ouverture du formulaire
9189 $datasubmit = $this->getDataSubmit();
9190 echo "\n<!-- ########## START DBFORM ########## -->\n";
9191 echo "<form";
9192 echo " id=\"bordereau_envoi_maire\"";
9193 echo " method=\"post\"";
9194 echo " name=\"f1\"";
9195 echo " action=\"";
9196 echo $datasubmit;
9197 echo "\"";
9198 echo ">\n";
9199
9200 // Paramétrage des champs du formulaire
9201 $champs = array("code_barres","date");
9202
9203 // Création d'un nouvel objet de type formulaire
9204 $form = $this->f->get_inst__om_formulaire(array(
9205 "validation" => 0,
9206 "maj" => 0,
9207 "champs" => $champs,
9208 ));
9209
9210 $template_required_label = '%s *';
9211 // Parametrage du champ code_barres
9212 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
9213 $form->setType("code_barres", "text");
9214 $form->setVal("code_barres", $code_barres);
9215 $form->setTaille("code_barres", 20);
9216 $form->setMax("code_barres", 20);
9217 // Parametrage du champ date
9218 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
9219 $form->setType("date", "date") ;
9220 if (empty($date)) {
9221 $date = date('d/m/Y');
9222 }
9223 $form->setVal("date", $date);
9224 $form->setTaille("date", 10);
9225 $form->setMax("date", 10);
9226
9227 // Création du bloc regroupant les champs
9228 $form->setBloc('code_barres','D');
9229 $form->setBloc('date','F');
9230 // Affichage du formulaire
9231 $form->entete();
9232 $form->afficher($champs, 0, false, false);
9233 $form->enpied();
9234 // Affichage du bouton
9235 printf("\t<div class=\"formControls\">\n");
9236 //
9237 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
9238 printf("\t</div>\n");
9239 // Fermeture du formulaire
9240 printf("\t</form>\n");
9241 }
9242
9243 /**
9244 * VIEW - view_bordereau_envoi_maire.
9245 *
9246 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
9247 *
9248 * @return [void]
9249 */
9250 function view_generate_bordereau_envoi_maire() {
9251 // Vérification de l'accessibilité sur l'élément
9252 $this->checkAccessibility();
9253 // Récupération de la collectivité du dossier d'instruction
9254 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
9255 // Récupération de ses paramètres
9256 $collectivite = $this->f->getCollectivite($collectivite_di);
9257 // Génération du PDF
9258 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
9259 // Affichage du PDF
9260 $this->expose_pdf_output(
9261 $result['pdf_output'],
9262 $result['filename']
9263 );
9264 }
9265
9266 /**
9267 * VIEW - view_rapport_instruction.
9268 *
9269 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
9270 * Cette action est bindée pour utiliser la fonction popUpIt.
9271 *
9272 * @return void
9273 */
9274 function view_overlay_notification_manuelle() {
9275
9276 // Vérification de l'accessibilité sur l'élément
9277 $this->checkAccessibility();
9278
9279 printf(
9280 '<script type="text/javascript" >
9281 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
9282 </script>',
9283 'instruction_notification_manuelle',
9284 OM_ROUTE_SOUSFORM,
9285 $this->getVal($this->clePrimaire),
9286 $this->getVal('dossier')
9287 );
9288 }
9289
9290 /**
9291 * VIEW - view_overlay_notification_service_consulte.
9292 *
9293 * Ouvre le sous-formulaire de notification des services consulte
9294 * en ajaxIt dans un overlay.
9295 * Cette action est bindée pour utiliser la fonction popUpIt.
9296 *
9297 * @return void
9298 */
9299 function view_overlay_notification_service_consulte() {
9300
9301 // Vérification de l'accessibilité sur l'élément
9302 $this->checkAccessibility();
9303
9304 printf(
9305 '<script type="text/javascript" >
9306 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
9307 </script>',
9308 'instruction_notification_manuelle',
9309 OM_ROUTE_SOUSFORM,
9310 $this->getVal($this->clePrimaire),
9311 $this->getVal('dossier')
9312 );
9313 }
9314
9315 /**
9316 * VIEW - overlay_notification_tiers_consulte.
9317 *
9318 * Ouvre le sous-formulaire de notification des tiers consulte
9319 * en ajaxIt dans un overlay.
9320 * Cette action est bindée pour utiliser la fonction popUpIt.
9321 *
9322 * @return void
9323 */
9324 function view_overlay_notification_tiers_consulte() {
9325
9326 // Vérification de l'accessibilité sur l'élément
9327 $this->checkAccessibility();
9328
9329 printf(
9330 '<script type="text/javascript" >
9331 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
9332 </script>',
9333 'instruction_notification_manuelle',
9334 OM_ROUTE_SOUSFORM,
9335 $this->getVal($this->clePrimaire),
9336 $this->getVal('dossier')
9337 );
9338 }
9339
9340 /**
9341 * VIEW - view_modale_selection_document_signe
9342 *
9343 * Ouvre le sous-formulaire de notification des services consulte
9344 * en ajaxIt dans un overlay.
9345 * Cette action est bindée pour utiliser la fonction popUpIt.
9346 *
9347 * @return void
9348 */
9349 function view_modale_selection_document_signe() {
9350
9351 // Vérification de l'accessibilité sur l'élément
9352 $this->checkAccessibility();
9353
9354 printf(
9355 '<script type="text/javascript" >
9356 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
9357 </script>',
9358 'instruction_modale',
9359 OM_ROUTE_SOUSFORM,
9360 $this->getVal($this->clePrimaire),
9361 $this->getVal('dossier')
9362 );
9363 }
9364
9365 /**
9366 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
9367 * pour exclure les dossiers du groupe contentieux.
9368 *
9369 * @param [string] $barcode numéro du code-barres
9370 * @return [mixed] ID de son instruction ou null si aucun code
9371 */
9372 function get_instruction_by_barcode($barcode) {
9373 // Begin
9374 $this->begin_treatment(__METHOD__);
9375
9376 // Vérification de l'existence de l'événement d'instruction
9377 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
9378 $qres = $this->f->get_one_result_from_db_query(
9379 sprintf(
9380 'SELECT
9381 instruction
9382 FROM
9383 %1$sinstruction
9384 INNER JOIN %1$sdossier
9385 ON dossier.dossier=instruction.dossier
9386 INNER JOIN %1$sdossier_instruction_type
9387 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
9388 INNER JOIN %1$sdossier_autorisation_type_detaille
9389 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
9390 INNER JOIN %1$sdossier_autorisation_type
9391 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
9392 INNER JOIN %1$sgroupe
9393 ON dossier_autorisation_type.groupe = groupe.groupe
9394 AND groupe.code != \'CTX\'
9395 WHERE
9396 code_barres = \'%2$s\'',
9397 DB_PREFIXE,
9398 $this->f->db->escapeSimple($barcode)
9399 ),
9400 array(
9401 "origin" => __METHOD__,
9402 )
9403 );
9404
9405 // Retourne résultat
9406 return $this->end_treatment(__METHOD__, $qres['result']);
9407 }
9408
9409 /**
9410 * Met à jour le champ date d'envoi signature
9411 * avec la date fournie et pour l'instruction donnée
9412 *
9413 * @param [string] $id ID de l'événement d'instruction
9414 * @param [string] $date date au format EN
9415 * @return [boolean] true si mise à jour avec succès
9416 */
9417 function update_date_envoi_signature($id, $date) {
9418 // Préparation du tableau
9419 $valF = array();
9420 $valF['date_envoi_signature'] = $date;
9421 // Begin
9422 $this->begin_treatment(__METHOD__);
9423 // Requête
9424 $res = $this->f->db->autoexecute(
9425 DB_PREFIXE.$this->table,
9426 $valF,
9427 DB_AUTOQUERY_UPDATE,
9428 $this->getCle($id)
9429 );
9430 $this->addToLog(
9431 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9432 VERBOSE_MODE
9433 );
9434 if ($this->f->isDatabaseError($res, true) !== false) {
9435 $this->end_treatment(__METHOD__, false);
9436 }
9437 //
9438 return $this->end_treatment(__METHOD__, true);
9439 }
9440
9441 /**
9442 * Méthode permettant de définir des valeurs à envoyer en base après
9443 * validation du formulaire d'ajout.
9444 * @param array $val tableau des valeurs retournées par le formulaire
9445 */
9446 function setValFAjout($val = array()) {
9447 // Mise à jour du flag created_by_commune lors d'un changement de décision
9448 // par un utilisateur de commune sur un dossier instruit par la comcom
9449 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9450 $this->valF['created_by_commune'] = true;
9451 }
9452
9453 //
9454 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9455 if (isset($this->valF['flag_edition_integrale']) === true) {
9456 unset($this->valF['flag_edition_integrale']);
9457 }
9458 if (isset($this->valF['signataire_arrete']) === true) {
9459 unset($this->valF['signataire_arrete']);
9460 }
9461 }
9462 }
9463
9464
9465 /**
9466 * Récupère l'instance d'un événement de workflow.
9467 *
9468 * @param mixed $evenement Identifiant de l'événement.
9469 *
9470 * @return object
9471 */
9472 function get_inst_evenement($evenement = null) {
9473 //
9474 return $this->get_inst_common("evenement", $evenement);
9475 }
9476
9477 /**
9478 * Logue l'action de l'instruction dans son DI.
9479 *
9480 * @param string $id Clé primaire de l'instruction.
9481 * @param array $val Valeurs de l'instruction.
9482 *
9483 * @return bool Vrai si traitement effectué avec succès
9484 */
9485 private function add_log_to_dossier($id, array $val) {
9486 $maj = $this->getParameter("maj");
9487 // Action = Trace par défaut
9488 $action = $this->get_backtrace();
9489 // Action = Identifant de l'action si contexte connu
9490 if (empty($maj) === false
9491 || (empty($maj) === true && $maj === 0)) {
9492 $action = $this->get_action_param($maj, 'identifier');
9493 if ($action === 'modifier_suivi') {
9494 $action = "modifier (via l'action suivi des dates)";
9495 }
9496 if ($action === 'notifier_commune'
9497 && isset($val['mails_destinataires']) === true) {
9498 $action = "notification de la commune (courriels : ";
9499 $action .= $val['mails_destinataires'].")";
9500 }
9501 }
9502 // Création du log
9503 $log = array(
9504 'date' => date('Y-m-d H:i:s'),
9505 'user' => $_SESSION['login'],
9506 'action' => $action,
9507 'values' => array(
9508 'date_evenement' => $this->dateDB($val['date_evenement']),
9509 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9510 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9511 'evenement' => $val['evenement'],
9512 'action' => $val['action'],
9513 'instruction' => $id,
9514 'etat' => $val['etat'],
9515 ),
9516 );
9517 // Ajout du log
9518 $di = $this->get_inst_dossier($val['dossier']);
9519 $ret = $di->add_log_instructions($log);
9520 if ($ret === false) {
9521 $this->correct = false;
9522 $this->msg = '';
9523 $this->addToMessage($di->msg);
9524 }
9525 return $ret;
9526 }
9527
9528
9529 /**
9530 * Retourne le contexte de déboguage formaté en HTML.
9531 *
9532 * @return string Une ligne par trace
9533 */
9534 private function get_backtrace() {
9535 $trace = debug_backtrace();
9536 $backtrace = '';
9537 $i = 1;
9538 foreach ($trace as $key => $value) {
9539 $func = $trace[$key]['function'];
9540 // On ne s'autolog pas
9541 if ($func === 'get_backtrace'
9542 || $func === 'add_log_to_dossier') {
9543 continue;
9544 }
9545 $backtrace .= $i.') ';
9546 // Si dans une classe
9547 if (isset($trace[$key]['class']) === true
9548 && empty($trace[$key]['class']) === false) {
9549 $backtrace .= $trace[$key]['class'].'->'.$func;
9550 }
9551 // Si procédural
9552 else {
9553 $file = $trace[$key]['file'];
9554 $line = $trace[$key]['line'];
9555 $truncated_file = $this->f->get_relative_path($file);
9556 if ($truncated_file !== false) {
9557 $file = $truncated_file;
9558 }
9559 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9560 }
9561 $backtrace .= '<br/>';
9562 $i++;
9563 }
9564 return $backtrace;
9565 }
9566
9567 /**
9568 * CONDITION - is_notifiable.
9569 *
9570 * Condition pour afficher l'action notifier_commune.
9571 *
9572 * @return boolean
9573 */
9574 public function is_notifiable() {
9575 // L'instruction doit être finalisée, ce qui revient à dire
9576 // définalisable sans bypass
9577 if ($this->is_unfinalizable_without_bypass() === false) {
9578 return false;
9579 }
9580 // La collectivité de l'utilisateur doit être de niveau multi
9581 if ($this->f->has_collectivite_multi() === false) {
9582 return false;
9583 }
9584 // Le paramètre multi de l'objet du courriel doit exister
9585 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9586 return false;
9587 }
9588 // Le paramètre multi du modèle du courriel doit exister
9589 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9590 return false;
9591 }
9592 // A ce stade toutes les conditions sont satisfaites
9593 return true;
9594 }
9595
9596 /**
9597 * TREATMENT - notifier_commune.
9598 *
9599 * Notifie aux communes et par courriel la finalisation d'une instruction.
9600 *
9601 * @return boolean
9602 */
9603 public function notifier_commune() {
9604 // Cette méthode permet d'exécuter une routine en début des méthodes
9605 // dites de TREATMENT.
9606 $this->begin_treatment(__METHOD__);
9607 $message = __('Erreur de paramétrage :');
9608 $erreurParametrage = false;
9609 // Récupération du paramétrage de la collectivité du dossier
9610 $id_di = $this->getVal('dossier');
9611 $di = $this->get_inst_dossier($id_di);
9612 $collectivite_di = $di->getVal('om_collectivite');
9613 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9614 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9615 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9616 $erreurParametrage = true;
9617 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9618 }
9619
9620 // Récupération de la liste des mails
9621 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9622 if (empty($adresses)) {
9623 $erreurParametrage = true;
9624 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9625 }
9626
9627 // Vérification du paramétrage des mails
9628 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9629 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9630 $erreurParametrage = true;
9631 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9632 }
9633 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9634 $erreurParametrage = true;
9635 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9636 }
9637
9638 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9639 // un message a destination de l'utilisateur est affiché
9640 if ($erreurParametrage) {
9641 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9642 $this->addToMessage($message);
9643 return $this->end_treatment(__METHOD__, false);
9644 }
9645
9646 // Création d'un notification et de sa tâche associé pour chaque mail
9647 foreach ($adresses as $adresse) {
9648 // Ajout de la notif et récupération de son id
9649 $destinataire = array(
9650 'destinataire' => $adresse,
9651 'courriel' => $adresse
9652 );
9653 $idNotif = $this->ajouter_notification(
9654 $this->getVal($this->clePrimaire),
9655 $this->f->get_connected_user_login_name(),
9656 $destinataire,
9657 $collectivite_di
9658 );
9659 if ($idNotif === false) {
9660 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9661 return $this->end_treatment(__METHOD__, false);
9662 }
9663 // Création de la tache en lui donnant l'id de la notification
9664 $notification_by_task = $this->notification_by_task(
9665 $idNotif,
9666 $this->getVal('dossier'),
9667 'mail',
9668 'notification_commune'
9669 );
9670 if ($notification_by_task === false) {
9671 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9672 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9673 return $this->end_treatment(__METHOD__, false);
9674 }
9675 }
9676 $this->addToMessage(__('La commune a été notifiée.'));
9677 return $this->end_treatment(__METHOD__, true);
9678 }
9679
9680 /**
9681 * Récupère l'instance de l'instructeur
9682 *
9683 * @param integer $instructeur Identifiant de l'instructeur.
9684 *
9685 * @return object
9686 */
9687 protected function get_inst_instructeur($instructeur) {
9688 //
9689 return $this->get_inst_common("instructeur", $instructeur);
9690 }
9691
9692
9693 /**
9694 * Récupère l'instance de l'utilisateur
9695 *
9696 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9697 *
9698 * @return object
9699 */
9700 protected function get_inst_om_utilisateur($om_utilisateur) {
9701 //
9702 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9703 }
9704
9705
9706 /**
9707 * Récupère l'instance de la division.
9708 *
9709 * @param integer $division Identifiant de la division.
9710 *
9711 * @return object
9712 */
9713 protected function get_inst_division($division) {
9714 //
9715 return $this->get_inst_common("division", $division);
9716 }
9717
9718
9719 /**
9720 * Récupère l'instance de la direction.
9721 *
9722 * @param integer $direction Identifiant de la direction.
9723 *
9724 * @return object
9725 */
9726 protected function get_inst_direction($direction) {
9727 //
9728 return $this->get_inst_common("direction", $direction);
9729 }
9730
9731
9732 /**
9733 * Récupère la collectivité d'un instructeur en passant par sa division puis
9734 * par sa direction.
9735 *
9736 * @param integer $instructeur Identifiant de l'instructeur.
9737 *
9738 * @return integer
9739 */
9740 protected function get_instructeur_om_collectivite($instructeur) {
9741 // Chemin vers la collectivité d'un instructeur
9742 $inst_instr = $this->get_inst_instructeur($instructeur);
9743 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9744 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9745
9746 // Collectivité
9747 $om_collectivite = $inst_direction->getVal('om_collectivite');
9748
9749 //
9750 return $om_collectivite;
9751 }
9752
9753 /*
9754 * CONDITION - can_user_access_dossier_contexte_ajout
9755 *
9756 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9757 * formulaire d'ajout.
9758 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9759 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9760 *
9761 */
9762 function can_user_access_dossier_contexte_ajout() {
9763
9764 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9765 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9766 //
9767 if ($id_dossier !== "") {
9768 $dossier = $this->f->get_inst__om_dbform(array(
9769 "obj" => "dossier_instruction",
9770 "idx" => $id_dossier,
9771 ));
9772 //
9773 return $dossier->can_user_access_dossier();
9774 }
9775 return false;
9776 }
9777
9778 /*
9779 * CONDITION - can_user_access_dossier
9780 *
9781 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9782 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9783 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9784 *
9785 */
9786 function can_user_access_dossier_contexte_modification() {
9787
9788 $id_dossier = $this->getVal('dossier');
9789 //
9790 if ($id_dossier !== "" && $id_dossier !== null) {
9791 $dossier = $this->f->get_inst__om_dbform(array(
9792 "obj" => "dossier_instruction",
9793 "idx" => $id_dossier,
9794 ));
9795 //
9796 return $dossier->can_user_access_dossier();
9797 }
9798 return false;
9799 }
9800
9801 /**
9802 * TREATMENT - envoyer_a_signature_sans_relecture
9803 *
9804 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9805 *
9806 * @return boolean true si l'envoi a été effectué avec succès false sinon
9807 */
9808 function envoyer_a_signature_sans_relecture() {
9809 return $this->envoyer_a_signature();
9810 }
9811
9812 /**
9813 * TREATMENT - envoyer_a_signature_avec_relecture
9814 *
9815 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9816 *
9817 * @return boolean true si l'envoi a été effectué avec succès false sinon
9818 */
9819 function envoyer_a_signature_avec_relecture() {
9820 $is_forced_view_files = true;
9821 return $this->envoyer_a_signature($is_forced_view_files);
9822 }
9823
9824 /**
9825 * TREATMENT - envoyer_a_signature
9826 *
9827 * Permet d'envoyer le document de l'instruction au parapheur pour signature
9828 *
9829 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9830 *
9831 * @return boolean true si l'envoi a été effectué avec succès false sinon
9832 */
9833 function envoyer_a_signature($is_forced_view_files = false) {
9834 $this->begin_treatment(__METHOD__);
9835 $this->correct = true;
9836
9837 // Instanciation de l'objet signataire_arrete
9838 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9839 'obj' => 'signataire_arrete',
9840 'idx' => $this->getVal('signataire_arrete'),
9841 ));
9842
9843 // Instanciation de l'objet dossier
9844 $inst_dossier = $this->f->get_inst__om_dbform(array(
9845 'obj' => 'dossier',
9846 'idx' => $this->getVal('dossier'),
9847 ));
9848
9849 //Instanciation de la classe electronicsignature
9850 $inst_es = $this->get_electronicsignature_instance();
9851 if ($inst_es === false) {
9852 $this->correct = false;
9853 return $this->end_treatment(__METHOD__, false);
9854 }
9855
9856 // Vérifie si la notification se fait via l'application ou via le parapheur
9857 try {
9858 $notification_required = $inst_es->signer_notification_is_delegated();
9859 } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9860 // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9861 $notification_required = false;
9862 }
9863
9864 // Si la notification est faite par l'application vérifie que l'adresse mail du
9865 // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9866 // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9867 // notification
9868 if ($notification_required === true) {
9869 $signer_mail = $inst_signataire_arrete->getVal('email');
9870 $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9871
9872 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9873
9874 if (empty($signer_mail)) {
9875 $this->correct = false;
9876 $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9877 $this->addToMessage($err_msg.$err_detail);
9878 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9879 return $this->end_treatment(__METHOD__, false);
9880 }
9881 if (! $this->f->checkValidEmailAddress($signer_mail)) {
9882 $this->correct = false;
9883 $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9884 $this->addToMessage($err_msg.$err_detail);
9885 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9886 return $this->end_treatment(__METHOD__, false);
9887 }
9888 }
9889
9890 // Récupération du document à signer
9891 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9892 if ($file === OP_FAILURE) {
9893 $this->correct = false;
9894 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9895 // Termine le traitement
9896 return $this->end_treatment(__METHOD__, false);
9897 }
9898
9899 // Initialisation des paramètre à passer pour l'envoi en signature
9900 $data = array(
9901 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9902 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9903 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9904 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9905 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9906 // Permet d'envoyer en signature l'instruction le jour de la date limite
9907 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9908 "dossier" => $this->getVal('dossier'),
9909 "is_forced_view_files" => $is_forced_view_files,
9910 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9911 );
9912
9913 // Initialisation des métadonnées
9914 $metadonnee_dossier = $file['metadata'];
9915 // Récupération du libellé du document transmis au parapheur
9916 $metadonnee_dossier['filename'] = $this->getVal('fichier_instruction_name');
9917 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9918
9919 $metadonnee_dossier['url_di'] = sprintf(
9920 '%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',
9921 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9922 $this->getVal('dossier')
9923 );
9924
9925 $optional_data = null;
9926 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9927 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9928 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9929 if (json_last_error() !== JSON_ERROR_NONE) {
9930 $this->correct = false;
9931 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9932 $this->addToLog(__METHOD__."(): ".
9933 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9934 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9935 );
9936 // Termine le traitement
9937 return $this->end_treatment(__METHOD__, false);
9938 }
9939 }
9940
9941 // Appel de la méthode de l'abstracteur send_for_signature()
9942 // Cette méthode doit retourner un tableau de valeur
9943 try {
9944 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9945 } catch (electronicsignature_exception $e) {
9946 $this->handle_electronicsignature_exception($e);
9947 return $this->end_treatment(__METHOD__, false);
9948 }
9949
9950 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9951 $valF = array();
9952
9953 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9954 foreach($this->champs as $identifiant => $champ) {
9955 $valF[$champ] = $this->val[$identifiant];
9956 }
9957 // On fait ensuite nos modifications spécifiques
9958 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9959 $valF['statut_signature'] = $result['statut'];
9960 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9961 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9962 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9963 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9964 $ret = $this->modifier($valF);
9965
9966 if ($ret === false) {
9967 $this->correct = false;
9968 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9969 // Termine le traitement
9970 return $this->end_treatment(__METHOD__, false);
9971 }
9972
9973 // Notification du signataire
9974 if ($notification_required === true) {
9975 if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9976 $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9977 $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9978 $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9979 // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9980 // precedemment
9981 $this->init_record_data($this->getVal($this->clePrimaire));
9982 $this->annuler_envoi_en_signature();
9983 $this->correct = false;
9984 return $this->end_treatment(__METHOD__, true);
9985 }
9986 }
9987
9988 // Message
9989 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9990 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9991 && array_key_exists('signature_page_url', $result) === true) {
9992 $this->addToMessage(sprintf(
9993 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9994 $result['signature_page_url'],
9995 __("Signez directement le document")
9996 ));
9997 }
9998 if ($notification_required !== true) {
9999 $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
10000 }
10001
10002 // Tout s'est bien passé, on termine le traitement
10003 return $this->end_treatment(__METHOD__, true);
10004 }
10005
10006 /**
10007 * Notifie le signataire d'un document à signer.
10008 * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
10009 * En cas d'erreur ajoute une ligne dans les logs de l'application.
10010 *
10011 * @param string $signer_name Nom du signataire
10012 * @param string $signer_mail Mail du signataire
10013 * @param string $user_name Nom de l'utilisateur openADS courant
10014 *
10015 * @return boolean true si succés, false si erreur
10016 */
10017 protected function notify_signer($signer_name, $signer_mail, $user_name) {
10018 // message d'erreur
10019 $err_msg_log = sprintf(
10020 __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
10021 $signer_name,
10022 $signer_mail,
10023 $this->getVal($this->clePrimaire)
10024 );
10025 $err_msg = sprintf(
10026 '%s %s (%s)"',
10027 __("Échec de la notification du signataire"),
10028 $signer_name,
10029 $signer_mail
10030 );
10031
10032 // vérification des informations requises
10033 if (empty($signer_name)) {
10034 $err_detail = __("le nom du signataire est vide");
10035 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10036 $this->addToMessage($err_msg.', '.$err_detail);
10037 return false;
10038 }
10039 if (empty($signer_mail)) {
10040 $err_detail = __("le courriel du signataire est vide");
10041 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10042 $this->addToMessage($err_msg.', '.$err_detail);
10043 return false;
10044 }
10045 if (empty($this->getVal('dossier'))) {
10046 $err_detail = __("l'identifiant du dossier est vide");
10047 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
10048 $this->addToMessage($err_msg.', '.$err_detail);
10049 return false;
10050 }
10051
10052 // ajout de la notification à la liste des notifications de l'instruction
10053 $instruction_id = $this->getVal($this->clePrimaire);
10054 $inst_notif = $this->f->get_inst__om_dbform(array(
10055 "obj" => "instruction_notification",
10056 "idx" => "]",
10057 ));
10058 $notif_val = array(
10059 'instruction_notification' => null,
10060 'instruction' => $instruction_id,
10061 'automatique' => true,
10062 'emetteur' => $user_name,
10063 'date_envoi' => null,
10064 'destinataire' => "$signer_name <$signer_mail>",
10065 'courriel' => $signer_mail,
10066 'date_premier_acces' => null,
10067 'statut' => '',
10068 'commentaire' => ''
10069 );
10070 $add_notif = $inst_notif->ajouter($notif_val);
10071 if ($add_notif === false) {
10072 $err_detail = __("Échec de l'ajout de la notification.");
10073 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
10074 $this->addToMessage($err_msg);
10075 return false;
10076 }
10077 $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
10078
10079 // ajout d'une tâche de notification (envoi du mail)
10080 $notification_task = $this->notification_by_task(
10081 $notification_id,
10082 $this->getVal('dossier'),
10083 'mail',
10084 'notification_signataire'
10085 );
10086 if ($notification_task === false) {
10087 $err_detail = sprintf(
10088 __("Échec de l'ajout de la tâche de notification (notification %s)."),
10089 $notification_id);
10090 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10091 $this->addToMessage($err_msg);
10092 return false;
10093 }
10094
10095 // Vérification de la réussite de l'envoi du mail
10096 // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
10097 // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
10098 // qui viens d'être créée.
10099 // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
10100 $qres = $this->f->get_one_result_from_db_query(
10101 sprintf(
10102 'SELECT
10103 state
10104 FROM
10105 %1$stask
10106 WHERE
10107 type = \'notification_signataire\'
10108 AND category = \'mail\'
10109 AND dossier = \'%2$s\'
10110 ORDER BY
10111 task DESC
10112 LIMIT 1',
10113 DB_PREFIXE,
10114 $this->f->db->escapeSimple($this->getVal('dossier'))
10115 ),
10116 array(
10117 'origin' => __METHOD__
10118 )
10119 );
10120 if ($qres['result'] === 'error') {
10121 $err_detail = sprintf(
10122 __("Échec de l'envoi du mail de notification (notification %s)."),
10123 $notification_id);
10124 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
10125 $this->addToMessage($err_msg);
10126 return false;
10127 }
10128 // TODO gérer les autres cas (gestion d'erreur)
10129
10130 // succès de la planification de la notification
10131 $this->addToMessage(sprintf(
10132 __('Le signataire "%s (%s)" sera notifié prochainement'),
10133 $signer_name,
10134 $signer_mail));
10135 return true;
10136 }
10137
10138 /**
10139 * Permet de récupérer la bonne date limite en fonction de si l'instruction
10140 * est en incomplet notifié ou non.
10141 * On peut ajouter des jours à cette date grâce au paramètre "delay".
10142 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
10143 * l'instruction en signature le jour de la date limite.
10144 *
10145 * @param int $delay Le nombre de jour à ajouter à la date limite.
10146 *
10147 * @return string $date_limite la date limite calculé ou false
10148 */
10149 private function compute_date_limite($delay) {
10150 // Instanciation de l'objet dossier
10151 $inst_dossier = $this->f->get_inst__om_dbform(array(
10152 'obj' => 'dossier',
10153 'idx' => $this->getVal('dossier'),
10154 ));
10155
10156 $date_to_compute = null;
10157 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
10158 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
10159 } else {
10160 $date_to_compute = $inst_dossier->getVal('date_limite');
10161 }
10162 if ($date_to_compute != null) {
10163 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
10164 }
10165
10166 return null;
10167 }
10168
10169 /**
10170 * Permet de récupérer la traduction de la valeur de statut_signature
10171 *
10172 * @return string la valeur de statut_signature traduite | false
10173 */
10174 function get_trad_for_statut($value_to_trad){
10175 $statut_signature_tab = array(
10176 'waiting' => __('en préparation'),
10177 'in_progress' => __('en cours de signature'),
10178 'canceled' => __('signature annulée'),
10179 'expired' => __('délai de signature expiré'),
10180 'finished' => __('signé')
10181 );
10182 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
10183 return $statut_signature_tab[$value_to_trad];
10184 }
10185
10186 return false;
10187 }
10188
10189 /**
10190 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
10191 *
10192 * @return string (json) la valeur de historique_signature mis à jour | false
10193 */
10194 function get_updated_historique_signature($historique_signature_values) {
10195
10196 $historique_signature_value_tab = $this->get_historique_signature_decoded();
10197
10198 if ($historique_signature_value_tab === false) {
10199 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
10200 return false;
10201 }
10202
10203 $last_val_historique_signature = array();
10204
10205 // Si la tableau récupéré n'est pas vide alors
10206 // on récupère la dernière ligne du tableau
10207 if (empty($historique_signature_value_tab) === false) {
10208 $last_val_historique_signature = end($historique_signature_value_tab);
10209 }
10210
10211 $format_date = '';
10212 $format_date_hour = '';
10213 $date_converted=array();
10214
10215 $date_to_convert = array(
10216 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
10217 'date_limite_instruction' => $this->compute_date_limite(0),
10218 'date_retour_signature' => $historique_signature_values['date_retour_signature']
10219 );
10220
10221 // Conversion des dates en fonction de leur format
10222 foreach ($date_to_convert as $key => $value) {
10223 $date_converted[$key] = null;
10224 if ($value != null) {
10225 $format_date = 'd/m/Y';
10226 $format_date_hour = 'd/m/Y H:i:s';
10227 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
10228 }
10229 }
10230
10231 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
10232 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
10233 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
10234 $tab_for_columns_trad = array(
10235 __('entry_date'),
10236 __('id_parapheur_signature'),
10237 __('emetteur'),
10238 __('signataire'),
10239 __('date_envoi'),
10240 __('date_limite'),
10241 __('date_retour'),
10242 __('statut_signature'),
10243 __('commentaire_signature')
10244 );
10245
10246 array_push($historique_signature_value_tab, array(
10247 'entry_date' => date('d/m/Y H:i:s'),
10248 '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'],
10249 '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'],
10250 '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'],
10251 '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'],
10252 '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'],
10253 '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'],
10254 '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']),
10255 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
10256 ));
10257
10258 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
10259 }
10260
10261 /**
10262 * TREATMENT - annuler_envoi_en_signature
10263 *
10264 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
10265 *
10266 * @return boolean true si l'annulation a été effectué avec succès false sinon
10267 */
10268 function annuler_envoi_en_signature() {
10269 $this->begin_treatment(__METHOD__);
10270 $this->correct = true;
10271
10272 //Instanciation de la classe electronicsignature
10273 $inst_es = $this->get_electronicsignature_instance();
10274 if ($inst_es === false) {
10275 $this->correct = false;
10276 return $this->end_treatment(__METHOD__, false);
10277 }
10278
10279 $data = array();
10280 if (! empty($this->getVal('id_parapheur_signature'))) {
10281 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
10282 } else {
10283 $this->correct = false;
10284 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
10285 return $this->end_treatment(__METHOD__, false);
10286 }
10287
10288 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
10289 // Cette méthode doit retourner un tableau de valeur
10290 try {
10291 $result = $inst_es->cancel_send_for_signature($data);
10292 } catch (electronicsignature_exception $e) {
10293 $this->handle_electronicsignature_exception($e);
10294 return $this->end_treatment(__METHOD__, false);
10295 }
10296
10297 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
10298 $valF = array();
10299
10300 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
10301 foreach($this->champs as $identifiant => $champ) {
10302 $valF[$champ] = $this->val[$identifiant];
10303 }
10304 // On fait ensuite nos modifications spécifiques
10305 $valF['id_parapheur_signature'] = null;
10306 $valF['statut_signature'] = $result['statut'];
10307 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
10308 $valF['date_envoi_signature'] = null;
10309 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
10310
10311 $ret = $this->modifier($valF);
10312
10313 if ($ret === false) {
10314 $this->correct = false;
10315 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
10316 // Termine le traitement
10317 return $this->end_treatment(__METHOD__, false);
10318 }
10319
10320 // Message
10321 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
10322
10323 // Tout s'est bien passé, on termine le traitement
10324 return $this->end_treatment(__METHOD__, true);
10325 }
10326
10327
10328 /**
10329 * Récupère le contenu du champ historique_signature et le converti en tableau
10330 *
10331 * @return array sinon false en cas d'erreur
10332 */
10333 protected function get_historique_signature_decoded() {
10334 $val = str_replace("'", '"', $this->getVal('historique_signature'));
10335 if ($val === '' || $val == 'false') {
10336 $val = json_encode(array());
10337 }
10338 if($this->isJson($val) === false) {
10339 return false;
10340 }
10341 return json_decode($val, true);
10342 }
10343
10344 /**
10345 * Récupère les informations à afficher dans le tableau de suivi à l'aide
10346 * d'une requête sql. Stocke ces informations dans un tableau.
10347 * Converti le tableau au format json et renvoi le json obtenu.
10348 *
10349 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
10350 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
10351 * La clause where de la requête est construite à partir du tableau contenant les types
10352 * de tâches fourni en paramètre.
10353 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
10354 *
10355 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
10356 * la date de premier accès ne sera pas affichée.
10357 *
10358 * @param array liste des tâches permettant d'identifier quelles notification afficher
10359 * @param boolean permet d'afficher les notifications non liées à des tâches
10360 * @return json
10361 */
10362 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
10363 $whereTypeTache = '';
10364 $sqlTaskNull = 'INNER';
10365
10366 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
10367 $listeChampsTrad = array(
10368 __('emetteur'),
10369 __('date_envoi'),
10370 __('destinataire'),
10371 __('date_premier_acces'),
10372 __('instruction'),
10373 __('annexes'),
10374 __('statut'),
10375 __('commentaire')
10376 );
10377 $listeChamps = array(
10378 'emetteur',
10379 'date_envoi',
10380 'destinataire',
10381 'date_premier_acces',
10382 'instruction',
10383 'annexes',
10384 'statut',
10385 'commentaire'
10386 );
10387
10388 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10389 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10390 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10391 // paramétrage
10392 if(is_bool($nonLieTache) && $nonLieTache === true) {
10393 $sqlTaskNull = 'LEFT';
10394 }
10395 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
10396 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
10397 // tiers consulté
10398 if (is_array($typeTache) && $typeTache != array()) {
10399 if (is_array($typeTache)) {
10400 $whereTypeTache = sprintf(
10401 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
10402 "'".implode("', '", $typeTache)."'"
10403 );
10404 }
10405 // La date de premier accès n'a pas besoin d'être renseigné pour
10406 // les notifications des demandeurs via le portail citoyen.
10407 // Les notifications des demandeurs sont liés à 3 types de tâches
10408 // notification_recepisse, notification_instruction, notification_decision
10409 // Si le suivi de la notification concerne un de ces types de tâches on
10410 // considère que c'est une notification de demandeurs.
10411 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
10412 // via le portail. Par défaut si rien n'est paramétré on considère que la
10413 // notification est faite via le portail
10414 if ((in_array('notification_recepisse', $typeTache) ||
10415 in_array('notification_instruction', $typeTache) ||
10416 in_array('notification_decision', $typeTache))) {
10417 $dossier = $this->getVal('dossier');
10418 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
10419 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
10420 if ($modeNotification === PORTAL) {
10421 $listeChamps = array(
10422 'emetteur',
10423 'date_envoi',
10424 'destinataire',
10425 'instruction',
10426 'annexes',
10427 'statut',
10428 'commentaire'
10429 );
10430 }
10431 }
10432 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10433 // de les afficher dans le suivi
10434 if (in_array('notification_depot_demat', $typeTache)) {
10435 $listeChamps = array(
10436 'emetteur',
10437 'date_envoi',
10438 'destinataire',
10439 'instruction',
10440 'statut',
10441 'commentaire'
10442 );
10443 }
10444 }
10445
10446 $valSuivi = array();
10447 // Récupération des infos nécessaires à l'affichage du tableau
10448 $sql = sprintf(
10449 'SELECT DISTINCT
10450 instruction_notification.instruction_notification,
10451 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10452 CASE WHEN instruction_notification.automatique = TRUE
10453 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10454 ELSE instruction_notification.emetteur
10455 END as emetteur,
10456 date_envoi,
10457 instruction_notification.destinataire,
10458 instruction_notification.date_premier_acces,
10459 evenement.libelle as instruction,
10460 instruction_notification.statut,
10461 instruction_notification.commentaire,
10462 annexes.instruction_annexe as annexes
10463 FROM
10464 %1$sinstruction_notification
10465 LEFT JOIN %1$sinstruction
10466 ON instruction.instruction = instruction_notification.instruction
10467 LEFT JOIN %1$sevenement
10468 ON instruction.evenement = evenement.evenement
10469 LEFT JOIN %1$sinstruction_notification_document
10470 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10471 AND instruction_notification_document.annexe = true
10472 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10473 %4$s JOIN %1$stask
10474 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10475 AND task.type LIKE \'notification%%\'
10476 -- Récupération de la liste des annexes sous la forme d une liste
10477 LEFT JOIN (
10478 SELECT
10479 instruction_notification,
10480 -- Récupère la liste des annexes de la notification
10481 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10482 -- à l affichage du lien vers les annexes
10483 CONCAT(
10484 \'[\',
10485 STRING_AGG(
10486 -- Affiche le nom du fichier selon le type de document/pièce
10487 CASE
10488 WHEN instruction_notification_document.document_type = \'instruction\'
10489 THEN CONCAT(
10490 \'{
10491 "obj" : "instruction",
10492 "champs" : "om_fichier_instruction",
10493 "label" : "\', evenement.libelle, \'",
10494 "id" : "\', instruction.instruction,\'"
10495 }\'
10496 )
10497 WHEN instruction_notification_document.document_type = \'consultation\'
10498 THEN CONCAT(
10499 \'{
10500 "obj" : "consultation",
10501 "champs" : "fichier",
10502 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10503 "id" : "\', consultation.consultation, \'"
10504 }\'
10505 )
10506 ELSE
10507 CONCAT(
10508 \'{
10509 "obj" : "document_numerise",
10510 "champs" : "uid",
10511 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10512 "id" : "\', document_numerise.document_numerise,\'"
10513 }\'
10514 )
10515 END,
10516 \', \'),
10517 \']\'
10518 ) AS instruction_annexe
10519 FROM
10520 %1$sinstruction_notification_document
10521 LEFT JOIN %1$sinstruction
10522 ON instruction_notification_document.instruction = instruction.instruction
10523 LEFT JOIN %1$sevenement
10524 ON instruction.evenement = evenement.evenement
10525 LEFT JOIN %1$sconsultation
10526 ON instruction_notification_document.document_id = consultation.consultation
10527 LEFT JOIN %1$sservice
10528 ON consultation.service = service.service
10529 LEFT JOIN %1$sdocument_numerise
10530 ON instruction_notification_document.document_id = document_numerise.document_numerise
10531 LEFT JOIN %1$sdocument_numerise_type
10532 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10533 WHERE
10534 instruction_notification_document.annexe = \'t\'
10535 GROUP BY
10536 instruction_notification
10537 ) AS annexes
10538 ON
10539 annexes.instruction_notification = instruction_notification.instruction_notification
10540 WHERE
10541 instruction.instruction = %2$s
10542 %3$s
10543 ORDER BY
10544 date_envoi ASC, instruction_notification.destinataire ASC',
10545 DB_PREFIXE,
10546 intval($this->getVal('instruction')),
10547 $whereTypeTache,
10548 $sqlTaskNull
10549 );
10550 $qres = $this->f->get_all_results_from_db_query($sql, array(
10551 "origin" => __METHOD__
10552 )
10553 );
10554 // Préparation du lien de téléchargement des annexes
10555 $htmlList =
10556 '<style>
10557 #content .gridjs-td a.lien_annexe {
10558 text-decoration : underline dotted 1px;
10559 }
10560 #content a.lien_annexe:hover {
10561 text-decoration : underline solid 1px;
10562 color : #46aede;
10563 }
10564 ol {padding-left : 10px;}
10565 </style>
10566 <ol>%1$s</ol>';
10567 $lienTelechargement =
10568 '<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">
10569 Annexe
10570 </a>';
10571 // Stockage des infos de chaque notification dans un tableau
10572 foreach ($qres['result'] as $row) {
10573 $valNotif = array();
10574 foreach($listeChamps as $champ) {
10575 $valNotif[$champ] = $row[$champ];
10576 if (($champ === 'date_envoi'
10577 || $champ === 'date_premier_acces')
10578 && $row[$champ] !== null
10579 && $row[$champ] !== '') {
10580 //
10581 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10582 } else if ($champ === 'annexes') {
10583 $listeAnnexe = '';
10584 $infoAnnexes = json_decode($row[$champ], true);
10585 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10586 // A partir des infos récupérées prépare le code html du lien vers chacune
10587 // des annexes et ajoute un élément de liste par annexe
10588 foreach($infoAnnexes as $annexe) {
10589 $listeAnnexe .= sprintf(
10590 '<li>%s</li>',
10591 sprintf($lienTelechargement,
10592 $annexe['obj'],
10593 $annexe['champs'],
10594 $annexe['id'],
10595 $annexe['label']
10596 )
10597 );
10598 }
10599 // Construction de la liste des annexes
10600 $valNotif[$champ] = sprintf(
10601 $htmlList,
10602 $listeAnnexe
10603 );
10604 }
10605 }
10606 }
10607 array_push($valSuivi, $valNotif);
10608 }
10609
10610 // Passage du tableau au format json
10611 return json_encode($valSuivi, JSON_HEX_APOS);
10612 }
10613
10614 /**
10615 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10616 *
10617 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10618 *
10619 * @return void
10620 */
10621 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10622 $this->f->displayMessage('error', $exception->getMessage());
10623 }
10624
10625
10626 /**
10627 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10628 *
10629 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10630 * @return electronicsignature Instance de l'abstracteur.
10631 */
10632 public function get_electronicsignature_instance($with_handle_error = true) {
10633 if(isset($this->electronicsignature_instance)) {
10634 return $this->electronicsignature_instance;
10635 }
10636 // Instanciation du connecteur electronicsignature
10637 try {
10638 require_once "electronicsignature.class.php";
10639 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10640 $this->electronicsignature_instance = new electronicsignature($collectivites);
10641 } catch (electronicsignature_exception $e) {
10642 if ($with_handle_error === true) {
10643 $this->handle_electronicsignature_exception($e);
10644 }
10645 return false;
10646 }
10647 return $this->electronicsignature_instance;
10648 }
10649
10650 /**
10651 * TREATMENT - envoyer_au_controle_de_legalite
10652 *
10653 * Ajoute la tâche envoi_CL.
10654 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10655 *
10656 * @return [type] [description]
10657 */
10658 function envoyer_au_controle_de_legalite() {
10659 $this->begin_treatment(__METHOD__);
10660 $this->correct = true;
10661
10662 //
10663 if ($this->can_be_sended_to_cl() === true) {
10664 // Création de la task 'envoi_CL'
10665 $inst_task = $this->f->get_inst__om_dbform(array(
10666 "obj" => "task",
10667 "idx" => 0,
10668 ));
10669 $task_val = array(
10670 'type' => 'envoi_CL',
10671 'object_id' => $this->getVal('instruction'),
10672 'dossier' => $this->getVal('dossier'),
10673 );
10674 // Change l'état de la tâche de notification en fonction de l'état de
10675 // transmission du dossier d'instruction
10676 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10677 if ($this->f->is_option_mode_service_consulte_enabled() === false
10678 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10679 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10680 //
10681 $task_val['state'] = task::STATUS_DRAFT;
10682 }
10683 $add_task = $inst_task->add_task(array('val' => $task_val));
10684 if ($add_task === false) {
10685 $this->addToMessage(sprintf('%s %s',
10686 __("Une erreur s'est produite lors de la création tâche."),
10687 __("Veuillez contacter votre administrateur.")
10688 ));
10689 $this->correct = false;
10690 return $this->end_treatment(__METHOD__, false);
10691 }
10692 // Mise à jour du champs 'envoye_cl_platau'
10693 $instr_val = array(
10694 'envoye_cl_platau' => 't',
10695 );
10696 $res = $this->f->db->autoExecute(
10697 DB_PREFIXE.$this->table,
10698 $instr_val,
10699 DB_AUTOQUERY_UPDATE,
10700 $this->getCle($this->getVal($this->clePrimaire))
10701 );
10702 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
10703 if ($this->f->isDatabaseError($res, true) === true) {
10704 $this->addToMessage(sprintf('%s %s',
10705 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10706 __("Veuillez contacter votre administrateur.")
10707 ));
10708 $this->correct = false;
10709 return $this->end_treatment(__METHOD__, false);
10710 }
10711 // Message de validation à l'utilisateur
10712 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10713 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10714 }
10715 //
10716 return $this->end_treatment(__METHOD__, true);
10717 }
10718
10719
10720 /**
10721 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10722 *
10723 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10724 * la vue 'sousformulaire'.
10725 *
10726 * @return string
10727 */
10728 function get_back_link($view = "formulaire") {
10729 //
10730 $href = parent::get_back_link($view);
10731 //
10732 $crud = $this->get_action_crud();
10733
10734 // Redirection vers le formulaire de modification à la validation du
10735 // formulaire d'ajout si l'événement associé possède une lettre type
10736 if (($crud === 'create'
10737 || ($crud === null
10738 && $this->getParameter('maj') == 0))
10739 && $this->correct == true
10740 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10741
10742 // On instancie l'instruction
10743 $inst_instruction = $this->f->get_inst__om_dbform(array(
10744 "obj" => "instruction",
10745 "idx" => $this->valF[$this->clePrimaire],
10746 ));
10747
10748 // Si l'instruction n'est pas finalisée automatiquement
10749 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10750 $href = str_replace("&action=3", "&action=1", $href);
10751 //
10752 if (strpos($href, "&retour=tab") !== false) {
10753 $href = str_replace("&retour=tab", "&retour= form", $href);
10754 } else {
10755 $href .= "&retour=form";
10756 }
10757 }
10758 }
10759
10760 //
10761 return $href;
10762 }
10763
10764 public function view_json_data() {
10765 $this->checkAccessibility();
10766 $this->f->disableLog();
10767 $view = $this->get_json_data();
10768 printf(json_encode($view));
10769 }
10770
10771 public function get_json_data() {
10772 $val = array_combine($this->champs, $this->val);
10773 foreach ($val as $key => $value) {
10774 $val[$key] = strip_tags($value);
10775 }
10776 $val['tacite'] = 'f';
10777 $inst_ad = $this->f->get_inst__om_dbform(array(
10778 "obj" => "avis_decision",
10779 "idx" => $val['avis_decision'],
10780 ));
10781 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10782 $val['tacite'] = 't';
10783 }
10784 return $val;
10785 }
10786
10787 /**
10788 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10789 * comme événement lié le suivant définit dans l'événement de l'instruction
10790 * instanciée.
10791 *
10792 * @param string $next_type Correspond aux trois déclenchement automatique
10793 * de création d'instruction paramétré sur un événement.
10794 * @param integer $instruction Identifiant de l'instruction à instancier.
10795 * @return mixed Identifiant de l'instruction recherchée ou false.
10796 */
10797 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10798 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10799 return false;
10800 }
10801 $result = array();
10802 $evenements = array();
10803 if ($instruction === null) {
10804 $instruction = $this->getVal($this->clePrimaire);
10805 $evenement = $this->getVal('evenement');
10806 $dossier = $this->getVal('dossier');
10807 } else {
10808 $inst = $this->f->get_inst__om_dbform(array(
10809 "obj" => "instruction",
10810 "idx" => $instruction,
10811 ));
10812 $evenement = $inst->getVal('evenement');
10813 $dossier = $inst->getVal('dossier');
10814 }
10815 // Récupération de l'identifiant de l'événement paramétré comme suivant
10816 // sur l'instruction instanciée
10817 $qres = $this->f->get_one_result_from_db_query(
10818 sprintf(
10819 'SELECT
10820 evenement_%3$s
10821 FROM
10822 %1$sevenement
10823 WHERE
10824 evenement = %2$s',
10825 DB_PREFIXE,
10826 intval($evenement),
10827 $next_type
10828 ),
10829 array(
10830 "origin" => __METHOD__,
10831 "force_return" => true,
10832 )
10833 );
10834 if ($qres["code"] !== "OK") {
10835 return false;
10836 }
10837 $ev_next = $qres["result"];
10838 // Récupération de l'instruction dans le dossier utilisant l'événement
10839 // suivant identifié dans la requête précédente
10840 $qres = $this->f->get_one_result_from_db_query(
10841 sprintf(
10842 'SELECT
10843 MAX(instruction.instruction) as instruction
10844 FROM
10845 %1$sinstruction
10846 WHERE
10847 dossier = \'%3$s\'
10848 AND evenement = %2$s',
10849 DB_PREFIXE,
10850 intval($ev_next),
10851 $this->f->db->escapeSimple($dossier)
10852 ),
10853 array(
10854 "origin" => __METHOD__,
10855 "force_return" => true,
10856 )
10857 );
10858 if ($qres["code"] !== "OK") {
10859 return false;
10860 }
10861 return $qres["result"];
10862 }
10863
10864 public function get_related_instructions($instruction = null) {
10865 $result = array();
10866 $evenements = array();
10867 if ($instruction === null) {
10868 $instruction = $this->getVal($this->clePrimaire);
10869 $evenement = $this->getVal('evenement');
10870 $dossier = $this->getVal('dossier');
10871 } else {
10872 $inst = $this->f->get_inst__om_dbform(array(
10873 "obj" => "instruction",
10874 "idx" => $instruction,
10875 ));
10876 $evenement = $inst->getVal('evenement');
10877 $dossier = $inst->getVal('dossier');
10878 }
10879 //
10880 $qres = $this->f->get_one_result_from_db_query(
10881 sprintf(
10882 'SELECT
10883 evenement
10884 FROM
10885 %1$sevenement
10886 WHERE
10887 evenement_retour_ar = %2$s
10888 OR evenement_retour_signature = %2$s',
10889 DB_PREFIXE,
10890 intval($evenement)
10891 ),
10892 array(
10893 "origin" => __METHOD__,
10894 "force_return" => true,
10895 )
10896 );
10897 if ($qres["code"] !== "OK") {
10898 return false;
10899 }
10900 $ev_parent = $qres["result"];
10901 //
10902 $qres = $this->f->get_one_result_from_db_query(
10903 sprintf(
10904 'SELECT
10905 MAX(instruction.instruction) as instruction
10906 FROM
10907 %1$sinstruction
10908 WHERE
10909 dossier = \'%3$s\'
10910 AND evenement = %2$s',
10911 DB_PREFIXE,
10912 intval($ev_parent),
10913 $this->f->db->escapeSimple($dossier)
10914 ),
10915 array(
10916 "origin" => __METHOD__,
10917 "force_return" => true,
10918 )
10919 );
10920 if ($qres["code"] !== "OK") {
10921 return false;
10922 }
10923 $result[] = $qres["result"];
10924 //
10925 $qres = $this->f->get_one_result_from_db_query(
10926 sprintf(
10927 'SELECT
10928 evenement_retour_ar
10929 FROM
10930 %1$sevenement
10931 WHERE
10932 evenement = %2$d
10933 AND evenement_retour_ar != %3$d',
10934 DB_PREFIXE,
10935 intval($ev_parent),
10936 intval($evenement)
10937 ),
10938 array(
10939 "origin" => __METHOD__,
10940 "force_return" => true,
10941 )
10942 );
10943 if ($qres["code"] !== "OK") {
10944 return false;
10945 }
10946 $evenements[] = $qres["result"];
10947 //
10948 $qres = $this->f->get_one_result_from_db_query(
10949 sprintf(
10950 'SELECT
10951 evenement_retour_signature
10952 FROM
10953 %1$sevenement
10954 WHERE
10955 evenement = %2$s
10956 AND evenement_retour_signature != %3$s
10957 ',
10958 DB_PREFIXE,
10959 intval($ev_parent),
10960 intval($evenement)
10961 ),
10962 array(
10963 "origin" => __METHOD__,
10964 "force_return" => true,
10965 )
10966 );
10967 if ($qres["code"] !== "OK") {
10968 return false;
10969 }
10970 $evenements[] = $qres["result"];
10971 foreach ($evenements as $value) {
10972 if ($value !== null) {
10973 $qres = $this->f->get_one_result_from_db_query(
10974 sprintf(
10975 'SELECT
10976 MAX(instruction.instruction) as instruction
10977 FROM
10978 %1$sinstruction
10979 WHERE
10980 dossier = \'%3$s\'
10981 AND evenement = %2$s',
10982 DB_PREFIXE,
10983 intval($value),
10984 $this->f->db->escapeSimple($dossier)
10985 ),
10986 array(
10987 "origin" => __METHOD__,
10988 "force_return" => true,
10989 )
10990 );
10991 if ($qres["code"] !== "OK") {
10992 return false;
10993 }
10994 $result[] = $qres["result"];
10995 }
10996 }
10997 return $result;
10998 }
10999
11000 protected function getDocumentType($champ = null) {
11001 $evenementId = $this->getVal('evenement');
11002 if (! empty($evenementId)) {
11003 $evenement = $this->f->findObjectById('evenement', $evenementId);
11004 if (! empty($evenement)) {
11005 return __("Instruction").':'.$evenement->getVal('libelle');
11006 }
11007 }
11008 return parent::getDocumentType();
11009 }
11010
11011 /**
11012 * Récupère à l'aide d'une requête sql la liste des demandeurs
11013 * pouvant être notifié. C'est à dire les demandeurs acceptant
11014 * les notifications et pour lesquels une adresse mail existe.
11015 *
11016 * Dans le cas, d'une notification pour le portail citoyen, seul
11017 * le pétitionnaire principal doit être notifier et uniquement si
11018 * il a une adress mail et qu'il accepte les notifications.
11019 *
11020 * @param string identifiant du dossier
11021 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
11022 * pour une notification de categorie portail
11023 * @return array liste des demandeurs pouvant être notifié
11024 */
11025 public function get_demandeurs_notifiable($idDossier = null, $portail = false) {
11026 if ($idDossier === null) {
11027 $idDossier = $this->getVal('dossier');
11028 }
11029 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
11030 // pour une notification depuis le portail citoyen
11031 $sqlPetitionnairePrincipal = '';
11032 // Gestion des champs nécessaires pour la notification d'un demandeur
11033 $condition_demandeur = "AND demandeur.notification = 't'
11034 AND demandeur.courriel IS NOT NULL";
11035 if ($portail === true) {
11036 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
11037 $condition_demandeur = "AND (
11038 (notification = 't' AND courriel IS NOT NULL)
11039 OR demande.source_depot = 'portal'
11040 )";
11041 }
11042
11043 $listeDemandeursNotifiable = array();
11044
11045 // Requête de récupération des demandeurs
11046 $qres = $this->f->get_all_results_from_db_query(
11047 sprintf(
11048 'SELECT
11049 demandeur.demandeur,
11050 CASE
11051 WHEN demandeur.qualite=\'particulier\'
11052 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
11053 ELSE
11054 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
11055 END AS destinataire,
11056 demandeur.courriel,
11057 petitionnaire_principal
11058 FROM
11059 %1$sdossier
11060 INNER JOIN %1$slien_dossier_demandeur
11061 ON dossier.dossier = lien_dossier_demandeur.dossier
11062 INNER JOIN %1$sdemandeur
11063 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
11064 -- Récupération de la plus ancienne demande associée au dossier (la demande
11065 -- de création du dossier)
11066 INNER JOIN (
11067 SELECT
11068 demande,
11069 dossier_instruction,
11070 source_depot
11071 FROM
11072 %1$sdemande
11073 WHERE
11074 dossier_instruction = \'%2$s\'
11075 ORDER BY
11076 demande ASC
11077 LIMIT 1
11078 ) as demande
11079 ON dossier.dossier = demande.dossier_instruction
11080 WHERE
11081 dossier.dossier = \'%2$s\'
11082 %3$s
11083 %4$s',
11084 DB_PREFIXE,
11085 $this->f->db->escapeSimple($idDossier),
11086 $condition_demandeur,
11087 $sqlPetitionnairePrincipal
11088 ),
11089 array(
11090 "origin" => __METHOD__
11091 )
11092 );
11093 // Récupération des infos des demandeurs et stockage dans un tableau
11094 // ayant pour clé les id des demandeurs
11095 foreach ($qres['result'] as $row) {
11096 $listeDemandeursNotifiable[$row['demandeur']] = $row;
11097 }
11098
11099 return $listeDemandeursNotifiable;
11100 }
11101
11102 /**
11103 * Renvoie la liste des notifications liées à l'instruction
11104 *
11105 * @param integer id de l'instruction dont on cherche les notifications
11106 * @return array liste des instruction_notification liés à l'instruction
11107 */
11108 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
11109 // Compose la clause définissant dans la requête le type de tâche attendus
11110 $clause_type_tache = '';
11111 if ($typeNotification != null) {
11112 if (is_array($typeNotification)) {
11113 $clause_type_tache = sprintf(
11114 'AND task.type IN (\'%1$s\')',
11115 implode("', '", $typeNotification),
11116 );
11117 } else {
11118 $clause_type_tache = sprintf(
11119 'AND task.type = \'%1$s\'',
11120 $typeNotification
11121 );
11122 }
11123 }
11124
11125 // Récupère les notifications liées à des tâches du type voulu et les stocke dans un tableau
11126 $qres = $this->f->get_all_results_from_db_query(
11127 sprintf('
11128 SELECT
11129 instruction_notification.instruction_notification
11130 FROM
11131 %1$sinstruction_notification
11132 INNER JOIN %1$stask
11133 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11134 %3$s
11135 WHERE
11136 instruction = %2$s',
11137 DB_PREFIXE,
11138 intval($id_instruction),
11139 $clause_type_tache
11140 ),
11141 array(
11142 "origin" => __METHOD__,
11143 'log_level' => DEBUG_MODE
11144 )
11145 );
11146 $listeInstrNotif = array();
11147 foreach ($qres['result'] as $row) {
11148 $listeInstrNotif[] = $row['instruction_notification'];
11149 }
11150
11151 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
11152 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
11153 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
11154 // paramétrage
11155 if(is_bool($nonLieTache) && $nonLieTache === true) {
11156 $qres = $this->f->get_all_results_from_db_query(
11157 sprintf('
11158 SELECT
11159 instruction_notification.instruction_notification
11160 FROM
11161 %1$sinstruction_notification
11162 LEFT JOIN %1$stask
11163 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
11164 AND task.type LIKE \'%%notification%%\'
11165 WHERE
11166 instruction = %2$s
11167 AND task.task IS NULL',
11168 DB_PREFIXE,
11169 intval($id_instruction)
11170 ),
11171 array(
11172 "origin" => __METHOD__
11173 )
11174 );
11175
11176 foreach ($qres['result'] as $row) {
11177 $listeInstrNotif[] = $row['instruction_notification'];
11178 }
11179 }
11180
11181 return $listeInstrNotif;
11182 }
11183
11184 /**
11185 * Crée une clé d'accès unique permettant à un utilisateur
11186 * anonyme de récupérer le document.
11187 *
11188 * @return string clé d'accès du document
11189 */
11190 function getCleAccesDocument() {
11191 // Initialisation d'un tableau
11192 $number_list = array();
11193
11194 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
11195 for ($i = 0; $i < 4; $i++) {
11196 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
11197 }
11198
11199 // Transformation en chaîne tout en séparant les nombres par un "-"
11200 $result = implode('-', $number_list);
11201
11202 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
11203 if ($this->getUidDocumentInstructionWithKey($result) != null) {
11204 return $this->getCleAccesDocument();
11205 }
11206
11207 //
11208 return $result;
11209 }
11210
11211 /**
11212 * Récupère une clé et renvoie l'uid du document liée à cette
11213 * clé. Si la clé n'existe pas renvoie null.
11214 *
11215 * @param string $cleGen clé dont on cherche l'instruction
11216 * @return integer|null
11217 */
11218 protected function getUidDocumentInstructionWithKey($cleGen) {
11219 $qres = $this->f->get_one_result_from_db_query(
11220 sprintf(
11221 'SELECT
11222 instruction.om_fichier_instruction
11223 FROM
11224 %1$sinstruction_notification_document
11225 LEFT JOIN %1$sinstruction
11226 ON instruction_notification_document.instruction = instruction.instruction
11227 WHERE
11228 instruction_notification_document.cle = \'%2$s\'',
11229 DB_PREFIXE,
11230 $this->f->db->escapeSimple($cleGen)
11231 ),
11232 array(
11233 "origin" => __METHOD__,
11234 )
11235 );
11236
11237 return $qres['result'];
11238 }
11239
11240 /**
11241 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
11242 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
11243 *
11244 * @param string $cleGen
11245 * @return instruction_notification
11246 */
11247 protected function getInstanceNotificationWithKey($key) {
11248 $qres = $this->f->get_one_result_from_db_query(
11249 sprintf(
11250 'SELECT
11251 instruction_notification
11252 FROM
11253 %1$sinstruction_notification_document
11254 WHERE
11255 cle = \'%2$s\'',
11256 DB_PREFIXE,
11257 $this->f->db->escapeSimple($key)
11258 ),
11259 array(
11260 "origin" => __METHOD__,
11261 )
11262 );
11263
11264 // Récupération de l'instance de notification
11265 $instNotif = $this->f->get_inst__om_dbform(array(
11266 "obj" => "instruction_notification",
11267 "idx" => $qres['result'],
11268 ));
11269 return $instNotif;
11270 }
11271
11272
11273 /**
11274 * Affiche la page de téléchargement du document de la notification.
11275 *
11276 * @param boolean $content_only Affiche le contenu seulement.
11277 *
11278 * @return void
11279 */
11280 public function view_telecharger_document_anonym() {
11281 // Par défaut on considère qu'on va afficher le formulaire
11282 $idx = 0;
11283 // Flag d'erreur
11284 $error = false;
11285 // Message d'erreur
11286 $message = '';
11287
11288 // Paramètres GET : récupération de la clé d'accès
11289 $cle_acces_document = $this->f->get_submitted_get_value('key');
11290 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
11291 // Vérification de l'existence de la clé et récupération de l'uid du fichier
11292 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
11293 if ($uidFichier != null) {
11294 // Récupération du document
11295 $file = $this->f->storage->get($uidFichier);
11296
11297 // Headers
11298 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11299 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11300 header("Content-Type: ".$file['metadata']['mimetype']);
11301 header("Accept-Ranges: bytes");
11302 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11303 // Affichage du document
11304 echo $file['file_content'];
11305
11306 // Récupération de la date de premier accès et maj du suivi uniquement
11307 // si la date de 1er accès n'a pas encore été remplis
11308 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
11309 if ($inst_notif->getVal('date_premier_acces') == null ||
11310 $inst_notif->getVal('date_premier_acces') == '') {
11311 $notif_val = array();
11312 foreach ($inst_notif->champs as $champ) {
11313 $notif_val[$champ] = $inst_notif->getVal($champ);
11314 }
11315 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
11316 $notif_val['statut'] = 'vu';
11317 $notif_val['commentaire'] = 'Le document a été vu';
11318 $suivi_notif = $inst_notif->modifier($notif_val);
11319 }
11320
11321 } else {
11322 // Page vide 404
11323 printf('Ressource inexistante');
11324 header('HTTP/1.0 404 Not Found');
11325 }
11326 }
11327
11328 /**
11329 * Récupère le titre du document envoyé au parapheur
11330 */
11331 protected function getDocumentTitre($champ = null) {
11332 $title = $this->getTitle();
11333 $dossier = $this->getDossier();
11334 return $dossier.' '.$title;
11335 }
11336
11337 /**
11338 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
11339 * l'overlay de notification des demandeurs.
11340 */
11341 function getSubFormTitle($ent) {
11342 $actionSansPath = array('411', '420', '430');
11343 if (in_array($this->getParameter('maj'), $actionSansPath)) {
11344 return '';
11345 }
11346 return parent::getSubFormTitle($ent);
11347 }
11348
11349 /**
11350 * Traitement de la notification automatique des tiers consulté.
11351 *
11352 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
11353 * récupérées ajoute une notification et une tâche de notification par mail.
11354 * La création de la tâche de notification par mail déclenchera l'envoi du mail
11355 * et la mise à jour du suivi.
11356 *
11357 * Les tiers notifiables sont ceux :
11358 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
11359 * - ayant une habilitation dont le type est listé dans les paramètres de
11360 * notification de l’événement,
11361 * - intervenant sur la commune ou le département du dossier
11362 * - ayant au moins une adresse mail valide
11363 *
11364 * @param evenement instance de l'événement associée à l'instruction
11365 * @param dossier instance du dossier de l'instruction
11366 * @return boolean indique si le traitement à réussi
11367 */
11368 public function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11369 // Récupération de l'identifiant plat'au du service consultant
11370 $consultationEntrante = $dossier->get_inst_consultation_entrante();
11371 // Récupération de la liste des types d'habilitations autorisées pour
11372 // cette notification
11373 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11374 // Récupération du département et de la commune du dossier
11375 $commune = $dossier->getVal('commune');
11376 // Le département est récupéré à partir de la commune du dossier donc si la
11377 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11378 $idDepartement = null;
11379 if (! empty($commune)) {
11380 $departement = $dossier->get_inst_departement_dossier();
11381 $idDepartement = $departement->getVal($departement->clePrimaire);
11382 }
11383 // Récupération des courriels des tiers notifiables
11384 $tiersANotifier = $this->get_courriels_tiers_notifiable(
11385 $typesHabilitationsNotifiable,
11386 $consultationEntrante->getVal('service_consultant_id'),
11387 $commune,
11388 $idDepartement
11389 );
11390 // Traitement de chacune des listes de diffusion pour extraire les
11391 // courriels, vérifier la validité des courriels et envoyer la
11392 // notification
11393 $notificationSend = false;
11394 if (empty($tiersANotifier)) {
11395 $this->addToLog(
11396 sprintf(
11397 '%s() : %s %s : %s',
11398 __METHOD__,
11399 __("La récupération des tiers à échoué."),
11400 __('Paramétrage'),
11401 var_export(
11402 array(
11403 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11404 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11405 'id_commune' => $commune,
11406 'id_departement' => $idDepartement
11407 ),
11408 true
11409 )
11410 ),
11411 DEBUG_MODE
11412 );
11413 return false;
11414 }
11415 foreach($tiersANotifier as $tierANotifier) {
11416 // Découpe la liste de diffusion pour stocker les adresses mails
11417 // des tiers dans un tableau
11418 $courriels =
11419 array_filter(
11420 array_map(
11421 'trim',
11422 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11423
11424 foreach ($courriels as $courriel) {
11425 // Pour chaque adresse mail vérifie si l'adresse est valide
11426 if (! $this->f->checkValidEmailAddress($courriel)) {
11427 continue;
11428 }
11429 $destinataire = array(
11430 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11431 'courriel' => $courriel
11432 );
11433 // Si l'adresse est valide ajoute une nouvelle notification
11434 // et une tâche d'envoi de mails
11435 $idNotif = $this->ajouter_notification(
11436 $this->getVal($this->clePrimaire),
11437 $this->f->get_connected_user_login_name(),
11438 $destinataire,
11439 $this->get_dossier_instruction_om_collectivite(),
11440 array(),
11441 true
11442 );
11443 if ($idNotif === false) {
11444 $this->addToLog(
11445 __METHOD__.
11446 __("L'ajout de la notification a échoué."),
11447 DEBUG_MODE
11448 );
11449 return false;
11450 }
11451 // Création de la tache en lui donnant l'id de la notification
11452 $notification_by_task = $this->notification_by_task(
11453 $idNotif,
11454 $dossier->getVal('dossier'),
11455 'mail',
11456 'notification_tiers_consulte'
11457 );
11458 if ($notification_by_task === false) {
11459 $this->addToLog(
11460 __METHOD__.
11461 __("L'ajout de la tâche de notification a échoué."),
11462 DEBUG_MODE
11463 );
11464 $this->addToMessage(
11465 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11466 );
11467 return false;
11468 }
11469 $notificationSend = true;
11470 }
11471 }
11472 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11473 // valide, affiche un message dans les logs pour avoir un suivi.
11474 if (! $notificationSend) {
11475 $this->addToLog(
11476 sprintf(
11477 '%s %s : %s %s : %s',
11478 __METHOD__,
11479 __("Il n'y a pas de tiers notifiable pour l'instruction"),
11480 $evenement->getVal('libelle'),
11481 __("du dossier"),
11482 $this->getVal('dossier')
11483 ),
11484 DEBUG_MODE
11485 );
11486 }
11487 return true;
11488 }
11489
11490 /**
11491 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11492 * respectant les conditions suvantes :
11493 * - le tiers consulté dois accepté les notifications
11494 * - la liste de diffusion ne dois pas être vide
11495 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11496 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11497 * du tiers
11498 * - le type d'habilitation des tiers dois appartenir à la liste
11499 * fournie en paramètre
11500 * - le tiers dois être associé à la commune ou au département passé
11501 * en paramètre
11502 *
11503 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11504 * pouvant être notifiée
11505 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11506 * @param integer $commune identifiant de la commune du dossier
11507 * @param integer $departement identifiant du département du dossier
11508 *
11509 * @return array listes de diffusion des tiers notifiable
11510 */
11511 public function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11512 // Si paramètre non renseigné alors ne renvoie rien
11513 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11514 return false;
11515 }
11516 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11517 $filtreServiceConsulteDI = '';
11518 if (! empty($idPlatau)) {
11519 $filtreServiceConsulteDI = sprintf(
11520 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11521 -- en charge du dossier
11522 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11523 OR tiers_consulte.uid_platau_acteur IS NULL)",
11524 $this->f->db->escapeSimple($idPlatau)
11525 );
11526 }
11527 $rst = $this->f->get_all_results_from_db_query(
11528 sprintf(
11529 'SELECT
11530 -- Tiers notifiables lié à la commune du dossier
11531 tiers_consulte.liste_diffusion,
11532 tiers_consulte.libelle
11533 FROM
11534 %1$shabilitation_tiers_consulte
11535 LEFT JOIN %1$stiers_consulte
11536 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11537 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11538 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11539 -- Conservation uniquement des tiers acteur de dossiers
11540 JOIN %1$slien_dossier_tiers
11541 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11542 WHERE
11543 tiers_consulte.accepte_notification_email IS TRUE
11544 AND tiers_consulte.liste_diffusion IS NOT NULL
11545 %3$s
11546 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11547 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11548 -- Filtre sur les tiers acteur du dossier
11549 AND lien_dossier_tiers.dossier = \'%6$s\'
11550 UNION
11551 SELECT
11552 -- Tiers notifiables lié au département du dossier
11553 tiers_consulte.liste_diffusion,
11554 tiers_consulte.libelle
11555 FROM
11556 %1$shabilitation_tiers_consulte
11557 LEFT JOIN %1$stiers_consulte
11558 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11559 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11560 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11561 -- Conservation uniquement des tiers acteur de dossiers
11562 JOIN %1$slien_dossier_tiers
11563 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11564 WHERE
11565 tiers_consulte.accepte_notification_email IS TRUE
11566 AND tiers_consulte.liste_diffusion IS NOT NULL
11567 %3$s
11568 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11569 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11570 -- Filtre sur les tiers acteur du dossier
11571 AND lien_dossier_tiers.dossier = \'%6$s\'',
11572 DB_PREFIXE,
11573 implode(', ', $typesHabilitations),
11574 $filtreServiceConsulteDI,
11575 intval($commune),
11576 intval($departement),
11577 $this->f->db->escapeSimple($this->getVal('dossier'))
11578 ),
11579 array(
11580 "origin" => __METHOD__
11581 )
11582 );
11583 // Faire un order by sur un union ne fonctionne pas. A la place
11584 // c'est le tableau des résultats qui est ordonné.
11585 usort($rst['result'], function($a, $b) {
11586 return strcmp($a['libelle'], $b['libelle']);
11587 });
11588 return $rst['result'];
11589 }
11590
11591 /**
11592 * Gestion spécifique de l'affichage des documents dans le tableau des
11593 * documents d'instruction.
11594 * Prend en compte qu'une instruction peut également avoir un document lié
11595 * dans la table storage.
11596 *
11597 * @return void
11598 */
11599 public function view_telecharger_editions() {
11600 // Récupère l'identifiant du document dans l'URL appelant l'action
11601 $idx = $this->f->get_submitted_get_value('idx');
11602 $obj = $this->table;
11603 $champ = 'om_fichier_instruction';
11604 // Cas d'un document historisé (dans la table storage)
11605 if (strpos($idx, 'STORAGE_') !== false) {
11606 $idx = substr($idx, 8);
11607 $obj = 'storage';
11608 $champ = 'uid';
11609 }
11610 // Ouvre le document
11611 $lien = '../app/index.php?module=form&snippet=file&obj='.$obj.'&champ='.$champ.'&id='.$idx;
11612 header("Location: ".$lien);
11613 }
11614 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26