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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 17036 - (show annotations)
Wed Feb 28 14:16:17 2024 UTC (10 months, 4 weeks ago) by softime
File size: 497067 byte(s)
chore(branch): fusion de la branche d'intégration 6.4.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
25 //
26 class instruction extends instruction_gen {
27
28 // Champs contenant les UID des fichiers
29 var $abstract_type = array(
30 "om_fichier_instruction" => "file",
31 );
32
33 var $valEvenement;
34 var $restriction_valid = null;
35 // Tableau contenant une partie des métadonnées arrêtés
36 var $metadonneesArrete;
37
38 /**
39 * Instance de la classe dossier
40 *
41 * @var mixed
42 */
43 var $inst_dossier = null;
44
45 /**
46 * Instance de la classe instructeur
47 *
48 * @var mixed
49 */
50 var $inst_instructeur = null;
51
52 /**
53 * Instance de la classe om_utilisateur
54 *
55 * @var mixed
56 */
57 var $inst_om_utilisateur = null;
58
59 var $metadata = array(
60 "om_fichier_instruction" => array(
61 "dossier" => "getDossier",
62 "dossier_version" => "getDossierVersion",
63 "numDemandeAutor" => "getNumDemandeAutor",
64 "anneemoisDemandeAutor" => "getAnneemoisDemandeAutor",
65 "typeInstruction" => "getTypeInstruction",
66 "statutAutorisation" => "getStatutAutorisation",
67 "typeAutorisation" => "getTypeAutorisation",
68 "dateEvenementDocument" => "getDateEvenementDocument",
69 "groupeInstruction" => 'getGroupeInstruction',
70 "title" => 'getTitle',
71 'concerneERP' => 'get_concerne_erp',
72
73 'date_cloture_metier' => 'getDossierDateDecision',
74 'type' => 'getDocumentType',
75 'dossier_autorisation_type_detaille' => 'getDossierAutorisationTypeDetaille',
76 'dossier_instruction_type' => 'getDossierInstructionTypeLibelle',
77 'region' => 'getDossierRegion',
78 'departement' => 'getDossierDepartement',
79 'commune' => 'getDossierCommune',
80 'annee' => 'getDossierAnnee',
81 'division' => 'getDossierDivision',
82 'collectivite' => 'getDossierServiceOrCollectivite',
83 ),
84 "arrete" => array(
85 "numArrete" => "getNumArrete",
86 "ReglementaireArrete" => "getReglementaireArrete",
87 "NotificationArrete" => "getNotificationArrete",
88 "dateNotificationArrete" => "getDateNotificationArrete",
89 "controleLegalite" => "getControleLegalite",
90 "dateSignature" => "getDateSignature",
91 "nomSignataire" => "getNomSignataire",
92 "qualiteSignataire" => "getQualiteSignataire",
93 "ap_numRue" => "getAp_numRue",
94 "ap_nomDeLaVoie" => "getAp_nomDeLaVoie",
95 "ap_codePostal" => "getAp_codePostal",
96 "ap_ville" => "getAp_ville",
97 "activite" => "getActivite",
98 "dateControleLegalite" => "getDateControleLegalite",
99 )
100 );
101
102 /**
103 * Flag pour identifier la reprise de l'instruction d'un dossier.
104 * Le statut de l'état passe de "cloture" à "encours".
105 *
106 * @var boolean
107 */
108 var $di_reopened = null;
109
110 // {{{ Gestion de la confidentialité des données spécifiques
111
112 /**
113 * Définition des actions disponibles sur la classe.
114 *
115 * @return void
116 */
117 function init_class_actions() {
118
119 parent::init_class_actions();
120
121 // ACTION - 000 - ajouter
122 // Modifie la condition d'affichage du bouton ajouter
123 $this->class_actions[0]["condition"] = array("is_addable", "can_user_access_dossier_contexte_ajout");
124
125 // ACTION - 001 - modifier
126 // Modifie la condition et le libellé du bouton modifier
127 $this->class_actions[1]["condition"] = array(
128 "is_editable",
129 "is_finalizable_without_bypass",
130 "can_user_access_dossier_contexte_modification",
131 "is_evenement_modifiable",
132 );
133 $this->class_actions[1]["portlet"]["libelle"] = _("Modifier");
134
135 // ACTION - 002 - supprimer
136 // Modifie la condition et le libellé du bouton supprimer
137 $this->class_actions[2]["condition"] = array(
138 "is_deletable",
139 "is_finalizable_without_bypass",
140 "can_user_access_dossier_contexte_modification",
141 "is_evenement_supprimable",
142 );
143 $this->class_actions[2]["portlet"]["libelle"] = _("Supprimer");
144
145 // ACTION - 003 - consulter
146 //
147 $this->class_actions[3]["condition"] = "can_user_access_dossier_contexte_modification";
148
149 // ACTION - 100 - finaliser
150 // Finalise l'enregistrement
151 $this->class_actions[100] = array(
152 "identifier" => "finaliser",
153 "portlet" => array(
154 "type" => "action-direct",
155 "libelle" => _("Finaliser le document"),
156 "order" => 110,
157 "class" => "finalise",
158 ),
159 "view" => "formulaire",
160 "method" => "finalize",
161 "button" => "finaliser",
162 "permission_suffix" => "finaliser",
163 "condition" => array(
164 "is_finalizable",
165 "is_finalizable_without_bypass",
166 "has_an_edition",
167 "can_user_access_dossier_contexte_modification",
168 ),
169 );
170
171 // ACTION - 110 - definaliser
172 // Finalise l'enregistrement
173 $this->class_actions[110] = array(
174 "identifier" => "definaliser",
175 "portlet" => array(
176 "type" => "action-direct",
177 "libelle" => _("Reprendre la redaction du document"),
178 "order" => 110,
179 "class" => "definalise",
180 ),
181 "view" => "formulaire",
182 "method" => "unfinalize",
183 "button" => "definaliser",
184 "permission_suffix" => "definaliser",
185 "condition" => array(
186 "is_unfinalizable",
187 "is_unfinalizable_without_bypass",
188 "can_user_access_dossier_contexte_modification",
189 "is_not_sent_for_signature",
190 "is_not_signed",
191 ),
192 );
193
194 // ACTION - 115 - Modification d'un document généré par une instruction
195 // Permet à un instructeur de modifier un document généré par une instruction
196 $this->class_actions[115] = array(
197 "identifier" => "modale_selection_document_signe",
198 "portlet" => array(
199 "type" => "action-self",
200 "libelle" => _("Remplacer par le document signé"),
201 "order" => 115,
202 "class" => "selection-document-signé",
203 ),
204 "view" => "view_modale_selection_document_signe",
205 "permission_suffix" => "selection_document_signe",
206 "condition" => array(
207 "is_finalized",
208 "is_not_date_retour_signature_set",
209 ),
210 );
211
212 // ACTION - 120 - edition
213 // Affiche l'édition
214 $this->class_actions[120] = array(
215 "identifier" => "edition",
216 "portlet" => array(
217 "type" => "action-blank",
218 "libelle" => _("Edition"),
219 "order" => 100,
220 "class" => "pdf-16",
221 ),
222 "view" => "view_edition",
223 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
224 "permission_suffix" => "om_fichier_instruction_telecharger",
225 );
226
227 // ACTION - 125 - modifier_suivi
228 // Suivi des dates
229 $this->class_actions[125] = array(
230 "identifier" => "modifier_suivi",
231 "portlet" => array(
232 "type" => "action-self",
233 "libelle" => _("Suivi des dates"),
234 "order" => 125,
235 "class" => "suivi-dates-16",
236 ),
237 "crud" => "update",
238 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
239 "permission_suffix" => "modification_dates",
240 );
241
242 // ACTION - 130 - bible
243 // Affiche la bible
244 $this->class_actions[130] = array(
245 "identifier" => "bible",
246 "view" => "view_bible",
247 "permission_suffix" => "modifier",
248 );
249
250 // ACTION - 140 - bible_auto
251 // Active la bible automatique
252 $this->class_actions[140] = array(
253 "identifier" => "bible_auto",
254 "view" => "view_bible_auto",
255 "permission_suffix" => "modifier",
256 );
257
258 // ACTION - 150 - suivi_bordereaux
259 // Imprimer un bordereau d'envoi
260 $this->class_actions[150] = array(
261 "identifier" => "suivi_bordereaux",
262 "view" => "view_suivi_bordereaux",
263 "permission_suffix" => "consulter",
264 );
265
266 // ACTION - 160 - suivi_envoi_lettre_rar
267 // Imprimer un bordereau d'envoi
268 $this->class_actions[160] = array(
269 "identifier" => "suivi_envoi_lettre_rar",
270 "view" => "view_suivi_envoi_lettre_rar",
271 "permission_suffix" => "consulter",
272 );
273
274 // ACTION - 170 - suivi_mise_a_jour_des_dates
275 // Mettre à jour les dates de l'instruction
276 $this->class_actions[170] = array(
277 "identifier" => "suivi_mise_a_jour_des_dates",
278 "view" => "view_suivi_mise_a_jour_des_dates",
279 "permission_suffix" => "consulter",
280 );
281
282 // ACTION - 175 - edit_by_notification_task
283 // Action à utiliser lors de la mise à jour des instructions par notification
284 $this->class_actions[175] = array(
285 "identifier" => "edit_by_notification_task",
286 "view" => "formulaire",
287 "permission_suffix" => "modifier",
288 "crud" => "update",
289 );
290
291 // ACTION - 176 - add_by_evenement_retour_after_notification_task
292 // Action à utiliser lors de l'ajout des instructions par événement suivant
293 // suite à une notification par tâche (donc notification dématerialisée)
294 $this->class_actions[176] = array(
295 "identifier" => "add_by_evenement_retour_after_notification_task",
296 "view" => "formulaire",
297 "permission_suffix" => "ajouter",
298 "crud" => "create",
299 );
300
301 // ACTION - 180 - pdf_lettre_rar
302 // Génère PDF sur bordereaux de lettres AR
303 $this->class_actions[180] = array(
304 "identifier" => "pdf_lettre_rar",
305 "view" => "view_pdf_lettre_rar",
306 "permission_suffix" => "consulter",
307 );
308
309 // ACTION - 190 - bordereau_envoi_maire
310 // Formulaire pour générer le bordereau d'envoi au maire
311 // Met à jour la date d'envoi à signature du maire
312 $this->class_actions[190] = array(
313 "identifier" => "bordereau_envoi_maire",
314 "view" => "view_bordereau_envoi_maire",
315 "permission_suffix" => "bordereau_envoi_maire",
316 );
317
318 // ACTION - 200 - generate_bordereau_envoi_maire
319 // Génère PDF bordereau d'envoi au maire
320 $this->class_actions[200] = array(
321 "identifier" => "generate_bordereau_envoi_maire",
322 "view" => "view_generate_bordereau_envoi_maire",
323 "permission_suffix" => "bordereau_envoi_maire",
324 );
325
326 // ACTION - 210 - notifier_commune
327 // Notifie la commune par mail d'un évément d'instruction finalisé
328 $this->class_actions[210] = array(
329 "identifier" => "notifier_commune",
330 "portlet" => array(
331 "type" => "action-direct-with-confirmation",
332 "libelle" => _("Notifier la commune par courriel"),
333 "order" => 210,
334 "class" => "notifier_commune-16",
335 ),
336 "view" => "formulaire",
337 "method" => "notifier_commune",
338 "permission_suffix" => "notifier_commune",
339 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
340 );
341
342 // ACTION - 220 - generate_suivi_bordereaux
343 // GénÚre PDF bordereaux
344 $this->class_actions[220] = array(
345 "identifier" => "generate_suivi_bordereaux",
346 "view" => "view_generate_suivi_bordereaux",
347 "permission_suffix" => "consulter",
348 );
349
350 // ACTION - 777 - pdf_temp
351 // Crée un PDF temporaire et affiche son contenu en base64
352 $this->class_actions[777] = array(
353 "identifier" => "pdf_temp",
354 "view" => "view_pdf_temp",
355 "permission_suffix" => "modifier",
356 "condition" => array("can_user_access_dossier_contexte_modification"),
357 );
358
359 // ACTION - 701
360 $this->class_actions[701] = array(
361 "identifier" => "enable-edition-integrale",
362 "portlet" => array(
363 "type" => "action-direct-with-confirmation",
364 "libelle" => _("Rédaction libre"),
365 "order" => 50,
366 "class" => "redac-libre-16",
367 ),
368 "view" => "formulaire",
369 "method" => "enable_edition_integrale",
370 "permission_suffix" => "modifier",
371 "condition" => array(
372 "is_editable",
373 "is_finalizable_without_bypass",
374 "can_user_access_dossier_contexte_modification",
375 "is_edition_integrale_not_enabled",
376 "is_option_redaction_libre_enabled",
377 "has_an_edition",
378 ),
379 );
380 // ACTION - 702
381 $this->class_actions[702] = array(
382 "identifier" => "disable-edition-integrale",
383 "portlet" => array(
384 "type" => "action-direct-with-confirmation",
385 "libelle" => _("Rédaction par compléments"),
386 "order" => 50,
387 "class" => "redac-complement-16",
388 ),
389 "view" => "formulaire",
390 "method" => "disable_edition_integrale",
391 "permission_suffix" => "modifier",
392 "condition" => array(
393 "is_editable",
394 "is_finalizable_without_bypass",
395 "can_user_access_dossier_contexte_modification",
396 "is_edition_integrale_enabled",
397 "is_option_redaction_libre_enabled",
398 "has_an_edition",
399 ),
400 );
401 // ACTION - 300 - evenement_has_an_edition_json
402 //
403 $this->class_actions[300] = array(
404 "identifier" => "evenement_has_an_edition_json",
405 "view" => "view_evenement_has_an_edition_json",
406 "permission_suffix" => "consulter",
407 );
408
409 // ACTION - 301 - evenement_has_a_commentaire
410 //
411 $this->class_actions[301] = array(
412 "identifier" => "evenement_has_a_commentaire_json",
413 "view" => "view_evenement_has_a_commentaire_json",
414 "permission_suffix" => "consulter",
415 );
416
417 // ACTION - 400 - Envoyer en signature
418 // Cet évenement permet d'envoyer le document au parapheur pour signature
419 $this->class_actions[400] = array(
420 "identifier" => "envoyer_a_signature",
421 "portlet" => array(
422 "libelle" => _("Envoyer à signature"),
423 "type" => "action-direct-with-confirmation",
424 "class" => "envoyer_a_signature-16",
425 ),
426 "view" => "formulaire",
427 "method" => "envoyer_a_signature_sans_relecture",
428 "condition" => array(
429 "can_be_signed",
430 ),
431 "permission_suffix" => "envoyer_a_signature",
432 );
433
434 // ACTION - 402 - Envoyer en signature avec relecture
435 // Cet évenement permet d'envoyer le document au parapheur pour signature
436 $this->class_actions[402] = array(
437 "identifier" => "envoyer_a_signature_relecture",
438 "portlet" => array(
439 "libelle" => __("Envoyer à signature avec relecture"),
440 "type" => "action-direct-with-confirmation",
441 "class" => "envoyer_a_signature-16",
442 ),
443 "view" => "formulaire",
444 "method" => "envoyer_a_signature_avec_relecture",
445 "condition" => array(
446 "can_be_signed",
447 "is_parapheur_relecture_parameter_enabled"
448 ),
449 "permission_suffix" => "envoyer_a_signature",
450 );
451
452 // ACTION - 404 - Annuler l'envoi en signature
453 // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
454 $this->class_actions[404] = array(
455 "identifier" => "annuler_envoi_signature",
456 "portlet" => array(
457 "libelle" => __("Annuler l'envoi en signature"),
458 "type" => "action-direct-with-confirmation",
459 "class" => "annuler_envoi_signature-16",
460 ),
461 "view" => "formulaire",
462 "method" => "annuler_envoi_en_signature",
463 "condition" => array(
464 "is_sent_for_signature",
465 "is_parapheur_annulation_parameter_enabled"
466 ),
467 "permission_suffix" => "envoyer_a_signature",
468 );
469
470 //
471 $this->class_actions[401] = array(
472 "identifier" => "preview_edition",
473 "view" => "formulaire",
474 "permission_suffix" => "tab",
475 );
476
477 //
478 $this->class_actions[405] = array(
479 "identifier" => "telecharger_editions",
480 "view" => "view_telecharger_editions",
481 "permission_suffix" => "om_fichier_instruction_telecharger",
482 );
483
484 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
485 $this->class_actions[410] = array(
486 "identifier" => "overlay_notification_manuelle",
487 "portlet" => array(
488 "libelle" => __("Notifier les pétitionnaires"),
489 "type" => "action-self",
490 "class" => "notifier_commune-16",
491 ),
492 "condition" => array(
493 "is_notifiable_by_task_manual",
494 "is_not_portail_notification_sans_annexe"
495 ),
496 "view" => "view_overlay_notification_manuelle",
497 "permission_suffix" => "modifier",
498 );
499
500 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
501 $this->class_actions[411] = array(
502 "identifier" => "notification_manuelle_portal",
503 "portlet" => array(
504 "libelle" => __("Notifier les pétitionnaires"),
505 "type" => "action-direct-with-confirmation",
506 "class" => "notifier_commune-16",
507 ),
508 "condition" => array(
509 "is_notifiable_by_task_manual",
510 "is_portail_notification_sans_annexe"
511 ),
512 "method" => "notifier_demandeur_principal_via_portal",
513 "permission_suffix" => "modifier",
514 );
515
516 // ACTION - 420 - Notifier les services consultés (mail)
517 $this->class_actions[420] = array(
518 "identifier" => "overlay_notification_service_consulte",
519 "portlet" => array(
520 "libelle" => __("Notifier les services consultés"),
521 "type" => "action-self",
522 "class" => "notifier_commune-16",
523 ),
524 "condition" => array(
525 "is_service_notifiable"
526 ),
527 "view" => "view_overlay_notification_service_consulte",
528 "permission_suffix" => "tab",
529 );
530
531 // ACTION - 430 - Notifier les tiers consultés (mail)
532 $this->class_actions[430] = array(
533 "identifier" => "overlay_notification_tiers_consulte",
534 "portlet" => array(
535 "libelle" => __("Notifier les tiers consultés"),
536 "type" => "action-self",
537 "class" => "notifier_commune-16",
538 ),
539 "condition" => array(
540 "is_tiers_notifiable"
541 ),
542 "view" => "view_overlay_notification_tiers_consulte",
543 "permission_suffix" => "tab",
544 );
545
546 //
547 $this->class_actions[403] = array(
548 "identifier" => "envoyer_au_controle_de_legalite",
549 "portlet" => array(
550 "libelle" => __("Envoyer au contrôle de légalité"),
551 "type" => "action-direct-with-confirmation",
552 "class" => "envoyer_au_controle_de_legalite-16",
553 ),
554 "view" => "formulaire",
555 "method" => "envoyer_au_controle_de_legalite",
556 "condition" => array(
557 "can_be_sended_to_cl"
558 ),
559 "permission_suffix" => "envoyer_au_controle_de_legalite",
560 );
561
562 //
563 $this->class_actions[998] = array(
564 "identifier" => "json_data",
565 "view" => "view_json_data",
566 "permission_suffix" => "consulter",
567 );
568 }
569
570 /**
571 * Clause select pour la requête de sélection des données de l'enregistrement.
572 *
573 * @return array
574 */
575 function get_var_sql_forminc__champs() {
576 return array(
577 "instruction",
578 "destinataire",
579 "instruction.evenement",
580 "instruction.commentaire",
581 "date_evenement",
582 "instruction.lettretype",
583 "signataire_arrete",
584 "flag_edition_integrale",
585 "om_final_instruction_utilisateur",
586 "date_finalisation_courrier",
587 "date_envoi_signature",
588 "date_retour_signature",
589 "date_envoi_rar",
590
591 "date_retour_rar",
592 "date_envoi_controle_legalite",
593 "date_retour_controle_legalite",
594
595 "numero_arrete",
596
597 "complement_om_html",
598 "'' as bible_auto",
599 "'' as bible",
600 "complement2_om_html",
601 "'' as bible2",
602 "complement3_om_html",
603 "'' as bible3",
604 "complement4_om_html",
605 "'' as bible4",
606
607 "titre_om_htmletat",
608 "corps_om_htmletatex",
609
610 "'' as btn_preview",
611 "'' as btn_redaction",
612
613 "'' as btn_refresh",
614 "'' as live_preview",
615
616 "dossier",
617 "instruction.action",
618 "instruction.delai",
619 "instruction.etat",
620 "instruction.autorite_competente",
621 "instruction.accord_tacite",
622 "instruction.delai_notification",
623 "instruction.avis_decision",
624 "archive_delai",
625 "archive_accord_tacite",
626 "archive_etat",
627 "archive_avis",
628 "archive_date_complet",
629 "archive_date_rejet",
630 "archive_date_limite",
631 "archive_date_notification_delai",
632 "archive_date_decision",
633 "archive_date_validite",
634 "archive_date_achevement",
635 "archive_date_conformite",
636 "archive_date_chantier",
637 "archive_date_dernier_depot",
638 "date_depot",
639 "date_depot_mairie",
640 "complement5_om_html",
641 "'' as bible5",
642 "complement6_om_html",
643 "'' as bible6",
644 "complement7_om_html",
645 "'' as bible7",
646 "complement8_om_html",
647 "'' as bible8",
648 "complement9_om_html",
649 "'' as bible9",
650 "complement10_om_html",
651 "'' as bible10",
652 "complement11_om_html",
653 "'' as bible11",
654 "complement12_om_html",
655 "complement13_om_html",
656 "complement14_om_html",
657 "complement15_om_html",
658 "archive_incompletude",
659 "archive_incomplet_notifie",
660 "archive_evenement_suivant_tacite",
661 "archive_evenement_suivant_tacite_incompletude",
662 "archive_etat_pendant_incompletude",
663 "archive_date_limite_incompletude",
664 "archive_delai_incompletude",
665 "archive_autorite_competente",
666 "code_barres",
667 "om_fichier_instruction",
668 "om_final_instruction",
669 "om_fichier_instruction_dossier_final",
670 "document_numerise",
671 "duree_validite_parametrage",
672 "duree_validite",
673 "created_by_commune",
674 "archive_date_cloture_instruction",
675 "archive_date_premiere_visite",
676 "archive_date_derniere_visite",
677 "archive_date_contradictoire",
678 "archive_date_retour_contradictoire",
679 "archive_date_ait",
680 "archive_date_transmission_parquet",
681 "archive_dossier_instruction_type",
682 "archive_date_affichage",
683 "pec_metier",
684 "archive_pec_metier",
685 "archive_a_qualifier",
686 "id_parapheur_signature",
687 "statut_signature",
688 "commentaire_signature",
689 "historique_signature",
690 "'' as suivi_notification",
691 "'' as suivi_notification_service",
692 "'' as suivi_notification_tiers",
693 "'' as suivi_notification_commune",
694
695 "'' as preview_edition",
696 "envoye_cl_platau",
697 "'' as log_instruction",
698 "parapheur_lien_page_signature"
699 );
700 }
701
702 /**
703 * CONDITION - is_edition_integrale_enabled
704 *
705 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
706 *
707 * @return boolean
708 */
709 function is_edition_integrale_enabled() {
710 if ($this->getVal("flag_edition_integrale") == 't') {
711 return true;
712 }
713 return false;
714 }
715
716 /**
717 * CONDITION - is_edition_integrale_not_enabled
718 *
719 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
720 *
721 * @return boolean
722 */
723 function is_edition_integrale_not_enabled() {
724 return !$this->is_edition_integrale_enabled();
725 }
726
727 /**
728 * CONDITION - is_option_redaction_libre_enabled
729 *
730 * Vérifie que l'option de rédaction libre est activée.
731 *
732 * @return boolean
733 */
734 function is_option_redaction_libre_enabled() {
735 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
736 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
737 }
738
739 /**
740 * CONDITION - is_option_parapheur_relecture_enabled
741 *
742 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
743 *
744 * @return boolean
745 */
746 function is_parapheur_relecture_parameter_enabled() {
747 //Instanciation de la classe electronicsignature
748 $inst_es = $this->get_electronicsignature_instance();
749 if ($inst_es === false) {
750 return false;
751 }
752
753 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
754 return false;
755 }
756
757 return true;
758 }
759
760 /**
761 * CONDITION - is_parapheur_annulation_parameter_enabled
762 *
763 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
764 *
765 * @return boolean
766 */
767 function is_parapheur_annulation_parameter_enabled() {
768 //Instanciation de la classe electronicsignature
769 $inst_es = $this->get_electronicsignature_instance();
770 if ($inst_es === false) {
771 return false;
772 }
773
774 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
775 return false;
776 }
777
778 return true;
779 }
780
781
782 /**
783 * CONDITION - is_sent_for_signature
784 *
785 * Vérifie que l'instruction a été envoyé à signature
786 *
787 * @return boolean
788 */
789 function is_sent_for_signature() {
790 // Si un parapheur a été configuré
791 // et que le champ id_parapheur_signature n'est pas vide
792 // que le status est différent de "canceled" ou "expired"
793 // alors l'évènement a été envoyé en signature
794 if ($this->has_connector_electronicsignature() === true
795 && empty($this->getVal("id_parapheur_signature")) === false
796 && ($this->getVal("statut_signature") != "canceled"
797 && $this->getVal("statut_signature") != "expired"
798 && $this->getVal("statut_signature") != "finished")) {
799 //
800 return true;
801 }
802
803 return false;
804 }
805
806 /**
807 * CONDITION - is_not_sent_for_signature
808 *
809 * Vérifie que l'instruction n'a pas été envoyé à signature
810 *
811 * @return boolean
812 */
813 function is_not_sent_for_signature() {
814 // Contrôle si l'utilisateur possède un bypass
815 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
816 if ($bypass == true) {
817 return true;
818 }
819
820 return !$this->is_sent_for_signature();
821 }
822
823
824 /**
825 * CONDITION - is_signed
826 *
827 * Vérifie que l'instruction a été signé
828 *
829 * @return boolean
830 */
831 function is_signed() {
832 // Si un parapheur a été configuré
833 // et que le champ id_parapheur_signature n'est pas vide
834 // et que le statut est égal à "finished"
835 // alors le document de l'instruciton à été signé
836 if ($this->has_connector_electronicsignature() === true
837 && empty($this->getVal("id_parapheur_signature")) === false
838 && $this->getVal("statut_signature") == "finished") {
839 //
840 return true;
841 }
842
843 return false;
844 }
845
846 /**
847 * CONDITION - is_signed
848 *
849 * Vérifie que l'instruction n'a pas été signée
850 *
851 * @return boolean
852 */
853 function is_not_signed() {
854 // Contrôle si l'utilisateur possède un bypass
855 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
856 if ($bypass == true) {
857 return true;
858 }
859
860 return !$this->is_signed();
861 }
862
863
864 /**
865 * is_sent_to_cl
866 *
867 * Vérifie que l'instruction a été envoyé au contrôle de légalité
868 *
869 * @return boolean
870 */
871 function is_sent_to_cl() {
872 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
873 if ($this->getVal('envoye_cl_platau') === 't') {
874 //
875 return true;
876 }
877 //
878 return false;
879 }
880
881 /**
882 * CONDITION - is_portail_notification
883 *
884 * Vérifie si la notification est une notification de catégorie portail
885 *
886 * @return boolean
887 */
888 function is_portail_notification_sans_annexe() {
889 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
890 $ev = $this->get_inst_evenement($this->getVal('evenement'));
891 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
892 && $ev->getVal('notification') != 'notification_manuelle_annexe'
893 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
894 ) {
895 return true;
896 }
897 return false;
898 }
899
900 /**
901 * CONDITION - is_not_portail_notification
902 *
903 * Vérifie si la notification n'est pas une notification de catégorie portail
904 *
905 * @return boolean
906 */
907 function is_not_portail_notification_sans_annexe() {
908 return (! $this->is_portail_notification_sans_annexe());
909 }
910
911 /**
912 * CONDITION - can_be_signed
913 *
914 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
915 *
916 * @return boolean
917 */
918 function can_be_signed() {
919 // Instanciation de l'objet signataire_arrete
920 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
921 "obj" => "signataire_arrete",
922 "idx" => $this->getVal("signataire_arrete"),
923 ));
924 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
925 // possède une adresse email, on vérifie le champ id_parapheur_signature
926 // S'il est vide l'évènement peut être envoyé en signature
927 // S'il ne l'est pas, alors on vérifie le champ statut_signature
928 // Si la valeur de ce champ est égal à "canceled" ou "expired"
929 // alors l'évènement peut être envoyé en signature
930 if ($this->has_connector_electronicsignature() === true
931 && $this->getVal("om_final_instruction") == 't'
932 && empty($inst_signataire_arrete->getVal('email')) === false) {
933 //
934 if (empty($this->getVal("id_parapheur_signature")) === true
935 || $this->getVal("statut_signature") == "canceled"
936 || $this->getVal("statut_signature") == "expired") {
937 //
938 return true;
939 }
940 }
941
942 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
943 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
944 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
945 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
946 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
947
948 return false;
949 }
950
951 /**
952 * CONDITION - has_connector_electronicsignature
953 *
954 * Vérifie qu'un parapheur est paramétré
955 *
956 * @return boolean
957 */
958 function has_connector_electronicsignature() {
959 $inst_es = $this->get_electronicsignature_instance(false);
960 if ($inst_es === false) {
961 return false;
962 }
963 return true;
964 }
965
966 /**
967 * CONDITION - can_display_parapheur
968 *
969 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
970 *
971 * @return boolean
972 */
973 function can_display_parapheur() {
974 $evenement_id = $this->getVal("evenement");
975 $inst_evenement = $this->get_inst_evenement($evenement_id);
976 if ($this->has_connector_electronicsignature() === true
977 && $inst_evenement->getVal('lettretype') !== ''
978 && $inst_evenement->getVal('lettretype') !== null
979 && (empty($this->getVal("id_parapheur_signature")) === false
980 || empty($this->getVal("historique_signature")) === false)) {
981 //
982 return true;
983 }
984
985 return false;
986 }
987
988 /**
989 * CONDITION - can_display_notification
990 *
991 * Vérifie que le champs "Suivi notification" est affichable
992 *
993 * @return boolean
994 */
995 function can_display_notification_demandeur() {
996 // Le suivi des notification est affiché si l'événement est notifiable
997 // et si des notifications ont été envoyées
998 $evenement_id = $this->getVal("evenement");
999 $inst_evenement = $this->get_inst_evenement($evenement_id);
1000 if ($inst_evenement->getVal('notification') != null &&
1001 $inst_evenement->getVal('notification') != '') {
1002 // Des notifications ont été envoyé si il existe au moins une notification
1003 // liées à l'instruction
1004 $idsNotifs = $this->get_instruction_notification(
1005 $this->getVal($this->clePrimaire),
1006 array(
1007 'notification_recepisse',
1008 'notification_instruction',
1009 'notification_decision',
1010 ),
1011 true
1012 );
1013 if (isset($idsNotifs) && $idsNotifs !== array()) {
1014 return true;
1015 }
1016 }
1017 return false;
1018 }
1019
1020 /**
1021 * CONDITION - can_display_notification
1022 *
1023 * Vérifie que le champs "suivi_notification_service" est affichable
1024 *
1025 * @return boolean
1026 */
1027 function can_display_notification_service() {
1028 // Le suivi des notification est affiché si l'événement est notifiable
1029 // et si des notifications ont été envoyées
1030 $evenement_id = $this->getVal("evenement");
1031 $inst_evenement = $this->get_inst_evenement($evenement_id);
1032 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1033 // Des notifications ont été envoyé si il existe au moins une notification
1034 // de type notification_service_consulte liées à l'instruction
1035 $idsNotifs = $this->get_instruction_notification(
1036 $this->getVal($this->clePrimaire),
1037 'notification_service_consulte'
1038 );
1039 if (isset($idsNotifs) && $idsNotifs !== array()) {
1040 return true;
1041 }
1042 }
1043 return false;
1044 }
1045
1046
1047 /**
1048 * CONDITION - can_display_notification_tiers
1049 *
1050 * Vérifie que le champs "suivi_notification_tiers" est affichable
1051 *
1052 * @return boolean
1053 */
1054 function can_display_notification_tiers() {
1055 // Le suivi des notification est affiché si l'événement est notifiable
1056 // et si des notifications ont été envoyées
1057 $evenement_id = $this->getVal("evenement");
1058 $inst_evenement = $this->get_inst_evenement($evenement_id);
1059 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1060 // Des notifications ont été envoyé si il existe au moins une notification
1061 // de type notification_tiers_consulte liées à l'instruction
1062 $idsNotifs = $this->get_instruction_notification(
1063 $this->getVal($this->clePrimaire),
1064 'notification_tiers_consulte'
1065 );
1066 if (isset($idsNotifs) && $idsNotifs !== array()) {
1067 return true;
1068 }
1069 }
1070 return false;
1071 }
1072
1073 /**
1074 * CONDITION - can_display_notification_commune
1075 *
1076 * Vérifie que le champs "suivi_notification_commune" est affichable
1077 *
1078 * @return boolean
1079 */
1080 function can_display_notification_commune() {
1081 // Le suivi des notification si il existe au moins une notification
1082 // de type notification_depot_demat liées à l'instruction
1083 $idsNotifs = $this->get_instruction_notification(
1084 $this->getVal($this->clePrimaire),
1085 array('notification_depot_demat', 'notification_commune')
1086 );
1087 if (isset($idsNotifs) && $idsNotifs !== array()) {
1088 return true;
1089 }
1090 return false;
1091 }
1092
1093 /**
1094 * TREATMENT - disable_edition_integrale.
1095 *
1096 * Cette methode permet de passer la consultation en "lu"
1097 *
1098 * @return boolean true si maj effectué false sinon
1099 */
1100 function disable_edition_integrale() {
1101 // Cette méthode permet d'exécuter une routine en début des méthodes
1102 // dites de TREATMENT.
1103 $this->begin_treatment(__METHOD__);
1104 $this->correct = true;
1105 $valF = array(
1106 "flag_edition_integrale" => false,
1107 "titre_om_htmletat" => null,
1108 "corps_om_htmletatex" => null,
1109 );
1110 $res = $this->f->db->autoExecute(
1111 DB_PREFIXE.$this->table,
1112 $valF,
1113 DB_AUTOQUERY_UPDATE,
1114 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1115 );
1116 if ($this->f->isDatabaseError($res, true)) {
1117 // Appel de la methode de recuperation des erreurs
1118 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1119 $this->correct = false;
1120 // Termine le traitement
1121 return $this->end_treatment(__METHOD__, false);
1122 } else {
1123 $this->addToMessage(_("Rédaction par compléments activé."));
1124 return $this->end_treatment(__METHOD__, true);
1125 }
1126
1127 // Termine le traitement
1128 return $this->end_treatment(__METHOD__, false);
1129 }
1130
1131 /**
1132 * TREATMENT - enable_edition_integrale.
1133 *
1134 * Cette methode permet de passer la consultation en "lu"
1135 *
1136 * @return boolean true si maj effectué false sinon
1137 */
1138 function enable_edition_integrale() {
1139 // Cette méthode permet d'exécuter une routine en début des méthodes
1140 // dites de TREATMENT.
1141 $this->begin_treatment(__METHOD__);
1142 $this->correct = true;
1143
1144 // Récupère la collectivite du dossier d'instruction
1145 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1146 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1147 //
1148 $params = array(
1149 "specific" => array(
1150 "corps" => array(
1151 "mode" => "get",
1152 )
1153 ),
1154 );
1155 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1156 $corps = $result['pdf_output'];
1157 //
1158 $params = array(
1159 "specific" => array(
1160 "titre" => array(
1161 "mode" => "get",
1162 )
1163 ),
1164 );
1165 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1166 $titre = $result['pdf_output'];
1167 //
1168 $valF = array(
1169 "flag_edition_integrale" => true,
1170 "titre_om_htmletat" => $titre,
1171 "corps_om_htmletatex" => $corps,
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 libre 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 * Cette méthode instancie le dossier à partir de l'identifiant passé
1196 * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1197 * associé au dossier.
1198 * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1199 * renverra NULL
1200 *
1201 * @param string identifiant du dossier
1202 * @return null|string null ou identifiant du DA
1203 */
1204 function getNumDemandeAutorFromDossier($id) {
1205 if (!isset($id)) {
1206 return NULL;
1207 }
1208
1209 $dossier = $this->f->get_inst__om_dbform(array(
1210 'obj' => 'dossier',
1211 'idx' => $id,
1212 ));
1213
1214 return $dossier->getVal('dossier_autorisation');
1215 }
1216
1217
1218 function setType(&$form, $maj) {
1219 // Récupération du mode de l'action
1220 $crud = $this->get_action_crud($maj);
1221 // Récupère la collectivité du dossier d'instruction
1222 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1223
1224 // Cache tous les champs
1225 foreach ($this->champs as $value) {
1226 $form->setType($value, 'hidden');
1227 }
1228
1229 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1230 if ($this->can_display_parapheur() === true && $maj == 3) {
1231 $form->setType('statut_signature', 'selectstatic');
1232 $form->setType('historique_signature', 'jsontotab');
1233 if ($this->getVal('commentaire_signature') == null) {
1234 $form->setType('commentaire_signature', 'hidden');
1235 } else {
1236 $form->setType('commentaire_signature', 'hiddenstatic');
1237 }
1238 }
1239
1240 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1241 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1242 $form->setType('suivi_notification', 'jsontotab');
1243 }
1244 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1245 if ($maj == 3 && $this->can_display_notification_service() === true) {
1246 $form->setType('suivi_notification_service', 'jsontotab');
1247 }
1248 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1249 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1250 $form->setType('suivi_notification_tiers', 'jsontotab');
1251 }
1252 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1253 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1254 $form->setType('suivi_notification_commune', 'jsontotab');
1255 }
1256
1257 // MODE AJOUTER
1258 if ($this->getParameter('maj') == 0) {
1259 $form->setType('commentaire', 'textareahidden');
1260 // Si l'option est active passage du champ date en lecture seule
1261 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1262 $form->setType("date_evenement", "hiddenstaticdate");
1263 } else {
1264 $form->setType("date_evenement", "date");
1265 }
1266 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1267 $form->setType("evenement", "selecthiddenstatic");
1268 } else {
1269 $form->setType("evenement", "select");
1270 }
1271 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1272 $form->setType("signataire_arrete", "selecthiddenstatic");
1273 } else {
1274 $form->setType("signataire_arrete", "select");
1275 }
1276 if ($this->is_option_redaction_libre_enabled() === true) {
1277 $form->setType("flag_edition_integrale", "select");
1278 }
1279 }
1280
1281 // MODE MODIFIER
1282 if ($this->getParameter('maj') == 1) {
1283 // Si l'option est active passage du champ date en lecture seule
1284 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1285 $form->setType("date_evenement", "hiddenstaticdate");
1286 } else {
1287 $form->setType("date_evenement", "date");
1288 }
1289 $form->setType("evenement", "selecthiddenstatic");
1290 if ($this->has_an_edition() === true) {
1291 $form->setType('lettretype', 'hiddenstatic');
1292 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1293 $form->setType("signataire_arrete", "selecthiddenstatic");
1294 } else {
1295 $form->setType("signataire_arrete", "select");
1296 }
1297 if ($this->getVal("flag_edition_integrale") == "t") {
1298 $form->setType("titre_om_htmletat", "htmlEtat");
1299 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1300 } else {
1301 $form->setType("complement_om_html", "html");
1302 $form->setType("complement2_om_html", "html");
1303 $form->setType("complement3_om_html", "html");
1304 $form->setType("complement4_om_html", "html");
1305 $form->setType('bible_auto', 'httpclick');
1306 $form->setType('bible', 'httpclick');
1307 $form->setType('bible2', 'httpclick');
1308 $form->setType('bible3', 'httpclick');
1309 $form->setType('bible4', 'httpclick');
1310 }
1311 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1312 //
1313 $form->setType('btn_refresh', 'httpclickbutton');
1314 $form->setType('btn_preview', 'httpclickbutton');
1315 $form->setType('btn_redaction', 'httpclickbutton');
1316 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1317 // pour identifiant le champ de prévisualisation et régler sa taille à
1318 // l'affichage du champ. En cas de modification, le selecteur doit également
1319 // être mis à jour
1320 $form->setType('live_preview', 'previsualiser_pdf');
1321 }
1322
1323 // necessaire pour calcul de date en modification
1324 //$form->setType('delai', 'hiddenstatic');
1325 // les administrateurs technique et fonctionnel peuvent
1326 // modifier tous les champs de date
1327 // si l'instruction a déjà été finalisée au moins une fois
1328 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1329 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1330 && $this->getVal("date_finalisation_courrier") != '') {
1331 //
1332 $form->setType('date_envoi_signature', 'date');
1333 $form->setType('date_retour_signature', 'date');
1334 if ($this->is_sent_for_signature() === true
1335 && $this->is_signed() === true) {
1336 //
1337 $form->setType("date_envoi_signature", "datereadonly");
1338 $form->setType("date_retour_signature", "datereadonly");
1339 }
1340 $form->setType('date_envoi_rar', 'date');
1341 $form->setType('date_retour_rar', 'date');
1342 $form->setType('date_envoi_controle_legalite', 'date');
1343 if ($this->is_sent_to_cl() === true) {
1344 $form->setType("date_envoi_controle_legalite", "datedisabled");
1345 }
1346 $form->setType('date_retour_controle_legalite', 'date');
1347 $form->setType('date_finalisation_courrier', 'date');
1348 }
1349 }
1350 }
1351
1352 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1353 if ($this->getParameter('maj') == 3
1354 || $this->getParameter('maj') == 2
1355 || $this->getParameter('maj') == 125
1356 || $this->getParameter('maj') == 410) {
1357 //
1358 $form->setType("date_evenement", "datestatic");
1359 $form->setType("evenement", "selecthiddenstatic");
1360 if ($this->has_an_edition() === true) {
1361 $form->setType('lettretype', 'hiddenstatic');
1362 $form->setType("signataire_arrete", "selecthiddenstatic");
1363 if ($this->getVal("om_final_instruction") == 't') {
1364 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1365 } else {
1366 $form->setType('om_final_instruction_utilisateur', 'hidden');
1367 }
1368 }
1369 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1370 $form->setType('commentaire', 'textareastatic');
1371 }
1372 }
1373
1374 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1375 if ($this->getParameter('maj') == 3
1376 || $this->getParameter('maj') == 2
1377 || $this->getParameter('maj') == 410) {
1378 // Si il n'y a pas de lettre type (edition) associé à l'événement
1379 // les dates de suivi ne sont pas affichée
1380 if ($this->has_an_edition() === true) {
1381 $form->setType('date_envoi_signature', 'datestatic');
1382 $form->setType('date_retour_signature', 'datestatic');
1383 $form->setType('date_envoi_rar', 'datestatic');
1384 $form->setType('date_retour_rar', 'datestatic');
1385 $form->setType('date_envoi_controle_legalite', 'datestatic');
1386 $form->setType('date_retour_controle_legalite', 'datestatic');
1387 $form->setType('date_finalisation_courrier', 'datestatic');
1388 if ($this->getVal("flag_edition_integrale") == "t") {
1389 $form->setType("titre_om_htmletat", "htmlstatic");
1390 $form->setType("corps_om_htmletatex", "htmlstatic");
1391 } else {
1392 $form->setType("complement_om_html", "htmlstatic");
1393 $form->setType("complement2_om_html", "htmlstatic");
1394 $form->setType("complement3_om_html", "htmlstatic");
1395 $form->setType("complement4_om_html", "htmlstatic");
1396 }
1397 }
1398 }
1399
1400 // MODE SUIVI DES DATES 125
1401 if ($this->getParameter('maj') == 125) {
1402 $form->setType("date_evenement", "hiddenstaticdate");
1403 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1404 $form->setType('date_envoi_signature', 'date');
1405 $form->setType('date_retour_signature', 'date');
1406 if ($this->is_sent_for_signature() === true
1407 || $this->is_signed() === true) {
1408 //
1409 $form->setType("date_envoi_signature", "datereadonly");
1410 $form->setType("date_retour_signature", "datereadonly");
1411 }
1412 $form->setType('date_envoi_rar', 'date');
1413 $form->setType('date_retour_rar', 'date');
1414 $form->setType('date_envoi_controle_legalite', 'date');
1415 if ($this->is_sent_to_cl() === true) {
1416 $form->setType("date_envoi_controle_legalite", "datedisabled");
1417 }
1418 $form->setType('date_retour_controle_legalite', 'date');
1419 $form->setType('date_finalisation_courrier', 'date');
1420 }
1421
1422 if ($maj == 401) {
1423 foreach ($this->champs as $champ) {
1424 $form->setType($champ, 'hidden');
1425 }
1426 $form->setType('preview_edition', 'previsualiser');
1427 }
1428
1429 // Si l'instruction a été envoyé au contrôle de légalité et que la
1430 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1431 // l'utilisateur que l'envoi au cl est en cours de traitement.
1432 if ($this->is_sent_to_cl() === true
1433 && empty($this->getVal('date_envoi_controle_legalite'))
1434 && $maj == 3) {
1435 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1436 }
1437 }
1438
1439 function setOnchange(&$form,$maj){
1440 parent::setOnchange($form,$maj);
1441
1442 // MODE AJOUTER
1443 if ($this->getParameter('maj') == 0) {
1444 $form->setOnchange(
1445 "evenement",
1446 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1447 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1448 );
1449 }
1450 }
1451
1452 function evenement_has_an_edition($evenement_id) {
1453 $evenement = $this->get_inst_evenement($evenement_id);
1454 $lettretype = $evenement->getVal('lettretype');
1455 if ($lettretype !== '' && $lettretype !== null) {
1456 return true;
1457 }
1458 return false;
1459 }
1460
1461 function view_evenement_has_an_edition_json() {
1462 $json_return = array(
1463 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1464 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1465 );
1466 echo json_encode($json_return);
1467 }
1468
1469 function evenement_has_a_commentaire($evenement_id) {
1470 $evenement = $this->get_inst_evenement($evenement_id);
1471 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1472 }
1473
1474 function view_evenement_has_a_commentaire_json() {
1475 $json_return = array(
1476 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1477 );
1478 echo json_encode($json_return);
1479 }
1480
1481
1482 /**
1483 * CONDITION - can_be_sended_to_cl
1484 *
1485 * Vérifie que le contrôle de légalité est disponible
1486 *
1487 * @return boolean
1488 */
1489 function can_be_sended_to_cl() {
1490 // Si l'instruction a une édition
1491 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1492 // par Plat'AU
1493 // et que la date de retour signature est renseignée
1494 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1495 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1496 if ($this->has_an_edition() === true) {
1497 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1498 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1499 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1500 && empty($this->getVal('date_retour_signature')) === false
1501 && empty($this->getVal('date_envoi_controle_legalite')) === true
1502 && $this->getVal('envoye_cl_platau') === 'f'
1503 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1504 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1505 //
1506 return true;
1507 }
1508 }
1509 //
1510 return false;
1511 }
1512
1513 /**
1514 *
1515 * @return string
1516 */
1517 function get_var_sql_forminc__sql_signataire_arrete() {
1518 return sprintf(
1519 "SELECT
1520 signataire_arrete.signataire_arrete,
1521 CONCAT_WS(
1522 ' - ',
1523 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1524 signataire_habilitation.libelle,
1525 signataire_arrete.description
1526 )
1527 FROM
1528 %1\$ssignataire_arrete
1529 LEFT JOIN %1\$ssignataire_habilitation
1530 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1531 WHERE
1532 ((signataire_arrete.om_validite_debut IS NULL
1533 AND (signataire_arrete.om_validite_fin IS NULL
1534 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1535 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1536 AND (signataire_arrete.om_validite_fin IS NULL
1537 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1538 ORDER BY
1539 signataire_arrete.prenom,
1540 signataire_arrete.nom",
1541 DB_PREFIXE
1542 );
1543 }
1544
1545 /**
1546 *
1547 * @return string
1548 */
1549 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1550 return sprintf(
1551 "SELECT
1552 signataire_arrete.signataire_arrete,
1553 CONCAT_WS(
1554 ' - ',
1555 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1556 signataire_habilitation.libelle,
1557 signataire_arrete.description
1558 )
1559 FROM
1560 %1\$ssignataire_arrete
1561 LEFT JOIN %1\$ssignataire_habilitation
1562 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1563 WHERE
1564 signataire_arrete.signataire_arrete = <idx>",
1565 DB_PREFIXE
1566 );
1567 }
1568
1569 /**
1570 *
1571 * @return string
1572 */
1573 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1574 return sprintf(
1575 "SELECT
1576 signataire_arrete.signataire_arrete,
1577 CONCAT_WS(
1578 ' - ',
1579 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1580 signataire_habilitation.libelle,
1581 signataire_arrete.description
1582 )
1583 FROM
1584 %1\$ssignataire_arrete
1585 LEFT JOIN %1\$som_collectivite
1586 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1587 LEFT JOIN %1\$ssignataire_habilitation
1588 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1589 WHERE
1590 ((signataire_arrete.om_validite_debut IS NULL
1591 AND (signataire_arrete.om_validite_fin IS NULL
1592 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1593 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1594 AND (signataire_arrete.om_validite_fin IS NULL
1595 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1596 AND (om_collectivite.niveau = '2'
1597 OR signataire_arrete.om_collectivite = <collectivite_di>)
1598 ORDER BY
1599 signataire_arrete.prenom, signataire_arrete.nom",
1600 DB_PREFIXE
1601 );
1602 }
1603
1604 /**
1605 *
1606 * @return string
1607 */
1608 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1609 return sprintf(
1610 "SELECT
1611 signataire_arrete.signataire_arrete,
1612 CONCAT_WS(
1613 ' - ',
1614 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1615 signataire_habilitation.libelle,
1616 signataire_arrete.description
1617 )
1618 FROM
1619 %1\$ssignataire_arrete
1620 LEFT JOIN %1\$ssignataire_habilitation
1621 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1622 WHERE
1623 ((signataire_arrete.om_validite_debut IS NULL
1624 AND (signataire_arrete.om_validite_fin IS NULL
1625 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1626 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1627 AND (signataire_arrete.om_validite_fin IS NULL
1628 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1629 AND signataire_arrete.defaut IS TRUE
1630 ORDER BY
1631 signataire_arrete.prenom, signataire_arrete.nom",
1632 DB_PREFIXE
1633 );
1634 }
1635
1636 /**
1637 *
1638 * @return string
1639 */
1640 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1641 return sprintf(
1642 "SELECT
1643 signataire_arrete.signataire_arrete,
1644 CONCAT_WS(
1645 ' - ',
1646 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1647 signataire_habilitation.libelle,
1648 signataire_arrete.description
1649 )
1650 FROM
1651 %1\$ssignataire_arrete
1652 LEFT JOIN %1\$ssignataire_habilitation
1653 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1654 LEFT JOIN %1\$som_collectivite
1655 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1656 WHERE
1657 ((signataire_arrete.om_validite_debut IS NULL
1658 AND (signataire_arrete.om_validite_fin IS NULL
1659 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1660 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1661 AND (signataire_arrete.om_validite_fin IS NULL
1662 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1663 AND signataire_arrete.defaut IS TRUE
1664 AND (om_collectivite.niveau = '2'
1665 OR signataire_arrete.om_collectivite = <collectivite_di>)
1666 ORDER BY
1667 signataire_arrete.prenom,
1668 signataire_arrete.nom",
1669 DB_PREFIXE
1670 );
1671 }
1672
1673 /**
1674 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1675 * dont l'identifiant a été passé en paramètre dans l'url.
1676 *
1677 * @return array
1678 */
1679 function get_var_sql_forminc__sql_evenement() {
1680 // Récupération du numéro de dossier
1681 $dossier = $this->getParameter("idxformulaire");
1682 // Si changement de décision par instructeur commune
1683 $filter = '';
1684 if ($this->f->isUserInstructeur() === true
1685 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1686 && $this->isInstrCanChangeDecision($dossier) === true) {
1687 $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1688 }
1689 // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1690 // de déterminer si il s'agit d'évènements suggérés.
1691 $qres = $this->f->get_all_results_from_db_query(
1692 sprintf(
1693 'SELECT
1694 DISTINCT(evenement.evenement),
1695 evenement.libelle,
1696 -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1697 CASE WHEN evenement_suggere_dossier.evenement IS NULL
1698 THEN FALSE
1699 ELSE TRUE
1700 END AS is_suggested
1701 FROM
1702 -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1703 -- selon le type de dossier et l état du dossier.
1704 %1$sevenement
1705 JOIN %1$slien_dossier_instruction_type_evenement
1706 ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1707 JOIN %1$stransition
1708 ON evenement.evenement = transition.evenement
1709 JOIN %1$sdossier
1710 ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1711 AND transition.etat = dossier.etat
1712 -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1713 LEFT JOIN (
1714 SELECT
1715 lien_sig_contrainte_evenement.evenement,
1716 dossier.dossier
1717 FROM
1718 %1$slien_sig_contrainte_evenement
1719 JOIN %1$ssig_contrainte
1720 ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1721 JOIN %1$slien_sig_contrainte_dossier_instruction_type
1722 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1723 JOIN %1$slien_sig_contrainte_om_collectivite
1724 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1725 JOIN %1$scontrainte
1726 ON sig_contrainte.libelle = contrainte.libelle
1727 JOIN %1$sdossier_contrainte
1728 ON contrainte.contrainte = dossier_contrainte.contrainte
1729 JOIN %1$sdossier
1730 ON dossier_contrainte.dossier = dossier.dossier
1731 AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1732 JOIN %1$som_collectivite
1733 ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1734 AND (dossier.om_collectivite = om_collectivite.om_collectivite
1735 OR om_collectivite.niveau = \'2\')
1736 ) AS evenement_suggere_dossier
1737 ON evenement.evenement = evenement_suggere_dossier.evenement
1738 AND dossier.dossier = evenement_suggere_dossier.dossier
1739 WHERE
1740 dossier.dossier = \'%2$s\'
1741 %3$s
1742 ORDER BY
1743 is_suggested DESC,
1744 evenement.libelle',
1745 DB_PREFIXE,
1746 $this->f->db->escapeSimple($dossier),
1747 $filter
1748 ),
1749 array(
1750 "origin" => __METHOD__
1751 )
1752 );
1753 return $qres['result'];
1754 }
1755
1756 /**
1757 * Récupère un tableau contenant des évènements de la forme :
1758 * $events = array(
1759 * 1 => array(
1760 * 'libelle' => 'evenement_libelle',
1761 * 'evenement' => 'identifiant_evenement',
1762 * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1763 * ))
1764 * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1765 *
1766 * Le format de sorti est le suivant :
1767 * $select = array(
1768 * 0 => array( -> liste des id des événements
1769 * '0' => '',
1770 * '1' => array(
1771 * '0' => array(), -> liste des id des événements suggérés
1772 * '1' => array(), -> liste des libelles des événements suggérés
1773 * ),
1774 * ...,
1775 * n => 'id_evenement_n'
1776 * ),
1777 * 1 => array(
1778 * '0' => '__('choisir')." ".__('evenement')',
1779 * '1' => '💡 Suggestions',
1780 * ...,
1781 * 'n' => 'libelle_evenement_n',
1782 * )
1783 * )
1784 *
1785 * @param array tableau des événements
1786 * @return array
1787 */
1788 protected function convert_events_array_to_select_format($events) {
1789 // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1790 $contenu = array(
1791 0 => array("",),
1792 1 => array(__('choisir')." ".__('evenement'),)
1793 );
1794
1795 if (! empty($events)) {
1796 // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1797 $suggested_event_group = array_filter($events, function($a) {
1798 return $a['is_suggested'] === 't';
1799 });
1800 if (! empty($suggested_event_group)) {
1801 // Prépare les données qui permettront d'afficher le groupe des événements
1802 // suggérés.
1803 $values = array();
1804 $labels = array();
1805 foreach ($suggested_event_group as $index => $suggested_event) {
1806 $values[] = $suggested_event['evenement'];
1807 $labels[] = $suggested_event['libelle'];
1808 // Supprime les évènements suggérés de la liste des évènements
1809 unset($events[$index]);
1810 }
1811 // Remplissage du select pour le groupe
1812 $contenu[0][] = array($values, $labels);
1813 $contenu[1][] = __('💡 Suggestions');
1814 }
1815
1816 // Remplissage du select
1817 foreach ($events as $event) {
1818 $contenu[0][] = $event['evenement'];
1819 $contenu[1][] = $event['libelle'];
1820 }
1821 }
1822 return $contenu;
1823 }
1824
1825 /**
1826 * SETTER_FORM - setSelect.
1827 *
1828 * @return void
1829 */
1830 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1831 //parent::setSelect($form, $maj);
1832 /**
1833 * On ne surcharge pas la méthode parent car une requête sur la table
1834 * dossier est mauvaise pour les performances, car la requête qui
1835 * concerne evenement est plus complexe que celle générée et car les
1836 * champs action, avis_decision et etat ne sont pas utilisés comme des
1837 * select
1838 */
1839 //// action
1840 //$this->init_select($form, $this->f->db, $maj, null, "action",
1841 // $sql_action, $sql_action_by_id, false);
1842
1843 //// avis_decision
1844 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1845 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1846
1847 //// dossier
1848 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1849 // $sql_dossier, $sql_dossier_by_id, false);
1850
1851 //// etat
1852 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1853 // $sql_etat, $sql_etat_by_id, false);
1854
1855 //// evenement
1856 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1857 // $sql_evenement, $sql_evenement_by_id, false);
1858
1859 // signataire_arrete
1860 // si contexte DI
1861 if ($this->getParameter("retourformulaire") == "dossier"
1862 || $this->f->contexte_dossier_instruction()) {
1863 // on recupère les signataires de la multicollectivité et de celle du DI
1864 $di = $this->f->get_inst__om_dbform(array(
1865 "obj" => "dossier_instruction",
1866 "idx" => $this->getParameter('idxformulaire'),
1867 ));
1868 $sql_signataire_arrete_by_di = str_replace(
1869 '<collectivite_di>',
1870 $di->getVal("om_collectivite"),
1871 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1872 );
1873 $this->init_select(
1874 $form,
1875 $this->f->db,
1876 $maj,
1877 null,
1878 "signataire_arrete",
1879 $sql_signataire_arrete_by_di,
1880 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1881 true
1882 );
1883 } else {
1884 $this->init_select(
1885 $form,
1886 $this->f->db,
1887 $maj,
1888 null,
1889 "signataire_arrete",
1890 $this->get_var_sql_forminc__sql("signataire_arrete"),
1891 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1892 true
1893 );
1894 }
1895
1896 /**
1897 * Gestion du filtre sur les événements de workflow disponibles
1898 * On récupère ici en fonction de l'état du dossier d'instruction en
1899 * cours et du type du dossier d'instruction en cours la liste
1900 * événements disponibles.
1901 */
1902 if ($maj == 0) {
1903 $evenements = $this->get_var_sql_forminc__sql_evenement();
1904 $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1905 } else {
1906 // Instanciation de l'événement pour récupérer son libellé
1907 $evenement = $this->f->get_inst__om_dbform(array(
1908 "obj" => "evenement",
1909 "idx" => $this->getVal("evenement"),
1910 ));
1911
1912 $contenu = array(
1913 0 => array($this->getVal("evenement"),),
1914 1 => array($evenement->getVal('libelle'),)
1915 );
1916 $form->setSelect("evenement", $contenu);
1917 }
1918
1919 /**
1920 * Gesion des liens vers la bible
1921 */
1922 // lien bible_auto
1923 $contenu = array(_("automatique"));
1924 $form->setSelect("bible_auto",$contenu);
1925 // lien bible1
1926 $contenu = array(_("bible"));
1927 $form->setSelect("bible",$contenu);
1928 // lien bible2
1929 $contenu = array(_("bible"));
1930 $form->setSelect("bible2",$contenu);
1931 // lien bible3
1932 $contenu = array(_("bible"));
1933 $form->setSelect("bible3",$contenu);
1934 // lien bible4
1935 $contenu = array(_("bible"));
1936 $form->setSelect("bible4",$contenu);
1937
1938 if ($maj == 1) {
1939 $base64 = $this->init_pdf_temp();
1940 $form->setSelect('live_preview', array('base64'=>$base64));
1941 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1942 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1943 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1944 }
1945
1946 // Selection du type de rédaction à l'ajout
1947 $content = array(
1948 0 => array('f', 't', ),
1949 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1950 );
1951 $form->setSelect('flag_edition_integrale', $content);
1952
1953 $contenu = array();
1954 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1955 $contenu[0][] = $value;
1956 $contenu[1][] = $this->get_trad_for_statut($value);
1957 }
1958 $form->setSelect('statut_signature', $contenu);
1959
1960
1961 if ($maj == 401) {
1962 $idx = $this->getParameter("idx");
1963 $dossier = $this->getParameter("idxformulaire");
1964 if ( strpos($idx, 'STORAGE_') !== FALSE) {
1965 $idx = substr($idx, 8);
1966 $model = 'storage';
1967 $champ = 'uid';
1968 $object = $this->f->get_inst__om_dbform(array(
1969 "obj" => $model,
1970 "idx" => $idx,
1971 ));
1972
1973 $file = $this->f->storage->get($object->getVal($champ));
1974 $label = $file['metadata']['filename'];
1975 $href =sprintf(
1976 '../app/index.php?module=form&snippet=file&obj=storage&champ=uid&id=%1$s',
1977 $idx
1978 );
1979 $this->addToLog(__METHOD__."(): file['metadata']['filename'] = ".$file['metadata']['filename']." ", DEBUG_MODE);
1980 $this->val['preview_edition'] = '';
1981 }else{
1982 $label ='instruction_'.$this->getVal($this->clePrimaire);
1983 $href =sprintf(
1984 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1985 $this->getVal($this->clePrimaire)
1986 );
1987 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1988 }
1989
1990 $form->setSelect('preview_edition', array(
1991 'base64' => base64_encode($file['file_content']),
1992 'mimetype' => $file['metadata']['mimetype'],
1993 'label' => $label,
1994 'href' => $href
1995 ));
1996 }
1997 }
1998
1999 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2000 //
2001 // Vérifie uniquementla cle secondaire : demande
2002 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
2003
2004 $id = $this->getVal($this->clePrimaire);
2005
2006 //Requête de vérification que cet événement d'instruction n'est pas lié
2007 //à la création d'un dossier d'instruction
2008 $qres = $this->f->get_one_result_from_db_query(
2009 sprintf(
2010 'SELECT
2011 demande_type.dossier_instruction_type
2012 FROM
2013 %1$sdemande_type
2014 LEFT JOIN %1$sdemande
2015 ON demande.demande_type = demande_type.demande_type
2016 WHERE
2017 demande.instruction_recepisse = \'%2$d\'',
2018 DB_PREFIXE,
2019 intval($id)
2020 ),
2021 array(
2022 "origin" => __METHOD__,
2023 )
2024 );
2025
2026 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
2027 //création de dossier d'instruction, l'événement d'instruction peut être
2028 //supprimé
2029 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
2030 // Requête de vérification que cet événement d'instruction est lié
2031 // à une demande
2032 $qres = $this->f->get_one_result_from_db_query(
2033 sprintf(
2034 'SELECT
2035 demande
2036 FROM
2037 %1$sdemande
2038 WHERE
2039 instruction_recepisse = \'%2$d\'',
2040 DB_PREFIXE,
2041 intval($id)
2042 ),
2043 array(
2044 "origin" => __METHOD__,
2045 )
2046 );
2047
2048 //Si c'est un événement d'instruction lié à une demande
2049 if ($qres['result'] != null || $qres['result'] != ""){
2050 $demande = $this->f->get_inst__om_dbform(array(
2051 "obj" => "demande",
2052 "idx" => $qres['result'],
2053 ));
2054
2055 //On met à jour la demande en supprimant la liaison vers
2056 //l'événement d'instruction
2057 $demande->setParameter("maj", 1);
2058 $valF = array();
2059 foreach($demande->champs as $identifiant => $champ) {
2060 $valF[$champ] = $demande->val[$identifiant];
2061 }
2062 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2063 $valF['instruction_recepisse']=NULL;
2064 $ret = $demande->modifier($valF);
2065 }
2066
2067 /**
2068 * Vérification que l'élément supprimé est le dernier pour pouvoir
2069 * remodifier les données de manière itérative.
2070 */
2071 $qres = $this->f->get_one_result_from_db_query(
2072 sprintf(
2073 'SELECT
2074 max(instruction)
2075 FROM
2076 %1$sinstruction
2077 WHERE
2078 dossier = \'%2$s\'',
2079 DB_PREFIXE,
2080 $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2081 ),
2082 array(
2083 "origin" => __METHOD__,
2084 )
2085 );
2086
2087 // Si on se trouve effectivement sur le dernier evenement d'instruction
2088 // alors on valide la suppression sinon on l'annule
2089 $this->correct = false;
2090 $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2091 if ($qres['result'] == $id) {
2092 // Alors on valide la suppression
2093 $this->correct = true;
2094 $message = __('Destruction_chronologique');
2095 }
2096 $this->addToMessage($message);
2097 }
2098 }
2099
2100 /**
2101 * Vérification de la possibilité ou non de modifier des dates de suivi
2102 * @param string $champ champ date à vérifier
2103 */
2104 function updateDate($champ) {
2105
2106 //Si le retourformulaire est "dossier_instruction"
2107 if ($this->getParameter("retourformulaire") == "dossier"
2108 || $this->f->contexte_dossier_instruction()) {
2109
2110 // Vérification de la possibilité de modifier les dates si déjà éditées
2111 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2112 // si l'utilisateur n'est pas un admin
2113 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2114
2115 // si le champ concerné est 'date_envoi_signature'
2116 // et que le statut du parapheur est 'expired'
2117 // alors on autorise le changement de la date
2118 // pour tous les autres cas, on ne peut modifier la date
2119 if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2120 $this->correct = false;
2121 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2122 }
2123 }
2124 }
2125 }
2126
2127 //
2128 return true;
2129 }
2130
2131 /**
2132 * SETTER_FORM - setValsousformulaire (setVal).
2133 *
2134 * @return void
2135 */
2136 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2137 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2138 //
2139 $this->retourformulaire = $retourformulaire;
2140 //
2141 if ($maj == 0) {
2142 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2143 $form->setVal("dossier", $this->getParameter("idxformulaire"));
2144 }
2145
2146 // Si l'instruction a été envoyé au contrôle de légalité et que la
2147 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2148 // l'utilisateur que l'envoi au cl est en cours de traitement.
2149 if ($this->is_sent_to_cl() === true
2150 && empty($this->getVal('date_envoi_controle_legalite'))
2151 && $maj == 3) {
2152 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2153 }
2154 //
2155 $this->set_form_default_values($form, $maj, $validation);
2156 }
2157
2158 /**
2159 * SETTER_FORM - set_form_default_values (setVal).
2160 *
2161 * @return void
2162 */
2163 function set_form_default_values(&$form, $maj, $validation) {
2164 //
2165 if ($maj == 0) {
2166 // si contexte DI
2167 if ($this->getParameter("retourformulaire") == "dossier"
2168 || $this->f->contexte_dossier_instruction()) {
2169 // on recupère les signataires de la multicollectivité et de celle du DI
2170 $di = $this->f->get_inst__om_dbform(array(
2171 "obj" => "dossier_instruction",
2172 "idx" => $this->getParameter("idxformulaire"),
2173 ));
2174 $sql = str_replace(
2175 "<collectivite_di>",
2176 $di->getVal("om_collectivite"),
2177 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2178 );
2179 } else {
2180 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2181 }
2182
2183 $qres = $this->f->get_all_results_from_db_query($sql, array(
2184 "origin" => __METHOD__));
2185 $row = array_shift($qres['result']);
2186 if (isset($row["signataire_arrete"])
2187 && is_numeric($row["signataire_arrete"])) {
2188 //
2189 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2190 }
2191 // Date du jour
2192 $form->setVal("date_evenement", date("Y-m-d"));
2193 }
2194 //
2195 if ($maj == 0 || $maj == 1 || $maj == 125) {
2196 $form->setVal("bible_auto", "bible_auto()");
2197 $form->setVal("bible", "bible(1)");
2198 $form->setVal("bible2", "bible(2)");
2199 $form->setVal("bible3", "bible(3)");
2200 $form->setVal("bible4", "bible(4)");
2201 }
2202 //
2203 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2204 if ($maj == 1
2205 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2206 && $this->has_an_edition() === true) {
2207 //
2208 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2209 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2210 $form->setVal("btn_preview", "show_instr_preview()");
2211 $form->setVal("btn_redaction", "show_instr_redaction()");
2212 }
2213
2214 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2215 // des communes
2216 if ($maj == 3) {
2217 if ($this->can_display_notification_demandeur()) {
2218 $typeNotification = array(
2219 'notification_recepisse',
2220 'notification_instruction',
2221 'notification_decision',
2222 );
2223 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2224 }
2225 if ($this->can_display_notification_service()) {
2226 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2227 }
2228 if ($this->can_display_notification_tiers()) {
2229 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2230 }
2231 if ($this->can_display_notification_commune()) {
2232 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2233 }
2234 if ($this->getVal('flag_edition_integrale') == 't') {
2235 $message = __("Aucun contenu à afficher.");
2236 if (empty($this->getVal('titre_om_htmletat'))) {
2237 $form->setVal("titre_om_htmletat", $message);
2238 }
2239 if (empty($this->getVal('corps_om_htmletatex'))) {
2240 $form->setVal("corps_om_htmletatex", $message);
2241 }
2242 }
2243 }
2244 }
2245
2246 function setLayout(&$form, $maj){
2247 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2248
2249 $form->setFieldset('evenement','D',_('Evenement'));
2250 $form->setFieldset('om_final_instruction_utilisateur','F','');
2251
2252 $form->setBloc('om_final_instruction_utilisateur','F');
2253 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2254 // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2255 $form->setBloc('om_final_instruction_utilisateur','F');
2256 $form->setBloc('parapheur_lien_page_signature','D');
2257
2258 $form->setBloc('date_finalisation_courrier','D',"","");
2259
2260 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2261 $form->setBloc('date_finalisation_courrier','D');
2262 $form->setBloc('date_envoi_rar','F');
2263
2264 $form->setBloc('date_retour_rar','D');
2265 $form->setBloc('date_retour_controle_legalite','F');
2266 $form->setFieldset('date_retour_controle_legalite','F','');
2267
2268 $form->setBloc('date_retour_controle_legalite','F');
2269
2270 $form->setBloc('statut_signature','D');
2271 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2272 $form->setBloc('commentaire_signature','F');
2273 $form->setBloc('historique_signature','D');
2274 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2275 $form->setBloc('historique_signature','F');
2276 $form->setFieldset('historique_signature','F');
2277
2278 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2279 $form->setFieldset('suivi_notification','F');
2280 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2281 $form->setFieldset('suivi_notification_service','F');
2282 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2283 $form->setFieldset('suivi_notification_tiers','F');
2284 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2285 $form->setFieldset('suivi_notification_commune','F');
2286
2287 if ($maj == 1) {
2288 // Récupère la collectivité du dossier d'instruction
2289 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2290
2291 //
2292 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2293 && $this->has_an_edition() === true) {
2294 //
2295 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2296 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2297 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2298 $form->setFieldset('complement_om_html','D',_('Complement'));
2299 $form->setFieldset('bible','F','');
2300 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2301 $form->setFieldset('bible2','F','');
2302 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2303 $form->setFieldset('bible3','F','');
2304 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2305 $form->setFieldset('bible4','F','');
2306 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2307 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2308 $form->setBloc('corps_om_htmletatex','F');
2309 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2310 $form->setBloc('btn_preview','F');
2311 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2312 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2313 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2314 $form->setFieldset('live_preview','F');
2315 $form->setBloc('live_preview','F');
2316 $form->setBloc('live_preview','F');
2317 } else {
2318 $form->setBloc('complement_om_html','D',"","hidelabel");
2319 $form->setFieldset('complement_om_html','D',_('Complement'));
2320 $form->setFieldset('bible','F','');
2321 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2322 $form->setFieldset('bible2','F','');
2323 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2324 $form->setFieldset('bible3','F','');
2325 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2326 $form->setFieldset('bible4','F','');
2327 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2328 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2329 $form->setBloc('corps_om_htmletatex','F');
2330 }
2331 } else {
2332 $form->setBloc('complement_om_html','D',"","hidelabel");
2333 $form->setFieldset('complement_om_html','D',_('Complement'));
2334 $form->setFieldset('bible','F','');
2335 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2336 $form->setFieldset('bible2','F','');
2337 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2338 $form->setFieldset('bible3','F','');
2339 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2340 $form->setFieldset('bible4','F','');
2341 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2342 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2343 $form->setBloc('corps_om_htmletatex','F');
2344 }
2345 }
2346
2347 function setLib(&$form, $maj) {
2348 //
2349 parent::setLib($form, $maj);
2350 //
2351 $form->setLib('bible_auto', "");
2352 $form->setLib('bible', "");
2353 $form->setLib('bible2', "");
2354 $form->setLib('bible3', "");
2355 $form->setLib('bible4', "");
2356 $form->setLib('btn_refresh', "");
2357 $form->setLib('btn_preview', "");
2358 $form->setLib('btn_redaction', "");
2359 $form->setLib('live_preview', "");
2360 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2361 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2362 $form->setLib('date_retour_rar', __("date_notification"));
2363 $form->setLib('statut_signature', __("statut"));
2364 $form->setLib('commentaire_signature', __("commentaire"));
2365 $form->setLib('historique_signature', '');
2366 $form->setLib('suivi_notification', '');
2367 $form->setLib('suivi_notification_service', '');
2368 $form->setLib('suivi_notification_tiers', '');
2369 $form->setLib('suivi_notification_commune', '');
2370 $form->setLib('preview_edition', "");
2371
2372 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2373 // ajout et que l'option de rédaction libre est activée sur la
2374 // collectivité du dossier
2375 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2376 //
2377 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2378 $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.");
2379 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2380 }
2381 else {
2382 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2383 }
2384
2385 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2386 // modification et que l'option de prévisualisation de l'édition est
2387 // activée sur la collectivité du dossier
2388 if ($maj === '1'
2389 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2390 //
2391 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2392 $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.");
2393 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2394 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2395 }
2396 }
2397
2398 /**
2399 * Surcharge om_dbform::set_form_specificity()
2400 *
2401 * Traitements spécifiques lié à l'affichage des formulaires.
2402 * Les traitements gérés ici sont les suivants :
2403 * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2404 * pu être récupérée.
2405 * - Affichage d'un message d'information à l'attention de l'utilisateur si
2406 * la notification est activée mais qu'elle n'est pas possible à cause du
2407 * paramètrage.
2408 *
2409 * @param formulaire $form Instance formulaire.
2410 * @param string $maj
2411 *
2412 * @return void
2413 */
2414 function set_form_specificity(&$form, $maj) {
2415 parent::set_form_specificity($form, $maj);
2416
2417 // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2418 // Si ce n'est pas le cas affiche un message d'erreur.
2419 if ((! empty($maj) && $maj == 3)) {
2420 if (! empty($this->getVal('lettretype'))) {
2421
2422 $om_edition = $this->f->get_inst__om_edition();
2423 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2424 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2425 $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2426
2427 if (empty($edition)) {
2428 $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2429 }
2430 }
2431 }
2432
2433 $this->display_notification_info($maj);
2434 }
2435
2436 /**
2437 * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2438 * citoyen, si la notification des demandeurs est activée sur l'évenement
2439 * d'instruction et que le paramétrage du demandeur principal n'est pas
2440 * correct alors un message a destination de l'instructeur est affiché.
2441 *
2442 * @param string $maj
2443 *
2444 * @return void
2445 */
2446 public function display_notification_info($maj) {
2447 if ((! empty($maj) && $maj == 3)) {
2448 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2449 // la requête permettant de savoir le type de demande à échouée) et si
2450 // la notification se fait par mail vérifie si il y a des erreurs de
2451 // paramétrage et si c'est le cas on affiche un message d'information
2452 if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2453 $erreurParam = $this->get_info_notification_fail();
2454 // Récupération de l'évenement d'instruction
2455 $instEV = $this->get_inst_evenement();
2456 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2457 $class = 'text-info ui-state-highlight ui-state-info';
2458 $message = __("La notification n'est pas possible.");
2459 $this->f->display_panel_information(
2460 $class,
2461 $message,
2462 $erreurParam,
2463 __('Les données suivantes doivent être modifiées'),
2464 'erreur_param_notif'
2465 );
2466 }
2467 }
2468 }
2469 }
2470
2471 /**
2472 * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2473 */
2474 public function display_error_message($msg) {
2475 $this->correct = false;
2476 $this->msg = $msg;
2477 }
2478
2479 /**
2480 * TRIGGER - triggerajouter.
2481 * Réalise différents traitements avant d'ajouter l'instruction en base.
2482 *
2483 * Les traitements réalisés sont les suivant :
2484 * - TODO : documenter les traietements existant
2485 * - Intégre les bibles pré-chargé aux compléments de l'instruction.
2486 * Ce traitement n'est déclenché que si l'on est pas en rédaction libre, et que l'évènement a une lettretype.
2487 *
2488 * @return boolean
2489 */
2490 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2491 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2492 /**
2493 * Le code suivant permet de récupérer des valeurs des tables evenement
2494 * et dossier pour les stocker dans l'instruction :
2495 * DEPUIS L'EVENEMENT
2496 * - action
2497 * - delai
2498 * - accord_tacite
2499 * - etat
2500 * - avis_decision
2501 * - delai_notification
2502 * - lettretype
2503 * - autorite_competente
2504 * - pec_metier
2505 * - complement_om_html
2506 * - complement2_om_html
2507 * - complement3_om_html
2508 * - complement4_om_html
2509 * - complement5_om_html
2510 * DEPUIS LE DOSSIER D'INSTRUCTION
2511 * - archive_delai
2512 * - archive_accord_tacite
2513 * - archive_etat
2514 * - archive_avis
2515 * - date_complet
2516 * - date_rejet
2517 * - date_limite
2518 * - date_notification_delai
2519 * - date_decision
2520 * - date_validite
2521 * - date_achevement
2522 * - date_chantier
2523 * - date_conformite
2524 * - avis_decision
2525 */
2526 // Récupération de tous les paramètres de l'événement sélectionné
2527 // TODO : remplacer cette requête par l'instanciation de l'événement
2528 $qres = $this->f->get_all_results_from_db_query(
2529 sprintf(
2530 'SELECT
2531 *
2532 FROM
2533 %1$sevenement
2534 WHERE
2535 evenement = %2$d',
2536 DB_PREFIXE,
2537 intval($this->valF['evenement'])
2538 ),
2539 array(
2540 "origin" => __METHOD__,
2541 )
2542 );
2543 foreach ($qres['result'] as $row) {
2544 // Récupération de l'identifiant de l'action
2545 // si une action est paramétrée dans l'événement
2546 $this->valF['action'] = NULL;
2547 if (isset($row['action']) and !empty($row['action'])) {
2548 $this->valF['action']=$row['action'];
2549 }
2550 // Récupération de la valeur du délai
2551 $this->valF['delai'] = $row['delai'];
2552 // Récupération de l'identifiant de l'état
2553 // si un état est paramétré dans l'événement
2554 $this->valF['etat']=NULL;
2555 if (isset($row['etat']) and !empty($row['etat'])) {
2556 $this->valF['etat']=$row['etat'];
2557 }
2558 // Récupération de la valeur d'accord tacite
2559 $this->valF['accord_tacite']=$row['accord_tacite'];
2560 // Récupération de la valeur du délai de notification
2561 $this->valF['delai_notification']=$row['delai_notification'];
2562 // Récupération de l'identifiant de l'avis
2563 // si un avis est paramétré dans l'événement
2564 $this->valF['avis_decision'] = NULL;
2565 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2566 $this->valF['avis_decision']=$row['avis_decision'];
2567 }
2568 // Récupération de la valeur de l'autorité compétente
2569 // si l'autorité compétente est paramétré dans l'événement
2570 $this->valF['autorite_competente'] = NULL;
2571 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2572 $this->valF['autorite_competente']=$row['autorite_competente'];
2573 }
2574 // Récupération de la valeur de la lettre type
2575 $this->valF['lettretype']=$row['lettretype'];
2576 // Récupération de la valeur de la prise en compte métier
2577 // si la prise en compte métier est paramétrée dans l'événement
2578 $this->valF['pec_metier'] = NULL;
2579 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2580 $this->valF['pec_metier'] = $row['pec_metier'];
2581 }
2582 }
2583 // Récupération de toutes les valeurs du dossier d'instruction en cours
2584 // TODO : remplacer cette requête par l'instanciation de l'objet
2585 $qres = $this->f->get_all_results_from_db_query(
2586 sprintf(
2587 'SELECT
2588 *
2589 FROM
2590 %1$sdossier
2591 WHERE
2592 dossier = \'%2$s\'',
2593 DB_PREFIXE,
2594 $this->f->db->escapeSimple($this->valF['dossier'])
2595 ),
2596 array(
2597 "origin" => __METHOD__,
2598 )
2599 );
2600 $row = array_shift($qres['result']);
2601 $this->updateArchiveData($row);
2602
2603 // Récupération de la duree de validite du dossier d'autorisation
2604 $qres = $this->f->get_one_result_from_db_query(
2605 sprintf(
2606 'SELECT
2607 duree_validite_parametrage
2608 FROM
2609 %1$sdossier_autorisation_type_detaille
2610 LEFT JOIN %1$sdossier_autorisation
2611 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2612 LEFT JOIN %1$sdossier
2613 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2614 WHERE
2615 dossier.dossier = \'%2$s\'',
2616 DB_PREFIXE,
2617 $this->f->db->escapeSimple($this->valF['dossier'])
2618 ),
2619 array(
2620 "origin" => __METHOD__,
2621 )
2622 );
2623
2624 if ($qres['result'] != '') {
2625 $this->valF['duree_validite_parametrage'] = $qres['result'];
2626 }
2627
2628 // Identifiant du type de courrier
2629 $idTypeCourrier = '11';
2630 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2631 // Code barres
2632 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2633
2634 // Set dans la propriété valF les valeurs des compléments pour qu'ils soient enregistrés
2635 // à l'ajout de l'instruction.
2636 // Le traitement n'est réalisé que si il y a une lettretype et qu'on est pas en rédaction libre
2637 if (! empty($this->valF['lettretype'])) {
2638 $this->set_precharge_complement($this->valF['evenement'], $this->valF['dossier']);
2639 }
2640 }
2641
2642 /**
2643 * Récupère pour chaque champ complementX_om_html le complément correspondant
2644 * et set l'entrée correspondante de valF avec.
2645 *
2646 * Problème potentiel : Le nombre de complément se base sur le champs complement ayant
2647 * l'indice le plus grand visible dans get_var_sql_forminc__champs().
2648 * Dans cette fonction on fait donc 15 itérations. Changer le nombre de complément
2649 * aura donc un impact sur cette méthode.
2650 *
2651 * @param string dossier : identifiant du dossier de l'instruction
2652 * @param int evenement : identifiant de l'évènement d'instruction
2653 *
2654 * @return void
2655 */
2656 public function set_precharge_complement($evenement, $dossier) {
2657 // Récupération des bibles et chargement dans les compléments
2658 for ($i = 1; $i <= 15; $i++) {
2659 // Constitution de l'id du champs.
2660 // Pour l'indice 1, l'id est complement_om_html, l'indice n'est pas visible dans ce cas.
2661 $field = "complement".($i === 1 ? '' : $i)."_om_html";
2662 // Récupération des compléments correspondant en fonction de l'évènement
2663 // et du dossier puis insertion dans la champs voulu
2664 $this->valF[$field] = $this->getBible($evenement, $dossier, $i, 'precharge');
2665 }
2666 }
2667
2668
2669
2670 /**
2671 * Test si une restriction est valide.
2672 *
2673 * @return boolean
2674 */
2675 function restrictionIsValid($restriction){
2676 if($this->restriction_valid != null) {
2677 return $this->restriction_valid;
2678 }
2679 if(empty($restriction)) {
2680 $this->restriction_valid = true;
2681 return $this->restriction_valid;
2682 }
2683 // Liste des opérateurs possibles sans espace
2684 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2685 // Liste identique mais avec le marqueur §
2686 $mark = "§";
2687 $operateurs_marked = array();
2688 foreach ($operateurs as $operateur) {
2689 $operateurs_marked[] = $mark.$operateur.$mark;
2690 }
2691
2692 // Supprime tous les espaces de la chaîne de caractère
2693 $restriction = preg_replace('/\s+/', '', $restriction);
2694
2695 // Met un marqueur avant et après les opérateurs
2696 // puis transforme la chaine en un tableau
2697 $restriction = str_replace($operateurs, $operateurs_marked,
2698 $restriction);
2699
2700 // Pour chaque opérateur logique
2701 foreach (array('&&', '||') as $operator) {
2702
2703 // S'il est absent on ne fait aucun traitement
2704 if (strpos($restriction, $mark.$operator.$mark) === false) {
2705 continue;
2706 }
2707 // Sinon on vérifie les deux conditions avec le OU/ET logique
2708 $restrictions = explode($mark.$operator.$mark, $restriction);
2709 $restrictions[0] = explode($mark, $restrictions[0]);
2710 $restrictions[1] = explode($mark, $restrictions[1]);
2711 $res_bool = false;
2712 if ($operator == '&&') {
2713 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2714 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2715 $res_bool = true;
2716 }
2717 }
2718 if ($operator == '||') {
2719 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2720 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2721 $res_bool = true;
2722 }
2723 }
2724 return $res_bool;
2725 }
2726 $tabRestriction = explode($mark, $restriction);
2727 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2728
2729 }
2730
2731 function is_restriction_satisfied($restriction, $operateurs) {
2732 // Tableau comprenant les résultat
2733 $res = array();
2734 // Compteur pour les résultat
2735 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2736 $j = 1;
2737 // Comparateur du calcul
2738 $comparateur = '';
2739 // Booléen retourné
2740 $res_bool = true;
2741
2742 // S'il y a un comparateur
2743 if (in_array(">=", $restriction)
2744 || in_array("<=", $restriction)
2745 || in_array("==", $restriction)
2746 || in_array("!=", $restriction)) {
2747
2748 // Si le tableau n'est pas vide
2749 if (count($restriction) > 0) {
2750
2751 // Boucle dans le tableau pour récupérer seulement les valeurs
2752 foreach ($restriction as $key => $value) {
2753 //
2754 if (!in_array($value, $operateurs)) {
2755 if ($this->getRestrictionValue($value) != false) {
2756 $res[] = $this->getRestrictionValue($value);
2757 } else {
2758 // Message d'erreur
2759 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2760 $this->addToMessage($error_message);
2761 // Arrête le traitement
2762 return false;
2763 }
2764 }
2765 }
2766
2767 // Boucle dans le tableau
2768 // commence à 1 car le 0 doit rester inchangé tout au long du
2769 // traitement
2770 for ($i = 1; $i<count($restriction); $i++) {
2771
2772 // Récupère le comparateur
2773 if ($restriction[$i] === ">="
2774 || $restriction[$i] === "<="
2775 || $restriction[$i] === "=="
2776 || $restriction[$i] === "!=") {
2777 $comparateur = $restriction[$i];
2778 }
2779
2780 // Si l'opérateur qui suit est un "+"
2781 if ($restriction[$i] === "+") {
2782 $dateDep = $res[$j];
2783 unset($res[$j]);$j++;
2784 $duree = $res[$j];
2785 unset($res[$j]);
2786 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2787 }
2788
2789 // Si l'opérateur qui suit est un "-"
2790 if ($restriction[$i] === "-") {
2791 $dateDep = $res[$j];
2792 unset($res[$j]);$j++;
2793 $duree = $res[$j];
2794 unset($res[$j]);
2795 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2796 }
2797 }
2798
2799 }
2800
2801 // Si les tableau des résultats n'est pas vide
2802 if (count($res) > 0) {
2803 //
2804 $res_bool = false;
2805 // Effectue le test
2806 if ($comparateur === ">=") {
2807 //
2808 if (strtotime($res[0]) >= strtotime($res[$j])) {
2809 $res_bool = true;
2810 }
2811 }
2812 if ($comparateur === "<=") {
2813 //
2814 if (strtotime($res[0]) <= strtotime($res[$j])) {
2815 $res_bool = true;
2816 }
2817 }
2818 if ($comparateur === "==") {
2819 //
2820 if (strtotime($res[0]) == strtotime($res[$j])) {
2821 $res_bool = true;
2822 }
2823 }
2824 if ($comparateur === "!=") {
2825 //
2826 if (strtotime($res[0]) != strtotime($res[$j])) {
2827 $res_bool = true;
2828 }
2829 }
2830 }
2831 // Sinon une erreur s'affiche
2832 } else {
2833
2834 // Message d'erreur
2835 $error_message = _("Mauvais parametrage de la restriction.")." ".
2836 _("Contactez votre administrateur");
2837 $this->addToMessage($error_message);
2838 // Arrête le traitement
2839 return false;
2840 }
2841
2842 return $res_bool;
2843
2844 }
2845
2846 /**
2847 * Permet de définir si l'événement passé en paramètre est un événement retour.
2848 * @param integer $evenement événement à tester
2849 *
2850 * @return boolean retourne true si événement retour sinon false
2851 */
2852 function is_evenement_retour($evenement) {
2853 if(empty($evenement) || !is_numeric($evenement)) {
2854 return "";
2855 }
2856
2857 $evenement = $this->f->get_inst__om_dbform(array(
2858 "obj" => "evenement",
2859 "idx" => $evenement,
2860 ));
2861
2862 return $evenement->getVal('retour') == 't';
2863 }
2864
2865 /**
2866 * Retourne le champ restriction de l'événement passé en paramètre.
2867 *
2868 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2869 *
2870 * @return string contenu du champ restriction
2871 */
2872 function get_restriction($evenement) {
2873 if(empty($evenement) || !is_numeric($evenement)) {
2874 return "";
2875 }
2876 //Récupère la restriction
2877 $evenement = $this->f->get_inst__om_dbform(array(
2878 "obj" => "evenement",
2879 "idx" => $evenement,
2880 ));
2881
2882 return $evenement->getVal('restriction');
2883 }
2884
2885 /**
2886 * Récupère la valeur du champ dans la restriction
2887 * @param string $restrictionValue Nom du champ
2888 * @return mixed Valeur du champ
2889 */
2890 function getRestrictionValue($restrictionValue){
2891
2892 // Initialisation de la valeur de retour
2893 $return = false;
2894
2895 // Récupére les valeurs du dossier
2896 $value_dossier = $this->get_dossier_actual();
2897
2898 //
2899 if (is_numeric($restrictionValue)) {
2900 $return = $restrictionValue;
2901 }elseif (isset($value_dossier[$restrictionValue])) {
2902 $return = $value_dossier[$restrictionValue];
2903 }elseif (isset($this->valF[$restrictionValue])) {
2904 $return = $this->valF[$restrictionValue];
2905 }
2906
2907 // Retourne la valeur du champ
2908 return $return;
2909 }
2910
2911
2912 /**
2913 * Calcul des règle d'action selon leur type.
2914 *
2915 * Types de règle :
2916 * - date
2917 * - numeric
2918 * - text
2919 * - bool
2920 * - specific
2921 * - technical_data
2922 *
2923 * @param string $rule Règle d'action.
2924 * @param string $rule_name Nom de la règle.
2925 * @param string $type Type de la règle.
2926 *
2927 * @return mixed Résultat de la règle
2928 */
2929 public function regle($rule, $rule_name, $type = null) {
2930
2931 // Supprime tous les espaces de la chaîne de caractère
2932 $rule = str_replace(' ', '', $rule);
2933 // Coupe la chaîne au niveau de l'opérateur
2934 $operands = explode ("+", $rule);
2935 // Nombre d'opérande
2936 $nb_operands = count($operands);
2937
2938 // Règle à null
2939 if ($rule == "null") {
2940 return null;
2941 }
2942
2943 // Tableau des champs de type date
2944 $rule_type_date = array(
2945 "regle_date_limite",
2946 "regle_date_notification_delai",
2947 "regle_date_complet",
2948 "regle_date_validite",
2949 "regle_date_decision",
2950 "regle_date_chantier",
2951 "regle_date_achevement",
2952 "regle_date_conformite",
2953 "regle_date_rejet",
2954 "regle_date_dernier_depot",
2955 "regle_date_limite_incompletude",
2956 "regle_date_cloture_instruction",
2957 "regle_date_premiere_visite",
2958 "regle_date_derniere_visite",
2959 "regle_date_contradictoire",
2960 "regle_date_retour_contradictoire",
2961 "regle_date_ait",
2962 "regle_date_transmission_parquet",
2963 "regle_date_affichage",
2964 );
2965 // Tableau des champs de type numérique
2966 $rule_type_numeric = array(
2967 "regle_delai",
2968 "regle_delai_incompletude",
2969 );
2970 // Tableau des champs de type text
2971 $rule_type_text = array(
2972 );
2973 // Tableau des champs de type booléen
2974 $rule_type_bool = array(
2975 "regle_a_qualifier",
2976 "regle_incompletude",
2977 "regle_incomplet_notifie",
2978 "regle_evenement_suivant_tacite_incompletude",
2979 );
2980 // Tableau des champs spécifiques
2981 $rule_type_specific = array(
2982 "regle_autorite_competente",
2983 "regle_etat",
2984 "regle_accord_tacite",
2985 "regle_avis",
2986 "regle_pec_metier",
2987 "regle_etat_pendant_incompletude",
2988 );
2989 // Tableau des champs de données techniques
2990 $rule_type_technical_data = array(
2991 'regle_donnees_techniques1',
2992 'regle_donnees_techniques2',
2993 'regle_donnees_techniques3',
2994 'regle_donnees_techniques4',
2995 'regle_donnees_techniques5',
2996 );
2997 // Tableau des champs simple
2998 $rule_type_simple = array(
2999 "regle_dossier_instruction_type",
3000 );
3001
3002 // Définit le type du champ
3003 if (in_array($rule_name, $rule_type_date) == true) {
3004 $type = "date";
3005 }
3006 if (in_array($rule_name, $rule_type_numeric) == true) {
3007 $type = "numeric";
3008 }
3009 if (in_array($rule_name, $rule_type_text) === true) {
3010 $type = "text";
3011 }
3012 if (in_array($rule_name, $rule_type_bool) === true) {
3013 $type = "bool";
3014 }
3015 if (in_array($rule_name, $rule_type_specific) === true) {
3016 $type = "specific";
3017 }
3018 if (in_array($rule_name, $rule_type_technical_data) === true) {
3019 $type = 'text';
3020 }
3021 if (in_array($rule_name, $rule_type_simple) === true) {
3022 $type = 'simple';
3023 }
3024
3025 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
3026 // Récupère directement la valeur de l'opérande
3027 if ($type === 'specific') {
3028 //
3029 return $this->get_value_for_rule($rule);
3030 }
3031
3032 // Initialisation des variables
3033 $key_date = 0;
3034 $total_numeric = 0;
3035 $res_text = '';
3036
3037 // Pour chaque opérande
3038 foreach ($operands as $key => $operand) {
3039
3040 // Si c'est une règle de type date
3041 if ($type == 'date') {
3042 // Vérifie si au moins une des opérandes est une date
3043 if (is_numeric($operand) === false
3044 && $this->get_value_for_rule($operand) !== null
3045 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
3046 // Récupère la position de la date
3047 $key_date = $key;
3048 }
3049 // Les autres opérandes doivent être que des numériques
3050 if (is_numeric($operand) == true) {
3051 // Ajoute l'opérande au total
3052 $total_numeric += $operand;
3053 }
3054 if (is_numeric($operand) === false
3055 && $this->get_value_for_rule($operand) !== null
3056 && is_numeric($this->get_value_for_rule($operand)) == true) {
3057 // Ajoute l'opérande au total
3058 $total_numeric += $this->get_value_for_rule($operand);
3059 }
3060 }
3061
3062 // Si c'est une règle de type numérique
3063 if ($type == 'numeric') {
3064 // Les opérandes doivent être que des numériques
3065 if (is_numeric($operand) == true) {
3066 // Ajoute l'opérande au total
3067 $total_numeric += $operand;
3068 }
3069 if (is_numeric($operand) === false
3070 && $this->get_value_for_rule($operand) !== null
3071 && is_numeric($this->get_value_for_rule($operand)) == true) {
3072 // Ajoute l'opérande au total
3073 $total_numeric += $this->get_value_for_rule($operand);
3074 }
3075 }
3076
3077 // Si c'est une règle de type text
3078 if ($type === 'text') {
3079 // Concatène toutes les chaînes de caractère
3080 $res_text .= $this->get_value_for_rule($operand);
3081 }
3082 }
3083
3084 // Résultat pour une règle de type date
3085 if ($type == 'date') {
3086 // Retourne le calcul de la date
3087 return $this->f->mois_date($this->valF[$operands[$key_date]],
3088 $total_numeric, "+");
3089 }
3090
3091 // Résultat pour une règle de type numérique
3092 if ($type == 'numeric') {
3093 // Retourne le calcul
3094 return $total_numeric;
3095 }
3096
3097 // Résultat pour une règle de type text
3098 if ($type === 'text') {
3099 // Retourne la chaîne de caractère
3100 return $res_text;
3101 }
3102 if ($type === 'simple' || $type === 'bool') {
3103 // Retourne la valeur du champs rule
3104 return $rule;
3105 }
3106 }
3107
3108
3109 /**
3110 * Récupère la valeur du champs dans l'instruction ou dans les données
3111 * techniques.
3112 * Spécifique au calcul des règles.
3113 *
3114 * @param string $field Champ
3115 *
3116 * @return mixed Valeur du champ
3117 */
3118 private function get_value_for_rule($field) {
3119 // Si le champ n'existe pas dans la table instruction
3120 if (array_key_exists($field, $this->valF) === false) {
3121 // Récupère l'instance de la classe donnees_techniques
3122 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3123 // Retourne la valeur de la donnée technique
3124 return $inst_donnees_techniques->getVal($field);
3125 }
3126
3127 //
3128 return $this->valF[$field];
3129 }
3130
3131
3132 /**
3133 * [get_inst_donnees_techniques description]
3134 *
3135 * @param [type] $donnees_techniques [description]
3136 *
3137 * @return [type] [description]
3138 */
3139 function get_inst_donnees_techniques($donnees_techniques = null) {
3140 //
3141 if (isset($this->inst_donnees_techniques) === false or
3142 $this->inst_donnees_techniques === null) {
3143 //
3144 if (is_null($donnees_techniques)) {
3145 $donnees_techniques = $this->getDonneesTechniques();
3146 }
3147 //
3148 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3149 "obj" => "donnees_techniques",
3150 "idx" => $donnees_techniques,
3151 ));
3152 }
3153 //
3154 return $this->inst_donnees_techniques;
3155 }
3156
3157
3158 /**
3159 * Retourne l'identifiant des données techniques liées du dossier
3160 * @return string L'identifiant des données techniques liées du dossier
3161 */
3162 function getDonneesTechniques() {
3163
3164 $qres = $this->f->get_one_result_from_db_query(
3165 sprintf(
3166 'SELECT
3167 donnees_techniques
3168 FROM
3169 %1$sdonnees_techniques
3170 WHERE
3171 dossier_instruction = \'%2$s\'',
3172 DB_PREFIXE,
3173 $this->f->db->escapeSimple($this->valF["dossier"])
3174 ),
3175 array(
3176 "origin" => __METHOD__,
3177 )
3178 );
3179
3180 return $qres['result'];
3181 }
3182
3183 /**
3184 * TRIGGER - triggerajouterapres.
3185 *
3186 * - Mise à jour des informations liées au workflow sur le dossier
3187 * - Interface avec le référentiel ERP [105][111]
3188 * - Mise à jour du DA
3189 * - Historisation de la vie du DI
3190 *
3191 * @return boolean
3192 */
3193 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3194 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3195
3196 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3197 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3198 // Instance de la classe evenement
3199 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3200 // Instance de l'état courant du dossier d'instruction
3201 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3202 "obj" => "etat",
3203 "idx" => $inst_di->get_id_etat(),
3204 ));
3205
3206 /**
3207 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3208 * par l'action
3209 */
3210 // état de complétude actuel du dossier
3211 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3212 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3213 $ev_suiv_tacite_incompletude = false;
3214 // Initialisation
3215 $valF = array();
3216 $valF_dt = array();
3217 //
3218 // Récupération des paramètres de l'action
3219 // TODO : remplacer cette requête par l'instanciation de l'action
3220 $qres = $this->f->get_all_results_from_db_query(
3221 sprintf(
3222 'SELECT
3223 *
3224 FROM
3225 %1$saction
3226 WHERE
3227 action = \'%2$s\'',
3228 DB_PREFIXE,
3229 $this->f->db->escapeSimple($this->valF['action'])
3230 ),
3231 array(
3232 "origin" => __METHOD__
3233 )
3234 );
3235 foreach ($qres['result'] as $row) {
3236
3237 // pour chacune des regles, on applique la regle
3238 if ($row['regle_delai'] != '') {
3239 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3240 }
3241 if ($row['regle_accord_tacite'] != '') {
3242 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3243 }
3244 if ($row['regle_avis'] != '') {
3245 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3246 }
3247 if ($row['regle_date_limite'] != '') {
3248 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3249 }
3250 if ($row['regle_date_complet'] != '') {
3251 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3252 }
3253 if ($row['regle_date_dernier_depot'] != '') {
3254 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3255 }
3256 if ($row['regle_date_notification_delai'] != '') {
3257 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3258 }
3259 if ($row['regle_date_decision'] != '') {
3260 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3261 }
3262 if ($row['regle_date_rejet'] != '') {
3263 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3264 }
3265 if ($row['regle_date_validite'] != '') {
3266 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3267 }
3268 if ($row['regle_date_chantier'] != '') {
3269 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3270 }
3271 if ($row['regle_date_achevement'] != '') {
3272 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3273 }
3274 if ($row['regle_date_conformite'] != '') {
3275 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3276 }
3277 if ($row['regle_date_limite_incompletude'] != '') {
3278 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3279 }
3280 if ($row['regle_delai_incompletude'] != '') {
3281 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3282 }
3283 if ($row['regle_autorite_competente'] != '') {
3284 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3285 }
3286 if ($row['regle_etat'] != '') {
3287 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3288 }
3289 if ($row['regle_date_cloture_instruction'] !== '') {
3290 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3291 }
3292 if ($row['regle_date_premiere_visite'] !== '') {
3293 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3294 }
3295 if ($row['regle_date_derniere_visite'] !== '') {
3296 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3297 }
3298 if ($row['regle_date_contradictoire'] !== '') {
3299 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3300 }
3301 if ($row['regle_date_retour_contradictoire'] !== '') {
3302 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3303 }
3304 if ($row['regle_date_ait'] !== '') {
3305 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3306 }
3307 if ($row['regle_donnees_techniques1'] !== '') {
3308 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3309 }
3310 if ($row['regle_donnees_techniques2'] !== '') {
3311 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3312 }
3313 if ($row['regle_donnees_techniques3'] !== '') {
3314 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3315 }
3316 if ($row['regle_donnees_techniques4'] !== '') {
3317 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3318 }
3319 if ($row['regle_donnees_techniques5'] !== '') {
3320 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3321 }
3322 if ($row['regle_date_transmission_parquet'] !== '') {
3323 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3324 }
3325 if ($row['regle_dossier_instruction_type'] !== '') {
3326 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3327 }
3328 // La date d'affichage est modifiée seulement si le champ n'est pas
3329 // renseigné
3330 if ($row['regle_date_affichage'] !== ''
3331 && ($inst_di->getVal('date_affichage') === ''
3332 || $inst_di->getVal('date_affichage') === null)) {
3333 //
3334 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3335 }
3336 //
3337 if ($row['regle_pec_metier'] != '') {
3338 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3339 }
3340 if ($row['regle_a_qualifier'] != '') {
3341 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3342 }
3343 //
3344 if ($row['regle_incompletude'] != '') {
3345 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3346 }
3347 if ($row['regle_incomplet_notifie'] != '') {
3348 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3349 }
3350 if ($row['regle_etat_pendant_incompletude'] != '') {
3351 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3352 }
3353 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3354 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3355 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3356 $ev_suiv_tacite_incompletude = true;
3357 }
3358 }
3359 }
3360
3361 // Si l'événement a un événement suivant tacite
3362 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3363 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3364 // pas associé de le même façon au dossier d'instruction
3365 if ($ev_suiv_tacite_incompletude === false) {
3366 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3367 }
3368 if ($ev_suiv_tacite_incompletude === true) {
3369 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3370 }
3371 }
3372 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3373 if (count($valF_dt) > 0) {
3374 $dt_id = $this->getDonneesTechniques();
3375 // On met à jour le dossier
3376 $cle = " donnees_techniques='".$dt_id."'";
3377 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3378 $this->addToLog(
3379 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3380 VERBOSE_MODE
3381 );
3382 $this->f->isDatabaseError($res1);
3383 // Affichage d'informations à l'utilisateur
3384 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3385 }
3386 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3387 if (count($valF) > 0) {
3388 //
3389 $inst_dossier = $this->f->get_inst__om_dbform(array(
3390 "obj" => "dossier",
3391 "idx" => $this->valF['dossier'],
3392 ));
3393 $valF['instruction'] = $id;
3394 $valF['crud'] = 'create';
3395 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3396 if ($update_by_instruction === false) {
3397 $this->cleanMessage();
3398 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3399 return false;
3400 }
3401 // Affichage d'informations à l'utilisateur
3402 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3403 }
3404
3405 /**
3406 * Interface avec le référentiel ERP.
3407 *
3408 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3409 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3410 * Déclencheur :
3411 * - L'option ERP est activée
3412 * - Le dossier est marqué comme "connecté au référentiel ERP"
3413 * - Le dossier est de type PC
3414 * - Le formulaire d'ajout d'un événement d'instruction est validé
3415 * avec un événement pour lequel les services ERP doivent être
3416 * informé
3417 */
3418 //
3419 if ($this->f->is_option_referentiel_erp_enabled() === true
3420 && $inst_di->is_connected_to_referentiel_erp() === true
3421 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3422 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3423 //
3424 $infos = array(
3425 "dossier_instruction" => $this->valF['dossier'],
3426 "decision" => $inst_evenement->getVal("libelle"),
3427 );
3428 //
3429 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3430 if ($ret !== true) {
3431 $this->cleanMessage();
3432 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3433 return false;
3434 }
3435 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3436 }
3437
3438 // Si le mode en rédaction intégrale est activé
3439 if (isset($this->valF['flag_edition_integrale']) === true
3440 && $this->valF['flag_edition_integrale'] === true) {
3441 $redactionIntegraleValF = array();
3442
3443 // Récupère la collectivite du dossier d'instruction
3444 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3445 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3446 // Récupère le corps de la lettre type
3447 $params = array(
3448 "specific" => array(
3449 "corps" => array(
3450 "mode" => "get",
3451 )
3452 ),
3453 );
3454 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3455 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3456 // Récupère le titre de la lettre type
3457 $params = array(
3458 "specific" => array(
3459 "titre" => array(
3460 "mode" => "get",
3461 )
3462 ),
3463 );
3464 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3465 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3466
3467 // mise à jour en base de données
3468 $res = $this->f->db->autoExecute(
3469 DB_PREFIXE.$this->table,
3470 $redactionIntegraleValF,
3471 DB_AUTOQUERY_UPDATE,
3472 $this->clePrimaire."=".$id
3473 );
3474 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3475 if ($this->f->isDatabaseError($res, true) === true) {
3476 return false;
3477 }
3478 }
3479
3480 /**
3481 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3482 */
3483 // Si la finalisation automatique de l'événement est activée
3484 // ET si l'instruction n'a pas déjà été finalisée
3485 // ET s'il existe une lettre type associée
3486 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3487 && $inst_evenement->getVal('om_final_instruction') !== 't'
3488 && $inst_evenement->getVal('lettretype') !== ''
3489 && $inst_evenement->getVal('lettretype') !== null) {
3490
3491 // On instancie l'instruction
3492 $inst_instruction = $this->f->get_inst__om_dbform(array(
3493 "obj" => "instruction",
3494 "idx" => $this->valF[$this->clePrimaire],
3495 ));
3496
3497 // On finalise l'instruction dans le contexte de finalisation : action 100
3498 $inst_instruction->setParameter('maj', 100);
3499 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3500
3501 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3502 // et dans le message d'erreur
3503 if ($finalize === false) {
3504 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3505 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3506 return false;
3507 }
3508 }
3509
3510 /**
3511 * Finalisation automatique des instructions tacites ou retours.
3512 */
3513 // Si l'option de finalisation automatique des instructions tacites ou
3514 // retours est activée et l'événement d'instruction a une lettre type
3515 // associée
3516 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3517 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3518 && $inst_evenement->getVal('lettretype') !== ''
3519 && $inst_evenement->getVal('lettretype') !== null) {
3520
3521 // Rècupère l'identifiant de l'événement
3522 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3523
3524 // Si l'événement d'instruction est identifié comme un événement
3525 // retour
3526 // OU l'événement d'instruction est l'événement suivant tacite du
3527 // dossier d'instruction (incomplétude prise en compte)
3528 // ET l'événement d'instruction n'a pas déjà été finalisé
3529 if (($inst_evenement->getVal("retour") === 't'
3530 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3531 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3532 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3533
3534 // Finalise l'instruction
3535 $inst_instruction = $this->f->get_inst__om_dbform(array(
3536 "obj" => "instruction",
3537 "idx" => $this->valF[$this->clePrimaire],
3538 ));
3539 $inst_instruction->setParameter('maj', 100);
3540 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3541 if ($finalize === false) {
3542 //
3543 return false;
3544 }
3545 }
3546 }
3547
3548 /**
3549 * Mise à jour de la version de clôture *version_clos* du dossier si et
3550 * seulement si l'instruction met à jour l'état du dossier.
3551 */
3552 if (isset($valF['etat']) === true
3553 && $valF['etat'] !== null
3554 && $valF['etat'] !== '') {
3555 // Instanciation de l'état appliqué sur le dossier par l'instruction
3556 $inst_etat = $this->f->get_inst__om_dbform(array(
3557 "obj" => "etat",
3558 "idx" => $valF['etat'],
3559 ));
3560 //
3561 $update_version_clos = null;
3562 // En cas d'instruction qui clôture le dossier
3563 if ($inst_etat->getVal('statut') === 'cloture') {
3564 $update_version_clos = $inst_di->update_version_clos('up');
3565 }
3566 // En cas d'instruction qui rouvre le dossier
3567 if ($inst_current_etat->getVal('statut') === 'cloture'
3568 && $inst_etat->getVal('statut') !== 'cloture') {
3569 //
3570 $update_version_clos = $inst_di->update_version_clos('down');
3571 //
3572 $params = array(
3573 'di_reopened' => true,
3574 );
3575 }
3576 //
3577 if ($update_version_clos === false) {
3578 $this->f->addToLog(sprintf(
3579 "%s() : ERREUR - %s %s",
3580 __METHOD__,
3581 sprintf(
3582 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3583 $inst_di->getVal($inst_di->clePrimaire)
3584 ),
3585 sprintf(
3586 __("L'instruction tente d'appliquer l'état %s."),
3587 $inst_etat->getVal($inst_etat->clePrimaire)
3588 )
3589 ));
3590 $this->addToMessage(sprintf(
3591 "%s %s",
3592 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3593 __("Veuillez contacter votre administrateur.")
3594 ));
3595 return false;
3596 }
3597 }
3598
3599 /**
3600 * Notification automatique
3601 */
3602 // Notification automatique à l'ajout de l'instruction si la notification
3603 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3604 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3605 ($inst_evenement->getVal('lettretype') === null ||
3606 $inst_evenement->getVal('lettretype') === '')) {
3607 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3608 $msgLog = sprintf(
3609 '%s %s : %d',
3610 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3611 __('Instruction notifiée'),
3612 $id
3613 );
3614
3615 // Récupération de la liste des demandeurs à notifier et de la catégorie
3616 $categorie = $this->f->get_param_option_notification($collectivite_di);
3617 $isPortal = $categorie === PORTAL;
3618 $demandeursANotifie = $this->get_demandeurs_notifiable(
3619 $this->valF['dossier'],
3620 $isPortal
3621 );
3622
3623 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3624 $demandeurPrincipalNotifie = false;
3625 foreach ($demandeursANotifie as $demandeur) {
3626 // Identifie si le demandeur principal a été notifié ou pas
3627 // et récupère ses informations
3628 if ($demandeur['petitionnaire_principal'] == 't') {
3629 $demandeurPrincipalNotifie = true;
3630 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3631 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3632 // suivante. On le considère également comme non notifié pour gérer l'envoie
3633 // des messages d'erreurs
3634 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3635 // d'impact sur la notification
3636 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3637 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3638 $demandeurPrincipalNotifie = false;
3639 continue;
3640 }
3641 }
3642 // Ajout de la notif et récupération de son id
3643 $idNotif = $this->ajouter_notification(
3644 $this->valF[$this->clePrimaire],
3645 $this->f->get_connected_user_login_name(),
3646 $demandeur,
3647 $collectivite_di,
3648 array(),
3649 true
3650 );
3651 if ($idNotif === false) {
3652 $this->addToLog(
3653 sprintf('%s() : %s', __METHOD__, $msgLog),
3654 DEBUG_MODE
3655 );
3656 return false;
3657 }
3658 // Création de la tache en lui donnant l'id de la notification
3659 $notification_by_task = $this->notification_by_task(
3660 $idNotif,
3661 $this->valF['dossier'],
3662 $categorie
3663 );
3664 if ($notification_by_task === false) {
3665 $this->addToLog(
3666 sprintf('%s() : %s', __METHOD__, $msgLog),
3667 DEBUG_MODE
3668 );
3669 $this->addToMessage(
3670 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3671 );
3672 return false;
3673 }
3674 }
3675 // Pour la notification par mail ou la notification via portal si le dossier a
3676 // été déposés via portal, si le demandeur principal n'est pas notifiable,
3677 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3678 // laquelle le demandeur principal n'a pas pu être notifié
3679 $depotPortal = $this->dossier_depose_sur_portail();
3680 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3681 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3682 // ' ' permet de mettre un espace entre les 2 msg de log.
3683 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3684 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3685 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3686 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3687 // Ajout de la notif et récupération de son id
3688 $idNotif = $this->ajouter_notification(
3689 $this->valF[$this->clePrimaire],
3690 $this->f->get_connected_user_login_name(),
3691 $demandeurPrincipal,
3692 $collectivite_di,
3693 array(),
3694 true,
3695 'Echec',
3696 implode(' ', $erreursParam)
3697 );
3698 if ($idNotif === false) {
3699 $this->addToLog(
3700 sprintf('%s() : %s', __METHOD__, $msgLog),
3701 DEBUG_MODE
3702 );
3703 $this->addToMessage(
3704 __('Erreur : la création de la notification a échouée.').
3705 __("Veuillez contacter votre administrateur.")
3706 );
3707 return false;
3708 }
3709 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3710 // de l'échec de la notification
3711 $dossier_message = $this->get_inst_dossier_message(0);
3712 $dossier_message_val = array(
3713 'dossier' => $val['dossier'],
3714 'type' => _('erreur expedition'),
3715 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3716 'login' => $_SESSION['login'],
3717 'date_emission' => date('Y-m-d H:i:s'),
3718 'contenu' => _('Échec lors de la notification de l\'instruction ').
3719 $inst_evenement->getVal('libelle').
3720 '.<br>'.
3721 implode("\n", $erreursParam).
3722 '<br>'.
3723 _('Veuillez corriger ces informations avant de renvoyer la notification.')
3724 );
3725 $add = $dossier_message->add_notification_message($dossier_message_val, true);
3726 // Si une erreur se produit pendant l'ajout
3727 if ($add !== true) {
3728 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3729 return false;
3730 }
3731 }
3732 $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.")));
3733 }
3734
3735 // Notification automatique en cas de dépôt de dossier dématérialisé
3736 // Vérifie si l'option de notification est active et si il s'agit bien d'une
3737 // instruction de récépissé
3738 if (
3739 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3740 && $this->is_instruction_recepisse()
3741 ) {
3742 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3743 $msgLog = sprintf(
3744 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3745 $val['dossier']
3746 );
3747 // Récupère l'instance de la demande
3748 $demande = $inst_di->get_inst_demande();
3749 // Vérifie que le dossier a été déposé via platau ou portal
3750 if (
3751 ($demande->getVal('source_depot') == PLATAU ||
3752 $demande->getVal('source_depot') == PORTAL)
3753 ) {
3754 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3755 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3756 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3757 if (empty($listeEmails)) {
3758 $this->addToLog(
3759 sprintf(
3760 '%s(): %s %s',
3761 __METHOD__,
3762 $msgLog,
3763 __('Aucun courriel paramétré.')
3764 ),
3765 DEBUG_MODE
3766 );
3767 } else {
3768 foreach ($listeEmails as $email) {
3769 // Ajout de la notif et récupération de son id
3770 $destinataire = array(
3771 'destinataire' => $email,
3772 'courriel' => $email
3773 );
3774 $idNotif = $this->ajouter_notification(
3775 $this->valF[$this->clePrimaire],
3776 $this->f->get_connected_user_login_name(),
3777 $destinataire,
3778 $collectivite_di,
3779 array(),
3780 true
3781 );
3782 if ($idNotif === false) {
3783 $this->addToLog(
3784 sprintf('%s(): %s', __METHOD__, $msgLog),
3785 DEBUG_MODE
3786 );
3787 return false;
3788 }
3789 // Création de la tache en lui donnant l'id de la notification
3790 $notification_by_task = $this->notification_by_task(
3791 $idNotif,
3792 $this->valF['dossier'],
3793 'mail',
3794 'notification_depot_demat'
3795 );
3796 if ($notification_by_task === false) {
3797 $this->addToMessage(
3798 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3799 );
3800 $this->addToLog(
3801 sprintf('%s(): %s', __METHOD__, $msgLog),
3802 DEBUG_MODE
3803 );
3804 return false;
3805 }
3806 }
3807 }
3808 }
3809 }
3810
3811 /**
3812 * Mise à jour de la date de dernière modification du dossier
3813 */
3814 $inst_di->update_last_modification_date();
3815
3816 /**
3817 * Mise à jour des données du DA.
3818 */
3819 $inst_da = $inst_di->get_inst_dossier_autorisation();
3820 $params['di_id'] = $this->valF['dossier'];
3821 if ($inst_da->majDossierAutorisation($params) === false) {
3822 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3823 $this->correct = false;
3824 return false;
3825 }
3826
3827 /**
3828 * Historisation de la vie du DI.
3829 */
3830 //
3831 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3832 }
3833
3834 /**
3835 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3836 * sont remplies.
3837 * Les conditions vérifiées sont les suivantes :
3838 * - L'option de notification *option_notification* doit être définie
3839 * - Le petitionnaire principal doit accepter les notifications
3840 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3841 * - Le pétitionnaire principal doit avoir une adresse mail correcte
3842 * Pour chaque vérification effectué un message d'erreur est ajouté si la
3843 * condition n'est pas remplie.
3844 * Renvoie le message d'erreur en sortie.
3845 *
3846 * @param string identifiant du dossier sur lequel les notifications ont échouée
3847 * @return string
3848 */
3849 protected function get_info_notification_fail($dossier = null) {
3850 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3851 // utilise celui associé à l'instruction
3852 if ($dossier == null) {
3853 $dossier = $this->getVal('dossier');
3854 }
3855 // Tableau contenant la liste des messages d'erreur
3856 $errorMessage = array();
3857 // Récupère l'option de notification
3858 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3859 $option_notification = $this->f->get_param_option_notification($collectivite_di);
3860 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3861 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3862 }
3863 // Récupère les informations du demandeurs principal
3864 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3865 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3866 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3867 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3868 }
3869 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3870 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3871 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3872 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3873 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3874 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3875 $infoPetitionnaire['courriel'].
3876 '.';
3877 }
3878 } else {
3879 // Si le courriel du pétitionnaire principal
3880 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3881 }
3882
3883 return $errorMessage;
3884 }
3885
3886 /**
3887 * Méthode servant à vérifier si un dossier a été déposé sur
3888 * le portail citoyen ou pas.
3889 * La verification se fait via une requête sql dans laquelle
3890 * on va chercher un dossier ayant pour id l'identifiant de
3891 * dossier associé à l'instruction et pour lequel la demande
3892 * associée la plus ancienne est une demande de création de
3893 * dossier via portail
3894 *
3895 * @param string identifiant du dossier. Si non renseigné c'est le dossier
3896 * associé à l'instruction qui est utilisé
3897 * @return boolean|void true : dossier déposé via portail, false : dossier
3898 * non déposé via portail et null : erreur de base de données.
3899 */
3900 protected function dossier_depose_sur_portail($dossier = null) {
3901 if (empty($dossier)) {
3902 $dossier = $this->getVal('dossier');
3903 }
3904 $qres = $this->f->get_one_result_from_db_query(
3905 sprintf(
3906 'SELECT
3907 dossier
3908 FROM
3909 %1$sdossier
3910 -- Récuperation de la première demande associée au dossier
3911 LEFT JOIN (
3912 SELECT
3913 demande,
3914 dossier_instruction,
3915 source_depot
3916 FROM
3917 %1$sdemande
3918 WHERE
3919 dossier_instruction = \'%2$s\'
3920 ORDER BY
3921 demande ASC
3922 LIMIT 1
3923 ) AS demande
3924 ON dossier.dossier = demande.dossier_instruction
3925 WHERE
3926 dossier.dossier = \'%2$s\'
3927 AND demande.source_depot = \'portal\'',
3928 DB_PREFIXE,
3929 $this->f->db->escapeSimple($dossier)
3930 ),
3931 array(
3932 "origin" => __METHOD__,
3933 "force_return" => true,
3934 )
3935 );
3936 if ($qres["code"] !== "OK") {
3937 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3938 return;
3939 }
3940 // Si on a un résultat c'est que le dossier a été déposé via le portail
3941 return ! empty($qres["result"]);
3942 }
3943
3944 public function is_service_notifiable() {
3945 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3946
3947 // Si l'instruction a une édition non finalisé quel que soit
3948 // le type de notification, il n'est pas notifiable
3949 if ($this->has_an_edition() === true) {
3950 if ($this->is_unfinalizable_without_bypass() === false) {
3951 return false;
3952 }
3953 }
3954 // Vérifie si la notification des tiers est active pour l'évènement
3955 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3956 }
3957
3958 public function is_tiers_notifiable() {
3959 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3960
3961 // Si l'instruction a une édition non finalisé quel que soit
3962 // le type de notification, il n'est pas notifiable
3963 if ($this->has_an_edition() === true) {
3964 if ($this->is_unfinalizable_without_bypass() === false) {
3965 return false;
3966 }
3967 }
3968 // Vérifie si la notification des tiers est active pour l'évènement
3969 return ! empty($evenement->getVal('notification_tiers'));
3970 }
3971
3972 /**
3973 * Méthode permettant de savoir si une instruction peut
3974 * être notifiée manuellement selon les différents types
3975 * de notification.
3976 *
3977 * Si l'instruction a une édition non finalisée alors elle n'est pas
3978 * manuellement notifiable.
3979 * Si l'instruction est associé à un événement de notification pour
3980 * lequel un retour signature est recquis, elle n'est notifiable que
3981 * si la date de retour de signature est remplie.
3982 * Par défaut si le type de notification n'est pas connu alors l'instruction
3983 * n'est pas notifiable.
3984 * Pour tous les autres cas l'instruction est manuellement notifiable.
3985 *
3986 * @return boolean true : notifiable | false : non notifiable
3987 */
3988 public function is_notifiable_by_task_manual() {
3989 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3990
3991 // Si l'instruction a une édition non finalisé quel que soit
3992 // le type de notification, il n'est pas notifiable
3993 if ($this->has_an_edition() === true) {
3994 if ($this->is_unfinalizable_without_bypass() === false) {
3995 return false;
3996 }
3997 }
3998
3999 // Gestion des différents cas selon la valeur du champs notification
4000 if ($ev->getVal('notification') == 'notification_manuelle' ||
4001 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
4002 $ev->getVal('notification') == 'notification_automatique'
4003 ) {
4004 return true;
4005 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
4006 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
4007 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
4008 $this->getVal('date_retour_signature') != null &&
4009 $this->getVal('date_retour_signature') != ''
4010 ) {
4011 return true ;
4012 }
4013 return false;
4014 }
4015
4016 /**
4017 * Crée une instance de notification et une tache notification_instruction de catégorie portal
4018 * pour le demandeur principal.
4019 *
4020 * @return boolean true si le traitement à réussi
4021 */
4022 protected function notifier_demandeur_principal_via_portal() {
4023 $this->begin_treatment(__METHOD__);
4024 $message = '';
4025 // Récupération des informations concernant le demandeur
4026 $dossier = $this->getVal('dossier');
4027 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
4028 $demandeur = $this->get_demandeurs_notifiable(
4029 $dossier,
4030 true
4031 );
4032 if ($demandeur !== array()) {
4033 $destinataire = array_values($demandeur);
4034 // Ajout de la notif et récupération de son id
4035 $idNotification = $this->ajouter_notification(
4036 $this->getVal($this->clePrimaire),
4037 $this->f->get_connected_user_login_name(),
4038 $destinataire[0],
4039 $collectivite_di,
4040 array(),
4041 true
4042 );
4043 if ($idNotification === false) {
4044 return $this->end_treatment(__METHOD__, false);
4045 }
4046 // Création de la tâche en lui donnant l'id de la notification
4047 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
4048 if ($notification_by_task === false) {
4049 $this->addToMessage(
4050 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4051 );
4052 return $this->end_treatment(__METHOD__, false);
4053 }
4054 $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.")));
4055 return $this->end_treatment(__METHOD__, true);
4056 }
4057 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
4058 return $this->end_treatment(__METHOD__, false);
4059 }
4060
4061 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
4062 // Si le type n'est pas correctement spécifié, alors il est calculé
4063 if ($type !== 'notification_recepisse'
4064 && $type !== 'notification_instruction'
4065 && $type !== 'notification_decision'
4066 && $type !== 'notification_service_consulte'
4067 && $type !== 'notification_tiers_consulte'
4068 && $type !== 'notification_depot_demat'
4069 && $type !== 'notification_commune'
4070 && $type !== 'notification_signataire') {
4071 //
4072 $type = 'notification_instruction';
4073 // Vérifie si l'instruction est un récépissé
4074 if ($this->is_instruction_recepisse()) {
4075 $type = 'notification_recepisse';
4076
4077 }
4078 // Vérifie si l'instruction est une décision
4079 if ($type !== 'notification_recepisse') {
4080 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4081 if ($avis_decision !== null && $avis_decision !== '') {
4082 $type = 'notification_decision';
4083 }
4084 }
4085 }
4086 // Préparation des valeurs de la tâche
4087 $task_val = array(
4088 'type' => $type,
4089 'object_id' => $object_id,
4090 'dossier' => $dossier,
4091 'category' => $category,
4092 );
4093 // Préparation de la tache de notification
4094 $inst_task = $this->f->get_inst__om_dbform(array(
4095 "obj" => "task",
4096 "idx" => 0,
4097 ));
4098
4099 $add_task = $inst_task->add_task(array('val' => $task_val));
4100 if ($add_task === false) {
4101 $this->addToLog(
4102 sprintf(
4103 '%s(): %s %s : %s',
4104 __METHOD__,
4105 __('Echec de l\'ajout de la tâche de notification.'),
4106 __('Paramétrage de la tâche'),
4107 var_export($task_val, true)
4108 ),
4109 DEBUG_MODE
4110 );
4111 return false;
4112 }
4113
4114 return true;
4115 }
4116
4117 /**
4118 * Cette méthode permet de savoir si l'instruction est une instruction
4119 * de recepisse (instruction lié à l'ajout du dossier).
4120 *
4121 * Pour cela, on récupère la liste des actions qui ont menées à la création
4122 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4123 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4124 * l'instruction et donc qu'il s'agit d'un recepisse.
4125 *
4126 * @return boolean
4127 */
4128 protected function is_instruction_recepisse() {
4129 // Récupère la liste des actions qui ont mené à la création de
4130 // l'instruction
4131 $trace = debug_backtrace();
4132 // Parcours la liste des actions et si une de ces actions est lié
4133 // à la classe demande on cosidère que l'instruction est un recepisse
4134 foreach ($trace as $key => $value) {
4135 if (isset($trace[$key]['class']) === true
4136 && empty($trace[$key]['class']) === false) {
4137 if (strtolower($trace[$key]['class']) === 'demande') {
4138 return true;
4139 }
4140 }
4141 }
4142 return false;
4143 }
4144
4145 /**
4146 * A partir des informations passée en argument ajoute un nouvel élément
4147 * dans la table instruction_notification.
4148 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4149 * paramètre si le paramétrage attendus est ok.
4150 * Ajoute également un nouvel élement dans instruction_notification_document
4151 * si l'instruction possède une lettretype.
4152 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4153 * élement dans la table instruction_notification_document qui correspondra
4154 * à l'annexe de la notification.
4155 *
4156 * @param integer identifiant de l'instruction notifiée
4157 * @param string information concernant l'emetteur
4158 * @param array tableau contenant 2 entrées
4159 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4160 * - courriel : adresse mail de la personne à notifier
4161 * @param integer identifiant de la collectivité permettant de récupèrer les
4162 * paramètres à valider
4163 * @param boolean indique si la notification est automatique ou manuelle
4164 * @param integer identifiant d'une instruction dont l'édition sera annexé
4165 * à la notification
4166 *
4167 * @return integer|boolean identifiant de la notification créée si le traitement
4168 * a réussie, false sinon.
4169 */
4170 protected function ajouter_notification(
4171 $idInstruction,
4172 $emetteur,
4173 $destinataire,
4174 $collectiviteId,
4175 $annexes = array(),
4176 $demandeAuto = false,
4177 $statut = 'en cours d\'envoi',
4178 $commentaire = 'Notification en cours de traitement'
4179 ) {
4180 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4181 // de créer la notification
4182 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4183 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4184 $this->addToMessage($msgErreur);
4185 $this->addToLog(
4186 sprintf('%s() : %s', __METHOD__, $msgErreur),
4187 DEBUG_MODE
4188 );
4189 return false;
4190 }
4191 // Préparation de la notification
4192 $inst_notif = $this->f->get_inst__om_dbform(array(
4193 "obj" => "instruction_notification",
4194 "idx" => "]",
4195 ));
4196 $notif_val = array(
4197 'instruction_notification' => null,
4198 'instruction' => $idInstruction,
4199 'automatique' => $demandeAuto,
4200 'emetteur' => $emetteur,
4201 'date_envoi' => null,
4202 'destinataire' => $destinataire['destinataire'],
4203 'courriel' => $destinataire['courriel'],
4204 'date_premier_acces' => null,
4205 'statut' => $statut,
4206 'commentaire' => $commentaire
4207 );
4208
4209 // Création de la notification
4210 $add_notif = $inst_notif->ajouter($notif_val);
4211 if ($add_notif === false) {
4212 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4213 $this->addToLog(
4214 sprintf(
4215 '%s() : %s %s : %s',
4216 __METHOD__,
4217 __("Echec de l'ajout de la notification en base de données."),
4218 __('Paramétrage de la notification'),
4219 var_export($notif_val, true)
4220 ),
4221 DEBUG_MODE
4222 );
4223 return false;
4224 }
4225
4226 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4227 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4228 $add_notif_doc = $this->ajouter_notification_document(
4229 $inst_notif->getVal($inst_notif->clePrimaire),
4230 $this->getVal($this->clePrimaire),
4231 'instruction'
4232 );
4233 if ($add_notif_doc === false) {
4234 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4235 return false;
4236 }
4237 }
4238 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4239 if (! empty($annexes) && is_array($annexes)) {
4240 $add_notif_annexe = $this->ajouter_notification_document_multiple(
4241 $inst_notif->getVal($inst_notif->clePrimaire),
4242 $annexes
4243 );
4244 if ($add_notif_annexe === false) {
4245 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4246 return false;
4247 }
4248 }
4249
4250 // Renvoie l'id de la nouvelle instance de instruction_notification
4251 return $inst_notif->getVal($inst_notif->clePrimaire);
4252 }
4253
4254 /**
4255 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4256 * instance dans la table instruction_notification_document lié a la
4257 * notification dont l'id est passé en paramètre.
4258 *
4259 * @param array tableau contenant les informations nécessaires pour créer les annexes
4260 *
4261 * @return integer|boolean identifiant de la notification créée si le traitement
4262 * a réussie, false sinon.
4263 */
4264 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4265 foreach ($listeDocument as $paramDoc) {
4266 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4267 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4268 return false;
4269 }
4270 }
4271 return true;
4272 }
4273
4274 /**
4275 * Ajoute un élément dans la table instruction_notification_document en utilisant
4276 * les éléments fourni en paramètre
4277 *
4278 * @param integer $idNotification : id de la notification à laquelle on associe le document
4279 * @param integer $idDocument : id de l'objet auquel est rattaché le document
4280 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4281 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4282 *
4283 * @return boolean indique si le traitement a réussi
4284 */
4285 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4286 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4287 "obj" => "instruction_notification_document",
4288 "idx" => "]",
4289 ));
4290 // l'attribut instruction doit obligatoirement être renseigné
4291 // pour éviter toutes confusion avec d'autres instruction l'id
4292 // 0 est donné au document n'appartenant pas aux instructions
4293 $notif_doc_val = array(
4294 'instruction_notification_document' => null,
4295 'instruction_notification' => $idNotification,
4296 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4297 'document_type' => $tableDocument,
4298 'document_id' => $idDocument,
4299 'cle' => $this->getCleAccesDocument(),
4300 'annexe' => $isAnnexe
4301 );
4302
4303 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4304 if ($add_notif_doc === false) {
4305 $this->addToLog(
4306 sprintf(
4307 '%s() : %s %s : %s',
4308 __METHOD__,
4309 __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4310 __('Paramétrage du document'),
4311 var_export($notif_doc_val, true)
4312 ),
4313 DEBUG_MODE
4314 );
4315 return false;
4316 }
4317 return true;
4318 }
4319
4320 /**
4321 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4322 *
4323 * @param integer identifiant de la collectivité
4324 * @return boolean
4325 */
4326 protected function is_parametrage_notification_correct($collectiviteId) {
4327 $categorie = $this->f->get_param_option_notification($collectiviteId);
4328 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4329 if ($categorie === 'mail' && $urlAccesNotif === null) {
4330 return false;
4331 }
4332 return true;
4333 }
4334
4335 /**
4336 * TRIGGER - triggermodifierapres.
4337 *
4338 * @return boolean
4339 */
4340 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4341 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4342 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4343 $message = '';
4344
4345 // Définit si le dossier d'instruction doit être mis à jour
4346 $update_dossier = true;
4347 // Les actions de mise à jour des dates ne doivent pas appliquer
4348 // l'action de l'événement et donc ne pas mettre à jour le dossier
4349 if ($this->getParameter("maj") == 125
4350 || $this->getParameter("maj") == 170
4351 || $this->getParameter("maj") == 175) {
4352 $update_dossier = false;
4353 }
4354
4355 // Traitement en cas de mise à jour du dossier
4356 if ($update_dossier === true) {
4357 /**
4358 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4359 * si la date de l'evenement est modifiee
4360 */
4361 // Initialisation
4362 $valF = array();
4363 $valF_dt = array();
4364 // Initialisation du type d'événement
4365 $type_evmt = "";
4366 // Récupération de l'action correspondante à l'événement
4367 $evenement = $this->f->get_inst__om_dbform(array(
4368 "obj" => "evenement",
4369 "idx" => $this->valF['evenement']
4370 ));
4371
4372 // Récupération des paramètres de l'action
4373 // TODO : remplacer cette requête par l'instanciation de l'action
4374 $qres = $this->f->get_all_results_from_db_query(
4375 sprintf(
4376 'SELECT
4377 *
4378 FROM
4379 %1$saction
4380 WHERE
4381 action = \'%2$s\'',
4382 DB_PREFIXE,
4383 $this->f->db->escapeSimple($evenement->getVal('action'))
4384 ),
4385 array(
4386 "origin" => __METHOD__
4387 )
4388 );
4389 foreach ($qres['result'] as $row) {
4390 // application des regles sur le courrier + delai
4391 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4392 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4393 }
4394 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4395 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4396 }
4397 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4398 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4399 }
4400 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4401 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4402 }
4403 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4404 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4405 }
4406 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4407 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4408 }
4409 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4410 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4411 }
4412 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4413 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4414 }
4415 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4416 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4417 }
4418 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4419 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4420 }
4421 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4422 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4423 }
4424 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4425 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4426 }
4427 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4428 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4429 }
4430 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4431 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4432 }
4433 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4434 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4435 }
4436 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4437 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4438 }
4439 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4440 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4441 }
4442 if ($row['regle_donnees_techniques1'] !== '') {
4443 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4444 }
4445 if ($row['regle_donnees_techniques2'] !== '') {
4446 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4447 }
4448 if ($row['regle_donnees_techniques3'] !== '') {
4449 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4450 }
4451 if ($row['regle_donnees_techniques4'] !== '') {
4452 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4453 }
4454 if ($row['regle_donnees_techniques5'] !== '') {
4455 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4456 }
4457 if ($row['regle_dossier_instruction_type'] !== '') {
4458 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4459 }
4460 }
4461 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4462 if (count($valF_dt) > 0) {
4463 $dt_id = $this->getDonneesTechniques();
4464 // On met à jour le dossier
4465 $cle = " donnees_techniques='".$dt_id."'";
4466 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4467 $this->addToLog(
4468 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4469 VERBOSE_MODE
4470 );
4471 $this->f->isDatabaseError($res1);
4472 // Affichage d'informations à l'utilisateur
4473 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4474 }
4475 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4476 if (count($valF) > 0) {
4477 $inst_dossier = $this->f->get_inst__om_dbform(array(
4478 "obj" => "dossier",
4479 "idx" => $this->valF['dossier'],
4480 ));
4481 $valF['instruction'] = $id;
4482 $valF['crud'] = 'update';
4483 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4484 if ($update_by_instruction === false) {
4485 $this->cleanMessage();
4486 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4487 return false;
4488 }
4489 // Affichage d'informations à l'utilisateur
4490 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4491 }
4492 }
4493
4494 // Par défaut les instructions à ajouter suite à la saisie d'une date
4495 // de retour signature ou de notification, utilisent l'action 0
4496 // Si la création d'événement d'instruction suivant est déclenchée par
4497 // une notification suite au traitement d'une tâche (démat') alors l'ajout
4498 // de la nouvelle instruction se fait avec l'action 176
4499 // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4500 // nouvelle instruction, depuis la méthode verifier()
4501 $code_action_add = 0;
4502 if ($this->getParameter("maj") == 175) {
4503 $code_action_add = 176;
4504 }
4505 $restriction = $this->get_restriction($val['evenement']);
4506 $this->restriction_valid = $this->restrictionIsValid($restriction);
4507
4508 if($restriction == "" || $this->restriction_valid ){
4509 // Récupération de tous les paramètres de l'événement sélectionné
4510 // TODO : remplacer cette requête par l'instanciation de l'evenement
4511 $qres = $this->f->get_all_results_from_db_query(
4512 sprintf(
4513 'SELECT
4514 *
4515 FROM
4516 %1$sevenement
4517 WHERE
4518 evenement = %2$d',
4519 DB_PREFIXE,
4520 intval($this->valF['evenement'])
4521 ),
4522 array(
4523 "origin" => __METHOD__
4524 )
4525 );
4526 $current_id = $this->getVal($this->clePrimaire);
4527 foreach ($qres['result'] as $row) {
4528 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4529 if ($this->getVal('date_retour_signature') == "" AND
4530 $this->valF['date_retour_signature'] != "" AND
4531 $row['evenement_retour_signature'] != "") {
4532 $new_instruction = $this->f->get_inst__om_dbform(array(
4533 "obj" => "instruction",
4534 "idx" => "]",
4535 ));
4536 // Création d'un tableau avec la liste des champs de l'instruction
4537 foreach($new_instruction->champs as $champ) {
4538 $valNewInstr[$champ] = "";
4539 }
4540 // Définition des valeurs de la nouvelle instruction
4541 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4542 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4543 $valNewInstr["dossier"] = $this->valF['dossier'];
4544 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4545 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4546 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4547 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4548 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4549 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4550 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4551 $new_instruction->setParameter("maj", $code_action_add);
4552 $new_instruction->class_actions[$code_action_add]["identifier"] =
4553 sprintf(
4554 __("Ajout suite au retour signature de l'instruction %s"),
4555 $current_id
4556 );
4557 $retour = $new_instruction->ajouter($valNewInstr);
4558
4559 //Si une erreur s'est produite et qu'il s'agit d'un problème
4560 //de restriction
4561 if ($retour == false && !$new_instruction->restriction_valid){
4562 $error_message = $this->get_restriction_error_message($restriction);
4563 $this->f->displayMessage("error", $error_message);
4564 $this->addToLog(__METHOD__."(): evenement retour ".
4565 "instruction ".$this->valF[$this->clePrimaire]." : ".
4566 $new_instruction->msg);
4567 }
4568 //Si une erreur s'est produite après le test de la restriction
4569 elseif ($retour == false && $new_instruction->restriction_valid){
4570 $this->correct = false ;
4571 $this->msg .= $new_instruction->msg;
4572 return false;
4573 }
4574 }
4575 // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4576 if ($this->getVal('date_retour_rar') == "" AND
4577 $this->valF['date_retour_rar'] != "") {
4578
4579 if($row['evenement_retour_ar'] != "") {
4580 $new_instruction = $this->f->get_inst__om_dbform(array(
4581 "obj" => "instruction",
4582 "idx" => "]",
4583 ));
4584 // Création d'un tableau avec la liste des champs de l'instruction
4585 foreach($new_instruction->champs as $champ) {
4586 $valNewInstr[$champ] = "";
4587 }
4588 // Définition des valeurs de la nouvelle instruction
4589 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4590 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4591 $valNewInstr["dossier"] = $this->valF['dossier'];
4592 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4593 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4594 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4595 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4596 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4597 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4598 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4599 $new_instruction->setParameter("maj", $code_action_add);
4600 $new_instruction->class_actions[$code_action_add]["identifier"] =
4601 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4602 $retour = $new_instruction->ajouter($valNewInstr);
4603
4604 //Si une erreur s'est produite et qu'il s'agit d'un problème
4605 //de restriction
4606 if ($retour == false && !$new_instruction->restriction_valid) {
4607 $error_message = $this->get_restriction_error_message($restriction);
4608 $this->f->displayMessage("error", $error_message);
4609 $this->addToLog(
4610 __METHOD__."(): evenement retour instruction ".
4611 $this->valF[$this->clePrimaire]." : ".
4612 $new_instruction->msg
4613 );
4614 }
4615 //Si une erreur s'est produite après le test de la restriction
4616 elseif ($retour == false && $new_instruction->restriction_valid){
4617 $this->correct = false ;
4618 $this->msg .= $new_instruction->msg;
4619 return false;
4620 }
4621 }
4622 }
4623 }
4624 }
4625
4626 // Traitement en cas de mise à jour du dossier
4627 if ($update_dossier === true) {
4628 /**
4629 * Mise à jour de la date de dernière modification du dossier
4630 * d'instruction
4631 */
4632 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4633 $inst_di->update_last_modification_date();
4634
4635 // Mise à jour des données du dossier d'autorisation
4636 $da = $this->f->get_inst__om_dbform(array(
4637 "obj" => "dossier_autorisation",
4638 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4639 ));
4640 $params = array(
4641 'di_id' => $this->getVal('dossier'),
4642 );
4643 if($da->majDossierAutorisation($params) === false) {
4644 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4645 $this->correct = false;
4646 return false;
4647 }
4648 }
4649
4650 // mise à jour des métadonnées issues des dates de suivi
4651 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4652 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4653 if ($dateRetourSignatureModified || $dateRetourRARModified) {
4654
4655 // Calculs des nouvelles métadonnées
4656 $metadata = $this->getMetadata("om_fichier_instruction");
4657
4658 // On vérifie si l'instruction à finaliser a un événement de type arrete
4659 // TODO : A voir pour remplacer par une instanciation de l'événement.
4660 // Voir également si l'événement ne dois pas être instancié en début de
4661 // méthode pour pouvoir être réutilisé.
4662 $qres = $this->f->get_one_result_from_db_query(
4663 sprintf(
4664 'SELECT
4665 type
4666 FROM
4667 %1$sevenement
4668 WHERE
4669 evenement = \'%2$d\'',
4670 DB_PREFIXE,
4671 intval($this->getVal("evenement"))
4672 ),
4673 array(
4674 "origin" => __METHOD__,
4675 "force_return" => true,
4676 )
4677 );
4678
4679 if ($qres["code"] !== "OK") {
4680 $this->correct = false;
4681 $this->addToMessage(__("Erreur de traitement de fichier."));
4682 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4683 return false;
4684 }
4685
4686 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4687 if ($qres['result'] == 'arrete'){
4688 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4689 }
4690
4691 // Filtre pour conserver uniquement les métadonnées liées aux dates
4692 $metadataToKeep = array(
4693 "statutAutorisation",
4694 "dateEvenementDocument",
4695 'date_cloture_metier',
4696 "NotificationArrete",
4697 "dateNotificationArrete",
4698 "controleLegalite",
4699 "dateSignature",
4700 "nomSignataire",
4701 "qualiteSignataire",
4702 "dateControleLegalite",
4703 );
4704 $metadata = array_filter(
4705 $metadata,
4706 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4707 ARRAY_FILTER_USE_KEY
4708 );
4709
4710 // Mise à jour des métadonnées du document en GED
4711 $docUid = $this->getVal("om_fichier_instruction");
4712 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4713 if ($operationOrUID == 'OP_FAILURE') {
4714 $this->correct = false;
4715 $this->addToMessage(__("Erreur de traitement de fichier."));
4716 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4717 return false;
4718 }
4719
4720 // mise à jour de l'UID du document en BDD
4721 else {
4722 $valF = array('om_fichier_instruction' => $operationOrUID);
4723 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4724 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4725 if ($this->f->isDatabaseError($res, true) === true) {
4726 $this->correct = false;
4727 $this->addToMessage(__("Erreur de traitement de fichier."));
4728 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4729 return false;
4730 }
4731 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4732 }
4733 }
4734
4735 // Déclenchement des notifications automatique après finalisation et
4736 // retour de signature
4737 if ($dateRetourSignatureModified === true
4738 && $this->valF['date_retour_signature'] !== ''
4739 && $this->valF['date_retour_signature'] !== null) {
4740
4741 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4742 $msgLog = sprintf(
4743 '%s %s : %d',
4744 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4745 __('Instruction notifiée'),
4746 $id
4747 );
4748
4749 // Récupération de l'instance de l'événement pour accéder au paramètrage
4750 // des notifications
4751 $ev = $this->get_inst_evenement($this->valF['evenement']);
4752 // Si la notification automatique des tiers consulté est active
4753 // déclenche le traitement de notification.
4754 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4755 $typeNotifTiers = $ev->getVal('notification_tiers');
4756 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4757 if ($typeNotifTiers === 'notification_automatique') {
4758 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4759 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4760 $this->correct = false;
4761 }
4762 }
4763
4764 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4765 // Récupération de la liste des demandeurs à notifier et de la catégorie
4766 $categorie = $this->f->get_param_option_notification($collectivite_di);
4767 $isPortal = $categorie === PORTAL;
4768 $demandeursANotifie = $this->get_demandeurs_notifiable(
4769 $this->valF['dossier'],
4770 $isPortal
4771 );
4772
4773 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4774 $demandeurPrincipalNotifie = false;
4775 foreach ($demandeursANotifie as $demandeur) {
4776 // Identifie si le demandeur principal a été notifié ou pas
4777 // et récupère ses informations
4778 if ($demandeur['petitionnaire_principal'] == 't') {
4779 $demandeurPrincipalNotifie = true;
4780 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4781 // son paramétrage, on effectue pas le traitement et on passe à l'itération
4782 // suivante. On le considère également comme non notifié pour gérer l'envoie
4783 // des messages d'erreurs
4784 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4785 // d'impact sur la notification
4786 $erreursParam = $this->get_info_notification_fail();
4787 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4788 $demandeurPrincipalNotifie = false;
4789 continue;
4790 }
4791 }
4792 // Ajout de la notif et récupération de son id
4793 $idNotif = $this->ajouter_notification(
4794 $this->valF[$this->clePrimaire],
4795 $this->f->get_connected_user_login_name(),
4796 $demandeur,
4797 $collectivite_di,
4798 array(),
4799 true
4800 );
4801 if ($idNotif === false) {
4802 $this->addToLog(
4803 sprintf('%s() : %s',__METHOD__, $msgLog),
4804 DEBUG_MODE
4805 );
4806 return false;
4807 }
4808 // Création de la tache en lui donnant l'id de la notification
4809 $notification_by_task = $this->notification_by_task(
4810 $idNotif,
4811 $this->valF['dossier'],
4812 $categorie
4813 );
4814 if ($notification_by_task === false) {
4815 $this->addToLog(
4816 sprintf('%s() : %s',__METHOD__, $msgLog),
4817 DEBUG_MODE
4818 );
4819 $this->addToMessage(
4820 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4821 );
4822 return false;
4823 }
4824 }
4825 // Pour la notification par mail ou la notification via portal si le dossier a
4826 // été déposés via portal, si le demandeur principal n'est pas notifiable,
4827 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4828 // laquelle le demandeur principal n'a pas pu être notifié
4829 $depotPortal = $this->dossier_depose_sur_portail();
4830 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4831 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4832 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4833 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4834 $erreursParam = $this->get_info_notification_fail();
4835 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4836 // Ajout de la notif et récupération de son id
4837 $idNotif = $this->ajouter_notification(
4838 $this->valF[$this->clePrimaire],
4839 $this->f->get_connected_user_login_name(),
4840 $demandeurPrincipal,
4841 $collectivite_di,
4842 array(),
4843 true,
4844 'Echec',
4845 implode(' ', $erreursParam)
4846 );
4847 if ($idNotif === false) {
4848 $this->addToLog(
4849 sprintf('%s() : %s', __METHOD__, $msgLog),
4850 DEBUG_MODE
4851 );
4852 $this->addToMessage(
4853 __('Erreur : la création de la notification a échouée.').
4854 __("Veuillez contacter votre administrateur.")
4855 );
4856 return false;
4857 }
4858 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4859 // de l'échec de la notification
4860 $dossier_message = $this->get_inst_dossier_message(0);
4861 $dossier_message_val = array(
4862 'dossier' => $this->getVal('dossier'),
4863 'type' => _('erreur expedition'),
4864 'emetteur' => $this->f->get_connected_user_login_name(),
4865 'login' => $_SESSION['login'],
4866 'date_emission' => date('Y-m-d H:i:s'),
4867 'contenu' => _('Échec lors de la notification de l\'instruction ').
4868 $ev->getVal('libelle').
4869 '.<br>'.
4870 implode("\n", $erreursParam).
4871 '<br>'.
4872 _('Veuillez corriger ces informations avant de renvoyer la notification.')
4873 );
4874 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4875 // Si une erreur se produit pendant l'ajout
4876 if ($add !== true) {
4877 $this->addToLog(
4878 sprintf(
4879 '%s() : %s',
4880 __METHOD__,
4881 __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4882 ),
4883 DEBUG_MODE
4884 );
4885 return false;
4886 }
4887 }
4888 $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.")));
4889 }
4890 }
4891
4892 return $this->add_log_to_dossier($id, $val);
4893 }
4894
4895 /**
4896 * TRIGGER - triggersupprimer.
4897 *
4898 * @return boolean
4899 */
4900 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4901 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4902 /**
4903 * L'objectif ici est de repositionner les valeurs récupérées en
4904 * archive dans le dossier d'instruction avant de supprimer l'événement
4905 * d'instruction si les valeurs du dossier sont différentes
4906 */
4907 $valF = array();
4908 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4909 foreach ($inst_di->champs as $key => $champ) {
4910 // Si le champ du DI à une archive dans l'instruction
4911 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4912 // Si la valeur entre le champ du DI et son archive dans instruction
4913 // est différente
4914 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4915 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4916 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
4917 // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
4918 if ($champ === "accord_tacite" && $valF[$champ] === null) {
4919 $valF[$champ] = ' ';
4920 }
4921 }
4922 }
4923 }
4924 // Spécificité du champ avis_decision dont le champ archive est nommé
4925 // différemment
4926 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4927 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4928 }
4929 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4930 // par l'archive
4931 unset($valF['date_affichage']);
4932
4933 /**
4934 * Mise à jour de la version de clôture *version_clos* du dossier si et
4935 * seulement si l'instruction met à jour l'état du dossier.
4936 */
4937 if (isset($valF['etat']) === true
4938 && $valF['etat'] !== null
4939 && $valF['etat'] !== '') {
4940 // Récupère l'état actuel du dossier d'instruction
4941 $inst_current_etat = $this->f->get_inst__om_dbform(array(
4942 "obj" => "etat",
4943 "idx" => $inst_di->get_id_etat(),
4944 ));
4945 // Instanciation de l'état archivé appliqué sur le dossier
4946 $inst_etat = $this->f->get_inst__om_dbform(array(
4947 "obj" => "etat",
4948 "idx" => $valF['etat'],
4949 ));
4950 //
4951 $update_version_clos = null;
4952 // En cas de clôture du dossier par l'état archivé
4953 if ($inst_etat->getVal('statut') === 'cloture') {
4954 $update_version_clos = $inst_di->update_version_clos('up');
4955 }
4956 // En cas de réouverture du dossier par l'état archivé
4957 if ($inst_current_etat->getVal('statut') === 'cloture'
4958 && $inst_etat->getVal('statut') !== 'cloture') {
4959 //
4960 $update_version_clos = $inst_di->update_version_clos('down');
4961 //
4962 $this->set_att_di_reopened(true);
4963 }
4964 //
4965 if ($update_version_clos === false) {
4966 $this->f->addToLog(sprintf(
4967 "%s() : ERREUR - %s %s",
4968 __METHOD__,
4969 sprintf(
4970 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4971 $inst_di->getVal($inst_di->clePrimaire)
4972 ),
4973 sprintf(
4974 __("L'instruction tente d'appliquer l'état %s."),
4975 $inst_etat->getVal($inst_etat->clePrimaire)
4976 )
4977 ));
4978 $this->addToMessage(sprintf(
4979 "%s %s",
4980 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4981 __("Veuillez contacter votre administrateur.")
4982 ));
4983 return false;
4984 }
4985 }
4986 // On supprime toutes les notications liées à l'instruction
4987 $notifASupprimer = $this->get_instruction_notification(
4988 $this->getVal($this->clePrimaire),
4989 array(
4990 'notification_recepisse',
4991 'notification_instruction',
4992 'notification_decision',
4993 'notification_service_consulte',
4994 'notification_tiers_consulte',
4995 'notification_depot_demat',
4996 'notification_commune',
4997 'notification_signataire'
4998 ),
4999 true
5000 );
5001
5002 foreach ($notifASupprimer as $idNotif) {
5003 $inst_notif = $this->f->get_inst__om_dbform(array(
5004 "obj" => "instruction_notification",
5005 "idx" => $idNotif,
5006 ));
5007 $val_notif = array();
5008 foreach ($inst_notif->champs as $champ) {
5009 $val_notif[$champ] = $inst_notif->getVal($champ);
5010 }
5011 // La suppression des notifications entrainera la suppression des tâches qui y sont
5012 // liées
5013 $supprNotif = $inst_notif->supprimer($val_notif);
5014 if ($supprNotif == false) {
5015 $this->addToMessage(sprintf(
5016 "%s %s",
5017 __("Erreur lors de la suppression des notifications de l'instruction."),
5018 __("Veuillez contacter votre administrateur.")
5019 ));
5020 return false;
5021 }
5022 }
5023
5024 // On met à jour le dossier
5025 $valF['instruction'] = $id;
5026 $valF['crud'] = 'delete';
5027 $update_by_instruction = $inst_di->update_by_instruction($valF);
5028 if ($update_by_instruction === false) {
5029 $this->cleanMessage();
5030 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
5031 return false;
5032 }
5033
5034 // Affichage d'informations à l'utilisateur
5035 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
5036
5037 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
5038 }
5039
5040 /**
5041 * TRIGGER - triggersupprimerapres.
5042 *
5043 * @return boolean
5044 */
5045 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
5046 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
5047 /**
5048 * Mise à jour de la date de dernière modification du dossier
5049 * d'instruction
5050 */
5051 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
5052 $inst_di->update_last_modification_date();
5053
5054 /**
5055 * Mise à jour des données du dossier d'autorisation
5056 */
5057 $da = $this->f->get_inst__om_dbform(array(
5058 "obj" => "dossier_autorisation",
5059 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
5060 ));
5061 $params = array(
5062 'di_id' => $this->getVal('dossier'),
5063 'di_reopened' => $this->get_att_di_reopened(),
5064 );
5065 if($da->majDossierAutorisation($params) === false) {
5066 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
5067 $this->correct = false;
5068 return false;
5069 }
5070
5071 /**
5072 * Gestion des tâches pour la dématérialisation
5073 */
5074 $inst_task_empty = $this->f->get_inst__om_dbform(array(
5075 "obj" => "task",
5076 "idx" => 0,
5077 ));
5078 foreach ($inst_di->task_types as $task_type) {
5079 $task_exists = $inst_task_empty->task_exists($task_type, $id);
5080 if ($task_exists !== false) {
5081 $inst_task = $this->f->get_inst__om_dbform(array(
5082 "obj" => "task",
5083 "idx" => $task_exists,
5084 ));
5085 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
5086 $task_val = array(
5087 'state' => $inst_task::STATUS_CANCELED,
5088 );
5089 $update_task = $inst_task->update_task(array('val' => $task_val));
5090 if ($update_task === false) {
5091 $this->addToMessage(sprintf('%s %s',
5092 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5093 __("Veuillez contacter votre administrateur.")
5094 ));
5095 $this->correct = false;
5096 return false;
5097 }
5098 }
5099 }
5100 }
5101
5102 //
5103 $val['evenement'] = $this->getVal('evenement');
5104 return $this->add_log_to_dossier($id, $val);
5105 }
5106
5107 /**
5108 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5109 * "di_reopened".
5110 *
5111 * @param boolean $val
5112 */
5113 function set_att_di_reopened($val) {
5114 $this->di_reopened = $val;
5115 }
5116
5117 /**
5118 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5119 *
5120 * @return boolean
5121 */
5122 function get_att_di_reopened() {
5123 return $this->di_reopened;
5124 }
5125
5126 /**
5127 * Permet de composer un message d'erreur sur restriction non valide en
5128 * fonction du contexte.
5129 *
5130 * @param string $restriction formule de la restriction
5131 *
5132 * @return string message d'erreur
5133 */
5134 function get_restriction_error_message($restriction) {
5135 // Affichage du message si la restriction s'applique
5136 // Contexte du suivi des dates (message simple)
5137 $message_restrict = _("Probleme de dates :");
5138 // Split restriction
5139 $champs_restrict = preg_split(
5140 '/(\W+)/',
5141 $restriction,
5142 null,
5143 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5144 );
5145 $formated_restrict = "";
5146 // Ajout des chaînes à traduire
5147 foreach ($champs_restrict as $value) {
5148 $formated_restrict .= _($value)." ";
5149 }
5150 $formated_restrict = substr($formated_restrict, 0, -1);
5151 // Message d'erreur dans le contexte du suivi des dates
5152 if($this->getParameter("maj") == 170) {
5153 $message_restrict .= " "._("contactez l'instructeur du dossier");
5154 $message_restrict .= "<br/>(".$formated_restrict.")";
5155 } else {
5156 // Affichage du message si la restriction s'applique
5157 // Contexte instruction
5158 $message_restrict .= "<br/>".$formated_restrict;
5159 }
5160
5161 return $message_restrict;
5162 }
5163
5164 /**
5165 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5166 * les vérifications suivantes :
5167 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5168 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5169 * le message d'erreur associé à la restriction
5170 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5171 * et / ou la modification et affiche un message d'erreur
5172 * -
5173 * -
5174 * -
5175 * -
5176 * -
5177 * -
5178 *
5179 * @param array val : tableau contenant les valeurs issues du formulaire.
5180 * @param - dnu1 : Paramètre déprécié et non utilisé.
5181 * @param - dnu2 : Paramètre déprécié et non utilisé.
5182 *
5183 * @return void
5184 */
5185 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5186 parent::verifier($val);
5187 //
5188 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5189 $restriction = $this->get_restriction($val['evenement']);
5190
5191 //Test qu'une restriction est présente
5192 if ($restriction != "" ){
5193
5194 // Vérifie le contexte de la modification et test si la restriction est valide.
5195 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5196 // Il n'est donc pas nécessaire de vérifier les restrictions.
5197 $this->restriction_valid = $this->restrictionIsValid($restriction);
5198 if ($this->getParameter("maj") != 176
5199 && !$this->restriction_valid) {
5200
5201 // Affichage du message si la restriction s'applique
5202 $this->addToMessage(
5203 $this->get_restriction_error_message($restriction)
5204 );
5205 $this->correct=false;
5206 return false;
5207 }
5208
5209 // Liste des opérateurs possible
5210 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5211 // Supprime tous les espaces de la chaîne de caractère
5212 $restriction = str_replace(' ', '', $restriction);
5213
5214 // Met des espace avant et après les opérateurs puis transforme la
5215 // chaine en un tableau
5216 $tabRestriction = str_replace($operateurs, " ", $restriction);
5217 // Tableau des champ
5218 $tabRestriction = explode(" ", $tabRestriction);
5219 // Supprime les numériques du tableau
5220 foreach ($tabRestriction as $key => $value) {
5221 if (is_numeric($value)) {
5222 unset($tabRestriction[$key]);
5223 }
5224 }
5225
5226 // Vérifie les champs utilisés pour la restriction
5227 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5228 if ($check_field_exist !== true) {
5229
5230 // Liste des champs en erreur
5231 $string_error_fields = implode(", ", $check_field_exist);
5232
5233 // Message d'erreur
5234 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5235 if (count($check_field_exist) > 1) {
5236 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5237 }
5238
5239 // Affiche l'erreur
5240 $this->correct=false;
5241 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5242 $this->addToMessage(_("Veuillez contacter votre administrateur."));
5243 }
5244 }
5245
5246 }
5247 if(!$this->updateDate("date_envoi_signature")) {
5248 return false;
5249 }
5250 if(!$this->updateDate("date_retour_signature")) {
5251 return false;
5252 }
5253 if(!$this->updateDate("date_envoi_rar")) {
5254 return false;
5255 }
5256 if(!$this->updateDate("date_retour_rar")) {
5257 return false;
5258 }
5259 if(!$this->updateDate("date_envoi_controle_legalite")) {
5260 return false;
5261 }
5262 if(!$this->updateDate("date_retour_controle_legalite")) {
5263 return false;
5264 }
5265
5266 }
5267
5268 /**
5269 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5270 * principal du dossier auquel appartiens l'instruction.
5271 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5272 *
5273 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5274 * et affiche un message dans les logs.
5275 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5276 *
5277 * @param string identifiant du dossier
5278 * @return array|boolean
5279 */
5280 protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5281 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5282 // l'objet courant
5283 if (empty($dossier)) {
5284 $dossier = $this->getVal('dossier');
5285 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5286 // false et on affiche un message d'erreur dans les logs
5287 if (empty($dossier)) {
5288 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5289 return false;
5290 }
5291 }
5292
5293 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5294 // principal
5295 $qres = $this->f->get_all_results_from_db_query(
5296 sprintf(
5297 'SELECT
5298 -- Récupère toutes les informations du demandeur principal
5299 demandeur.*,
5300 CASE
5301 WHEN demandeur.qualite=\'particulier\'
5302 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5303 ELSE
5304 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5305 END AS destinataire
5306 FROM
5307 %1$sdossier
5308 LEFT JOIN %1$slien_dossier_demandeur
5309 ON lien_dossier_demandeur.dossier = dossier.dossier
5310 LEFT JOIN %1$sdemandeur
5311 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5312 WHERE
5313 dossier.dossier = \'%2$s\'
5314 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5315 DB_PREFIXE,
5316 $this->f->db->escapeSimple($dossier)
5317 ),
5318 array(
5319 "origin" => __METHOD__,
5320 )
5321 );
5322 if (is_array($qres["result"]) === true
5323 && array_key_exists(0, $qres["result"]) === true) {
5324 //
5325 return $qres["result"][0];
5326 }
5327 return null;
5328 }
5329
5330
5331
5332 /**
5333 * Finalisation des documents.
5334 * @param string $champ champ du fichier à finaliser
5335 * @param booleen $status permet de définir si on finalise ou définalise
5336 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5337 */
5338 function manage_finalizing($mode = null, $val = array()) {
5339 //
5340 $this->begin_treatment(__METHOD__);
5341
5342 //
5343 $id_inst = $this->getVal($this->clePrimaire);
5344
5345 //
5346 $admin_msg_error = _("Veuillez contacter votre administrateur.");
5347 $file_msg_error = _("Erreur de traitement de fichier.")
5348 ." ".$admin_msg_error;
5349 $bdd_msg_error = _("Erreur de base de données.")
5350 ." ".$admin_msg_error;
5351 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5352
5353 // Si on finalise le document
5354 if ($mode == "finalize"){
5355 //
5356 $etat = _('finalisation');
5357
5358 // Récupère la collectivite du dossier d'instruction
5359 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5360
5361 //
5362 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5363
5364 //
5365 $params = array(
5366 "specific" => array(),
5367 );
5368 // Si la rédaction libre est activée sur l'instruction
5369 if ($this->getVal("flag_edition_integrale") == 't') {
5370 $params["specific"]["corps"] = array(
5371 "mode" => "set",
5372 "value" => $this->getVal("corps_om_htmletatex"),
5373 );
5374 $params["specific"]["titre"] = array(
5375 "mode" => "set",
5376 "value" => $this->getVal("titre_om_htmletat"),
5377 );
5378 }
5379 // Génération du PDF
5380 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5381 $pdf_output = $result['pdf_output'];
5382
5383 //Métadonnées du document
5384 $metadata = array(
5385 'filename' => 'instruction_'.$id_inst.'.pdf',
5386 'mimetype' => 'application/pdf',
5387 'size' => strlen($pdf_output)
5388 );
5389
5390 // Récupération des métadonnées calculées après validation
5391 $spe_metadata = $this->getMetadata("om_fichier_instruction");
5392
5393 //On vérifie si l'instruction à finaliser a un événement de type arrete
5394 // TODO : A voir pour remplacer par une instanciation de l'événement.
5395 // Voir également si l'événement ne dois pas être instancié en début de
5396 // méthode pour pouvoir être réutilisé.
5397 $qres = $this->f->get_one_result_from_db_query(
5398 sprintf(
5399 'SELECT
5400 type
5401 FROM
5402 %1$sevenement
5403 WHERE
5404 evenement = \'%2$d\'',
5405 DB_PREFIXE,
5406 intval($this->getVal("evenement"))
5407 ),
5408 array(
5409 "origin" => __METHOD__,
5410 "force_return" => true,
5411 )
5412 );
5413
5414 if ($qres["code"] !== "OK") {
5415 $this->correct = false;
5416 $this->addToMessage($bdd_msg_error);
5417 return $this->end_treatment(__METHOD__, false);
5418 }
5419
5420 //Initialisation de la variable
5421 $arrete_metadata = array();
5422 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5423 if ($qres['result'] === 'arrete'){
5424 $arrete_metadata = $this->getMetadata("arrete");
5425 }
5426
5427 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5428
5429 /*
5430 // transforme le tableau de métadonnées en objet
5431 $mdf = new MetadataFactory();
5432 $md = $mdf->build('Instruction', $metadata);
5433 */
5434
5435 // Si le document a déjà été finalisé on le met à jour
5436 // en conservant son UID
5437 if ($this->getVal("om_fichier_instruction") != ''){
5438 $uid = $this->f->storage->update(
5439 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5440 }
5441 // Sinon on crée un nouveau document et dont on récupère l'UID
5442 else {
5443 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5444 }
5445 }
5446
5447 // Si on définalise le document
5448 if ($mode == "unfinalize") {
5449 //
5450 $etat = _('définalisation');
5451 // Récupération de l'uid du document finalisé
5452 $uid = $this->getVal("om_fichier_instruction");
5453 }
5454
5455 // Si on définalise l'UID doit être défini
5456 // Si on finalise la création/modification du fichier doit avoir réussi
5457 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5458 $this->correct = false;
5459 $this->addToMessage($file_msg_error);
5460 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5461 return $this->end_treatment(__METHOD__, false);
5462 }
5463
5464 //
5465 foreach ($this->champs as $key => $champ) {
5466 //
5467 $val[$champ] = $this->val[$key];
5468 }
5469
5470 //
5471 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5472 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5473 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5474 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5475 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5476 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5477 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5478 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5479 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5480 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5481 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5482 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5483 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5484 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5485 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5486 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5487 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5488 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5489 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5490 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5491 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5492 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5493 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5494 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5495 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5496 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5497 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5498 $this->setvalF($val);
5499
5500 // Verification de la validite des donnees
5501 $this->verifier($this->val);
5502 // Si les verifications precedentes sont correctes, on procede a
5503 // la modification, sinon on ne fait rien et on retourne une erreur
5504 if ($this->correct === true) {
5505 //
5506 $valF = array(
5507 "om_fichier_instruction" => $uid,
5508 "date_finalisation_courrier" => date('Y-m-d')
5509 );
5510 //
5511 if($mode=="finalize") {
5512 // état finalisé vrai
5513 $valF["om_final_instruction"] = true;
5514 // ajout log utilisateur
5515 $login = $_SESSION['login'];
5516 $nom = "";
5517 $this->f->getUserInfos();
5518 if (isset($this->f->om_utilisateur["nom"])
5519 && !empty($this->f->om_utilisateur["nom"])) {
5520 $nom = $this->f->om_utilisateur["nom"];
5521 }
5522 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5523 if ($nom != "") {
5524 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5525 }
5526 } else {
5527 // état finalisé faux
5528 $valF["om_final_instruction"] = false;
5529 // suppression log utilisateur
5530 $valF["om_final_instruction_utilisateur"] = '';
5531 }
5532
5533 // Execution de la requête de modification des donnees de l'attribut
5534 // valF de l'objet dans l'attribut table de l'objet
5535 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5536 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5537 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5538 //
5539 if ($this->f->isDatabaseError($res, true) === true) {
5540 $this->correct = false;
5541 $this->addToMessage($bdd_msg_error);
5542 return $this->end_treatment(__METHOD__, false);
5543 }
5544
5545 //
5546 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5547 //
5548 if ($this->add_log_to_dossier($id_inst, $val) === false) {
5549 return $this->end_treatment(__METHOD__, false);
5550 }
5551 //
5552 return $this->end_treatment(__METHOD__, true);
5553 }
5554 // L'appel de verifier() a déjà positionné correct à false
5555 // et défini un message d'erreur.
5556 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5557 return $this->end_treatment(__METHOD__, false);
5558 }
5559
5560 /**
5561 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5562 * @return string numéro de dossier d'instruction
5563 */
5564 protected function getDossier($champ = null) {
5565 if(empty($this->specificMetadata)) {
5566 $this->getSpecificMetadata();
5567 }
5568 return $this->specificMetadata->dossier;
5569 }
5570 /**
5571 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5572 * @return int Version
5573 */
5574 protected function getDossierVersion() {
5575 if(empty($this->specificMetadata)) {
5576 $this->getSpecificMetadata();
5577 }
5578 return $this->specificMetadata->version;
5579 }
5580 /**
5581 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5582 * @return string numéro de dossier d'autorisation
5583 */
5584 protected function getNumDemandeAutor() {
5585 if(empty($this->specificMetadata)) {
5586 $this->getSpecificMetadata();
5587 }
5588 return $this->specificMetadata->dossier_autorisation;
5589 }
5590 /**
5591 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5592 * @return date de la demande initiale
5593 */
5594 protected function getAnneemoisDemandeAutor() {
5595 if(empty($this->specificMetadata)) {
5596 $this->getSpecificMetadata();
5597 }
5598 return $this->specificMetadata->date_demande_initiale;
5599 }
5600 /**
5601 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5602 * @return string type du dossier d'instruction
5603 */
5604 protected function getTypeInstruction() {
5605 if(empty($this->specificMetadata)) {
5606 $this->getSpecificMetadata();
5607 }
5608 return $this->specificMetadata->dossier_instruction_type;
5609 }
5610 /**
5611 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5612 * @return string avis
5613 */
5614 protected function getStatutAutorisation() {
5615 if(empty($this->specificMetadata)) {
5616 $this->getSpecificMetadata();
5617 }
5618 return $this->specificMetadata->statut;
5619 }
5620 /**
5621 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5622 * @return string type du dossier d'autorisation
5623 */
5624 protected function getTypeAutorisation() {
5625 if(empty($this->specificMetadata)) {
5626 $this->getSpecificMetadata();
5627 }
5628 return $this->specificMetadata->dossier_autorisation_type;
5629 }
5630 /**
5631 * Récupération de la date d'ajout de document à ajouter aux métadonnées
5632 * @return date de l'évènement
5633 */
5634 protected function getDateEvenementDocument() {
5635 return date("Y-m-d");
5636 }
5637 /**
5638 * Récupération du groupe d'instruction à ajouter aux métadonnées
5639 * @return string Groupe d'instruction
5640 */
5641 protected function getGroupeInstruction() {
5642 if(empty($this->specificMetadata)) {
5643 $this->getSpecificMetadata();
5644 }
5645 return $this->specificMetadata->groupe_instruction;
5646 }
5647 /**
5648 * Récupération du libellé du type du document à ajouter aux métadonnées
5649 * @return string Groupe d'instruction
5650 */
5651 protected function getTitle() {
5652
5653 // Récupère le champ événement
5654 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5655 $evenement = $this->valF["evenement"];
5656 } else {
5657 $evenement = $this->getVal("evenement");
5658 }
5659
5660 // Requête sql
5661 $evenement = $this->f->get_inst__om_dbform(array(
5662 "obj" => "evenement",
5663 "idx" => $evenement
5664 ));
5665
5666 // Retourne le libelle de l'événement
5667 return $evenement->getVal('libelle');
5668 }
5669
5670
5671 /**
5672 * Récupération du champ ERP du dossier d'instruction.
5673 *
5674 * @return boolean
5675 */
5676 public function get_concerne_erp() {
5677 //
5678 if(empty($this->specificMetadata)) {
5679 $this->getSpecificMetadata();
5680 }
5681 //
5682 return $this->specificMetadata->erp;
5683 }
5684
5685
5686 /**
5687 * Cette méthode permet de stocker en attribut toutes les métadonnées
5688 * nécessaire à l'ajout d'un document.
5689 */
5690 public function getSpecificMetadata() {
5691 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5692 $dossier = $this->valF["dossier"];
5693 } else {
5694 $dossier = $this->getVal("dossier");
5695 }
5696 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5697 $qres = $this->f->get_all_results_from_db_query(
5698 sprintf(
5699 'SELECT
5700 dossier.dossier AS dossier,
5701 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5702 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5703 dossier_instruction_type.code AS dossier_instruction_type,
5704 etat_dossier_autorisation.libelle AS statut,
5705 dossier_autorisation_type.code AS dossier_autorisation_type,
5706 groupe.code AS groupe_instruction,
5707 CASE WHEN dossier.erp IS TRUE
5708 THEN \'true\'
5709 ELSE \'false\'
5710 END AS erp
5711 FROM
5712 %1$sdossier
5713 LEFT JOIN %1$sdossier_instruction_type
5714 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5715 LEFT JOIN %1$sdossier_autorisation
5716 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5717 LEFT JOIN %1$setat_dossier_autorisation
5718 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5719 LEFT JOIN %1$sdossier_autorisation_type_detaille
5720 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5721 LEFT JOIN %1$sdossier_autorisation_type
5722 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5723 LEFT JOIN %1$sgroupe
5724 ON dossier_autorisation_type.groupe = groupe.groupe
5725 WHERE
5726 dossier.dossier = \'%2$s\'',
5727 DB_PREFIXE,
5728 $this->f->db->escapeSimple($dossier)
5729 ),
5730 array(
5731 "origin" => __METHOD__,
5732 )
5733 );
5734 $row = array_shift($qres['result']);
5735
5736 //Si il y a un résultat
5737 if (! empty($row)) {
5738
5739 // Instrance de la classe dossier
5740 $inst_dossier = $this->get_inst_dossier($dossier);
5741 // TODO : améliorer ce code
5742 //
5743 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5744 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5745 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5746 // valeurs issues de la requête en objet.
5747 $metadata = (object)$row;
5748 // Insère l'attribut version à l'objet
5749 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5750
5751 //Alors on créé l'objet dossier_instruction
5752 $this->specificMetadata = $metadata;
5753
5754 }
5755 }
5756
5757 /**
5758 * Retourne le statut du dossier d'instruction
5759 * @param string $idx Identifiant du dossier d'instruction
5760 * @return string Le statut du dossier d'instruction
5761 */
5762 function getStatutAutorisationDossier($idx){
5763
5764 $statut = '';
5765
5766 //Si l'identifiant du dossier d'instruction fourni est correct
5767 if ( $idx != '' ){
5768
5769 //On récupère le statut de l'état du dossier à partir de l'identifiant du
5770 //dossier
5771 $qres = $this->f->get_one_result_from_db_query(
5772 sprintf(
5773 'SELECT
5774 etat.statut
5775 FROM
5776 %1$sdossier
5777 LEFT JOIN
5778 %1$setat
5779 ON
5780 dossier.etat = etat.etat
5781 WHERE
5782 dossier = \'%2$s\'',
5783 DB_PREFIXE,
5784 $this->f->db->escapeSimple($idx)
5785 ),
5786 array(
5787 "origin" => __METHOD__,
5788 )
5789 );
5790 }
5791
5792 return $qres['result'];
5793 }
5794
5795 /**
5796 * Récupère les données du dossier
5797 * @return array
5798 */
5799 function get_dossier_actual() {
5800
5801 // Initialisation de la valeur de retour
5802 $return = array();
5803
5804 // Récupération de toutes les valeurs du dossier d'instruction en cours
5805 // TODO : remplacer cette requête par une instanciation de l'objet
5806 $qres = $this->f->get_all_results_from_db_query(
5807 sprintf(
5808 'SELECT
5809 *
5810 FROM
5811 %1$sdossier
5812 WHERE
5813 dossier = \'%2$s\'',
5814 DB_PREFIXE,
5815 $this->f->db->escapeSimple($this->valF['dossier'])
5816 ),
5817 array(
5818 'origin' => __METHOD__
5819 )
5820 );
5821
5822 foreach ($qres['result'] as $row) {
5823
5824 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5825 // de l'état et de l'avis du dossier d'instruction
5826 $return['archive_delai'] = $row['delai'];
5827 $return['archive_accord_tacite'] = $row['accord_tacite'];
5828 $return['archive_etat'] = $row['etat'];
5829 $return['archive_avis'] = $row['avis_decision'];
5830 // Récupération de la valeur actuelle des dates du dossier
5831 // d'instruction
5832 $return['archive_date_complet'] = $row['date_complet'];
5833 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5834 $return['archive_date_rejet'] = $row['date_rejet'];
5835 $return['archive_date_limite'] = $row['date_limite'];
5836 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5837 $return['archive_date_decision'] = $row['date_decision'];
5838 $return['archive_date_validite'] = $row['date_validite'];
5839 $return['archive_date_achevement'] = $row['date_achevement'];
5840 $return['archive_date_chantier'] = $row['date_chantier'];
5841 $return['archive_date_conformite'] = $row['date_conformite'];
5842 $return['archive_incompletude'] = $row['incompletude'];
5843 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5844 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5845 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5846 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5847 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5848 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5849 $return['archive_autorite_competente'] = $row['autorite_competente'];
5850 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5851 $return['duree_validite'] = $row['duree_validite'];
5852 $return['date_depot'] = $row['date_depot'];
5853 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5854 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5855 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5856 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5857 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5858 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5859 $return['archive_date_ait'] = $row['date_ait'];
5860 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5861 $return['archive_date_affichage'] = $row['date_affichage'];
5862 $return['archive_pec_metier'] = $row['pec_metier'];
5863 $return['archive_a_qualifier'] = $row['a_qualifier'];
5864 }
5865
5866 // Retour de la fonction
5867 return $return;
5868
5869 }
5870
5871 /**
5872 * Permet de vérifier qu'un événement est verrouillable
5873 * @param integer $idx Identifiant de l'instruction
5874 * @return boolean
5875 */
5876 function checkEvenementNonVerrouillable($idx) {
5877 // Si la condition n'est pas vide
5878 if ($idx != "") {
5879
5880 // Requête SQL
5881 $qres = $this->f->get_one_result_from_db_query(
5882 sprintf(
5883 'SELECT
5884 evenement.non_verrouillable
5885 FROM
5886 %1$sevenement
5887 LEFT JOIN %1$sinstruction
5888 ON instruction.evenement = evenement.evenement
5889 WHERE
5890 instruction.instruction = \'%2$s\'',
5891 DB_PREFIXE,
5892 intval($idx)
5893 ),
5894 array(
5895 "origin" => __METHOD__,
5896 )
5897 );
5898 }
5899
5900 // Si on a un résultat et que ce résultat indique que l'événement n'est
5901 // pas vérrouillable renvoie true, sinon renvoie false
5902 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5903 }
5904
5905 /**
5906 * Mise à jour des champs archive_*
5907 * @param mixed $row La ligne de données
5908 */
5909 public function updateArchiveData($row){
5910
5911 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5912 // de l'état et de l'avis du dossier d'instruction
5913 $this->valF['archive_delai']=$row['delai'];
5914 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5915 $this->valF['archive_etat']=$row['etat'];
5916 $this->valF['archive_avis']=$row['avis_decision'];
5917 // Récupération de la valeur actuelle des 9 dates du dossier
5918 // d'instruction
5919 if ($row['date_complet'] != '') {
5920 $this->valF['archive_date_complet']=$row['date_complet'];
5921 }
5922 if ($row['date_dernier_depot'] != '') {
5923 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5924 }
5925 if ($row['date_rejet'] != '') {
5926 $this->valF['archive_date_rejet']= $row['date_rejet'];
5927 }
5928 if ($row['date_limite'] != '') {
5929 $this->valF['archive_date_limite']= $row['date_limite'];
5930 }
5931 if ($row['date_notification_delai'] != '') {
5932 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5933 }
5934 if ($row['date_decision'] != '') {
5935 $this->valF['archive_date_decision']= $row['date_decision'];
5936 }
5937 if ($row['date_validite'] != '') {
5938 $this->valF['archive_date_validite']= $row['date_validite'];
5939 }
5940 if ($row['date_achevement'] != '') {
5941 $this->valF['archive_date_achevement']= $row['date_achevement'];
5942 }
5943 if ($row['date_chantier'] != '') {
5944 $this->valF['archive_date_chantier']= $row['date_chantier'];
5945 }
5946 if ($row['date_conformite'] != '') {
5947 $this->valF['archive_date_conformite']= $row['date_conformite'];
5948 }
5949 if ($row['incompletude'] != '') {
5950 $this->valF['archive_incompletude']= $row['incompletude'];
5951 }
5952 if ($row['incomplet_notifie'] != '') {
5953 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5954 }
5955 if ($row['evenement_suivant_tacite'] != '') {
5956 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5957 }
5958 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5959 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5960 }
5961 if ($row['etat_pendant_incompletude'] != '') {
5962 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5963 }
5964 if ($row['date_limite_incompletude'] != '') {
5965 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5966 }
5967 if ($row['delai_incompletude'] != '') {
5968 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5969 }
5970 if ($row['autorite_competente'] != '') {
5971 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5972 }
5973 if ($row['duree_validite'] != '') {
5974 $this->valF['duree_validite']= $row['duree_validite'];
5975 }
5976 if ($row['date_depot'] != '') {
5977 $this->valF['date_depot']= $row['date_depot'];
5978 }
5979 if ($row['date_depot_mairie'] != '') {
5980 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5981 }
5982 // Dates concernant les dossiers contentieux
5983 if ($row['date_cloture_instruction'] != '') {
5984 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5985 }
5986 if ($row['date_premiere_visite'] != '') {
5987 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5988 }
5989 if ($row['date_derniere_visite'] != '') {
5990 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5991 }
5992 if ($row['date_contradictoire'] != '') {
5993 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5994 }
5995 if ($row['date_retour_contradictoire'] != '') {
5996 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5997 }
5998 if ($row['date_ait'] != '') {
5999 $this->valF['archive_date_ait']= $row['date_ait'];
6000 }
6001 if ($row['date_transmission_parquet'] != '') {
6002 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
6003 }
6004 //
6005 if ($row['dossier_instruction_type'] != '') {
6006 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
6007 }
6008 if ($row['date_affichage'] != '') {
6009 $this->valF['archive_date_affichage']= $row['date_affichage'];
6010 }
6011 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
6012 $this->valF['archive_pec_metier']= $row['pec_metier'];
6013 }
6014 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
6015 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
6016 }
6017 }
6018
6019 // {{{
6020 // Méthodes de récupération des métadonnées arrêté
6021 /**
6022 * @return string Retourne le numéro d'arrêté
6023 */
6024 function getNumArrete() {
6025 return $this->getVal("numero_arrete");
6026 }
6027 /**
6028 * @return chaîne vide
6029 */
6030 function getReglementaireArrete() {
6031 return 'true';
6032 }
6033 /**
6034 * @return boolean de notification au pétitionnaire
6035 */
6036 function getNotificationArrete() {
6037 return 'true';
6038 }
6039 /**
6040 * @return date de notification au pétitionnaire
6041 */
6042 function getDateNotificationArrete() {
6043 if (empty($this->metadonneesArrete)) {
6044 $this->getArreteMetadata();
6045 }
6046 return $this->metadonneesArrete["datenotification"];
6047 }
6048 /**
6049 * @return boolean check si le document est passé au contrôle de légalité
6050 */
6051 function getControleLegalite() {
6052 return 'true';
6053 }
6054 /**
6055 * @return date de signature de l'arrêté
6056 */
6057 function getDateSignature() {
6058 if (empty($this->metadonneesArrete)) {
6059 $this->getArreteMetadata();
6060 }
6061 return $this->metadonneesArrete["datesignaturearrete"];
6062 }
6063 /**
6064 * @return string nom du signataire
6065 */
6066 function getNomSignataire() {
6067 if (empty($this->metadonneesArrete)) {
6068 $this->getArreteMetadata();
6069 }
6070 return $this->metadonneesArrete["nomsignataire"];
6071 }
6072 /**
6073 * @return string qualité du signataire
6074 */
6075 function getQualiteSignataire() {
6076 if (empty($this->metadonneesArrete)) {
6077 $this->getArreteMetadata();
6078 }
6079 return $this->metadonneesArrete["qualitesignataire"];
6080 }
6081 /**
6082 * @return string numéro du terrain
6083 */
6084 function getAp_numRue() {
6085 if (empty($this->metadonneesArrete)) {
6086 $this->getArreteMetadata();
6087 }
6088 return $this->metadonneesArrete["ap_numrue"];
6089 }
6090 /**
6091 * @return string nom de la rue du terrain
6092 */
6093 function getAp_nomDeLaVoie() {
6094 if (empty($this->metadonneesArrete)) {
6095 $this->getArreteMetadata();
6096 }
6097 return $this->metadonneesArrete["ap_nomdelavoie"];
6098 }
6099 /**
6100 * @return string code postal du terrain
6101 */
6102 function getAp_codePostal() {
6103 if (empty($this->metadonneesArrete)) {
6104 $this->getArreteMetadata();
6105 }
6106 return $this->metadonneesArrete["ap_codepostal"];
6107 }
6108 /**
6109 * @return string ville du terrain
6110 */
6111 function getAp_ville() {
6112 if (empty($this->metadonneesArrete)) {
6113 $this->getArreteMetadata();
6114 }
6115 return $this->metadonneesArrete["ap_ville"];
6116 }
6117 /**
6118 * @return string activité
6119 */
6120 function getActivite() {
6121 return "Droit du sol";
6122 }
6123 /**
6124 * @return string date du retour de controle légalité
6125 */
6126 function getDateControleLegalite() {
6127 if (empty($this->metadonneesArrete)) {
6128 $this->getArreteMetadata();
6129 }
6130 return $this->metadonneesArrete["datecontrolelegalite"];
6131 }
6132
6133 // Fin des méthodes de récupération des métadonnées
6134 // }}}
6135
6136 /**
6137 * Méthode de récupération des métadonnées arrêtés dans la base de données,
6138 * les données sont stockés dans l'attribut $this->metadonneesArrete
6139 */
6140 function getArreteMetadata() {
6141
6142 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6143 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6144 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6145 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6146 "ap_codepostal"=>"", "ap_ville"=>"");
6147
6148 $qres = $this->f->get_all_results_from_db_query(
6149 sprintf(
6150 'SELECT
6151 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6152 signataire_arrete.qualite as qualitesignataire,
6153 instruction.etat as decisionarrete,
6154 instruction.date_retour_rar as datenotification,
6155 instruction.date_retour_signature as datesignaturearrete,
6156 instruction.date_retour_controle_legalite as datecontrolelegalite,
6157 dossier.terrain_adresse_voie_numero as ap_numrue,
6158 dossier.terrain_adresse_voie as ap_nomdelavoie,
6159 dossier.terrain_adresse_code_postal as ap_codepostal,
6160 dossier.terrain_adresse_localite as ap_ville
6161 FROM
6162 %1$sinstruction
6163 LEFT JOIN %1$ssignataire_arrete
6164 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6165 LEFT JOIN %1$sdossier
6166 ON instruction.dossier = dossier.dossier
6167 LEFT JOIN %1$sdonnees_techniques
6168 ON donnees_techniques.dossier_instruction = dossier.dossier
6169 WHERE
6170 instruction.instruction = %2$d',
6171 DB_PREFIXE,
6172 intval($this->getVal('instruction'))
6173 ),
6174 array(
6175 'origin' => __METHOD__
6176 )
6177 );
6178 $this->metadonneesArrete = array_shift($qres['result']);
6179 }
6180
6181 /**
6182 * CONDITION - has_an_edition.
6183 *
6184 * Condition pour afficher le bouton de visualisation de l'édition.
6185 *
6186 * @return boolean
6187 */
6188 function has_an_edition() {
6189 // Récupère la valeur du champ lettretype
6190 $lettretype = $this->getVal("lettretype");
6191 // Si le champ est vide
6192 if ($lettretype !== '' && $lettretype !== null) {
6193 //
6194 return true;
6195 }
6196
6197 //
6198 return false;
6199 }
6200
6201 /**
6202 * CONDITION - is_modifiable.
6203 *
6204 * Controle si l'évenement est modifiable.
6205 *
6206 * @return boolean
6207 */
6208 function is_evenement_modifiable() {
6209 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6210 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6211 }
6212
6213 /**
6214 * CONDITION - is_editable.
6215 *
6216 * Condition pour la modification.
6217 *
6218 * @return boolean
6219 */
6220 function is_editable() {
6221
6222 // XXX
6223 // 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é)
6224 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6225
6226 // Contrôle si l'utilisateur possède un bypass
6227 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6228 //
6229 if ($bypass == true) {
6230 //
6231 return true;
6232 }
6233
6234 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6235 // que l'événement n'est pas identifié comme non verrouillable
6236 if ($this->f->isUserInstructeur()
6237 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6238 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6239 //
6240 return false;
6241 }
6242
6243 // Si l'utilisateur est un intructeur qui correspond à la division du
6244 // dossier
6245 if ($this->is_instructeur_from_division_dossier() === true) {
6246 //
6247 return true;
6248 }
6249
6250 // Si l'utilisateur est instructeur de la commune du dossier et que
6251 // l'instruction est créée par un instructeur de la commune
6252 if ($this->is_instructeur_from_collectivite_dossier() === true and
6253 $this->getVal('created_by_commune') === 't') {
6254 return true;
6255 }
6256
6257 //
6258 return false;
6259 }
6260
6261 /**
6262 * Vérifie si l'événement est supprimable ou pas.
6263 *
6264 * @return boolean
6265 */
6266 function is_evenement_supprimable() {
6267 // Controle si l'évenement est supprimable
6268 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6269 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6270 }
6271
6272 /**
6273 * CONDITION - is_deletable.
6274 *
6275 * Condition pour la suppression.
6276 *
6277 * @return boolean
6278 */
6279 function is_deletable() {
6280
6281 // XXX
6282 // 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é)
6283 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6284
6285 // Contrôle si l'utilisateur possède un bypass intégral
6286 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6287 //
6288 if ($bypass == true) {
6289
6290 //
6291 return true;
6292 }
6293
6294 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6295 // division du dossier et si l'utilisateur n'a pas la permission bypass
6296 // de la division
6297 if ($this->is_instructeur_from_division_dossier() === false
6298 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6299
6300 //
6301 return false;
6302 }
6303
6304 // l'événement est-il le dernier ?
6305 $dernier_evenement = false;
6306 // instanciation dossier
6307 $dossier = $this->f->get_inst__om_dbform(array(
6308 "obj" => "dossier",
6309 "idx" => $this->getVal('dossier'),
6310 ));
6311 // récupération dernier événement
6312 $id_dernier_evenement = $dossier->get_dernier_evenement();
6313 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6314 $dernier_evenement = true;
6315 }
6316
6317 // Si dossier cloturé ou si pas dernier événement
6318 // ou de type retour ou si une date est renseignée
6319 // ET utilisateur non administrateur
6320 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6321 || $dernier_evenement == false
6322 || $this->is_evenement_retour($this->getVal("evenement")) == true
6323 || $this->getVal('date_envoi_signature') != ''
6324 || $this->getVal('date_retour_signature') != ''
6325 || $this->getVal('date_envoi_rar') != ''
6326 || $this->getVal('date_retour_rar') != ''
6327 || $this->getVal('date_envoi_controle_legalite') != ''
6328 || $this->getVal('date_retour_controle_legalite') != '') {
6329 // pas le droit de supprimer
6330 return false;;
6331 }
6332
6333 //
6334 return true;
6335 }
6336
6337
6338 /**
6339 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6340 * dossier.
6341 *
6342 * @return, boolean true/false
6343 */
6344 function is_instructeur_from_collectivite_dossier() {
6345 if ($this->f->isUserInstructeur() === true and
6346 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6347 return true;
6348 }
6349 return false;
6350 }
6351
6352 /**
6353 * CONDITION - is_addable.
6354 *
6355 * Condition pour afficher les boutons modifier et supprimer.
6356 *
6357 * @return boolean
6358 */
6359 function is_addable() {
6360 // Contrôle si l'utilisateur possède un bypass
6361 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6362 //
6363 if ($bypass == true) {
6364
6365 //
6366 return true;
6367 }
6368 // Si l'utilisateur est un intructeur qui correspond à la
6369 // division du dossier ou qu'il peut changer la décision
6370 if ($this->is_instructeur_from_division_dossier() === true or
6371 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6372 //
6373 return true;
6374 }
6375
6376 //
6377 return false;
6378 }
6379
6380 /**
6381 * CONDITION - is_finalizable.
6382 *
6383 * Condition pour afficher le bouton.
6384 *
6385 * @return boolean
6386 */
6387 function is_finalizable() {
6388 // Contrôle si l'utilisateur possède un bypass
6389 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6390 //
6391 if ($bypass == true) {
6392 //
6393 return true;
6394 }
6395
6396 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6397 // que l'événement n'est pas identifié comme non verrouillable
6398 if ($this->f->isUserInstructeur()
6399 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6400 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6401 //
6402 return false;
6403 }
6404
6405 // Si l'utilisateur est un intructeur qui correspond à la division du
6406 // dossier
6407 if ($this->is_instructeur_from_division_dossier() === true) {
6408 //
6409 return true;
6410 }
6411
6412 // Si l'utilisateur est instructeur de la commune du dossier et que
6413 // l'instruction est créée par un instructeur de la commune
6414 if ($this->is_instructeur_from_collectivite_dossier() === true and
6415 $this->getVal('created_by_commune') === 't') {
6416 return true;
6417 }
6418
6419 //
6420 return false;
6421 }
6422
6423 /**
6424 * CONDITION - is_finalize_without_bypass.
6425 *
6426 * Condition pour afficher le bouton sans le bypass.
6427 *
6428 * @return boolean [description]
6429 */
6430 function is_finalizable_without_bypass() {
6431 // Récupère la valeur du champ finalisé
6432 $om_final_instruction = $this->getVal('om_final_instruction');
6433
6434 // Si le rapport n'est pas finalisé
6435 if (empty($om_final_instruction)
6436 || $om_final_instruction == 'f') {
6437 //
6438 return true;
6439 }
6440
6441 //
6442 return false;
6443 }
6444
6445 /**
6446 * CONDITION - is_unfinalizable.
6447 *
6448 * Condition pour afficher le bouton.
6449 *
6450 * @return boolean
6451 */
6452 function is_unfinalizable(){
6453 // Contrôle si l'utilisateur possède un bypass
6454 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6455 //
6456 if ($bypass == true) {
6457 //
6458 return true;
6459 }
6460
6461 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6462 // que l'événement n'est pas identifié comme non verrouillable
6463 if ($this->f->isUserInstructeur()
6464 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6465 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6466 //
6467 return false;
6468 }
6469
6470 // Si l'utilisateur est un intructeur qui correspond à la division du
6471 // dossier
6472 if ($this->is_instructeur_from_division_dossier() === true) {
6473 //
6474 return true;
6475 }
6476
6477 // Si l'utilisateur est instructeur de la commune du dossier et que
6478 // l'instruction est créée par un instructeur de la commune
6479 if ($this->is_instructeur_from_collectivite_dossier() === true and
6480 $this->getVal('created_by_commune') === 't') {
6481 return true;
6482 }
6483
6484 //
6485 return false;
6486 }
6487
6488 /**
6489 * CONDITION - is_unfinalizable_without_bypass.
6490 *
6491 * Condition pour afficher le bouton sans le bypass.
6492 *
6493 * @return boolean
6494 */
6495 function is_unfinalizable_without_bypass() {
6496 // Récupère la valeur du champ finalisé
6497 $om_final_instruction = $this->getVal('om_final_instruction');
6498
6499 // Si l'instruction est finalisée
6500 if ($om_final_instruction == 't') {
6501 //
6502 return true;
6503 }
6504
6505 //
6506 return false;
6507 }
6508
6509
6510 /**
6511 * Permet de définir si un instructeur commune peut editer une instruction
6512 *
6513 * @return boolean true si il peut
6514 */
6515 function isInstrCanChangeDecision($idx) {
6516
6517 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6518 $this->f->isUserInstructeur() !== true) {
6519 return false;
6520 }
6521
6522
6523
6524 // Sinon on vérifie l'éligibilité du dossier au changement de décision
6525 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6526 // de décision :
6527 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6528 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6529 $sql = sprintf(
6530 'SELECT
6531 dossier.dossier
6532 FROM
6533 %1$sdossier
6534 JOIN %1$setat
6535 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6536 JOIN %1$slien_dossier_demandeur
6537 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6538 JOIN %1$sdossier_instruction_type
6539 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6540 JOIN %1$sinstruction
6541 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6542 ON instruction.instruction = (
6543 SELECT instruction
6544 FROM %1$sinstruction
6545 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6546 AND evenement.retour IS FALSE
6547 WHERE instruction.dossier = dossier.dossier
6548 ORDER BY date_evenement DESC, instruction DESC
6549 LIMIT 1
6550 )
6551 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6552 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6553 -- non signée, non notifié, etc.
6554 AND (instruction.om_final_instruction IS TRUE
6555 OR instruction.created_by_commune IS TRUE)
6556 AND instruction.date_retour_signature IS NULL
6557 AND instruction.date_envoi_rar IS NULL
6558 AND instruction.date_retour_rar IS NULL
6559 AND instruction.date_envoi_controle_legalite IS NULL
6560 AND instruction.date_retour_controle_legalite IS NULL
6561 -- On vérifie que l instruction soit un arrêté ou un changement de décision
6562 JOIN %1$sevenement
6563 ON instruction.evenement=evenement.evenement
6564 AND (evenement.type = \'arrete\'
6565 OR evenement.type = \'changement_decision\')
6566 -- Recherche les informations du pétitionnaire principal pour l affichage
6567 JOIN %1$sdemandeur
6568 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6569 -- Recherche la collectivité rattachée à l instructeur
6570 JOIN %1$sinstructeur
6571 ON dossier.instructeur=instructeur.instructeur
6572 JOIN %1$sdivision
6573 ON instructeur.division=division.division
6574 JOIN %1$sdirection
6575 ON division.direction=direction.direction
6576 JOIN %1$som_collectivite
6577 ON direction.om_collectivite=om_collectivite.om_collectivite
6578 WHERE
6579 -- Vérification que la décision a été prise par l agglo
6580 om_collectivite.niveau = \'2\'
6581 AND dossier.dossier = \'%2$s\'
6582 ',
6583 DB_PREFIXE,
6584 $this->f->db->escapeSimple($idx)
6585 );
6586
6587
6588 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6589 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6590 $sql .= sprintf(
6591 ' AND dossier.om_collectivite = %1$d',
6592 intval($_SESSION['collectivite'])
6593 );
6594 }
6595 $qres = $this->f->get_one_result_from_db_query(
6596 $sql,
6597 array(
6598 "origin" => __METHOD__,
6599 )
6600 );
6601
6602 return $qres['result'] !== null;
6603 }
6604
6605
6606 /**
6607 * CONDITION - can_monitoring_dates.
6608 *
6609 * Condition pour afficher le bouton de suivi des dates.
6610 *
6611 * @return boolean
6612 */
6613 public function can_monitoring_dates() {
6614 // Récupère la valeur du champ finalisé
6615 $om_final_instruction = $this->getVal('om_final_instruction');
6616
6617 // Si l'instruction n'est pas finalisée
6618 if ($om_final_instruction !== 't') {
6619 //
6620 return false;
6621 }
6622
6623 // Contrôle si l'utilisateur possède un bypass
6624 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6625 if ($bypass === true) {
6626 return true;
6627 }
6628
6629 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6630 // un utilisateur lié à un instructeur
6631 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6632
6633 // On vérifie en premier lieu que le DI n'est pas clôturé et que
6634 // l'utilisateur ne possède pas la permission de modifier le suivi des
6635 // dates sur un dossier clôturé
6636 $inst_dossier = $this->get_inst_dossier();
6637 if ($inst_dossier->getStatut() === 'cloture'
6638 && $perm_moni_dates_d_closed === false) {
6639 //
6640 return false;
6641 }
6642 // On récupère ses infos
6643 $coll_di = $inst_dossier->getVal('om_collectivite');
6644 $div_di = $this->getDivisionFromDossier();
6645 // et celles de son éventuel instructeur
6646 $instr_di = $inst_dossier->getVal('instructeur');
6647
6648 // Il faut disposer d'une entrée instructeur
6649 if ($this->f->isUserInstructeur() === false) {
6650 return false;
6651 }
6652
6653 // Par défaut on prétend que l'instructeur n'est pas multi
6654 $instr_di_coll_multi = false;
6655 // Si un instructeur est affecté au dossier
6656 if ($instr_di !== '' && $instr_di !== null) {
6657 // Vérifie si l'instructeur est de la collectivité de niveau 2
6658 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6659 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6660 //
6661 $instr_di_coll_multi = true;
6662 }
6663 }
6664
6665 // Il faut qu'il instruise le dossier ou soit de la même division
6666 if ($this->f->om_utilisateur['instructeur'] === $instr_di
6667 || $this->f->om_utilisateur['division'] === $div_di) {
6668 //
6669 return true;
6670 }
6671
6672 // On donne également le droit s'il est de la même collectivité que
6673 // le dossier ET si l'instruction est déléguée à la communauté
6674 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6675 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6676 && $instr_di_coll_multi === true) {
6677 //
6678 return true;
6679 }
6680
6681 // Si l'instructeur ne rentre pas dans les deux cas précédents
6682 return false;
6683 }
6684
6685
6686 /**
6687 * CONDITION - is_finalized.
6688 *
6689 * Condition pour vérifier si une instruction est finalisée.
6690 *
6691 * @return boolean
6692 */
6693 public function is_finalized() {
6694
6695 return $this->getVal('om_final_instruction') === "t";
6696 }
6697
6698 /**
6699 * CONDITION - is_not_date_retour_signature_set.
6700 *
6701 * Condition pour vérifier si une date de retour signature n'est pas définie.
6702 *
6703 * @return boolean
6704 */
6705 public function is_not_date_retour_signature_set() {
6706
6707 return $this->getVal('date_retour_signature') == null;
6708
6709 }
6710
6711
6712 /**
6713 * TREATMENT - finalize.
6714 *
6715 * Permet de finaliser un enregistrement.
6716 *
6717 * @param array $val valeurs soumises par le formulaire
6718 *
6719 * @return boolean
6720 */
6721 function finalize($val = array()) {
6722
6723 // Cette méthode permet d'exécuter une routine en début des méthodes
6724 // dites de TREATMENT.
6725 $this->begin_treatment(__METHOD__);
6726 $message = '';
6727 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6728
6729 // Controle du signataire
6730 if (! $this->controle_signataire($ev)) {
6731 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6732 // Termine le traitement
6733 return $this->end_treatment(__METHOD__, false);
6734 }
6735
6736 // Traitement de la finalisation
6737 $ret = $this->manage_finalizing("finalize", $val);
6738
6739 // Si le traitement retourne une erreur
6740 if ($ret !== true) {
6741
6742 // Termine le traitement
6743 return $this->end_treatment(__METHOD__, false);
6744 }
6745
6746 // Envoi des notifications aux demandeurs si la notification est automatique
6747 // et que la signature n'est pas requise
6748 if ($ev->getVal('notification') === 'notification_automatique') {
6749 // Préparation du message de log en cas d'erreur de notification
6750 $msgLog = sprintf(
6751 '%s %s : %d',
6752 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6753 __('Instruction notifiée'),
6754 $this->getVal($this->clePrimaire)
6755 );
6756 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6757 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6758 // Récupération de la liste des demandeurs à notifier et de la catégorie
6759 $categorie = $this->f->get_param_option_notification($collectivite_di);
6760 $isPortal = $categorie === PORTAL;
6761 $demandeursANotifie = $this->get_demandeurs_notifiable(
6762 $this->getVal('dossier'),
6763 $isPortal
6764 );
6765
6766 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6767 $demandeurPrincipalNotifie = false;
6768 if (count($demandeursANotifie) > 0) {
6769 foreach ($demandeursANotifie as $demandeur) {
6770 // Identifie si le demandeur principal a été notifié ou pas
6771 // et récupère ses informations
6772 if ($demandeur['petitionnaire_principal'] == 't') {
6773 $demandeurPrincipalNotifie = true;
6774 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6775 // son paramétrage, on effectue pas le traitement et on passe à l'itération
6776 // suivante. On le considère également comme non notifié pour gérer l'envoie
6777 // des messages d'erreurs
6778 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6779 // d'impact sur la notification
6780 $erreursParam = $this->get_info_notification_fail();
6781 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6782 $demandeurPrincipalNotifie = false;
6783 continue;
6784 }
6785 }
6786 // Ajout de la notif et récupération de son id
6787 $idNotif = $this->ajouter_notification(
6788 $this->getVal($this->clePrimaire),
6789 $this->f->get_connected_user_login_name(),
6790 $demandeur,
6791 $collectivite_di,
6792 array(),
6793 true
6794 );
6795 if ($idNotif === false) {
6796 // Termine le traitement
6797 $this->addToLog(
6798 sprintf('%s() : %s', __METHOD__, $msgLog),
6799 DEBUG_MODE
6800 );
6801 return $this->end_treatment(__METHOD__, false);
6802 }
6803 $notification_by_task = $this->notification_by_task(
6804 $idNotif,
6805 $this->getVal('dossier'),
6806 $categorie
6807 );
6808 if ($notification_by_task === false) {
6809 $this->addToLog(
6810 sprintf('%s() : %s', __METHOD__, $msgLog),
6811 DEBUG_MODE
6812 );
6813 $this->addToMessage(
6814 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6815 );
6816 // Termine le traitement
6817 return $this->end_treatment(__METHOD__, false);
6818 }
6819 $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.")));
6820 }
6821 }
6822 // Pour la notification par mail ou la notification via portal si le dossier a
6823 // été déposés via portal, si le demandeur principal n'est pas notifiable,
6824 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6825 // laquelle le demandeur principal n'a pas pu être notifié
6826 $depotPortal = $this->dossier_depose_sur_portail();
6827 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6828 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6829 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6830 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6831 $erreursParam = $this->get_info_notification_fail();
6832 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6833 // Ajout de la notif et récupération de son id
6834 $idNotif = $this->ajouter_notification(
6835 $this->valF[$this->clePrimaire],
6836 $this->f->get_connected_user_login_name(),
6837 $demandeurPrincipal,
6838 $collectivite_di,
6839 array(),
6840 true,
6841 'Echec',
6842 implode(' ', $erreursParam)
6843 );
6844 if ($idNotif === false) {
6845 $this->addToMessage(
6846 __('Erreur : la création de la notification a échouée.').
6847 __("Veuillez contacter votre administrateur.")
6848 );
6849 $this->addToLog(
6850 sprintf('%s() : %s', __METHOD__, $msgLog),
6851 DEBUG_MODE
6852 );
6853 return false;
6854 }
6855 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6856 // de l'échec de la notification
6857 $dossier_message = $this->get_inst_dossier_message(0);
6858 $dossier_message_val = array(
6859 'dossier' => $this->getVal('dossier'),
6860 'type' => _('erreur expedition'),
6861 'emetteur' => $this->f->get_connected_user_login_name(),
6862 'login' => $_SESSION['login'],
6863 'date_emission' => date('Y-m-d H:i:s'),
6864 'contenu' => _('Échec lors de la notification de l\'instruction ').
6865 $ev->getVal('libelle').
6866 '.<br>'.
6867 implode("\n", $erreursParam).
6868 '<br>'.
6869 _('Veuillez corriger ces informations avant de renvoyer la notification.')
6870 );
6871 $add = $dossier_message->add_notification_message($dossier_message_val, true);
6872 // Si une erreur se produit pendant l'ajout
6873 if ($add !== true) {
6874 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6875 return false;
6876 }
6877 }
6878 }
6879
6880 // Termine le traitement
6881 return $this->end_treatment(__METHOD__, true);
6882 }
6883
6884 /**
6885 * Récupère l'instance de dossier message.
6886 *
6887 * @param string $dossier_message Identifiant du message.
6888 *
6889 * @return object
6890 */
6891 private function get_inst_dossier_message($dossier_message = null) {
6892 //
6893 return $this->get_inst_common("dossier_message", $dossier_message);
6894 }
6895
6896 /**
6897 * Vérifie si le signataire est obligatoire pour finaliser
6898 * le document apartir du paramétrage de l'événement.
6899 * Si c'est le cas, vérifie si il y a bien un signataire
6900 * renseigné.
6901 * Si c'est le cas renvoie true, sinon renvoie false.
6902 *
6903 * @param evenement évenement de l'instruction permettant de
6904 * récupérer le paramétrage
6905 * @return boolean
6906 */
6907 protected function controle_signataire($evenement) {
6908 // Vérifie si le signataire est obligatoire et si c'est le cas
6909 // vérifie si il y a bien un signataire pour le document
6910 if ($evenement->is_signataire_obligatoire() &&
6911 ($this->getVal('signataire_arrete') === null ||
6912 $this->getVal('signataire_arrete') === '')) {
6913 return false;
6914 }
6915 return true;
6916 }
6917
6918 /**
6919 * TREATMENT - unfinalize.
6920 *
6921 * Permet de définaliser un enregistrement.
6922 *
6923 * @param array $val valeurs soumises par le formulaire
6924 *
6925 * @return boolean
6926 */
6927 function unfinalize($val = array()) {
6928
6929 // Cette méthode permet d'exécuter une routine en début des méthodes
6930 // dites de TREATMENT.
6931 $this->begin_treatment(__METHOD__);
6932
6933 // Traitement de la finalisation
6934 $ret = $this->manage_finalizing("unfinalize", $val);
6935
6936 // Si le traitement retourne une erreur
6937 if ($ret !== true) {
6938
6939 // Termine le traitement
6940 return $this->end_treatment(__METHOD__, false);
6941 }
6942
6943 // Termine le traitement
6944 return $this->end_treatment(__METHOD__, true);
6945 }
6946
6947 /**
6948 * VIEW - view_edition
6949 *
6950 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6951 *
6952 * @return null Si l'action est incorrecte
6953 */
6954 function view_edition() {
6955
6956 // Si l'instruction est finalisée
6957 if($this->getVal("om_final_instruction") == 't'
6958 && $this->getVal("om_final_instruction") != null) {
6959
6960 // Ouvre le document
6961 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6962 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6963 //
6964 header("Location: ".$lien);
6965 } else {
6966
6967 // Récupère la collectivite du dossier d'instruction
6968 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6969
6970 //
6971 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6972
6973 // Paramètre du PDF
6974 $params = array(
6975 "watermark" => true,
6976 "specific" => array(
6977 "mode" => "previsualisation",
6978 ),
6979 );
6980 // Si la rédaction libre est activée sur l'instruction
6981 if ($this->getVal("flag_edition_integrale") == 't') {
6982 $params["specific"]["corps"] = array(
6983 "mode" => "set",
6984 "value" => $this->getVal("corps_om_htmletatex"),
6985 );
6986 $params["specific"]["titre"] = array(
6987 "mode" => "set",
6988 "value" => $this->getVal("titre_om_htmletat"),
6989 );
6990 }
6991
6992 // Génération du PDF
6993 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6994 // Affichage du PDF
6995 $this->expose_pdf_output(
6996 $result['pdf_output'],
6997 $result['filename']
6998 );
6999 }
7000 }
7001
7002 /**
7003 * Récupère la collectivité du dossier d'instruction.
7004 *
7005 * @param string $dossier_instruction_id Identifiant du DI.
7006 *
7007 * @return integer
7008 */
7009 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
7010
7011 // Si l'identifiant n'est pas renseigné
7012 if ($dossier_instruction_id === null) {
7013 // Récupère la valeur
7014 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
7015 $dossier_instruction_id = $this->getVal('dossier');
7016 } elseif ($this->getParameter('idxformulaire') !== null
7017 && $this->getParameter('idxformulaire') !== '') {
7018 //
7019 $dossier_instruction_id = $this->getParameter('idxformulaire');
7020 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
7021 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
7022 //
7023 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
7024 }
7025 }
7026
7027 //
7028 $dossier_instruction = $this->f->get_inst__om_dbform(array(
7029 "obj" => "dossier_instruction",
7030 "idx" => $dossier_instruction_id,
7031 ));
7032
7033 //
7034 return $dossier_instruction->getVal('om_collectivite');
7035 }
7036
7037 /**
7038 * VIEW - view_bible
7039 *
7040 * Affiche la bible manuelle.
7041 *
7042 * @return void
7043 */
7044 function view_bible() {
7045 // Vérification de l'accessibilité sur l'élément
7046 $this->checkAccessibility();
7047
7048 /**
7049 * Affichage de la structure HTML
7050 */
7051 //
7052 if ($this->f->isAjaxRequest()) {
7053 //
7054 header("Content-type: text/html; charset=".HTTPCHARSET."");
7055 } else {
7056 //
7057 $this->f->setFlag("htmlonly");
7058 $this->f->display();
7059 }
7060 //
7061 $this->f->displayStartContent();
7062 //
7063 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
7064 $this->f->displayTitle();
7065
7066 /**
7067 *
7068 */
7069 //
7070 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
7071 $evenement = intval($evenement);
7072 //
7073 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7074 // Récupération du code du type de DA
7075 $code_da_type = '';
7076 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7077 $code_da_type = $matches[0];
7078 }
7079 //
7080 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7081
7082 // Récupération de la collectivité du dossier
7083 $dossier = $this->f->get_inst__om_dbform(array(
7084 "obj" => "dossier",
7085 "idx" => $idx,
7086 ));
7087
7088 $qres = $this->f->get_all_results_from_db_query(
7089 sprintf(
7090 'SELECT
7091 *,
7092 bible.libelle as bible_lib
7093 FROM
7094 %1$sbible
7095 LEFT OUTER JOIN %1$sdossier_autorisation_type
7096 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7097 LEFT JOIN %1$som_collectivite
7098 ON bible.om_collectivite = om_collectivite.om_collectivite
7099 WHERE
7100 (evenement = %2$d
7101 OR evenement IS NULL)
7102 AND (complement = %3$d
7103 OR complement IS NULL)
7104 AND (bible.dossier_autorisation_type IS NULL
7105 OR dossier_autorisation_type.code = \'%4$s\')
7106 AND (om_collectivite.niveau = \'2\'
7107 OR bible.om_collectivite = %5$d)
7108 ORDER BY
7109 bible_lib ASC',
7110 DB_PREFIXE,
7111 intval($evenement),
7112 intval($complement),
7113 $this->f->db->escapeSimple($code_da_type),
7114 intval($dossier->getVal("om_collectivite"))
7115 ),
7116 array(
7117 'origin' => __METHOD__
7118 )
7119 );
7120 //
7121 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7122 //
7123 if ($qres['row_count'] > 0) {
7124 //
7125 echo "\t<table id='tab-bible' width='100%'>\n";
7126 //
7127 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7128 echo "<th>"._("Choisir")."</th>";
7129 echo "<th>"._("Libelle")."</th>";
7130 echo "</tr>\n";
7131 //
7132 $i = 0;
7133 //
7134 foreach ($qres['result'] as $row) {
7135 //
7136 echo "\t\t<tr";
7137 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7138 echo ">";
7139 //
7140 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7141 // XXX utilisation de l'attribut titre pour afficher une infobulle
7142 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7143 //
7144 echo "</tr>\n";
7145 //
7146 $i++;
7147 }
7148 echo "\t</table>\n";
7149 //
7150 echo "<div class=\"formControls\">\n";
7151 $this->f->layout->display_form_button(array(
7152 "value" => _("Valider"),
7153 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7154 ));
7155 $this->f->displayLinkJsCloseWindow();
7156 echo "</div>\n";
7157
7158 } else {
7159 //
7160 $message_class = "error";
7161 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7162 $this->f->displayMessage($message_class, $message);
7163 //
7164 echo "<div class=\"formControls\">\n";
7165 $this->f->displayLinkJsCloseWindow();
7166 echo "</div>\n";
7167 }
7168 //
7169 echo "</form>\n";
7170
7171 /**
7172 * Affichage de la structure HTML
7173 */
7174 //
7175 $this->f->displayEndContent();
7176 }
7177
7178 /**
7179 * VIEW - view_bible_auto
7180 *
7181 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7182 *
7183 * @return void
7184 */
7185 function view_bible_auto() {
7186 // Vérification de l'accessibilité sur l'élément
7187 $this->checkAccessibility();
7188 //
7189 $this->f->disableLog();
7190
7191 $formatDate="AAAA-MM-JJ";
7192
7193 // Récupération des paramètres
7194 $idx = $this->f->get_submitted_get_value('idx');
7195 $evenement = $this->f->get_submitted_get_value('ev');
7196
7197 // Initialisation de la variable de retour
7198 $retour['complement_om_html'] = '';
7199 $retour['complement2_om_html'] = '';
7200 $retour['complement3_om_html'] = '';
7201 $retour['complement4_om_html'] = '';
7202
7203 // Vérification d'une consultation liée à l'événement
7204 $instEvenement = $this->f->get_inst__om_dbform(array(
7205 "obj" => "evenement",
7206 "idx" => $evenement,
7207 ));
7208
7209 // Si consultation liée, récupération du retour d'avis
7210 if($instEvenement->getVal('consultation') == 'Oui'){
7211
7212 $qres = $this->f->get_all_results_from_db_query(
7213 sprintf(
7214 'SELECT
7215 date_retour,
7216 avis_consultation.libelle as avis_consultation,
7217 COALESCE(service.libelle, tiers_consulte.libelle) as service
7218 FROM
7219 %1$sconsultation
7220 LEFT JOIN %1$stiers_consulte
7221 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7222 LEFT JOIN %1$sservice
7223 ON consultation.service = service.service
7224 LEFT JOIN %1$savis_consultation
7225 ON consultation.avis_consultation = avis_consultation.avis_consultation
7226 WHERE
7227 dossier = \'%2$s\'
7228 AND consultation.visible',
7229 DB_PREFIXE,
7230 $this->f->db->escapeSimple($idx)
7231 ),
7232 array(
7233 'origin' => __METHOD__
7234 )
7235 );
7236 // Récupération des consultations
7237 foreach ($qres['result'] as $row) {
7238 $correct=false;
7239 // date retour
7240 if ($row['date_retour']<>""){
7241 if ($formatDate=="AAAA-MM-JJ"){
7242 $date = explode("-", $row['date_retour']);
7243 // controle de date
7244 if (count($date) == 3 and
7245 checkdate($date[1], $date[2], $date[0])) {
7246 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7247 $correct=true;
7248 }else{
7249 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7250 $correct=false;
7251 }
7252 }
7253 }
7254 //
7255 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7256 if($correct == true){
7257 $temp=$temp." du ".$date_retour_f;
7258 }
7259 // Concaténation des retours d'avis de consultation
7260 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7261 } // while
7262
7263 } // consultation
7264 // Récupération des bibles automatiques pour le champ complement_om_html
7265 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7266 // Récupération des bibles automatiques pour le champ complement2_om_html
7267 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7268 // Récupération des bibles automatiques pour le champ complement3_om_html
7269 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7270 // Récupération des bibles automatiques pour le champ complement4_om_html
7271 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7272
7273
7274
7275 echo json_encode($retour);
7276 }
7277
7278 /**
7279 * VIEW - view_pdf_temp
7280 *
7281 * @return void
7282 */
7283 function view_pdf_temp() {
7284 $this->checkAccessibility();
7285 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7286 $this->f->set_submitted_value();
7287 $merge_fields = array();
7288 //
7289 if (array_key_exists('c1', $_POST) === true) {
7290 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7291 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7292 }
7293 if (array_key_exists('c2', $_POST) === true) {
7294 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7295 }
7296 if (array_key_exists('c3', $_POST) === true) {
7297 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7298 }
7299 if (array_key_exists('c4', $_POST) === true) {
7300 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7301 }
7302 $params = array(
7303 "watermark" => true,
7304 "specific" => array(
7305 "merge_fields" => $merge_fields,
7306 ),
7307 );
7308 //
7309 if (array_key_exists('corps', $_POST) === true) {
7310 $params["specific"]["corps"] = array(
7311 "mode" => "set",
7312 "value" => $_POST['corps'],
7313 );
7314 }
7315 if (array_key_exists('titre', $_POST) === true) {
7316 $params["specific"]["titre"] = array(
7317 "mode" => "set",
7318 "value" => $_POST['titre'],
7319 );
7320 }
7321 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7322 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7323 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7324 $retour = array(
7325 'base' => base64_encode($result['pdf_output']),
7326 );
7327 echo json_encode($retour);
7328 }
7329
7330 /**
7331 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7332 * PDF sans prise en compte de la valeur des compléments et le retourne en
7333 * base 64.
7334 *
7335 * @return string Rendu PDF converti en base 64.
7336 */
7337 function init_pdf_temp() {
7338 $params = array(
7339 "watermark" => true,
7340 );
7341 // Si la rédaction libre est activée sur l'instruction
7342 if ($this->getVal("flag_edition_integrale") == 't') {
7343 $params["specific"]["corps"] = array(
7344 "mode" => "set",
7345 "value" => $this->getVal("corps_om_htmletatex"),
7346 );
7347 $params["specific"]["titre"] = array(
7348 "mode" => "set",
7349 "value" => $this->getVal("titre_om_htmletat"),
7350 );
7351 }
7352 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7353 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7354 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7355
7356 return base64_encode($result['pdf_output']);
7357 }
7358
7359 /**
7360 * Récupération des éléments de bible.
7361 *
7362 * @param integer $event id de l'événement
7363 * @param string $idx id du dossier
7364 * @param integer $compnb numéro du champ complement
7365 * @param string $type types possibles : automatique ou precharge
7366 *
7367 * @return string Chaîne de texte à insérer dans le champ complement
7368 */
7369 function getBible($event, $idx, $compnb, $type = 'automatique') {
7370 // Récupération de la collectivité du dossier
7371 $dossier = $this->f->get_inst__om_dbform(array(
7372 "obj" => "dossier",
7373 "idx" => $idx,
7374 ));
7375 // Récupération du code du type de DA
7376 $code_da_type = '';
7377 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7378 $code_da_type = $matches[0];
7379 }
7380
7381 // Prépare le filtre de la requête selon le type de remplissage voulu
7382 $sql_filter_type = '';
7383 if ($type === 'automatique') {
7384 $sql_filter_type = "AND automatique = 'Oui'";
7385 } elseif ($type === 'precharge') {
7386 $sql_filter_type = "AND precharge IS TRUE";
7387 }
7388
7389 $qres = $this->f->get_all_results_from_db_query(
7390 sprintf(
7391 'SELECT
7392 *
7393 FROM
7394 %1$sbible
7395 LEFT OUTER JOIN %1$sdossier_autorisation_type
7396 ON bible.dossier_autorisation_type =
7397 dossier_autorisation_type.dossier_autorisation_type
7398 LEFT JOIN %1$som_collectivite
7399 ON bible.om_collectivite = om_collectivite.om_collectivite
7400 WHERE
7401 (evenement = %2$d
7402 OR evenement IS NULL)
7403 AND (complement = %3$d
7404 OR complement IS NULL)
7405 AND (dossier_autorisation_type.code = \'%4$s\'
7406 OR bible.dossier_autorisation_type IS NULL)
7407 AND (om_collectivite.niveau = \'2\'
7408 OR bible.om_collectivite = %5$d)
7409 %6$s',
7410 DB_PREFIXE,
7411 intval($event),
7412 intval($compnb),
7413 $this->f->db->escapeSimple($code_da_type),
7414 intval($dossier->getVal("om_collectivite")),
7415 $sql_filter_type
7416 ),
7417 array(
7418 "origin" => __METHOD__
7419 )
7420 );
7421 $temp = "";
7422 foreach ($qres['result'] as $row) {
7423 // Remplacement des retours à la ligne par des br
7424 $temp .= preg_replace(
7425 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7426 );
7427 // Ajout d'un saut de ligne entre chaque bible.
7428 $temp .= '<br/>';
7429 } // fin while
7430 return $temp;
7431 }
7432
7433 /**
7434 * VIEW - view_suivi_bordereaux.
7435 *
7436 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7437 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7438 * collectivité des dossiers affichés.
7439 *
7440 * @return void
7441 */
7442 function view_suivi_bordereaux() {
7443 // Vérification de l'accessibilité sur l'élément
7444 $this->checkAccessibility();
7445
7446 /**
7447 * Validation du formulaire
7448 */
7449 // Si le formulaire a été validé
7450 if ($this->f->get_submitted_post_value("validation") !== null) {
7451 // Si un bordereau à été sélectionné
7452 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7453 // Si aucun bordereau n'a été sélectionné
7454 $message_class = "error";
7455 $message = _("Veuillez selectionner un bordereau.");
7456 }
7457 // Sinon si les dates ne sont pas valide
7458 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7459 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7460 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7461 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7462 // Si aucune date n'a été saisie
7463 $message_class = "error";
7464 $message = _("Veuillez saisir une date valide.");
7465 }
7466 // Sinon si les dates ne sont pas valides
7467 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7468 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7469 // Si aucune date n'a été saisie
7470 $message_class = "error";
7471 $message = _("Erreur de parametrage. Contactez votre administrateur.");
7472 }
7473 // Affiche le message de validation
7474 else {
7475 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7476 $etat = $this->f->get_inst__om_dbform(array(
7477 "obj" => "om_etat",
7478 "idx" => $this->f->get_submitted_post_value("bordereau")
7479 ));
7480 $qres = $this->f->get_one_result_from_db_query(
7481 sprintf(
7482 'SELECT
7483 om_etat.libelle
7484 FROM
7485 %som_etat
7486 WHERE
7487 om_etat.id = \'%s\'',
7488 DB_PREFIXE,
7489 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7490 ),
7491 array(
7492 "origin" => __METHOD__,
7493 )
7494 );
7495
7496 //
7497 $message_class = "valid";
7498 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7499 $message .= " : <br/><br/>";
7500 $message .= "<a class='om-prev-icon pdf-16'";
7501 $message .= " title=\""._("Bordereau")."\"";
7502 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7503 $message .= "&action=220";
7504 $message .= "&idx=0";
7505 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7506 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7507 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7508 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7509 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7510 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7511 }
7512 $message .= "'"." target='_blank'>";
7513 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7514 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7515 $message .= "</a>";
7516 }
7517 }
7518
7519 /**
7520 * Affichage des messages et du formulaire
7521 */
7522 // Affichage du message de validation ou d'erreur
7523 if (isset($message) && isset($message_class) && $message != "") {
7524 $this->f->displayMessage($message_class, $message);
7525 }
7526 // Ouverture du formulaire
7527 printf("\t<form");
7528 printf(" method=\"post\"");
7529 printf(" id=\"suivi_bordereaux_form\"");
7530 printf(" action=\"\"");
7531 printf(">\n");
7532 // Paramétrage des champs du formulaire
7533 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7534 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7535 // collectivité dans le formulaire
7536 if ($_SESSION["niveau"] == 2) {
7537 array_push($champs, "om_collectivite");
7538 }
7539 // Création d'un nouvel objet de type formulaire
7540 $form = $this->f->get_inst__om_formulaire(array(
7541 "validation" => 0,
7542 "maj" => 0,
7543 "champs" => $champs,
7544 ));
7545 // Paramétrage du champ date_bordereau_debut
7546 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7547 $form->setType("date_bordereau_debut", "date");
7548 $form->setTaille("date_bordereau_debut", 12);
7549 $form->setMax("date_bordereau_debut", 12);
7550 $form->setRequired("date_bordereau_debut");
7551 $form->setOnchange("date_bordereau_debut", "fdate(this)");
7552 $form->setVal("date_bordereau_debut", date("d/m/Y"));
7553 // Paramétrage du champ date_bordereau_fin
7554 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7555 $form->setType("date_bordereau_fin", "date");
7556 $form->setTaille("date_bordereau_fin", 12);
7557 $form->setMax("date_bordereau_fin", 12);
7558 $form->setRequired("date_bordereau_fin");
7559 $form->setOnchange("date_bordereau_fin", "fdate(this)");
7560 $form->setVal("date_bordereau_fin", date("d/m/Y"));
7561 // Paramétrage du champ bordereau
7562 $form->setLib("bordereau", _("bordereau"));
7563 $form->setType("bordereau", "select");
7564 $form->setRequired("bordereau");
7565 // Valeurs des champs
7566 if ($this->f->get_submitted_post_value("validation") !== null) {
7567 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7568 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7569 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7570 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7571 }
7572 // Données du select - On récupère ici la liste de tous les états disponibles
7573 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7574 // 'bordereau_'
7575 $qres = $this->f->get_all_results_from_db_query(
7576 sprintf(
7577 'SELECT
7578 om_etat.id,
7579 om_etat.libelle
7580 FROM
7581 %1$som_etat
7582 WHERE
7583 om_etat.id LIKE \'bordereau_%%\'
7584 ORDER BY
7585 om_etat.id',
7586 DB_PREFIXE
7587 ),
7588 array(
7589 "origin" => __METHOD__
7590 )
7591 );
7592 // Données du select
7593 $contenu = array(
7594 0 => array("", ),
7595 1 => array(_("choisir bordereau")),
7596 );
7597 foreach ($qres['result'] as $row) {
7598 $contenu[0][] = $row['id'];
7599 $contenu[1][] = $row['libelle'];
7600 }
7601 $form->setSelect("bordereau", $contenu);
7602 //
7603 if ($_SESSION["niveau"] == 2) {
7604 $form->setLib("om_collectivite", _("collectivite"));
7605 $form->setType("om_collectivite", "select");
7606
7607 // Données du select - On récupère ici la liste de tous toutes les collectivités
7608 // de niveau 1
7609 $qres = $this->f->get_all_results_from_db_query(
7610 sprintf(
7611 'SELECT
7612 om_collectivite,
7613 libelle
7614 FROM
7615 %1$som_collectivite
7616 WHERE
7617 niveau = \'1\'
7618 ORDER BY
7619 libelle',
7620 DB_PREFIXE
7621 ),
7622 array(
7623 "origin" => __METHOD__
7624 )
7625 );
7626 // La valeur par défaut du select est Toutes
7627 $list_collectivites = array(
7628 0 => array("", ),
7629 1 => array(_("toutes"))
7630 );
7631
7632 $id_colls = "";
7633 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7634 // par des virgules, pour un traitement plus facile dans la requête de sous-état
7635 foreach ($qres['result'] as $row) {
7636 if ($id_colls != "") {
7637 $id_colls .= ",";
7638 }
7639 $id_colls .= $row['om_collectivite'];
7640 $list_collectivites[0][] = $row['om_collectivite'];
7641 $list_collectivites[1][] = $row['libelle'];
7642 }
7643 // On affecte la liste d'identifiants à l'option Toutes
7644 $list_collectivites[0][0] = $id_colls ;
7645 $form->setSelect("om_collectivite", $list_collectivites);
7646 }
7647 // Affichage du formulaire
7648 $form->entete();
7649 $form->afficher($champs, 0, false, false);
7650 $form->enpied();
7651 // Affichage du bouton
7652 printf("\t<div class=\"formControls\">\n");
7653 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7654 printf("\t</div>\n");
7655 // Fermeture du formulaire
7656 printf("\t</form>\n");
7657 }
7658
7659
7660 /**
7661 * VIEW - view_generate_suivi_bordereaux.
7662 *
7663 * Génère et affiche les bordereaux de suivi.
7664 *
7665 * @return [void]
7666 */
7667 function view_generate_suivi_bordereaux() {
7668 // Vérification de l'accessibilité sur l'élément
7669 $this->checkAccessibility();
7670 // Récupération du type de bordereau
7671 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7672 // Génération du PDF
7673 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7674 // Affichage du PDF
7675 $this->expose_pdf_output(
7676 $result['pdf_output'],
7677 $result['filename']
7678 );
7679 }
7680
7681
7682 /**
7683 * VIEW - view_suivi_envoi_lettre_rar.
7684 *
7685 * Vue pour imprimer les AR.
7686 *
7687 * @return void
7688 */
7689 function view_suivi_envoi_lettre_rar() {
7690 // Vérification de l'accessibilité sur l'élément
7691 $this->checkAccessibility();
7692
7693 //
7694 if ($this->f->get_submitted_post_value("date") !== null) {
7695 $date = $this->f->get_submitted_post_value("date");
7696 } else {
7697 $date = "";
7698 }
7699 //
7700 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7701 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7702 } else {
7703 $liste_code_barres_instruction = "";
7704 }
7705
7706 // Compteur du nombre de page générées
7707 $nbLettres = 0;
7708 // Liste d'id des instructions
7709 $id4Gen = array();
7710 //
7711 $error = "";
7712
7713 // Initialisation du tableau qui va contenir les DI pour lister les liens
7714 $dossierTab = array();
7715 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7716 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7717 $hasHidden = true;
7718 // S'il ne peut pas les consulter il aura des dossiers caché
7719 if ($isAccredited === true) {
7720 $hasHidden = false;
7721 }
7722
7723 /**
7724 * Validation du formulaire
7725 */
7726 // Si le formulaire a été validé
7727 if ($this->f->get_submitted_post_value('validation') !== null) {
7728 //
7729 if (empty($date) || empty($liste_code_barres_instruction)) {
7730 //
7731 $message_class = "error";
7732 $message = _("Tous les champs doivent etre remplis.");
7733 } else {
7734 // Création d'un tableau d'instruction
7735 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7736 //
7737 foreach ($liste as $code_barres) {
7738 // On enlève les éventuels espaces saisis
7739 $code_barres = trim($code_barres);
7740 // Vérification de l'existence de l'instruction
7741 if ($code_barres != "") {
7742 // Si la valeur transmise est numérique
7743 if (is_numeric($code_barres)) {
7744 //
7745 $sql = "SELECT count(*)
7746 FROM ".DB_PREFIXE."instruction
7747 INNER JOIN ".DB_PREFIXE."dossier
7748 ON dossier.dossier=instruction.dossier
7749 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7750 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7751 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7752 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7753 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7754 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7755 INNER JOIN ".DB_PREFIXE."groupe
7756 ON dossier_autorisation_type.groupe = groupe.groupe
7757 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7758
7759 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7760 $group_clause = array();
7761 foreach ($_SESSION["groupe"] as $key => $value) {
7762 $group_clause[$key] = "(groupe.code = '".$key."'";
7763 if($value["confidentiel"] !== true) {
7764 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7765 }
7766 $group_clause[$key] .= ")";
7767 }
7768 $conditions = implode(" OR ", $group_clause);
7769 $sql .= " AND (" . $conditions . ")";
7770
7771 $qres = $this->f->get_one_result_from_db_query(
7772 $sql,
7773 array(
7774 "origin" => __METHOD__,
7775 )
7776 );
7777
7778 if ($qres['result'] == "1") {
7779 // Récupération de la date d'envoi de l'instruction bippé
7780 $qres = $this->f->get_all_results_from_db_query(
7781 sprintf(
7782 'SELECT
7783 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7784 instruction
7785 FROM
7786 %1$sinstruction
7787 WHERE
7788 code_barres = \'%2$s\'',
7789 DB_PREFIXE,
7790 $this->f->db->escapeSimple($code_barres)
7791 ),
7792 array(
7793 'origin' => __METHOD__
7794 )
7795 );
7796 $row = array_shift($qres['result']);
7797 // Si pas de date ou correspond à la date du formulaire on
7798 // effectue le traitement
7799 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7800 $instr = $this->f->get_inst__om_dbform(array(
7801 "obj" => "instruction",
7802 "idx" => $row['instruction'],
7803 ));
7804 $valF = array();
7805 foreach($instr->champs as $id => $champ) {
7806 $valF[$champ] = $instr->val[$id];
7807 }
7808
7809 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7810 if ($isAccredited === true
7811 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7812 $dossier = $this->f->get_inst__om_dbform(array(
7813 "obj" => "dossier",
7814 "idx" => $instr->getVal("dossier"),
7815 ));
7816 if ($dossier->is_user_from_allowed_collectivite()){
7817 $dossierTab[$instr->getVal("dossier")] = $dossier;
7818 } else {
7819 $hasHidden = true;
7820 }
7821 }
7822
7823 $valF['date_evenement']=
7824 $instr->dateDBToForm($valF['date_evenement']);
7825 $valF['archive_date_complet']=
7826 $instr->dateDBToForm($valF['archive_date_complet']);
7827 $valF['archive_date_rejet']=
7828 $instr->dateDBToForm($valF['archive_date_rejet']);
7829 $valF['archive_date_limite']=
7830 $instr->dateDBToForm($valF['archive_date_limite']);
7831 $valF['archive_date_notification_delai']=
7832 $instr->dateDBToForm($valF['archive_date_notification_delai']);
7833 $valF['archive_date_decision']=
7834 $instr->dateDBToForm($valF['archive_date_decision']);
7835 $valF['archive_date_validite']=
7836 $instr->dateDBToForm($valF['archive_date_validite']);
7837 $valF['archive_date_achevement']=
7838 $instr->dateDBToForm($valF['archive_date_achevement']);
7839 $valF['archive_date_chantier']=
7840 $instr->dateDBToForm($valF['archive_date_chantier']);
7841 $valF['archive_date_conformite']=
7842 $instr->dateDBToForm($valF['archive_date_conformite']);
7843 $valF['archive_date_dernier_depot']=
7844 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7845 $valF['archive_date_limite_incompletude']=
7846 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7847 $valF['date_finalisation_courrier']=
7848 $instr->dateDBToForm($valF['date_finalisation_courrier']);
7849 $valF['date_envoi_signature']=
7850 $instr->dateDBToForm($valF['date_envoi_signature']);
7851 $valF['date_retour_signature']=
7852 $instr->dateDBToForm($valF['date_retour_signature']);
7853 $valF['date_envoi_rar']=
7854 $instr->dateDBToForm($valF['date_envoi_rar']);
7855 $valF['date_retour_rar']=
7856 $instr->dateDBToForm($valF['date_retour_rar']);
7857 $valF['date_envoi_controle_legalite']=
7858 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7859 $valF['date_retour_controle_legalite']=
7860 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7861 $valF['date_envoi_rar'] = $date;
7862
7863 // Vérification de la finalisation du document
7864 // correspondant au code barres
7865 if($instr->getVal("om_final_instruction") === 't') {
7866 $instr->setParameter('maj', 1);
7867 $instr->class_actions[1]["identifier"] =
7868 "envoi lettre RAR (depuis le menu suivi des pièces)";
7869 if ($instr->modifier($valF) == true) {
7870 $id4Gen[] = $code_barres;
7871 $nbLettres ++;
7872 } else {
7873 //
7874 if ($error != "") {
7875 $error .= "<br/>";
7876 }
7877 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7878 $code_barres);
7879 $error .= " ";
7880 $error .= _("Veuillez contacter votre administrateur.");
7881 }
7882 } else {
7883 //
7884 if ($error != "") {
7885 $error .= "<br/>";
7886 }
7887 $error .= sprintf(_("Le document correspondant au
7888 code barres %s n'est pas finalise,
7889 le bordereau ne sera pas genere."),
7890 $code_barres);
7891 }
7892
7893 } else {
7894 //
7895 if ($error != "") {
7896 $error .= "<br/>";
7897 }
7898 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7899 }
7900 } else {
7901 //
7902 if ($error != "") {
7903 $error .= "<br/>";
7904 }
7905 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7906 }
7907 } else {
7908 //
7909 if ($error != "") {
7910 $error .= "<br/>";
7911 }
7912 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7913 }
7914 }
7915 }
7916 }
7917 }
7918
7919 /**
7920 * Affichage des messages et du formulaire
7921 */
7922 // Affichage du message de validation ou d'erreur
7923 if (isset($message) && isset($message_class) && $message != "") {
7924 $this->f->displayMessage($message_class, $message);
7925 }
7926 // Affichage du message d'erreur
7927 if(!empty($error)) {
7928 $this->f->displayMessage("error", $error);
7929 }
7930 // Affichage du message de validation de la saisie
7931 if ($nbLettres > 0) {
7932 //
7933 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7934 echo "\n<p>";
7935 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7936 echo "\n<span class=\"text\">";
7937 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7938 echo " : \n<br/><br/>";
7939 echo "\n<a class='om-prev-icon pdf-16'";
7940 echo "\n title=\""._("imprimer les AR")."\"";
7941 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7942 echo "\n target='_blank'>";
7943 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7944 echo "\n</a>";
7945 echo "\n</span>";
7946 echo "\n</p>";
7947 echo "\n<br/>\n";
7948 if ($isAccredited === true) {
7949 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7950 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7951 echo _('Dossiers concernés par ce traitement');
7952 echo "\n</legend>";
7953 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7954
7955 if ($hasHidden === true) {
7956 echo "\n<br/>";
7957 echo "\n<p>";
7958 echo "\n<span class='text'>";
7959 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.");
7960 echo "</span>";
7961 echo "\n</p>";
7962 echo "\n<br/>";
7963 }
7964 foreach ($dossierTab as $dossier) {
7965
7966 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7967 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7968 $code_datd = $inst_datd->getVal('code');
7969
7970 $obj = "dossier_instruction";
7971 if ($code_datd === 'REC' OR $code_datd === 'REG') {
7972 $obj = "dossier_contentieux_tous_recours";
7973 }
7974 if ($code_datd === 'IN') {
7975 $obj = "dossier_contentieux_toutes_infractions";
7976 }
7977
7978 echo "\n<div class=\"bloc group\">";
7979 echo "\n<div class=\"field field-type-text\">";
7980
7981 echo "\n<p>";
7982 echo "\n<span class='text'>";
7983 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7984 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7985 echo $dossier->getVal("dossier");
7986 echo "\">";
7987 echo "\n</a>";
7988
7989 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7990 echo " href=\"".OM_ROUTE_FORM."&obj=";
7991 echo $obj;
7992 echo "&action=3&idx=";
7993 echo $dossier->getVal("dossier");
7994 echo "\">";
7995 echo $dossier->getVal("dossier_libelle");
7996 echo "\n</a>";
7997 echo "\n</span>";
7998 echo "\n</p>";
7999
8000 echo "\n</div>";
8001 echo "\n</div>";
8002 }
8003 echo "\n</div>";
8004 echo "\n</fieldset>";
8005 }
8006 echo "\n</div>";
8007 echo "\n</div>";
8008 }
8009 // Ouverture du formulaire
8010 echo "\t<form";
8011 echo " method=\"post\"";
8012 echo " id=\"suivi_envoi_lettre_rar_form\"";
8013 echo " action=\"\"";
8014 echo ">\n";
8015 // Paramétrage des champs du formulaire
8016 $champs = array("date", "liste_code_barres_instruction");
8017 // Création d'un nouvel objet de type formulaire
8018 $form = $this->f->get_inst__om_formulaire(array(
8019 "validation" => 0,
8020 "maj" => 0,
8021 "champs" => $champs,
8022 ));
8023 // Paramétrage du champ date du formulaire
8024 $form->setLib("date", _("Date")."* :");
8025 $form->setType("date", "date");
8026 $form->setOnchange("date", "fdate(this)");
8027 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
8028 $form->setTaille("date", 10);
8029 $form->setMax("date", 10);
8030 // Paramétrage du champ liste_code_barres_instruction du formulaire
8031 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
8032 $form->setType("liste_code_barres_instruction", "textarea");
8033 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
8034 $form->setTaille("liste_code_barres_instruction", 20);
8035 $form->setMax("liste_code_barres_instruction", 20);
8036 // Affichage du formulaire
8037 $form->entete();
8038 $form->afficher($champs, 0, false, false);
8039 $form->enpied();
8040 // Affichage du bouton
8041 echo "\t<div class=\"formControls\">\n";
8042 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8043 echo "\t</div>\n";
8044 // Fermeture du formulaire
8045 echo "\t</form>\n";
8046 }
8047
8048 /**
8049 * VIEW - view_suivi_mise_a_jour_des_dates.
8050 *
8051 * Vu pour mettre à jour les dates de suivi de l'instruction.
8052 *
8053 * @return void
8054 */
8055 function view_suivi_mise_a_jour_des_dates() {
8056 // Vérification de l'accessibilité sur l'élément
8057 $this->checkAccessibility();
8058
8059 // Récupération des valeur passées en POST ou GET
8060 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
8061 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
8062 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
8063 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
8064 } else {
8065 $type_mise_a_jour = "";
8066 }
8067 if($this->f->get_submitted_post_value('date') !== null) {
8068 $date = $this->f->get_submitted_post_value('date');
8069 } elseif($this->f->get_submitted_get_value('date') !== null) {
8070 $date = $this->f->get_submitted_get_value('date');
8071 } else {
8072 $date = "";
8073 }
8074 if($this->f->get_submitted_post_value('code_barres') !== null) {
8075 $code_barres = $this->f->get_submitted_post_value('code_barres');
8076 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
8077 $code_barres = $this->f->get_submitted_get_value('code_barres');
8078 } else {
8079 $code_barres = "";
8080 }
8081 // Booléen permettant de définir si un enregistrement à eu lieu
8082 $correct = false;
8083 // Booléen permettant de définir si les dates peuvent êtres enregistrées
8084 $date_error = false;
8085 // Champs date à mettre à jour
8086 $liste_champs=array();
8087
8088 // Si le formulaire a été validé
8089 if ($this->f->get_submitted_post_value('validation') !== null) {
8090 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8091
8092 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8093 $group_clause = array();
8094 foreach ($_SESSION["groupe"] as $key => $value) {
8095 $group_clause[$key] = "(groupe.code = '".$key."'";
8096 if($value["confidentiel"] !== true) {
8097 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8098 }
8099 $group_clause[$key] .= ")";
8100 }
8101 $conditions = implode(" OR ", $group_clause);
8102 $groupFilter = " AND (" . $conditions . ")";
8103
8104 $qres = $this->f->get_all_results_from_db_query(
8105 sprintf(
8106 'SELECT
8107 instruction
8108 FROM
8109 %1$sinstruction
8110 INNER JOIN %1$sdossier
8111 ON dossier.dossier = instruction.dossier
8112 INNER JOIN %1$sdossier_instruction_type
8113 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8114 INNER JOIN %1$sdossier_autorisation_type_detaille
8115 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8116 INNER JOIN %1$sdossier_autorisation_type
8117 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8118 INNER JOIN %1$sgroupe
8119 ON dossier_autorisation_type.groupe = groupe.groupe
8120 WHERE
8121 code_barres = \'%2$s\'
8122 %3$s',
8123 DB_PREFIXE,
8124 $this->f->db->escapeSimple($code_barres),
8125 $groupFilter
8126 ),
8127 array(
8128 'origin' => __METHOD__
8129 )
8130 );
8131 if($qres['row_count'] === 1) {
8132 $liste_champs = explode(";", $type_mise_a_jour);
8133 $row = array_shift($qres['result']);
8134 $instr = $this->f->get_inst__om_dbform(array(
8135 "obj" => "instruction",
8136 "idx" => $row['instruction'],
8137 ));
8138 // Mise à jour des dates après l'écran de verification
8139 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8140 $valF = array();
8141 foreach($instr->champs as $id => $champ) {
8142 $valF[$champ] = $instr->val[$id];
8143 }
8144 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8145 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8146 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8147 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8148 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8149 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8150 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8151 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8152 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8153 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8154 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8155 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8156 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8157 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8158 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8159 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8160 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8161 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8162 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8163 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8164 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8165 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8166 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8167 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8168 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8169 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8170
8171 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8172 $valF[$maj_date]=$date;
8173 }
8174
8175 // Vérification de la finalisation du document
8176 // correspondant au code barres
8177 if($valF["om_final_instruction"] === 't' or
8178 $valF["lettretype"] == '') {
8179 $code_barres = "";
8180
8181 //Désactivation de l'autocommit
8182 $this->f->db->autoCommit(false);
8183
8184 //On modifie les valeurs de l'instruction
8185 $instr->setParameter('maj', 170);
8186 $instr->class_actions[170]["identifier"] =
8187 "mise à jour des dates (depuis le menu suivi des pièces)";
8188 $retour = $instr->modifier($valF);
8189
8190 //Si une erreur s'est produite, on défait les modifications
8191 //qui ont été faites
8192 if (!$retour){
8193 $instr->undoValidation();
8194 }
8195 //Sinon, on valide en base de données les modifications
8196 else {
8197 $this->f->db->commit();
8198 }
8199
8200 // Variable correct retourné depuis la classe instruction
8201 $correct = $instr->correct;
8202
8203 // Si la modification sur l'instruction a échoué
8204 if ($correct === false) {
8205
8206 // Message d'erreur de la classe instruction
8207 $error = $instr->msg;
8208 }
8209
8210 } else {
8211 // Indique que le traitement est en erreur
8212 $correct = false;
8213 // Message d'erreur
8214 $error = sprintf(_("Le document n'est pas finalise."),
8215 "<span class='bold'>".$code_barres."</span>");
8216 }
8217 } else {
8218 // Récupération des infos du dossier
8219 $qres = $this->f->get_all_results_from_db_query(
8220 sprintf(
8221 'SELECT
8222 dossier.dossier_libelle,
8223 evenement.libelle as evenement,
8224 autorite_competente.code as autorite_competente_code,
8225 autorite_competente.libelle as autorite_competente,
8226 evenement.type as evenement_type,
8227 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8228 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8229 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8230 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8231 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8232 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8233 FROM
8234 %1$sinstruction
8235 INNER JOIN %1$sdossier
8236 ON dossier.dossier=instruction.dossier
8237 LEFT JOIN %1$sautorite_competente
8238 ON dossier.autorite_competente=autorite_competente.autorite_competente
8239 INNER JOIN %1$sevenement
8240 ON instruction.evenement=evenement.evenement
8241 WHERE
8242 code_barres = \'%2$s\'',
8243 DB_PREFIXE,
8244 $this->f->db->escapeSimple($code_barres)
8245 ),
8246 array(
8247 "origin" => __METHOD__
8248 )
8249 );
8250 $infos = array_shift($qres['result']);
8251
8252 // Vérification de la non modification des dates de suivi
8253 foreach(explode(";", $type_mise_a_jour) as $champ) {
8254 if ($champ === 'date_envoi_controle_legalite') {
8255 if ($instr->is_sent_to_cl() === true) {
8256 $error = __("Les dates de suivis ne peuvent etre modifiees");
8257 $date_error = true;
8258 break;
8259 }
8260 }
8261 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8262 $error = _("Les dates de suivis ne peuvent etre modifiees");
8263 $date_error = true;
8264 break;
8265 }
8266 }
8267 }
8268 } else {
8269 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8270 }
8271
8272 } else {
8273 $error = _("Tous les champs doivent etre remplis.");
8274 }
8275 }
8276
8277 /**
8278 * Affichage des messages et du formulaire
8279 */
8280 // Affichage du message de validation ou d'erreur
8281 if (isset($message) && isset($message_class) && $message != "") {
8282 $this->f->displayMessage($message_class, $message);
8283 }
8284 // Affichage du message d'erreur
8285 if(!empty($error)) {
8286 $this->f->displayMessage("error", $error);
8287 }
8288
8289 // Affichage du message de validation de la saisie
8290 if($correct === true) {
8291 $this->f->displayMessage("ok", _("Saisie enregistree"));
8292 }
8293 // Ouverture du formulaire
8294 echo "\t<form";
8295 echo " method=\"post\"";
8296 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8297 echo " action=\"\"";
8298 echo ">\n";
8299 // Paramétrage des champs du formulaire
8300 if(isset($infos)) {
8301 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8302 , "autorite_competente", "date_envoi_signature",
8303 "date_retour_signature", "date_envoi_controle_legalite",
8304 "date_retour_controle_legalite", "date_envoi_rar",
8305 "date_retour_rar", "is_valid");
8306 } else {
8307 $champs = array("type_mise_a_jour", "date", "code_barres");
8308 }
8309 // Création d'un nouvel objet de type formulaire
8310 $form = $this->f->get_inst__om_formulaire(array(
8311 "validation" => 0,
8312 "maj" => 0,
8313 "champs" => $champs,
8314 ));
8315 // Paramétrage des champs du formulaire
8316 // Parametrage du champ type_mise_a_jour
8317 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8318 if(isset($infos)) {
8319 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8320
8321 } else {
8322 $form->setType("type_mise_a_jour", "select");
8323
8324 }
8325 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8326 $contenu = array();
8327
8328 $contenu[0][0] = "date_envoi_signature";
8329 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8330
8331 $contenu[0][1] = "date_retour_signature";
8332 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8333
8334 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8335 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8336
8337 $contenu[0][3] = "date_envoi_controle_legalite";
8338 $contenu[1][3] = _("date d'envoi au controle de legalite");
8339
8340 $contenu[0][4] = "date_retour_controle_legalite";
8341 $contenu[1][4] = _("date de retour de controle de legalite");
8342
8343 $contenu[0][5] = "date_retour_rar";
8344 $contenu[1][5] = __("date de notification du correspondant");
8345
8346 $form->setSelect("type_mise_a_jour", $contenu);
8347
8348 // Parametrage du champ date
8349 $form->setLib("date", _("Date")."* :");
8350 if(isset($infos)) {
8351 $form->setType("date", "hiddenstaticdate");
8352
8353 } else {
8354 $form->setType("date", "date");
8355 }
8356 $form->setVal("date", $date);
8357 $form->setTaille("date", 10);
8358 $form->setMax("date", 10);
8359
8360 // Parametrage du champ code_barres
8361 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8362 if(isset($infos)) {
8363 $form->setType("code_barres", "hiddenstatic");
8364 } else {
8365 $form->setType("code_barres", "text");
8366 }
8367 $form->setVal("code_barres", $code_barres);
8368 $form->setTaille("code_barres", 20);
8369 $form->setMax("code_barres", 20);
8370
8371 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8372 if(isset($infos)) {
8373
8374 // Tous les champs sont défini par defaut à static
8375 foreach ($infos as $key => $value) {
8376 $form->setType($key, "static");
8377 if(in_array($key, $liste_champs)) {
8378 $form->setVal($key, $date);
8379 } else {
8380 $form->setVal($key, $value);
8381 }
8382 }
8383
8384 // Les champs dont on viens de définir la valeur sont en gras
8385 foreach ($liste_champs as $value) {
8386 $form->setBloc($value,'DF',"",'bold');
8387 }
8388
8389 // Parametrage du champ dossier
8390 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8391 $form->setType("dossier_libelle", "static");
8392 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8393
8394 // Parametrage du champ evenement
8395 $form->setLib("evenement", _("evenement")." :");
8396 $form->setType("evenement", "static");
8397 $form->setVal("evenement", $infos['evenement']);
8398
8399 // Parametrage du champ autorite_competente
8400 $form->setLib("autorite_competente", _("Autorite competente")." :");
8401 $form->setType("autorite_competente", "static");
8402 $form->setVal("autorite_competente", $infos['autorite_competente']);
8403
8404 // Parametrage des libellés d'envoi avec AR
8405 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8406 $form->setLib("date_retour_rar", __("date_notification")." :");
8407
8408 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8409 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8410 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8411 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8412 // Configuration des libellé en fonction de l'autorité compétente
8413 if($infos['autorite_competente_code'] == 'ETAT') {
8414 $form->setType("date_envoi_controle_legalite", "hiddendate");
8415 $form->setType("date_retour_controle_legalite", "hiddendate");
8416 }
8417
8418 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8419 $form->setLib("is_valid", _("Valide")." :");
8420 $form->setType("is_valid", "hidden");
8421 $form->setVal("is_valid", 'true');
8422
8423 $form->setFieldset('dossier_libelle','D',_('Synthese'));
8424 $form->setFieldset('is_valid','F');
8425
8426 }
8427
8428
8429 // Création du fieldset regroupant les champs permettant la mise à jour des date
8430 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8431 $form->setFieldset('code_barres','F');
8432 // Affichage du formulaire
8433 $form->entete();
8434 $form->afficher($champs, 0, false, false);
8435 $form->enpied();
8436 // Affichage du bouton
8437 echo "\t<div class=\"formControls\">\n";
8438 //
8439 if(!$date_error) {
8440 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8441 }
8442 // Si pas sur l'écran de validation
8443 if(isset($infos)) {
8444 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8445 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8446 echo "\">Retour</a>";
8447 }
8448 echo "\t</div>\n";
8449 // Fermeture du formulaire
8450 echo "\t</form>\n";
8451 }
8452
8453 /**
8454 * [view_pdf_lettre_rar description]
8455 *
8456 * @return [type] [description]
8457 */
8458 function view_pdf_lettre_rar() {
8459 // Vérification de l'accessibilité sur l'élément
8460 $this->checkAccessibility();
8461 //
8462 $this->f->disableLog();
8463
8464 if($this->f->get_submitted_get_value('liste') != null) {
8465 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8466
8467 // Classe permettant la mise en page de l'édition pdf
8468 require_once "../obj/pdf_lettre_rar.class.php";
8469 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8470 // Initialisation de la mise en page
8471 $pdf_lettre_rar->init($this->f);
8472
8473 foreach ($listeCodeBarres as $code_barres) {
8474
8475 // On récupère le dossier
8476 $qres = $this->f->get_one_result_from_db_query(
8477 sprintf(
8478 'SELECT
8479 dossier
8480 FROM
8481 %1$sinstruction
8482 WHERE
8483 code_barres = \'%2$s\'',
8484 DB_PREFIXE,
8485 $this->f->db->escapeSimple($code_barres)
8486 ),
8487 array(
8488 "origin" => __METHOD__,
8489 )
8490 );
8491
8492 $inst_dossier = $this->f->get_inst__om_dbform(array(
8493 "obj" => "dossier",
8494 "idx" => $qres['result'],
8495 ));
8496
8497 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8498 $groupe = $inst_dossier->get_type_affichage_formulaire();
8499 switch ($groupe) {
8500 case 'CTX IN':
8501 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8502 break;
8503 case 'CTX RE':
8504 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8505 break;
8506 case 'ADS':
8507 case 'DPC':
8508 case 'CONSULTATION ENTRANTE':
8509 default:
8510 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8511 break;
8512 }
8513
8514 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8515 $qres = $this->f->get_all_results_from_db_query(
8516 sprintf(
8517 'SELECT
8518 dossier.dossier_libelle,
8519 evenement.type,
8520 count(lien_dossier_demandeur) as nbdemandeur,
8521 CASE
8522 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8523 THEN CONCAT(phase.code, \' - \', division.libelle)
8524 ELSE
8525 phase.code
8526 END AS code_phase
8527 FROM
8528 %1$sinstruction
8529 LEFT JOIN %1$sdossier
8530 ON instruction.dossier = dossier.dossier
8531 LEFT JOIN %1$sdivision
8532 ON dossier.division = division.division
8533 INNER JOIN %1$sevenement
8534 ON instruction.evenement=evenement.evenement
8535 LEFT JOIN %1$sphase
8536 ON evenement.phase = phase.phase
8537 inner JOIN %1$slien_dossier_demandeur
8538 ON instruction.dossier=lien_dossier_demandeur.dossier
8539 inner join %1$sdemandeur
8540 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8541 WHERE
8542 code_barres = \'%2$s\'
8543 AND %3$s
8544 GROUP BY
8545 dossier.dossier_libelle,
8546 evenement.type,
8547 phase.code,
8548 division.libelle',
8549 DB_PREFIXE,
8550 $this->f->db->escapeSimple($code_barres),
8551 $sql_demandeur
8552 ),
8553 array(
8554 "origin" => __METHOD__
8555 )
8556 );
8557 $testDemandeur = array_shift($qres['result']);
8558
8559
8560 // Recuperation de l'adresse de destination
8561 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8562 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8563 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8564 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8565 }
8566
8567 $qres = $this->f->get_all_results_from_db_query(
8568 sprintf(
8569 'SELECT
8570 CASE WHEN demandeur.qualite = \'particulier\'
8571 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8572 ELSE TRIM(demandeur.personne_morale_denomination)
8573 END as ligne1,
8574 CASE WHEN demandeur.qualite = \'personne_morale\'
8575 THEN TRIM(demandeur.personne_morale_raison_sociale)
8576 ELSE \'\'
8577 END as ligne1_1,
8578 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8579 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8580 ELSE \'\'
8581 END as ligne1_2,
8582 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8583 CASE demandeur.complement
8584 WHEN null THEN \'\'
8585 ELSE trim(demandeur.complement)
8586 END as ligne3,
8587 CASE demandeur.lieu_dit
8588 WHEN null THEN \'\'
8589 ELSE trim(demandeur.lieu_dit)
8590 END as ligne4,
8591 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8592 (CASE WHEN demandeur.bp IS NOT NULL
8593 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8594 ELSE \'\'
8595 END),
8596 (CASE WHEN demandeur.cedex IS NOT NULL
8597 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8598 ELSE \'\'
8599 END))
8600 as ligne5,
8601 code_barres as code_barres
8602 FROM
8603 %1$sinstruction
8604 INNER JOIN %1$sdossier
8605 ON dossier.dossier = instruction.dossier
8606 INNER JOIN %1$slien_dossier_demandeur
8607 ON dossier.dossier = lien_dossier_demandeur.dossier
8608 INNER JOIN %1$sdemandeur
8609 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8610 LEFT OUTER JOIN %1$scivilite AS pc
8611 ON demandeur.particulier_civilite = pc.civilite
8612 OR demandeur.personne_morale_civilite = pc.civilite
8613 WHERE
8614 instruction.code_barres = \'%2$s\'
8615 %3$s',
8616 DB_PREFIXE,
8617 $this->f->db->escapeSimple($code_barres),
8618 $sqlAdresse
8619 ),
8620 array(
8621 "origin" => __METHOD__
8622 )
8623 );
8624 $adresse_dest = array_shift($qres['result']);
8625
8626 // Création adresse destinataire sans ligne vide
8627 $adresse_destinataire = array();
8628 if (!empty($adresse_dest['ligne1'])) {
8629 $adresse_destinataire[] = $adresse_dest['ligne1'];
8630 }
8631 if (!empty($adresse_dest['ligne1_1'])) {
8632 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8633 }
8634 if (!empty($adresse_dest['ligne1_2'])) {
8635 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8636 }
8637 $adresse_destinataire[] = $adresse_dest['ligne2'];
8638 if (!empty($adresse_dest['ligne3'])) {
8639 $adresse_destinataire[] = $adresse_dest['ligne3'];
8640 }
8641 if (!empty($adresse_dest['ligne4'])) {
8642 $adresse_destinataire[] = $adresse_dest['ligne4'];
8643 }
8644 $adresse_destinataire[] = $adresse_dest['ligne5'];
8645
8646 // Création du champ specifique
8647 $specifique_content = array();
8648 $specifique_content[] = $adresse_dest['ligne1'];
8649 $specifique_content[] = $adresse_dest['ligne1_1'];
8650 $specifique_content[] = $adresse_dest['ligne1_2'];
8651 $specifique_content[] = $testDemandeur['dossier_libelle'];
8652 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8653 unset($adresse_dest['code_barres']);
8654 // Ajout d'une page aux pdf
8655 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8656
8657 }
8658 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8659 $om_edition = $this->f->get_inst__om_edition();
8660 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8661 }
8662 }
8663
8664 /**
8665 * VIEW - view_bordereau_envoi_maire.
8666 *
8667 * Formulaire demandant :
8668 * - le code-barres de l'événement d'instruction
8669 * - la date d'envoi du courrier pour signature par le maire
8670 *
8671 * Lors de la validation :
8672 * => met à jour cette date dans l'événement d'instruction
8673 * => crée un lien permettant de générer en PDF le bordereau
8674 *
8675 * @return void
8676 */
8677 function view_bordereau_envoi_maire() {
8678 // Vérification de l'accessibilité sur l'élément
8679 $this->checkAccessibility();
8680
8681 // Récupération des valeur passées en POST ou GET
8682 $code_barres = "";
8683 if($this->f->get_submitted_post_value('code_barres') !== null) {
8684 $code_barres = $this->f->get_submitted_post_value('code_barres');
8685 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8686 $code_barres = $this->f->get_submitted_get_value('code_barres');
8687 }
8688 $date = "";
8689 if($this->f->get_submitted_post_value('date') !== null) {
8690 $date = $this->f->get_submitted_post_value('date');
8691 } elseif($this->f->get_submitted_get_value('date') !== null) {
8692 $date = $this->f->get_submitted_get_value('date');
8693 }
8694 $validation = 0;
8695 if($this->f->get_submitted_post_value('validation') !== null) {
8696 $validation = $this->f->get_submitted_post_value('validation');
8697 } elseif($this->f->get_submitted_get_value('validation') !== null) {
8698 $validation = $this->f->get_submitted_get_value('validation');
8699 }
8700
8701 // Si le formulaire a été validé
8702 if ($this->f->get_submitted_post_value('validation') !== null) {
8703 // Tous les champs doivent obligatoirement être remplis
8704 if (!empty($date) && !empty($code_barres)) {
8705 $date_en = $this->dateDB($date);
8706 // Si date valide
8707 if ($date_en != "") {
8708 $id_instruction = $this->get_instruction_by_barcode($code_barres);
8709 // Si un événement d'instruction a été trouvé pour ce code-barres
8710 if ($id_instruction !== null) {
8711 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8712 // Si mise à jour réussie de la date d'envoi du courrier
8713 // pour signature par l'autorité compétente
8714 if($ret === true) {
8715 // Message de validation avec lien PDF
8716 $message_class = "valid";
8717 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8718 $message .= " : <br/><br/>";
8719 $message .= "<a class='om-prev-icon pdf-16'";
8720 $message .= " id=\"generer_bordereau_envoi_maire\"";
8721 $message .= " title=\""._("Bordereau")."\"";
8722 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8723 $message .= "&action=200";
8724 $message .= "&idx=".$id_instruction."'";
8725 $message .= " target='_blank'>";
8726 $message .= _("Bordereau d'envoi au maire");
8727 $message .= "</a><br/><br/>";
8728 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8729 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8730 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8731
8732 } else {
8733 // Message d'erreur
8734 $message_class = "error";
8735 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8736 $code_barres);
8737 }
8738 }
8739 else {
8740 $message_class = "error";
8741 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8742 }
8743 }
8744 else {
8745 $message_class = "error";
8746 $message = _("La date est invalide.");
8747 }
8748 } else {
8749 $message_class = "error";
8750 $message = _("Tous les champs doivent etre remplis.");
8751 }
8752 }
8753
8754 /**
8755 * Affichage des messages et du formulaire
8756 */
8757
8758 // Affichage du message de validation ou d'erreur
8759 if (isset($message) && isset($message_class) && $message != "") {
8760 $this->f->displayMessage($message_class, $message);
8761 }
8762
8763 // Ouverture du formulaire
8764 $datasubmit = $this->getDataSubmit();
8765 echo "\n<!-- ########## START DBFORM ########## -->\n";
8766 echo "<form";
8767 echo " id=\"bordereau_envoi_maire\"";
8768 echo " method=\"post\"";
8769 echo " name=\"f1\"";
8770 echo " action=\"";
8771 echo $datasubmit;
8772 echo "\"";
8773 echo ">\n";
8774
8775 // Paramétrage des champs du formulaire
8776 $champs = array("code_barres","date");
8777
8778 // Création d'un nouvel objet de type formulaire
8779 $form = $this->f->get_inst__om_formulaire(array(
8780 "validation" => 0,
8781 "maj" => 0,
8782 "champs" => $champs,
8783 ));
8784
8785 $template_required_label = '%s *';
8786 // Parametrage du champ code_barres
8787 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8788 $form->setType("code_barres", "text");
8789 $form->setVal("code_barres", $code_barres);
8790 $form->setTaille("code_barres", 20);
8791 $form->setMax("code_barres", 20);
8792 // Parametrage du champ date
8793 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8794 $form->setType("date", "date") ;
8795 if (empty($date)) {
8796 $date = date('d/m/Y');
8797 }
8798 $form->setVal("date", $date);
8799 $form->setTaille("date", 10);
8800 $form->setMax("date", 10);
8801
8802 // Création du bloc regroupant les champs
8803 $form->setBloc('code_barres','D');
8804 $form->setBloc('date','F');
8805 // Affichage du formulaire
8806 $form->entete();
8807 $form->afficher($champs, 0, false, false);
8808 $form->enpied();
8809 // Affichage du bouton
8810 printf("\t<div class=\"formControls\">\n");
8811 //
8812 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8813 printf("\t</div>\n");
8814 // Fermeture du formulaire
8815 printf("\t</form>\n");
8816 }
8817
8818 /**
8819 * VIEW - view_bordereau_envoi_maire.
8820 *
8821 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8822 *
8823 * @return [void]
8824 */
8825 function view_generate_bordereau_envoi_maire() {
8826 // Vérification de l'accessibilité sur l'élément
8827 $this->checkAccessibility();
8828 // Récupération de la collectivité du dossier d'instruction
8829 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8830 // Récupération de ses paramètres
8831 $collectivite = $this->f->getCollectivite($collectivite_di);
8832 // Génération du PDF
8833 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8834 // Affichage du PDF
8835 $this->expose_pdf_output(
8836 $result['pdf_output'],
8837 $result['filename']
8838 );
8839 }
8840
8841 /**
8842 * VIEW - view_rapport_instruction.
8843 *
8844 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8845 * Cette action est bindée pour utiliser la fonction popUpIt.
8846 *
8847 * @return void
8848 */
8849 function view_overlay_notification_manuelle() {
8850
8851 // Vérification de l'accessibilité sur l'élément
8852 $this->checkAccessibility();
8853
8854 printf(
8855 '<script type="text/javascript" >
8856 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8857 </script>',
8858 'instruction_notification_manuelle',
8859 OM_ROUTE_SOUSFORM,
8860 $this->getVal($this->clePrimaire),
8861 $this->getVal('dossier')
8862 );
8863 }
8864
8865 /**
8866 * VIEW - view_overlay_notification_service_consulte.
8867 *
8868 * Ouvre le sous-formulaire de notification des services consulte
8869 * en ajaxIt dans un overlay.
8870 * Cette action est bindée pour utiliser la fonction popUpIt.
8871 *
8872 * @return void
8873 */
8874 function view_overlay_notification_service_consulte() {
8875
8876 // Vérification de l'accessibilité sur l'élément
8877 $this->checkAccessibility();
8878
8879 printf(
8880 '<script type="text/javascript" >
8881 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8882 </script>',
8883 'instruction_notification_manuelle',
8884 OM_ROUTE_SOUSFORM,
8885 $this->getVal($this->clePrimaire),
8886 $this->getVal('dossier')
8887 );
8888 }
8889
8890 /**
8891 * VIEW - overlay_notification_tiers_consulte.
8892 *
8893 * Ouvre le sous-formulaire de notification des tiers consulte
8894 * en ajaxIt dans un overlay.
8895 * Cette action est bindée pour utiliser la fonction popUpIt.
8896 *
8897 * @return void
8898 */
8899 function view_overlay_notification_tiers_consulte() {
8900
8901 // Vérification de l'accessibilité sur l'élément
8902 $this->checkAccessibility();
8903
8904 printf(
8905 '<script type="text/javascript" >
8906 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8907 </script>',
8908 'instruction_notification_manuelle',
8909 OM_ROUTE_SOUSFORM,
8910 $this->getVal($this->clePrimaire),
8911 $this->getVal('dossier')
8912 );
8913 }
8914
8915 /**
8916 * VIEW - view_modale_selection_document_signe
8917 *
8918 * Ouvre le sous-formulaire de notification des services consulte
8919 * en ajaxIt dans un overlay.
8920 * Cette action est bindée pour utiliser la fonction popUpIt.
8921 *
8922 * @return void
8923 */
8924 function view_modale_selection_document_signe() {
8925
8926 // Vérification de l'accessibilité sur l'élément
8927 $this->checkAccessibility();
8928
8929 printf(
8930 '<script type="text/javascript" >
8931 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8932 </script>',
8933 'instruction_modale',
8934 OM_ROUTE_SOUSFORM,
8935 $this->getVal($this->clePrimaire),
8936 $this->getVal('dossier')
8937 );
8938 }
8939
8940 /**
8941 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8942 * pour exclure les dossiers du groupe contentieux.
8943 *
8944 * @param [string] $barcode numéro du code-barres
8945 * @return [mixed] ID de son instruction ou null si aucun code
8946 */
8947 function get_instruction_by_barcode($barcode) {
8948 // Begin
8949 $this->begin_treatment(__METHOD__);
8950
8951 // Vérification de l'existence de l'événement d'instruction
8952 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8953 $qres = $this->f->get_one_result_from_db_query(
8954 sprintf(
8955 'SELECT
8956 instruction
8957 FROM
8958 %1$sinstruction
8959 INNER JOIN %1$sdossier
8960 ON dossier.dossier=instruction.dossier
8961 INNER JOIN %1$sdossier_instruction_type
8962 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8963 INNER JOIN %1$sdossier_autorisation_type_detaille
8964 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8965 INNER JOIN %1$sdossier_autorisation_type
8966 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8967 INNER JOIN %1$sgroupe
8968 ON dossier_autorisation_type.groupe = groupe.groupe
8969 AND groupe.code != \'CTX\'
8970 WHERE
8971 code_barres = \'%2$s\'',
8972 DB_PREFIXE,
8973 $this->f->db->escapeSimple($barcode)
8974 ),
8975 array(
8976 "origin" => __METHOD__,
8977 )
8978 );
8979
8980 // Retourne résultat
8981 return $this->end_treatment(__METHOD__, $qres['result']);
8982 }
8983
8984 /**
8985 * Met à jour le champ date d'envoi signature
8986 * avec la date fournie et pour l'instruction donnée
8987 *
8988 * @param [string] $id ID de l'événement d'instruction
8989 * @param [string] $date date au format EN
8990 * @return [boolean] true si mise à jour avec succès
8991 */
8992 function update_date_envoi_signature($id, $date) {
8993 // Préparation du tableau
8994 $valF = array();
8995 $valF['date_envoi_signature'] = $date;
8996 // Begin
8997 $this->begin_treatment(__METHOD__);
8998 // Requête
8999 $res = $this->f->db->autoexecute(
9000 DB_PREFIXE.$this->table,
9001 $valF,
9002 DB_AUTOQUERY_UPDATE,
9003 $this->getCle($id)
9004 );
9005 $this->addToLog(
9006 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
9007 VERBOSE_MODE
9008 );
9009 if ($this->f->isDatabaseError($res, true) !== false) {
9010 $this->end_treatment(__METHOD__, false);
9011 }
9012 //
9013 return $this->end_treatment(__METHOD__, true);
9014 }
9015
9016 /**
9017 * Méthode permettant de définir des valeurs à envoyer en base après
9018 * validation du formulaire d'ajout.
9019 * @param array $val tableau des valeurs retournées par le formulaire
9020 */
9021 function setValFAjout($val = array()) {
9022 // Mise à jour du flag created_by_commune lors d'un changement de décision
9023 // par un utilisateur de commune sur un dossier instruit par la comcom
9024 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
9025 $this->valF['created_by_commune'] = true;
9026 }
9027
9028 //
9029 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
9030 if (isset($this->valF['flag_edition_integrale']) === true) {
9031 unset($this->valF['flag_edition_integrale']);
9032 }
9033 if (isset($this->valF['signataire_arrete']) === true) {
9034 unset($this->valF['signataire_arrete']);
9035 }
9036 }
9037 }
9038
9039
9040 /**
9041 * Récupère l'instance d'un événement de workflow.
9042 *
9043 * @param mixed $evenement Identifiant de l'événement.
9044 *
9045 * @return object
9046 */
9047 function get_inst_evenement($evenement = null) {
9048 //
9049 return $this->get_inst_common("evenement", $evenement);
9050 }
9051
9052 /**
9053 * Logue l'action de l'instruction dans son DI.
9054 *
9055 * @param string $id Clé primaire de l'instruction.
9056 * @param array $val Valeurs de l'instruction.
9057 *
9058 * @return bool Vrai si traitement effectué avec succès
9059 */
9060 private function add_log_to_dossier($id, array $val) {
9061 $maj = $this->getParameter("maj");
9062 // Action = Trace par défaut
9063 $action = $this->get_backtrace();
9064 // Action = Identifant de l'action si contexte connu
9065 if (empty($maj) === false
9066 || (empty($maj) === true && $maj === 0)) {
9067 $action = $this->get_action_param($maj, 'identifier');
9068 if ($action === 'modifier_suivi') {
9069 $action = "modifier (via l'action suivi des dates)";
9070 }
9071 if ($action === 'notifier_commune'
9072 && isset($val['mails_destinataires']) === true) {
9073 $action = "notification de la commune (courriels : ";
9074 $action .= $val['mails_destinataires'].")";
9075 }
9076 }
9077 // Création du log
9078 $log = array(
9079 'date' => date('Y-m-d H:i:s'),
9080 'user' => $_SESSION['login'],
9081 'action' => $action,
9082 'values' => array(
9083 'date_evenement' => $this->dateDB($val['date_evenement']),
9084 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9085 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9086 'evenement' => $val['evenement'],
9087 'action' => $val['action'],
9088 'instruction' => $id,
9089 'etat' => $val['etat'],
9090 ),
9091 );
9092 // Ajout du log
9093 $di = $this->get_inst_dossier($val['dossier']);
9094 $ret = $di->add_log_instructions($log);
9095 if ($ret === false) {
9096 $this->correct = false;
9097 $this->msg = '';
9098 $this->addToMessage($di->msg);
9099 }
9100 return $ret;
9101 }
9102
9103
9104 /**
9105 * Retourne le contexte de déboguage formaté en HTML.
9106 *
9107 * @return string Une ligne par trace
9108 */
9109 private function get_backtrace() {
9110 $trace = debug_backtrace();
9111 $backtrace = '';
9112 $i = 1;
9113 foreach ($trace as $key => $value) {
9114 $func = $trace[$key]['function'];
9115 // On ne s'autolog pas
9116 if ($func === 'get_backtrace'
9117 || $func === 'add_log_to_dossier') {
9118 continue;
9119 }
9120 $backtrace .= $i.') ';
9121 // Si dans une classe
9122 if (isset($trace[$key]['class']) === true
9123 && empty($trace[$key]['class']) === false) {
9124 $backtrace .= $trace[$key]['class'].'->'.$func;
9125 }
9126 // Si procédural
9127 else {
9128 $file = $trace[$key]['file'];
9129 $line = $trace[$key]['line'];
9130 $truncated_file = $this->f->get_relative_path($file);
9131 if ($truncated_file !== false) {
9132 $file = $truncated_file;
9133 }
9134 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9135 }
9136 $backtrace .= '<br/>';
9137 $i++;
9138 }
9139 return $backtrace;
9140 }
9141
9142 /**
9143 * CONDITION - is_notifiable.
9144 *
9145 * Condition pour afficher l'action notifier_commune.
9146 *
9147 * @return boolean
9148 */
9149 public function is_notifiable() {
9150 // L'instruction doit être finalisée, ce qui revient à dire
9151 // définalisable sans bypass
9152 if ($this->is_unfinalizable_without_bypass() === false) {
9153 return false;
9154 }
9155 // La collectivité de l'utilisateur doit être de niveau multi
9156 if ($this->f->has_collectivite_multi() === false) {
9157 return false;
9158 }
9159 // Le paramètre multi de l'objet du courriel doit exister
9160 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9161 return false;
9162 }
9163 // Le paramètre multi du modèle du courriel doit exister
9164 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9165 return false;
9166 }
9167 // A ce stade toutes les conditions sont satisfaites
9168 return true;
9169 }
9170
9171 /**
9172 * TREATMENT - notifier_commune.
9173 *
9174 * Notifie aux communes et par courriel la finalisation d'une instruction.
9175 *
9176 * @return boolean
9177 */
9178 public function notifier_commune() {
9179 // Cette méthode permet d'exécuter une routine en début des méthodes
9180 // dites de TREATMENT.
9181 $this->begin_treatment(__METHOD__);
9182 $message = __('Erreur de paramétrage :');
9183 $erreurParametrage = false;
9184 // Récupération du paramétrage de la collectivité du dossier
9185 $id_di = $this->getVal('dossier');
9186 $di = $this->get_inst_dossier($id_di);
9187 $collectivite_di = $di->getVal('om_collectivite');
9188 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9189 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9190 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9191 $erreurParametrage = true;
9192 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9193 }
9194
9195 // Récupération de la liste des mails
9196 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9197 if (empty($adresses)) {
9198 $erreurParametrage = true;
9199 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9200 }
9201
9202 // Vérification du paramétrage des mails
9203 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9204 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9205 $erreurParametrage = true;
9206 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9207 }
9208 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9209 $erreurParametrage = true;
9210 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9211 }
9212
9213 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9214 // un message a destination de l'utilisateur est affiché
9215 if ($erreurParametrage) {
9216 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9217 $this->addToMessage($message);
9218 return $this->end_treatment(__METHOD__, false);
9219 }
9220
9221 // Création d'un notification et de sa tâche associé pour chaque mail
9222 foreach ($adresses as $adresse) {
9223 // Ajout de la notif et récupération de son id
9224 $destinataire = array(
9225 'destinataire' => $adresse,
9226 'courriel' => $adresse
9227 );
9228 $idNotif = $this->ajouter_notification(
9229 $this->getVal($this->clePrimaire),
9230 $this->f->get_connected_user_login_name(),
9231 $destinataire,
9232 $collectivite_di
9233 );
9234 if ($idNotif === false) {
9235 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9236 return $this->end_treatment(__METHOD__, false);
9237 }
9238 // Création de la tache en lui donnant l'id de la notification
9239 $notification_by_task = $this->notification_by_task(
9240 $idNotif,
9241 $this->getVal('dossier'),
9242 'mail',
9243 'notification_commune'
9244 );
9245 if ($notification_by_task === false) {
9246 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9247 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9248 return $this->end_treatment(__METHOD__, false);
9249 }
9250 }
9251 $this->addToMessage(__('La commune a été notifiée.'));
9252 return $this->end_treatment(__METHOD__, true);
9253 }
9254
9255 /**
9256 * Récupère l'instance de l'instructeur
9257 *
9258 * @param integer $instructeur Identifiant de l'instructeur.
9259 *
9260 * @return object
9261 */
9262 protected function get_inst_instructeur($instructeur) {
9263 //
9264 return $this->get_inst_common("instructeur", $instructeur);
9265 }
9266
9267
9268 /**
9269 * Récupère l'instance de l'utilisateur
9270 *
9271 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9272 *
9273 * @return object
9274 */
9275 protected function get_inst_om_utilisateur($om_utilisateur) {
9276 //
9277 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9278 }
9279
9280
9281 /**
9282 * Récupère l'instance de la division.
9283 *
9284 * @param integer $division Identifiant de la division.
9285 *
9286 * @return object
9287 */
9288 protected function get_inst_division($division) {
9289 //
9290 return $this->get_inst_common("division", $division);
9291 }
9292
9293
9294 /**
9295 * Récupère l'instance de la direction.
9296 *
9297 * @param integer $direction Identifiant de la direction.
9298 *
9299 * @return object
9300 */
9301 protected function get_inst_direction($direction) {
9302 //
9303 return $this->get_inst_common("direction", $direction);
9304 }
9305
9306
9307 /**
9308 * Récupère la collectivité d'un instructeur en passant par sa division puis
9309 * par sa direction.
9310 *
9311 * @param integer $instructeur Identifiant de l'instructeur.
9312 *
9313 * @return integer
9314 */
9315 protected function get_instructeur_om_collectivite($instructeur) {
9316 // Chemin vers la collectivité d'un instructeur
9317 $inst_instr = $this->get_inst_instructeur($instructeur);
9318 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9319 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9320
9321 // Collectivité
9322 $om_collectivite = $inst_direction->getVal('om_collectivite');
9323
9324 //
9325 return $om_collectivite;
9326 }
9327
9328 /*
9329 * CONDITION - can_user_access_dossier_contexte_ajout
9330 *
9331 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9332 * formulaire d'ajout.
9333 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9334 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9335 *
9336 */
9337 function can_user_access_dossier_contexte_ajout() {
9338
9339 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9340 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9341 //
9342 if ($id_dossier !== "") {
9343 $dossier = $this->f->get_inst__om_dbform(array(
9344 "obj" => "dossier_instruction",
9345 "idx" => $id_dossier,
9346 ));
9347 //
9348 return $dossier->can_user_access_dossier();
9349 }
9350 return false;
9351 }
9352
9353 /*
9354 * CONDITION - can_user_access_dossier
9355 *
9356 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9357 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9358 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9359 *
9360 */
9361 function can_user_access_dossier_contexte_modification() {
9362
9363 $id_dossier = $this->getVal('dossier');
9364 //
9365 if ($id_dossier !== "" && $id_dossier !== null) {
9366 $dossier = $this->f->get_inst__om_dbform(array(
9367 "obj" => "dossier_instruction",
9368 "idx" => $id_dossier,
9369 ));
9370 //
9371 return $dossier->can_user_access_dossier();
9372 }
9373 return false;
9374 }
9375
9376 /**
9377 * TREATMENT - envoyer_a_signature_sans_relecture
9378 *
9379 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9380 *
9381 * @return boolean true si l'envoi a été effectué avec succès false sinon
9382 */
9383 function envoyer_a_signature_sans_relecture() {
9384 return $this->envoyer_a_signature();
9385 }
9386
9387 /**
9388 * TREATMENT - envoyer_a_signature_avec_relecture
9389 *
9390 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9391 *
9392 * @return boolean true si l'envoi a été effectué avec succès false sinon
9393 */
9394 function envoyer_a_signature_avec_relecture() {
9395 $is_forced_view_files = true;
9396 return $this->envoyer_a_signature($is_forced_view_files);
9397 }
9398
9399 /**
9400 * TREATMENT - envoyer_a_signature
9401 *
9402 * Permet d'envoyer le document de l'instruction au parapheur pour signature
9403 *
9404 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9405 *
9406 * @return boolean true si l'envoi a été effectué avec succès false sinon
9407 */
9408 function envoyer_a_signature($is_forced_view_files = false) {
9409 $this->begin_treatment(__METHOD__);
9410 $this->correct = true;
9411
9412 // Instanciation de l'objet signataire_arrete
9413 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9414 'obj' => 'signataire_arrete',
9415 'idx' => $this->getVal('signataire_arrete'),
9416 ));
9417
9418 // Instanciation de l'objet dossier
9419 $inst_dossier = $this->f->get_inst__om_dbform(array(
9420 'obj' => 'dossier',
9421 'idx' => $this->getVal('dossier'),
9422 ));
9423
9424 //Instanciation de la classe electronicsignature
9425 $inst_es = $this->get_electronicsignature_instance();
9426 if ($inst_es === false) {
9427 $this->correct = false;
9428 return $this->end_treatment(__METHOD__, false);
9429 }
9430
9431 // Vérifie si la notification se fait via l'application ou via le parapheur
9432 try {
9433 $notification_required = $inst_es->signer_notification_is_delegated();
9434 } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9435 // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9436 $notification_required = false;
9437 }
9438
9439 // Si la notification est faite par l'application vérifie que l'adresse mail du
9440 // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9441 // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9442 // notification
9443 if ($notification_required === true) {
9444 $signer_mail = $inst_signataire_arrete->getVal('email');
9445 $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9446
9447 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9448
9449 if (empty($signer_mail)) {
9450 $this->correct = false;
9451 $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9452 $this->addToMessage($err_msg.$err_detail);
9453 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9454 return $this->end_treatment(__METHOD__, false);
9455 }
9456 if (! $this->f->checkValidEmailAddress($signer_mail)) {
9457 $this->correct = false;
9458 $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9459 $this->addToMessage($err_msg.$err_detail);
9460 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9461 return $this->end_treatment(__METHOD__, false);
9462 }
9463 }
9464
9465 // Récupération du document à signer
9466 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9467 if ($file === OP_FAILURE) {
9468 $this->correct = false;
9469 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9470 // Termine le traitement
9471 return $this->end_treatment(__METHOD__, false);
9472 }
9473
9474 // Initialisation des paramètre à passer pour l'envoi en signature
9475 $data = array(
9476 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9477 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9478 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9479 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9480 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9481 // Permet d'envoyer en signature l'instruction le jour de la date limite
9482 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9483 "dossier" => $this->getVal('dossier'),
9484 "is_forced_view_files" => $is_forced_view_files,
9485 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9486 );
9487
9488 // Initialisation des métadonnées
9489 $metadonnee_dossier = $file['metadata'];
9490 // récupération de l'extension du fichier
9491 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9492 // Modification du libellé du document transmis au parapheur
9493 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9494 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9495 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9496
9497 $metadonnee_dossier['url_di'] = sprintf(
9498 '%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',
9499 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9500 $this->getVal('dossier')
9501 );
9502
9503 $optional_data = null;
9504 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9505 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9506 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9507 if (json_last_error() !== JSON_ERROR_NONE) {
9508 $this->correct = false;
9509 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9510 $this->addToLog(__METHOD__."(): ".
9511 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9512 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9513 );
9514 // Termine le traitement
9515 return $this->end_treatment(__METHOD__, false);
9516 }
9517 }
9518
9519 // Appel de la méthode de l'abstracteur send_for_signature()
9520 // Cette méthode doit retourner un tableau de valeur
9521 try {
9522 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9523 } catch (electronicsignature_exception $e) {
9524 $this->handle_electronicsignature_exception($e);
9525 return $this->end_treatment(__METHOD__, false);
9526 }
9527
9528 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9529 $valF = array();
9530
9531 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9532 foreach($this->champs as $identifiant => $champ) {
9533 $valF[$champ] = $this->val[$identifiant];
9534 }
9535 // On fait ensuite nos modifications spécifiques
9536 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9537 $valF['statut_signature'] = $result['statut'];
9538 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9539 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9540 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9541 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9542 $ret = $this->modifier($valF);
9543
9544 if ($ret === false) {
9545 $this->correct = false;
9546 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9547 // Termine le traitement
9548 return $this->end_treatment(__METHOD__, false);
9549 }
9550
9551 // Notification du signataire
9552 if ($notification_required === true) {
9553 if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9554 $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9555 $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9556 $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9557 // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9558 // precedemment
9559 $this->init_record_data($this->getVal($this->clePrimaire));
9560 $this->annuler_envoi_en_signature();
9561 $this->correct = false;
9562 return $this->end_treatment(__METHOD__, true);
9563 }
9564 }
9565
9566 // Message
9567 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9568 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9569 && array_key_exists('signature_page_url', $result) === true) {
9570 $this->addToMessage(sprintf(
9571 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9572 $result['signature_page_url'],
9573 __("Signez directement le document")
9574 ));
9575 }
9576 if ($notification_required !== true) {
9577 $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9578 }
9579
9580 // Tout s'est bien passé, on termine le traitement
9581 return $this->end_treatment(__METHOD__, true);
9582 }
9583
9584 /**
9585 * Notifie le signataire d'un document à signer.
9586 * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9587 * En cas d'erreur ajoute une ligne dans les logs de l'application.
9588 *
9589 * @param string $signer_name Nom du signataire
9590 * @param string $signer_mail Mail du signataire
9591 * @param string $user_name Nom de l'utilisateur openADS courant
9592 *
9593 * @return boolean true si succés, false si erreur
9594 */
9595 protected function notify_signer($signer_name, $signer_mail, $user_name) {
9596 // message d'erreur
9597 $err_msg_log = sprintf(
9598 __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9599 $signer_name,
9600 $signer_mail,
9601 $this->getVal($this->clePrimaire)
9602 );
9603 $err_msg = sprintf(
9604 '%s %s (%s)"',
9605 __("Échec de la notification du signataire"),
9606 $signer_name,
9607 $signer_mail
9608 );
9609
9610 // vérification des informations requises
9611 if (empty($signer_name)) {
9612 $err_detail = __("le nom du signataire est vide");
9613 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9614 $this->addToMessage($err_msg.', '.$err_detail);
9615 return false;
9616 }
9617 if (empty($signer_mail)) {
9618 $err_detail = __("le courriel du signataire est vide");
9619 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9620 $this->addToMessage($err_msg.', '.$err_detail);
9621 return false;
9622 }
9623 if (empty($this->getVal('dossier'))) {
9624 $err_detail = __("l'identifiant du dossier est vide");
9625 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9626 $this->addToMessage($err_msg.', '.$err_detail);
9627 return false;
9628 }
9629
9630 // ajout de la notification à la liste des notifications de l'instruction
9631 $instruction_id = $this->getVal($this->clePrimaire);
9632 $inst_notif = $this->f->get_inst__om_dbform(array(
9633 "obj" => "instruction_notification",
9634 "idx" => "]",
9635 ));
9636 $notif_val = array(
9637 'instruction_notification' => null,
9638 'instruction' => $instruction_id,
9639 'automatique' => true,
9640 'emetteur' => $user_name,
9641 'date_envoi' => null,
9642 'destinataire' => "$signer_name <$signer_mail>",
9643 'courriel' => $signer_mail,
9644 'date_premier_acces' => null,
9645 'statut' => '',
9646 'commentaire' => ''
9647 );
9648 $add_notif = $inst_notif->ajouter($notif_val);
9649 if ($add_notif === false) {
9650 $err_detail = __("Échec de l'ajout de la notification.");
9651 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9652 $this->addToMessage($err_msg);
9653 return false;
9654 }
9655 $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9656
9657 // ajout d'une tâche de notification (envoi du mail)
9658 $notification_task = $this->notification_by_task(
9659 $notification_id,
9660 $this->getVal('dossier'),
9661 'mail',
9662 'notification_signataire'
9663 );
9664 if ($notification_task === false) {
9665 $err_detail = sprintf(
9666 __("Échec de l'ajout de la tâche de notification (notification %s)."),
9667 $notification_id);
9668 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9669 $this->addToMessage($err_msg);
9670 return false;
9671 }
9672
9673 // Vérification de la réussite de l'envoi du mail
9674 // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9675 // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9676 // qui viens d'être créée.
9677 // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9678 $qres = $this->f->get_one_result_from_db_query(
9679 sprintf(
9680 'SELECT
9681 state
9682 FROM
9683 %1$stask
9684 WHERE
9685 type = \'notification_signataire\'
9686 AND category = \'mail\'
9687 AND dossier = \'%2$s\'
9688 ORDER BY
9689 task DESC
9690 LIMIT 1',
9691 DB_PREFIXE,
9692 $this->f->db->escapeSimple($this->getVal('dossier'))
9693 ),
9694 array(
9695 'origin' => __METHOD__
9696 )
9697 );
9698 if ($qres['result'] === 'error') {
9699 $err_detail = sprintf(
9700 __("Échec de l'envoi du mail de notification (notification %s)."),
9701 $notification_id);
9702 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9703 $this->addToMessage($err_msg);
9704 return false;
9705 }
9706
9707 // succès de la planification de la notification
9708 $this->addToMessage(sprintf(
9709 __('Le signataire "%s (%s)" sera notifié prochainement'),
9710 $signer_name,
9711 $signer_mail));
9712 return true;
9713 }
9714
9715 /**
9716 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9717 * est en incomplet notifié ou non.
9718 * On peut ajouter des jours à cette date grâce au paramètre "delay".
9719 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9720 * l'instruction en signature le jour de la date limite.
9721 *
9722 * @param int $delay Le nombre de jour à ajouter à la date limite.
9723 *
9724 * @return string $date_limite la date limite calculé ou false
9725 */
9726 private function compute_date_limite($delay) {
9727 // Instanciation de l'objet dossier
9728 $inst_dossier = $this->f->get_inst__om_dbform(array(
9729 'obj' => 'dossier',
9730 'idx' => $this->getVal('dossier'),
9731 ));
9732
9733 $date_to_compute = null;
9734 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9735 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9736 } else {
9737 $date_to_compute = $inst_dossier->getVal('date_limite');
9738 }
9739 if ($date_to_compute != null) {
9740 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9741 }
9742
9743 return null;
9744 }
9745
9746 /**
9747 * Permet de récupérer la traduction de la valeur de statut_signature
9748 *
9749 * @return string la valeur de statut_signature traduite | false
9750 */
9751 function get_trad_for_statut($value_to_trad){
9752 $statut_signature_tab = array(
9753 'waiting' => __('en préparation'),
9754 'in_progress' => __('en cours de signature'),
9755 'canceled' => __('signature annulée'),
9756 'expired' => __('délai de signature expiré'),
9757 'finished' => __('signé')
9758 );
9759 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9760 return $statut_signature_tab[$value_to_trad];
9761 }
9762
9763 return false;
9764 }
9765
9766 /**
9767 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9768 *
9769 * @return string (json) la valeur de historique_signature mis à jour | false
9770 */
9771 function get_updated_historique_signature($historique_signature_values) {
9772
9773 $historique_signature_value_tab = $this->get_historique_signature_decoded();
9774
9775 if ($historique_signature_value_tab === false) {
9776 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9777 return false;
9778 }
9779
9780 $last_val_historique_signature = array();
9781
9782 // Si la tableau récupéré n'est pas vide alors
9783 // on récupère la dernière ligne du tableau
9784 if (empty($historique_signature_value_tab) === false) {
9785 $last_val_historique_signature = end($historique_signature_value_tab);
9786 }
9787
9788 $format_date = '';
9789 $format_date_hour = '';
9790 $date_converted=array();
9791
9792 $date_to_convert = array(
9793 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9794 'date_limite_instruction' => $this->compute_date_limite(0),
9795 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9796 );
9797
9798 // Conversion des dates en fonction de leur format
9799 foreach ($date_to_convert as $key => $value) {
9800 $date_converted[$key] = null;
9801 if ($value != null) {
9802 $format_date = 'd/m/Y';
9803 $format_date_hour = 'd/m/Y H:i:s';
9804 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9805 }
9806 }
9807
9808 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9809 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9810 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9811 $tab_for_columns_trad = array(
9812 __('entry_date'),
9813 __('id_parapheur_signature'),
9814 __('emetteur'),
9815 __('signataire'),
9816 __('date_envoi'),
9817 __('date_limite'),
9818 __('date_retour'),
9819 __('statut_signature'),
9820 __('commentaire_signature')
9821 );
9822
9823 array_push($historique_signature_value_tab, array(
9824 'entry_date' => date('d/m/Y H:i:s'),
9825 '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'],
9826 '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'],
9827 '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'],
9828 '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'],
9829 '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'],
9830 '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'],
9831 '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']),
9832 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9833 ));
9834
9835 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9836 }
9837
9838 /**
9839 * TREATMENT - annuler_envoi_en_signature
9840 *
9841 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9842 *
9843 * @return boolean true si l'annulation a été effectué avec succès false sinon
9844 */
9845 function annuler_envoi_en_signature() {
9846 $this->begin_treatment(__METHOD__);
9847 $this->correct = true;
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 $data = array();
9857 if (! empty($this->getVal('id_parapheur_signature'))) {
9858 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9859 } else {
9860 $this->correct = false;
9861 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9862 return $this->end_treatment(__METHOD__, false);
9863 }
9864
9865 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9866 // Cette méthode doit retourner un tableau de valeur
9867 try {
9868 $result = $inst_es->cancel_send_for_signature($data);
9869 } catch (electronicsignature_exception $e) {
9870 $this->handle_electronicsignature_exception($e);
9871 return $this->end_treatment(__METHOD__, false);
9872 }
9873
9874 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9875 $valF = array();
9876
9877 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9878 foreach($this->champs as $identifiant => $champ) {
9879 $valF[$champ] = $this->val[$identifiant];
9880 }
9881 // On fait ensuite nos modifications spécifiques
9882 $valF['id_parapheur_signature'] = null;
9883 $valF['statut_signature'] = $result['statut'];
9884 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9885 $valF['date_envoi_signature'] = null;
9886 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9887
9888 $ret = $this->modifier($valF);
9889
9890 if ($ret === false) {
9891 $this->correct = false;
9892 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9893 // Termine le traitement
9894 return $this->end_treatment(__METHOD__, false);
9895 }
9896
9897 // Message
9898 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9899
9900 // Tout s'est bien passé, on termine le traitement
9901 return $this->end_treatment(__METHOD__, true);
9902 }
9903
9904
9905 /**
9906 * Récupère le contenu du champ historique_signature et le converti en tableau
9907 *
9908 * @return array sinon false en cas d'erreur
9909 */
9910 protected function get_historique_signature_decoded() {
9911 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9912 if ($val === '' || $val == 'false') {
9913 $val = json_encode(array());
9914 }
9915 if($this->isJson($val) === false) {
9916 return false;
9917 }
9918 return json_decode($val, true);
9919 }
9920
9921 /**
9922 * Récupère les informations à afficher dans le tableau de suivi à l'aide
9923 * d'une requête sql. Stocke ces informations dans un tableau.
9924 * Converti le tableau au format json et renvoi le json obtenu.
9925 *
9926 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9927 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9928 * La clause where de la requête est construite à partir du tableau contenant les types
9929 * de tâches fourni en paramètre.
9930 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9931 *
9932 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9933 * la date de premier accès ne sera pas affichée.
9934 *
9935 * @param array liste des tâches permettant d'identifier quelles notification afficher
9936 * @param boolean permet d'afficher les notifications non liées à des tâches
9937 * @return json
9938 */
9939 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9940 $whereTypeTache = '';
9941 $sqlTaskNull = 'INNER';
9942
9943 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9944 $listeChampsTrad = array(
9945 __('emetteur'),
9946 __('date_envoi'),
9947 __('destinataire'),
9948 __('date_premier_acces'),
9949 __('instruction'),
9950 __('annexes'),
9951 __('statut'),
9952 __('commentaire')
9953 );
9954 $listeChamps = array(
9955 'emetteur',
9956 'date_envoi',
9957 'destinataire',
9958 'date_premier_acces',
9959 'instruction',
9960 'annexes',
9961 'statut',
9962 'commentaire'
9963 );
9964
9965 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9966 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9967 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9968 // paramétrage
9969 if(is_bool($nonLieTache) && $nonLieTache === true) {
9970 $sqlTaskNull = 'LEFT';
9971 }
9972 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9973 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9974 // tiers consulté
9975 if (is_array($typeTache) && $typeTache != array()) {
9976 if (is_array($typeTache)) {
9977 $whereTypeTache = sprintf(
9978 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
9979 "'".implode("', '", $typeTache)."'"
9980 );
9981 }
9982 // La date de premier accès n'a pas besoin d'être renseigné pour
9983 // les notifications des demandeurs via le portail citoyen.
9984 // Les notifications des demandeurs sont liés à 3 types de tâches
9985 // notification_recepisse, notification_instruction, notification_decision
9986 // Si le suivi de la notification concerne un de ces types de tâches on
9987 // considère que c'est une notification de demandeurs.
9988 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9989 // via le portail. Par défaut si rien n'est paramétré on considère que la
9990 // notification est faite via le portail
9991 if ((in_array('notification_recepisse', $typeTache) ||
9992 in_array('notification_instruction', $typeTache) ||
9993 in_array('notification_decision', $typeTache))) {
9994 $dossier = $this->getVal('dossier');
9995 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9996 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9997 if ($modeNotification === PORTAL) {
9998 $listeChamps = array(
9999 'emetteur',
10000 'date_envoi',
10001 'destinataire',
10002 'instruction',
10003 'annexes',
10004 'statut',
10005 'commentaire'
10006 );
10007 }
10008 }
10009 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
10010 // de les afficher dans le suivi
10011 if (in_array('notification_depot_demat', $typeTache)) {
10012 $listeChamps = array(
10013 'emetteur',
10014 'date_envoi',
10015 'destinataire',
10016 'instruction',
10017 'statut',
10018 'commentaire'
10019 );
10020 }
10021 }
10022
10023 $valSuivi = array();
10024 // Récupération des infos nécessaires à l'affichage du tableau
10025 $sql = sprintf(
10026 'SELECT DISTINCT
10027 instruction_notification.instruction_notification,
10028 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
10029 CASE WHEN instruction_notification.automatique = TRUE
10030 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
10031 ELSE instruction_notification.emetteur
10032 END as emetteur,
10033 date_envoi,
10034 instruction_notification.destinataire,
10035 instruction_notification.date_premier_acces,
10036 evenement.libelle as instruction,
10037 instruction_notification.statut,
10038 instruction_notification.commentaire,
10039 annexes.instruction_annexe as annexes
10040 FROM
10041 %1$sinstruction_notification
10042 LEFT JOIN %1$sinstruction
10043 ON instruction.instruction = instruction_notification.instruction
10044 LEFT JOIN %1$sevenement
10045 ON instruction.evenement = evenement.evenement
10046 LEFT JOIN %1$sinstruction_notification_document
10047 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
10048 AND instruction_notification_document.annexe = true
10049 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
10050 %4$s JOIN %1$stask
10051 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10052 AND task.type LIKE \'notification%%\'
10053 -- Récupération de la liste des annexes sous la forme d une liste
10054 LEFT JOIN (
10055 SELECT
10056 instruction_notification,
10057 -- Récupère la liste des annexes de la notification
10058 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
10059 -- à l affichage du lien vers les annexes
10060 CONCAT(
10061 \'[\',
10062 STRING_AGG(
10063 -- Affiche le nom du fichier selon le type de document/pièce
10064 CASE
10065 WHEN instruction_notification_document.document_type = \'instruction\'
10066 THEN CONCAT(
10067 \'{
10068 "obj" : "instruction",
10069 "champs" : "om_fichier_instruction",
10070 "label" : "\', evenement.libelle, \'",
10071 "id" : "\', instruction.instruction,\'"
10072 }\'
10073 )
10074 WHEN instruction_notification_document.document_type = \'consultation\'
10075 THEN CONCAT(
10076 \'{
10077 "obj" : "consultation",
10078 "champs" : "fichier",
10079 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
10080 "id" : "\', consultation.consultation, \'"
10081 }\'
10082 )
10083 ELSE
10084 CONCAT(
10085 \'{
10086 "obj" : "document_numerise",
10087 "champs" : "uid",
10088 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10089 "id" : "\', document_numerise.document_numerise,\'"
10090 }\'
10091 )
10092 END,
10093 \', \'),
10094 \']\'
10095 ) AS instruction_annexe
10096 FROM
10097 %1$sinstruction_notification_document
10098 LEFT JOIN %1$sinstruction
10099 ON instruction_notification_document.instruction = instruction.instruction
10100 LEFT JOIN %1$sevenement
10101 ON instruction.evenement = evenement.evenement
10102 LEFT JOIN %1$sconsultation
10103 ON instruction_notification_document.document_id = consultation.consultation
10104 LEFT JOIN %1$sservice
10105 ON consultation.service = service.service
10106 LEFT JOIN %1$sdocument_numerise
10107 ON instruction_notification_document.document_id = document_numerise.document_numerise
10108 LEFT JOIN %1$sdocument_numerise_type
10109 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10110 WHERE
10111 instruction_notification_document.annexe = \'t\'
10112 GROUP BY
10113 instruction_notification
10114 ) AS annexes
10115 ON
10116 annexes.instruction_notification = instruction_notification.instruction_notification
10117 WHERE
10118 instruction.instruction = %2$s
10119 %3$s
10120 ORDER BY
10121 date_envoi ASC, instruction_notification.destinataire ASC',
10122 DB_PREFIXE,
10123 intval($this->getVal('instruction')),
10124 $whereTypeTache,
10125 $sqlTaskNull
10126 );
10127 $qres = $this->f->get_all_results_from_db_query($sql, array(
10128 "origin" => __METHOD__
10129 )
10130 );
10131 // Préparation du lien de téléchargement des annexes
10132 $htmlList =
10133 '<style>
10134 #content .gridjs-td a.lien_annexe {
10135 text-decoration : underline dotted 1px;
10136 }
10137 #content a.lien_annexe:hover {
10138 text-decoration : underline solid 1px;
10139 color : #46aede;
10140 }
10141 ol {padding-left : 10px;}
10142 </style>
10143 <ol>%1$s</ol>';
10144 $lienTelechargement =
10145 '<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">
10146 Annexe
10147 </a>';
10148 // Stockage des infos de chaque notification dans un tableau
10149 foreach ($qres['result'] as $row) {
10150 $valNotif = array();
10151 foreach($listeChamps as $champ) {
10152 $valNotif[$champ] = $row[$champ];
10153 if (($champ === 'date_envoi'
10154 || $champ === 'date_premier_acces')
10155 && $row[$champ] !== null
10156 && $row[$champ] !== '') {
10157 //
10158 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10159 } else if ($champ === 'annexes') {
10160 $listeAnnexe = '';
10161 $infoAnnexes = json_decode($row[$champ], true);
10162 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10163 // A partir des infos récupérées prépare le code html du lien vers chacune
10164 // des annexes et ajoute un élément de liste par annexe
10165 foreach($infoAnnexes as $annexe) {
10166 $listeAnnexe .= sprintf(
10167 '<li>%s</li>',
10168 sprintf($lienTelechargement,
10169 $annexe['obj'],
10170 $annexe['champs'],
10171 $annexe['id'],
10172 $annexe['label']
10173 )
10174 );
10175 }
10176 // Construction de la liste des annexes
10177 $valNotif[$champ] = sprintf(
10178 $htmlList,
10179 $listeAnnexe
10180 );
10181 }
10182 }
10183 }
10184 array_push($valSuivi, $valNotif);
10185 }
10186
10187 // Passage du tableau au format json
10188 return json_encode($valSuivi, JSON_HEX_APOS);
10189 }
10190
10191 /**
10192 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10193 *
10194 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10195 *
10196 * @return void
10197 */
10198 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10199 $this->f->displayMessage('error', $exception->getMessage());
10200 }
10201
10202
10203 /**
10204 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10205 *
10206 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10207 * @return electronicsignature Instance de l'abstracteur.
10208 */
10209 public function get_electronicsignature_instance($with_handle_error = true) {
10210 if(isset($this->electronicsignature_instance)) {
10211 return $this->electronicsignature_instance;
10212 }
10213 // Instanciation du connecteur electronicsignature
10214 try {
10215 require_once "electronicsignature.class.php";
10216 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10217 $this->electronicsignature_instance = new electronicsignature($collectivites);
10218 } catch (electronicsignature_exception $e) {
10219 if ($with_handle_error === true) {
10220 $this->handle_electronicsignature_exception($e);
10221 }
10222 return false;
10223 }
10224 return $this->electronicsignature_instance;
10225 }
10226
10227 /**
10228 * TREATMENT - envoyer_au_controle_de_legalite
10229 *
10230 * Ajoute la tâche envoi_CL.
10231 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10232 *
10233 * @return [type] [description]
10234 */
10235 function envoyer_au_controle_de_legalite() {
10236 $this->begin_treatment(__METHOD__);
10237 $this->correct = true;
10238
10239 //
10240 if ($this->can_be_sended_to_cl() === true) {
10241 // Création de la task 'envoi_CL'
10242 $inst_task = $this->f->get_inst__om_dbform(array(
10243 "obj" => "task",
10244 "idx" => 0,
10245 ));
10246 $task_val = array(
10247 'type' => 'envoi_CL',
10248 'object_id' => $this->getVal('instruction'),
10249 'dossier' => $this->getVal('dossier'),
10250 );
10251 // Change l'état de la tâche de notification en fonction de l'état de
10252 // transmission du dossier d'instruction
10253 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10254 if ($this->f->is_option_mode_service_consulte_enabled() === false
10255 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10256 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10257 //
10258 $task_val['state'] = $inst_task::STATUS_DRAFT;
10259 }
10260 $add_task = $inst_task->add_task(array('val' => $task_val));
10261 if ($add_task === false) {
10262 $this->addToMessage(sprintf('%s %s',
10263 __("Une erreur s'est produite lors de la création tâche."),
10264 __("Veuillez contacter votre administrateur.")
10265 ));
10266 $this->correct = false;
10267 return $this->end_treatment(__METHOD__, false);
10268 }
10269 // Mise à jour du champs 'envoye_cl_platau'
10270 $instr_val = array(
10271 'envoye_cl_platau' => 't',
10272 );
10273 $res = $this->f->db->autoExecute(
10274 DB_PREFIXE.$this->table,
10275 $instr_val,
10276 DB_AUTOQUERY_UPDATE,
10277 $this->getCle($this->getVal($this->clePrimaire))
10278 );
10279 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
10280 if ($this->f->isDatabaseError($res, true) === true) {
10281 $this->addToMessage(sprintf('%s %s',
10282 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10283 __("Veuillez contacter votre administrateur.")
10284 ));
10285 $this->correct = false;
10286 return $this->end_treatment(__METHOD__, false);
10287 }
10288 // Message de validation à l'utilisateur
10289 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10290 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10291 }
10292 //
10293 return $this->end_treatment(__METHOD__, true);
10294 }
10295
10296
10297 /**
10298 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10299 *
10300 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10301 * la vue 'sousformulaire'.
10302 *
10303 * @return string
10304 */
10305 function get_back_link($view = "formulaire") {
10306 //
10307 $href = parent::get_back_link($view);
10308 //
10309 $crud = $this->get_action_crud();
10310
10311 // Redirection vers le formulaire de modification à la validation du
10312 // formulaire d'ajout si l'événement associé possède une lettre type
10313 if (($crud === 'create'
10314 || ($crud === null
10315 && $this->getParameter('maj') == 0))
10316 && $this->correct == true
10317 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10318
10319 // On instancie l'instruction
10320 $inst_instruction = $this->f->get_inst__om_dbform(array(
10321 "obj" => "instruction",
10322 "idx" => $this->valF[$this->clePrimaire],
10323 ));
10324
10325 // Si l'instruction n'est pas finalisée automatiquement
10326 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10327 $href = str_replace("&action=3", "&action=1", $href);
10328 //
10329 if (strpos($href, "&retour=tab") !== false) {
10330 $href = str_replace("&retour=tab", "&retour= form", $href);
10331 } else {
10332 $href .= "&retour=form";
10333 }
10334 }
10335 }
10336
10337 //
10338 return $href;
10339 }
10340
10341 public function view_json_data() {
10342 $this->checkAccessibility();
10343 $this->f->disableLog();
10344 $view = $this->get_json_data();
10345 printf(json_encode($view));
10346 }
10347
10348 public function get_json_data() {
10349 $val = array_combine($this->champs, $this->val);
10350 foreach ($val as $key => $value) {
10351 $val[$key] = strip_tags($value);
10352 }
10353 $val['tacite'] = 'f';
10354 $inst_ad = $this->f->get_inst__om_dbform(array(
10355 "obj" => "avis_decision",
10356 "idx" => $val['avis_decision'],
10357 ));
10358 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10359 $val['tacite'] = 't';
10360 }
10361 return $val;
10362 }
10363
10364 /**
10365 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10366 * comme événement lié le suivant définit dans l'événement de l'instruction
10367 * instanciée.
10368 *
10369 * @param string $next_type Correspond aux trois déclenchement automatique
10370 * de création d'instruction paramétré sur un événement.
10371 * @param integer $instruction Identifiant de l'instruction à instancier.
10372 * @return mixed Identifiant de l'instruction recherchée ou false.
10373 */
10374 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10375 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10376 return false;
10377 }
10378 $result = array();
10379 $evenements = array();
10380 if ($instruction === null) {
10381 $instruction = $this->getVal($this->clePrimaire);
10382 $evenement = $this->getVal('evenement');
10383 $dossier = $this->getVal('dossier');
10384 } else {
10385 $inst = $this->f->get_inst__om_dbform(array(
10386 "obj" => "instruction",
10387 "idx" => $instruction,
10388 ));
10389 $evenement = $inst->getVal('evenement');
10390 $dossier = $inst->getVal('dossier');
10391 }
10392 // Récupération de l'identifiant de l'événement paramétré comme suivant
10393 // sur l'instruction instanciée
10394 $qres = $this->f->get_one_result_from_db_query(
10395 sprintf(
10396 'SELECT
10397 evenement_%3$s
10398 FROM
10399 %1$sevenement
10400 WHERE
10401 evenement = %2$s',
10402 DB_PREFIXE,
10403 intval($evenement),
10404 $next_type
10405 ),
10406 array(
10407 "origin" => __METHOD__,
10408 "force_return" => true,
10409 )
10410 );
10411 if ($qres["code"] !== "OK") {
10412 return false;
10413 }
10414 $ev_next = $qres["result"];
10415 // Récupération de l'instruction dans le dossier utilisant l'événement
10416 // suivant identifié dans la requête précédente
10417 $qres = $this->f->get_one_result_from_db_query(
10418 sprintf(
10419 'SELECT
10420 MAX(instruction.instruction) as instruction
10421 FROM
10422 %1$sinstruction
10423 WHERE
10424 dossier = \'%3$s\'
10425 AND evenement = %2$s',
10426 DB_PREFIXE,
10427 intval($ev_next),
10428 $this->f->db->escapeSimple($dossier)
10429 ),
10430 array(
10431 "origin" => __METHOD__,
10432 "force_return" => true,
10433 )
10434 );
10435 if ($qres["code"] !== "OK") {
10436 return false;
10437 }
10438 return $qres["result"];
10439 }
10440
10441 public function get_related_instructions($instruction = null) {
10442 $result = array();
10443 $evenements = array();
10444 if ($instruction === null) {
10445 $instruction = $this->getVal($this->clePrimaire);
10446 $evenement = $this->getVal('evenement');
10447 $dossier = $this->getVal('dossier');
10448 } else {
10449 $inst = $this->f->get_inst__om_dbform(array(
10450 "obj" => "instruction",
10451 "idx" => $instruction,
10452 ));
10453 $evenement = $inst->getVal('evenement');
10454 $dossier = $inst->getVal('dossier');
10455 }
10456 //
10457 $qres = $this->f->get_one_result_from_db_query(
10458 sprintf(
10459 'SELECT
10460 evenement
10461 FROM
10462 %1$sevenement
10463 WHERE
10464 evenement_retour_ar = %2$s
10465 OR evenement_retour_signature = %2$s',
10466 DB_PREFIXE,
10467 intval($evenement)
10468 ),
10469 array(
10470 "origin" => __METHOD__,
10471 "force_return" => true,
10472 )
10473 );
10474 if ($qres["code"] !== "OK") {
10475 return false;
10476 }
10477 $ev_parent = $qres["result"];
10478 //
10479 $qres = $this->f->get_one_result_from_db_query(
10480 sprintf(
10481 'SELECT
10482 MAX(instruction.instruction) as instruction
10483 FROM
10484 %1$sinstruction
10485 WHERE
10486 dossier = \'%3$s\'
10487 AND evenement = %2$s',
10488 DB_PREFIXE,
10489 intval($ev_parent),
10490 $this->f->db->escapeSimple($dossier)
10491 ),
10492 array(
10493 "origin" => __METHOD__,
10494 "force_return" => true,
10495 )
10496 );
10497 if ($qres["code"] !== "OK") {
10498 return false;
10499 }
10500 $result[] = $qres["result"];
10501 //
10502 $qres = $this->f->get_one_result_from_db_query(
10503 sprintf(
10504 'SELECT
10505 evenement_retour_ar
10506 FROM
10507 %1$sevenement
10508 WHERE
10509 evenement = %2$d
10510 AND evenement_retour_ar != %3$d',
10511 DB_PREFIXE,
10512 intval($ev_parent),
10513 intval($evenement)
10514 ),
10515 array(
10516 "origin" => __METHOD__,
10517 "force_return" => true,
10518 )
10519 );
10520 if ($qres["code"] !== "OK") {
10521 return false;
10522 }
10523 $evenements[] = $qres["result"];
10524 //
10525 $qres = $this->f->get_one_result_from_db_query(
10526 sprintf(
10527 'SELECT
10528 evenement_retour_signature
10529 FROM
10530 %1$sevenement
10531 WHERE
10532 evenement = %2$s
10533 AND evenement_retour_signature != %3$s
10534 ',
10535 DB_PREFIXE,
10536 intval($ev_parent),
10537 intval($evenement)
10538 ),
10539 array(
10540 "origin" => __METHOD__,
10541 "force_return" => true,
10542 )
10543 );
10544 if ($qres["code"] !== "OK") {
10545 return false;
10546 }
10547 $evenements[] = $qres["result"];
10548 foreach ($evenements as $value) {
10549 if ($value !== null) {
10550 $qres = $this->f->get_one_result_from_db_query(
10551 sprintf(
10552 'SELECT
10553 MAX(instruction.instruction) as instruction
10554 FROM
10555 %1$sinstruction
10556 WHERE
10557 dossier = \'%3$s\'
10558 AND evenement = %2$s',
10559 DB_PREFIXE,
10560 intval($value),
10561 $this->f->db->escapeSimple($dossier)
10562 ),
10563 array(
10564 "origin" => __METHOD__,
10565 "force_return" => true,
10566 )
10567 );
10568 if ($qres["code"] !== "OK") {
10569 return false;
10570 }
10571 $result[] = $qres["result"];
10572 }
10573 }
10574 return $result;
10575 }
10576
10577 protected function getDocumentType($champ = null) {
10578 $evenementId = $this->getVal('evenement');
10579 if (! empty($evenementId)) {
10580 $evenement = $this->f->findObjectById('evenement', $evenementId);
10581 if (! empty($evenement)) {
10582 return __("Instruction").':'.$evenement->getVal('libelle');
10583 }
10584 }
10585 return parent::getDocumentType();
10586 }
10587
10588 /**
10589 * Récupère à l'aide d'une requête sql la liste des demandeurs
10590 * pouvant être notifié. C'est à dire les demandeurs acceptant
10591 * les notifications et pour lesquels une adresse mail existe.
10592 *
10593 * Dans le cas, d'une notification pour le portail citoyen, seul
10594 * le pétitionnaire principal doit être notifier et uniquement si
10595 * il a une adress mail et qu'il accepte les notifications.
10596 *
10597 * @param string identifiant du dossier
10598 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10599 * pour une notification de categorie portail
10600 * @return array liste des demandeurs pouvant être notifié
10601 */
10602 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10603 if ($idDossier === null) {
10604 $idDossier = $this->getVal('dossier');
10605 }
10606 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10607 // pour une notification depuis le portail citoyen
10608 $sqlPetitionnairePrincipal = '';
10609 // Gestion des champs nécessaires pour la notification d'un demandeur
10610 $condition_demandeur = "AND demandeur.notification = 't'
10611 AND demandeur.courriel IS NOT NULL";
10612 if ($portail === true) {
10613 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10614 $condition_demandeur = "AND (
10615 (notification = 't' AND courriel IS NOT NULL)
10616 OR demande.source_depot = 'portal'
10617 )";
10618 }
10619
10620 $listeDemandeursNotifiable = array();
10621
10622 // Requête de récupération des demandeurs
10623 $qres = $this->f->get_all_results_from_db_query(
10624 sprintf(
10625 'SELECT
10626 demandeur.demandeur,
10627 CASE
10628 WHEN demandeur.qualite=\'particulier\'
10629 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10630 ELSE
10631 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10632 END AS destinataire,
10633 demandeur.courriel,
10634 petitionnaire_principal
10635 FROM
10636 %1$sdossier
10637 INNER JOIN %1$slien_dossier_demandeur
10638 ON dossier.dossier = lien_dossier_demandeur.dossier
10639 INNER JOIN %1$sdemandeur
10640 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10641 -- Récupération de la plus ancienne demande associée au dossier (la demande
10642 -- de création du dossier)
10643 INNER JOIN (
10644 SELECT
10645 demande,
10646 dossier_instruction,
10647 source_depot
10648 FROM
10649 %1$sdemande
10650 WHERE
10651 dossier_instruction = \'%2$s\'
10652 ORDER BY
10653 demande ASC
10654 LIMIT 1
10655 ) as demande
10656 ON dossier.dossier = demande.dossier_instruction
10657 WHERE
10658 dossier.dossier = \'%2$s\'
10659 %3$s
10660 %4$s',
10661 DB_PREFIXE,
10662 $this->f->db->escapeSimple($idDossier),
10663 $condition_demandeur,
10664 $sqlPetitionnairePrincipal
10665 ),
10666 array(
10667 "origin" => __METHOD__
10668 )
10669 );
10670 // Récupération des infos des demandeurs et stockage dans un tableau
10671 // ayant pour clé les id des demandeurs
10672 foreach ($qres['result'] as $row) {
10673 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10674 }
10675
10676 return $listeDemandeursNotifiable;
10677 }
10678
10679 /**
10680 * Renvoie la liste des notifications liées à l'instruction
10681 *
10682 * @param integer id de l'instruction dont on cherche les notifications
10683 * @return array liste des instruction_notification liés à l'instruction
10684 */
10685 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10686 $whereTypeTache = '';
10687 $sqlTaskNull = 'INNER';
10688 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10689 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10690 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10691 // paramétrage
10692 if(is_bool($nonLieTache) && $nonLieTache === true) {
10693 $sqlTaskNull = 'LEFT';
10694 }
10695 if ($typeNotification != null) {
10696 if (is_array($typeNotification)) {
10697 $whereTypeTache = sprintf(
10698 'AND (task.type IN (%1$s))',
10699 "'".implode("', '", $typeNotification)."'"
10700 );
10701 } else {
10702 $whereTypeTache = sprintf(
10703 'AND (task.type = \'%1$s\')',
10704 $typeNotification
10705 );
10706 }
10707 }
10708 $listeInstrNotif = array();
10709 $qres = $this->f->get_all_results_from_db_query(
10710 sprintf('
10711 SELECT
10712 instruction_notification.instruction_notification
10713 FROM
10714 %1$sinstruction_notification
10715 %4$s JOIN %1$stask
10716 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10717 %3$s
10718 WHERE
10719 instruction = %2$s',
10720 DB_PREFIXE,
10721 intval($id_instruction),
10722 $whereTypeTache,
10723 $sqlTaskNull
10724 ),
10725 array(
10726 "origin" => __METHOD__
10727 )
10728 );
10729 foreach ($qres['result'] as $row) {
10730 $listeInstrNotif[] = $row['instruction_notification'];
10731 }
10732 return $listeInstrNotif;
10733 }
10734
10735 /**
10736 * Crée une clé d'accès unique permettant à un utilisateur
10737 * anonyme de récupérer le document.
10738 *
10739 * @return string clé d'accès du document
10740 */
10741 protected function getCleAccesDocument() {
10742 // Initialisation d'un tableau
10743 $number_list = array();
10744
10745 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10746 for ($i = 0; $i < 4; $i++) {
10747 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10748 }
10749
10750 // Transformation en chaîne tout en séparant les nombres par un "-"
10751 $result = implode('-', $number_list);
10752
10753 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10754 if ($this->getUidDocumentInstructionWithKey($result) != null) {
10755 return $this->getCleAccesDocument();
10756 }
10757
10758 //
10759 return $result;
10760 }
10761
10762 /**
10763 * Récupère une clé et renvoie l'uid du document liée à cette
10764 * clé. Si la clé n'existe pas renvoie null.
10765 *
10766 * @param string $cleGen clé dont on cherche l'instruction
10767 * @return integer|null
10768 */
10769 protected function getUidDocumentInstructionWithKey($cleGen) {
10770 $qres = $this->f->get_one_result_from_db_query(
10771 sprintf(
10772 'SELECT
10773 instruction.om_fichier_instruction
10774 FROM
10775 %1$sinstruction_notification_document
10776 LEFT JOIN %1$sinstruction
10777 ON instruction_notification_document.instruction = instruction.instruction
10778 WHERE
10779 instruction_notification_document.cle = \'%2$s\'',
10780 DB_PREFIXE,
10781 $this->f->db->escapeSimple($cleGen)
10782 ),
10783 array(
10784 "origin" => __METHOD__,
10785 )
10786 );
10787
10788 return $qres['result'];
10789 }
10790
10791 /**
10792 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10793 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10794 *
10795 * @param string $cleGen
10796 * @return instruction_notification
10797 */
10798 protected function getInstanceNotificationWithKey($key) {
10799 $qres = $this->f->get_one_result_from_db_query(
10800 sprintf(
10801 'SELECT
10802 instruction_notification
10803 FROM
10804 %1$sinstruction_notification_document
10805 WHERE
10806 cle = \'%2$s\'',
10807 DB_PREFIXE,
10808 $this->f->db->escapeSimple($key)
10809 ),
10810 array(
10811 "origin" => __METHOD__,
10812 )
10813 );
10814
10815 // Récupération de l'instance de notification
10816 $instNotif = $this->f->get_inst__om_dbform(array(
10817 "obj" => "instruction_notification",
10818 "idx" => $qres['result'],
10819 ));
10820 return $instNotif;
10821 }
10822
10823
10824 /**
10825 * Affiche la page de téléchargement du document de la notification.
10826 *
10827 * @param boolean $content_only Affiche le contenu seulement.
10828 *
10829 * @return void
10830 */
10831 public function view_telecharger_document_anonym() {
10832 // Par défaut on considère qu'on va afficher le formulaire
10833 $idx = 0;
10834 // Flag d'erreur
10835 $error = false;
10836 // Message d'erreur
10837 $message = '';
10838
10839 // Paramètres GET : récupération de la clé d'accès
10840 $cle_acces_document = $this->f->get_submitted_get_value('key');
10841 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10842 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10843 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10844 if ($uidFichier != null) {
10845 // Récupération du document
10846 $file = $this->f->storage->get($uidFichier);
10847
10848 // Headers
10849 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10850 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10851 header("Content-Type: ".$file['metadata']['mimetype']);
10852 header("Accept-Ranges: bytes");
10853 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10854 // Affichage du document
10855 echo $file['file_content'];
10856
10857 // Récupération de la date de premier accès et maj du suivi uniquement
10858 // si la date de 1er accès n'a pas encore été remplis
10859 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10860 if ($inst_notif->getVal('date_premier_acces') == null ||
10861 $inst_notif->getVal('date_premier_acces') == '') {
10862 $notif_val = array();
10863 foreach ($inst_notif->champs as $champ) {
10864 $notif_val[$champ] = $inst_notif->getVal($champ);
10865 }
10866 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10867 $notif_val['statut'] = 'vu';
10868 $notif_val['commentaire'] = 'Le document a été vu';
10869 $suivi_notif = $inst_notif->modifier($notif_val);
10870 }
10871
10872 } else {
10873 // Page vide 404
10874 printf('Ressource inexistante');
10875 header('HTTP/1.0 404 Not Found');
10876 }
10877 }
10878
10879 /**
10880 * Récupère le titre du document envoyé au parapheur
10881 */
10882 protected function getDocumentTitre($champ = null) {
10883 $title = $this->getTitle();
10884 $dossier = $this->getDossier();
10885 return $dossier.' '.$title;
10886 }
10887
10888 /**
10889 * Compose le nom du document à transmettre au parapheur.
10890 * Le nom ets composé de cette manière :
10891 * instruction_xxx_libelle_de_la_lettre_type_associee
10892 * ou xxx correspond au numéro de l'instruction
10893 */
10894 protected function getDocumentLibelle() {
10895 // Récupère le champ instruction
10896 $instruction = $this->getVal("instruction");
10897
10898 // Requête sql servant à récupérer le titre du document
10899 // TO_CHAR() introduit un espace avant l'affichage du nombre
10900 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10901 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10902 $documentLibelle = $this->f->get_one_result_from_db_query(
10903 sprintf(
10904 'SELECT
10905 CONCAT(
10906 \'instruction\',
10907 TO_CHAR(instruction.instruction, \'000\'),
10908 \'_\',
10909 LOWER(om_lettretype.libelle)
10910 ) AS nom_fichier
10911 FROM
10912 %1$sinstruction
10913 LEFT JOIN %1$som_lettretype
10914 ON om_lettretype.id = instruction.lettretype
10915 WHERE
10916 instruction = %2$d',
10917 DB_PREFIXE,
10918 intval($instruction)
10919 ),
10920 array(
10921 "origin" => __METHOD__,
10922 )
10923 );
10924
10925 $documentLibelle = $documentLibelle['result'];
10926
10927 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10928 // caractères spéciaux en '_'
10929 // La méthode normalize_string est utilisé pour gérer les accents
10930 $documentLibelle = $this->f->normalize_string($documentLibelle);
10931 // TODO : comparer cette liste et celle de la méthode normalize_string
10932 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10933 // liste
10934 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10935 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10936 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10937 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10938 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10939 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10940 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10941 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10942 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10943 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10944 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10945 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10946 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10947 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10948 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10949 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10950 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10951 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10952 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10953 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10954 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10955 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10956 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10957 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10958 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10959 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10960 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10961 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10962 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10963 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10964 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10965 );
10966
10967 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10968 }
10969
10970 /**
10971 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10972 * l'overlay de notification des demandeurs.
10973 */
10974 function getSubFormTitle($ent) {
10975 $actionSansPath = array('411', '420', '430');
10976 if (in_array($this->getParameter('maj'), $actionSansPath)) {
10977 return '';
10978 }
10979 return parent::getSubFormTitle($ent);
10980 }
10981
10982 /**
10983 * Traitement de la notification automatique des tiers consulté.
10984 *
10985 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10986 * récupérées ajoute une notification et une tâche de notification par mail.
10987 * La création de la tâche de notification par mail déclenchera l'envoi du mail
10988 * et la mise à jour du suivi.
10989 *
10990 * Les tiers notifiables sont ceux :
10991 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10992 * - ayant une habilitation dont le type est listé dans les paramètres de
10993 * notification de l’événement,
10994 * - intervenant sur la commune ou le département du dossier
10995 * - ayant au moins une adresse mail valide
10996 *
10997 * @param evenement instance de l'événement associée à l'instruction
10998 * @param dossier instance du dossier de l'instruction
10999 * @return boolean indique si le traitement à réussi
11000 */
11001 protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
11002 // Récupération de l'identifiant plat'au du service consultant
11003 $consultationEntrante = $dossier->get_inst_consultation_entrante();
11004 // Récupération de la liste des types d'habilitations autorisées pour
11005 // cette notification
11006 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
11007 // Récupération du département et de la commune du dossier
11008 $commune = $dossier->getVal('commune');
11009 // Le département est récupéré à partir de la commune du dossier donc si la
11010 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
11011 $idDepartement = null;
11012 if (! empty($commune)) {
11013 $departement = $dossier->get_inst_departement_dossier();
11014 $idDepartement = $departement->getVal($departement->clePrimaire);
11015 }
11016 // Récupération des courriels des tiers notifiables
11017 $tiersANotifier = $this->get_courriels_tiers_notifiable(
11018 $typesHabilitationsNotifiable,
11019 $consultationEntrante->getVal('service_consultant_id'),
11020 $commune,
11021 $idDepartement
11022 );
11023 // Traitement de chacune des listes de diffusion pour extraire les
11024 // courriels, vérifier la validité des courriels et envoyer la
11025 // notification
11026 $notificationSend = false;
11027 if (empty($tiersANotifier)) {
11028 $this->addToLog(
11029 sprintf(
11030 '%s() : %s %s : %s',
11031 __METHOD__,
11032 __("La récupération des tiers à échoué."),
11033 __('Paramétrage'),
11034 var_export(
11035 array(
11036 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
11037 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
11038 'id_commune' => $commune,
11039 'id_departement' => $idDepartement
11040 ),
11041 true
11042 )
11043 ),
11044 DEBUG_MODE
11045 );
11046 return false;
11047 }
11048 foreach($tiersANotifier as $tierANotifier) {
11049 // Découpe la liste de diffusion pour stocker les adresses mails
11050 // des tiers dans un tableau
11051 $courriels =
11052 array_filter(
11053 array_map(
11054 'trim',
11055 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
11056
11057 foreach ($courriels as $courriel) {
11058 // Pour chaque adresse mail vérifie si l'adresse est valide
11059 if (! $this->f->checkValidEmailAddress($courriel)) {
11060 continue;
11061 }
11062 $destinataire = array(
11063 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
11064 'courriel' => $courriel
11065 );
11066 // Si l'adresse est valide ajoute une nouvelle notification
11067 // et une tâche d'envoi de mails
11068 $idNotif = $this->ajouter_notification(
11069 $this->getVal($this->clePrimaire),
11070 $this->f->get_connected_user_login_name(),
11071 $destinataire,
11072 $this->get_dossier_instruction_om_collectivite(),
11073 array(),
11074 true
11075 );
11076 if ($idNotif === false) {
11077 $this->addToLog(
11078 __METHOD__.
11079 __("L'ajout de la notification a échoué."),
11080 DEBUG_MODE
11081 );
11082 return false;
11083 }
11084 // Création de la tache en lui donnant l'id de la notification
11085 $notification_by_task = $this->notification_by_task(
11086 $idNotif,
11087 $dossier->getVal('dossier'),
11088 'mail',
11089 'notification_tiers_consulte'
11090 );
11091 if ($notification_by_task === false) {
11092 $this->addToLog(
11093 __METHOD__.
11094 __("L'ajout de la tâche de notification a échoué."),
11095 DEBUG_MODE
11096 );
11097 $this->addToMessage(
11098 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11099 );
11100 return false;
11101 }
11102 $notificationSend = true;
11103 }
11104 }
11105 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11106 // valide, affiche un message dans les logs pour avoir un suivi.
11107 if (! $notificationSend) {
11108 $this->addToLog(
11109 sprintf(
11110 '%s %s : %s %s : %s',
11111 __METHOD__,
11112 __("Il n'y a pas de tiers notifiable pour l'instruction"),
11113 $evenement->getVal('libelle'),
11114 __("du dossier"),
11115 $this->getVal('dossier')
11116 ),
11117 DEBUG_MODE
11118 );
11119 }
11120 return true;
11121 }
11122
11123 /**
11124 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11125 * respectant les conditions suvantes :
11126 * - le tiers consulté dois accepté les notifications
11127 * - la liste de diffusion ne dois pas être vide
11128 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11129 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11130 * du tiers
11131 * - le type d'habilitation des tiers dois appartenir à la liste
11132 * fournie en paramètre
11133 * - le tiers dois être associé à la commune ou au département passé
11134 * en paramètre
11135 *
11136 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11137 * pouvant être notifiée
11138 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11139 * @param integer $commune identifiant de la commune du dossier
11140 * @param integer $departement identifiant du département du dossier
11141 *
11142 * @return array listes de diffusion des tiers notifiable
11143 */
11144 protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11145 // Si paramètre non renseigné alors ne renvoie rien
11146 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11147 return false;
11148 }
11149 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11150 $filtreServiceConsulteDI = '';
11151 if (! empty($idPlatau)) {
11152 $filtreServiceConsulteDI = sprintf(
11153 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11154 -- en charge du dossier
11155 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11156 OR tiers_consulte.uid_platau_acteur IS NULL)",
11157 $this->f->db->escapeSimple($idPlatau)
11158 );
11159 }
11160 $rst = $this->f->get_all_results_from_db_query(
11161 sprintf(
11162 'SELECT
11163 -- Tiers notifiables lié à la commune du dossier
11164 tiers_consulte.liste_diffusion,
11165 tiers_consulte.libelle
11166 FROM
11167 %1$shabilitation_tiers_consulte
11168 LEFT JOIN %1$stiers_consulte
11169 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11170 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11171 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11172 -- Conservation uniquement des tiers acteur de dossiers
11173 JOIN %1$slien_dossier_tiers
11174 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11175 WHERE
11176 tiers_consulte.accepte_notification_email IS TRUE
11177 AND tiers_consulte.liste_diffusion IS NOT NULL
11178 %3$s
11179 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11180 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11181 -- Filtre sur les tiers acteur du dossier
11182 AND lien_dossier_tiers.dossier = \'%6$s\'
11183 UNION
11184 SELECT
11185 -- Tiers notifiables lié au département du dossier
11186 tiers_consulte.liste_diffusion,
11187 tiers_consulte.libelle
11188 FROM
11189 %1$shabilitation_tiers_consulte
11190 LEFT JOIN %1$stiers_consulte
11191 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11192 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11193 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11194 -- Conservation uniquement des tiers acteur de dossiers
11195 JOIN %1$slien_dossier_tiers
11196 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11197 WHERE
11198 tiers_consulte.accepte_notification_email IS TRUE
11199 AND tiers_consulte.liste_diffusion IS NOT NULL
11200 %3$s
11201 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11202 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11203 -- Filtre sur les tiers acteur du dossier
11204 AND lien_dossier_tiers.dossier = \'%6$s\'',
11205 DB_PREFIXE,
11206 implode(', ', $typesHabilitations),
11207 $filtreServiceConsulteDI,
11208 intval($commune),
11209 intval($departement),
11210 $this->f->db->escapeSimple($this->getVal('dossier'))
11211 ),
11212 array(
11213 "origin" => __METHOD__
11214 )
11215 );
11216 // Faire un order by sur un union ne fonctionne pas. A la place
11217 // c'est le tableau des résultats qui est ordonné.
11218 usort($rst['result'], function($a, $b) {
11219 return strcmp($a['libelle'], $b['libelle']);
11220 });
11221 return $rst['result'];
11222 }
11223
11224 /**
11225 * Gestion de l'affichage PDF spécial vue la dif
11226 */
11227 function view_telecharger_editions () {
11228 /**
11229 * Affiche le contenu du fichier
11230 * @param string $uid Identifiant unique du fichier
11231 * @param object $f Instance de la classe utils
11232 * @param string $dl Téléchargement
11233 * @param string $mode Mode permettant de définir l'endroit où se situe le fichier
11234 * @ignore
11235 */
11236 function display_file_content($uid, $dl, $f, $mode) {
11237
11238 // Choix du support du filestorage
11239 switch ($mode) {
11240 case 'temporary':
11241 $file = $f->storage->get_temporary($uid);
11242 break;
11243
11244 default:
11245 $file = $f->storage->get($uid);
11246 break;
11247 }
11248
11249 // Affichage du contenu du fichier
11250 if($file != null) {
11251
11252 // Headers
11253 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
11254 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
11255 header("Content-Type: ".$file['metadata']['mimetype']);
11256 header("Accept-Ranges: bytes");
11257
11258 // Vérification pour la valeur de $dl
11259 if (!in_array($dl, array("download", "inline"))) {
11260 if ($f->getParameter("edition_output") == "download") {
11261 $dl="download";
11262 } else {
11263 $dl="inline";
11264 }
11265 }
11266
11267 // Vérification si on affiche simplement l'image, sinon envoi un dialogue de sauvegarde
11268 if ($dl=="download") {
11269 header("Content-Disposition: attachment; filename=\"".$file['metadata']['filename']."\";" );
11270 } else {
11271 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
11272
11273 }
11274
11275 // Rendu du fichier
11276 echo $file['file_content'];
11277
11278 } else {
11279 // Retour à l'accueil + affichage de l'erreur
11280 $f->displayMessage("error", __("Le fichier n'existe pas ou n'est pas accessible."));
11281
11282 }
11283 }
11284
11285 $this->f->displayMessage("info", __("TEST Page Start. "));
11286
11287 $f = $this->f;
11288 //
11289 $f->disableLog();
11290 // Initialisation des paramètres
11291 $params = array(
11292 "uid" => array(
11293 "default_value" => "",
11294 ),
11295 "dl" => array(
11296 "default_value" => "",
11297 ),
11298 "mode" => array(
11299 "default_value" => "filestorage",
11300 ),
11301 "obj" => array(
11302 "default_value" => "",
11303 ),
11304 "champ" => array(
11305 "default_value" => "",
11306 ),
11307 "idx" => array(
11308 "default_value" => "",
11309 ),
11310 );
11311 foreach ($this->f->get_initialized_parameters($params) as $key => $value) {
11312 ${$key} = $value;
11313 }
11314 // Si les paramètres nécessaires ne sont pas correctement fournis
11315 if (($obj == "" || $champ == "" || $idx == "")) {
11316 $this->f->displayMessage("error", __("Les parametres transmis ne sont pas corrects."));
11317 return;
11318 }
11319
11320 $this->addToLog(__METHOD__."(): idx = ".$idx." ", DEBUG_MODE);
11321
11322 if ( strpos($idx, 'STORAGE_') !== FALSE) {
11323 $idx = substr($idx, 8);
11324 $obj = 'storage';
11325 $champ = 'uid';
11326 }
11327 $object = $this->f->get_inst__om_dbform(array(
11328 "obj" => $obj,
11329 "idx" => $idx,
11330 ));
11331
11332 // Si pas d'objet envoi message de retour
11333 if ($object === null) {
11334 $f->displayMessage("error", __("Objet inexistant."));
11335 die();
11336 }
11337 $uid = $object->getVal($champ);
11338
11339 //Affichage du fichier
11340 display_file_content($uid, $dl, $f, $mode);
11341
11342 return;
11343 }
11344 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26