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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15973 - (show annotations)
Thu Oct 26 18:29:29 2023 UTC (13 months, 1 week ago) by softime
File size: 489203 byte(s)
Error occurred while calculating annotation data.
chore(branch): fusion de la branche d'intégration 6.2.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 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
478 $this->class_actions[410] = array(
479 "identifier" => "overlay_notification_manuelle",
480 "portlet" => array(
481 "libelle" => __("Notifier les pétitionnaires"),
482 "type" => "action-self",
483 "class" => "notifier_commune-16",
484 ),
485 "condition" => array(
486 "is_notifiable_by_task_manual",
487 "is_not_portail_notification_sans_annexe"
488 ),
489 "view" => "view_overlay_notification_manuelle",
490 "permission_suffix" => "modifier",
491 );
492
493 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
494 $this->class_actions[411] = array(
495 "identifier" => "notification_manuelle_portal",
496 "portlet" => array(
497 "libelle" => __("Notifier les pétitionnaires"),
498 "type" => "action-direct-with-confirmation",
499 "class" => "notifier_commune-16",
500 ),
501 "condition" => array(
502 "is_notifiable_by_task_manual",
503 "is_portail_notification_sans_annexe"
504 ),
505 "method" => "notifier_demandeur_principal_via_portal",
506 "permission_suffix" => "modifier",
507 );
508
509 // ACTION - 420 - Notifier les services consultés (mail)
510 $this->class_actions[420] = array(
511 "identifier" => "overlay_notification_service_consulte",
512 "portlet" => array(
513 "libelle" => __("Notifier les services consultés"),
514 "type" => "action-self",
515 "class" => "notifier_commune-16",
516 ),
517 "condition" => array(
518 "is_service_notifiable"
519 ),
520 "view" => "view_overlay_notification_service_consulte",
521 "permission_suffix" => "tab",
522 );
523
524 // ACTION - 430 - Notifier les tiers consultés (mail)
525 $this->class_actions[430] = array(
526 "identifier" => "overlay_notification_tiers_consulte",
527 "portlet" => array(
528 "libelle" => __("Notifier les tiers consultés"),
529 "type" => "action-self",
530 "class" => "notifier_commune-16",
531 ),
532 "condition" => array(
533 "is_tiers_notifiable"
534 ),
535 "view" => "view_overlay_notification_tiers_consulte",
536 "permission_suffix" => "tab",
537 );
538
539 //
540 $this->class_actions[403] = array(
541 "identifier" => "envoyer_au_controle_de_legalite",
542 "portlet" => array(
543 "libelle" => __("Envoyer au contrôle de légalité"),
544 "type" => "action-direct-with-confirmation",
545 "class" => "envoyer_au_controle_de_legalite-16",
546 ),
547 "view" => "formulaire",
548 "method" => "envoyer_au_controle_de_legalite",
549 "condition" => array(
550 "can_be_sended_to_cl"
551 ),
552 "permission_suffix" => "envoyer_au_controle_de_legalite",
553 );
554
555 //
556 $this->class_actions[998] = array(
557 "identifier" => "json_data",
558 "view" => "view_json_data",
559 "permission_suffix" => "consulter",
560 );
561 }
562
563 /**
564 * Clause select pour la requête de sélection des données de l'enregistrement.
565 *
566 * @return array
567 */
568 function get_var_sql_forminc__champs() {
569 return array(
570 "instruction",
571 "destinataire",
572 "instruction.evenement",
573 "instruction.commentaire",
574 "date_evenement",
575 "instruction.lettretype",
576 "signataire_arrete",
577 "flag_edition_integrale",
578 "om_final_instruction_utilisateur",
579 "date_finalisation_courrier",
580 "date_envoi_signature",
581 "date_retour_signature",
582 "date_envoi_rar",
583
584 "date_retour_rar",
585 "date_envoi_controle_legalite",
586 "date_retour_controle_legalite",
587
588 "numero_arrete",
589
590 "complement_om_html",
591 "'' as bible_auto",
592 "'' as bible",
593 "complement2_om_html",
594 "'' as bible2",
595 "complement3_om_html",
596 "'' as bible3",
597 "complement4_om_html",
598 "'' as bible4",
599
600 "titre_om_htmletat",
601 "corps_om_htmletatex",
602
603 "'' as btn_preview",
604 "'' as btn_redaction",
605
606 "'' as btn_refresh",
607 "'' as live_preview",
608
609 "dossier",
610 "instruction.action",
611 "instruction.delai",
612 "instruction.etat",
613 "instruction.autorite_competente",
614 "instruction.accord_tacite",
615 "instruction.delai_notification",
616 "instruction.avis_decision",
617 "archive_delai",
618 "archive_accord_tacite",
619 "archive_etat",
620 "archive_avis",
621 "archive_date_complet",
622 "archive_date_rejet",
623 "archive_date_limite",
624 "archive_date_notification_delai",
625 "archive_date_decision",
626 "archive_date_validite",
627 "archive_date_achevement",
628 "archive_date_conformite",
629 "archive_date_chantier",
630 "archive_date_dernier_depot",
631 "date_depot",
632 "date_depot_mairie",
633 "complement5_om_html",
634 "'' as bible5",
635 "complement6_om_html",
636 "'' as bible6",
637 "complement7_om_html",
638 "'' as bible7",
639 "complement8_om_html",
640 "'' as bible8",
641 "complement9_om_html",
642 "'' as bible9",
643 "complement10_om_html",
644 "'' as bible10",
645 "complement11_om_html",
646 "'' as bible11",
647 "complement12_om_html",
648 "complement13_om_html",
649 "complement14_om_html",
650 "complement15_om_html",
651 "archive_incompletude",
652 "archive_incomplet_notifie",
653 "archive_evenement_suivant_tacite",
654 "archive_evenement_suivant_tacite_incompletude",
655 "archive_etat_pendant_incompletude",
656 "archive_date_limite_incompletude",
657 "archive_delai_incompletude",
658 "archive_autorite_competente",
659 "code_barres",
660 "om_fichier_instruction",
661 "om_final_instruction",
662 "om_fichier_instruction_dossier_final",
663 "document_numerise",
664 "duree_validite_parametrage",
665 "duree_validite",
666 "created_by_commune",
667 "archive_date_cloture_instruction",
668 "archive_date_premiere_visite",
669 "archive_date_derniere_visite",
670 "archive_date_contradictoire",
671 "archive_date_retour_contradictoire",
672 "archive_date_ait",
673 "archive_date_transmission_parquet",
674 "archive_dossier_instruction_type",
675 "archive_date_affichage",
676 "pec_metier",
677 "archive_pec_metier",
678 "archive_a_qualifier",
679 "id_parapheur_signature",
680 "statut_signature",
681 "commentaire_signature",
682 "historique_signature",
683 "'' as suivi_notification",
684 "'' as suivi_notification_service",
685 "'' as suivi_notification_tiers",
686 "'' as suivi_notification_commune",
687
688 "'' as preview_edition",
689 "envoye_cl_platau",
690 "'' as log_instruction",
691 "parapheur_lien_page_signature"
692 );
693 }
694
695 /**
696 * CONDITION - is_edition_integrale_enabled
697 *
698 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
699 *
700 * @return boolean
701 */
702 function is_edition_integrale_enabled() {
703 if ($this->getVal("flag_edition_integrale") == 't') {
704 return true;
705 }
706 return false;
707 }
708
709 /**
710 * CONDITION - is_edition_integrale_not_enabled
711 *
712 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
713 *
714 * @return boolean
715 */
716 function is_edition_integrale_not_enabled() {
717 return !$this->is_edition_integrale_enabled();
718 }
719
720 /**
721 * CONDITION - is_option_redaction_libre_enabled
722 *
723 * Vérifie que l'option de rédaction libre est activée.
724 *
725 * @return boolean
726 */
727 function is_option_redaction_libre_enabled() {
728 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
729 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
730 }
731
732 /**
733 * CONDITION - is_option_parapheur_relecture_enabled
734 *
735 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
736 *
737 * @return boolean
738 */
739 function is_parapheur_relecture_parameter_enabled() {
740 //Instanciation de la classe electronicsignature
741 $inst_es = $this->get_electronicsignature_instance();
742 if ($inst_es === false) {
743 return false;
744 }
745
746 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
747 return false;
748 }
749
750 return true;
751 }
752
753 /**
754 * CONDITION - is_parapheur_annulation_parameter_enabled
755 *
756 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
757 *
758 * @return boolean
759 */
760 function is_parapheur_annulation_parameter_enabled() {
761 //Instanciation de la classe electronicsignature
762 $inst_es = $this->get_electronicsignature_instance();
763 if ($inst_es === false) {
764 return false;
765 }
766
767 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
768 return false;
769 }
770
771 return true;
772 }
773
774
775 /**
776 * CONDITION - is_sent_for_signature
777 *
778 * Vérifie que l'instruction a été envoyé à signature
779 *
780 * @return boolean
781 */
782 function is_sent_for_signature() {
783 // Si un parapheur a été configuré
784 // et que le champ id_parapheur_signature n'est pas vide
785 // que le status est différent de "canceled" ou "expired"
786 // alors l'évènement a été envoyé en signature
787 if ($this->has_connector_electronicsignature() === true
788 && empty($this->getVal("id_parapheur_signature")) === false
789 && ($this->getVal("statut_signature") != "canceled"
790 && $this->getVal("statut_signature") != "expired"
791 && $this->getVal("statut_signature") != "finished")) {
792 //
793 return true;
794 }
795
796 return false;
797 }
798
799 /**
800 * CONDITION - is_not_sent_for_signature
801 *
802 * Vérifie que l'instruction n'a pas été envoyé à signature
803 *
804 * @return boolean
805 */
806 function is_not_sent_for_signature() {
807 // Contrôle si l'utilisateur possède un bypass
808 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
809 if ($bypass == true) {
810 return true;
811 }
812
813 return !$this->is_sent_for_signature();
814 }
815
816
817 /**
818 * CONDITION - is_signed
819 *
820 * Vérifie que l'instruction a été signé
821 *
822 * @return boolean
823 */
824 function is_signed() {
825 // Si un parapheur a été configuré
826 // et que le champ id_parapheur_signature n'est pas vide
827 // et que le statut est égal à "finished"
828 // alors le document de l'instruciton à été signé
829 if ($this->has_connector_electronicsignature() === true
830 && empty($this->getVal("id_parapheur_signature")) === false
831 && $this->getVal("statut_signature") == "finished") {
832 //
833 return true;
834 }
835
836 return false;
837 }
838
839 /**
840 * CONDITION - is_signed
841 *
842 * Vérifie que l'instruction n'a pas été signée
843 *
844 * @return boolean
845 */
846 function is_not_signed() {
847 // Contrôle si l'utilisateur possède un bypass
848 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_apres_signature");
849 if ($bypass == true) {
850 return true;
851 }
852
853 return !$this->is_signed();
854 }
855
856
857 /**
858 * is_sent_to_cl
859 *
860 * Vérifie que l'instruction a été envoyé au contrôle de légalité
861 *
862 * @return boolean
863 */
864 function is_sent_to_cl() {
865 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
866 if ($this->getVal('envoye_cl_platau') === 't') {
867 //
868 return true;
869 }
870 //
871 return false;
872 }
873
874 /**
875 * CONDITION - is_portail_notification
876 *
877 * Vérifie si la notification est une notification de catégorie portail
878 *
879 * @return boolean
880 */
881 function is_portail_notification_sans_annexe() {
882 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
883 $ev = $this->get_inst_evenement($this->getVal('evenement'));
884 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
885 && $ev->getVal('notification') != 'notification_manuelle_annexe'
886 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
887 ) {
888 return true;
889 }
890 return false;
891 }
892
893 /**
894 * CONDITION - is_not_portail_notification
895 *
896 * Vérifie si la notification n'est pas une notification de catégorie portail
897 *
898 * @return boolean
899 */
900 function is_not_portail_notification_sans_annexe() {
901 return (! $this->is_portail_notification_sans_annexe());
902 }
903
904 /**
905 * CONDITION - can_be_signed
906 *
907 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
908 *
909 * @return boolean
910 */
911 function can_be_signed() {
912 // Instanciation de l'objet signataire_arrete
913 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
914 "obj" => "signataire_arrete",
915 "idx" => $this->getVal("signataire_arrete"),
916 ));
917 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
918 // possède une adresse email, on vérifie le champ id_parapheur_signature
919 // S'il est vide l'évènement peut être envoyé en signature
920 // S'il ne l'est pas, alors on vérifie le champ statut_signature
921 // Si la valeur de ce champ est égal à "canceled" ou "expired"
922 // alors l'évènement peut être envoyé en signature
923 if ($this->has_connector_electronicsignature() === true
924 && $this->getVal("om_final_instruction") == 't'
925 && empty($inst_signataire_arrete->getVal('email')) === false) {
926 //
927 if (empty($this->getVal("id_parapheur_signature")) === true
928 || $this->getVal("statut_signature") == "canceled"
929 || $this->getVal("statut_signature") == "expired") {
930 //
931 return true;
932 }
933 }
934
935 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
936 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
937 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
938 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
939 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
940
941 return false;
942 }
943
944 /**
945 * CONDITION - has_connector_electronicsignature
946 *
947 * Vérifie qu'un parapheur est paramétré
948 *
949 * @return boolean
950 */
951 function has_connector_electronicsignature() {
952 $inst_es = $this->get_electronicsignature_instance(false);
953 if ($inst_es === false) {
954 return false;
955 }
956 return true;
957 }
958
959 /**
960 * CONDITION - can_display_parapheur
961 *
962 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
963 *
964 * @return boolean
965 */
966 function can_display_parapheur() {
967 $evenement_id = $this->getVal("evenement");
968 $inst_evenement = $this->get_inst_evenement($evenement_id);
969 if ($this->has_connector_electronicsignature() === true
970 && $inst_evenement->getVal('lettretype') !== ''
971 && $inst_evenement->getVal('lettretype') !== null
972 && (empty($this->getVal("id_parapheur_signature")) === false
973 || empty($this->getVal("historique_signature")) === false)) {
974 //
975 return true;
976 }
977
978 return false;
979 }
980
981 /**
982 * CONDITION - can_display_notification
983 *
984 * Vérifie que le champs "Suivi notification" est affichable
985 *
986 * @return boolean
987 */
988 function can_display_notification_demandeur() {
989 // Le suivi des notification est affiché si l'événement est notifiable
990 // et si des notifications ont été envoyées
991 $evenement_id = $this->getVal("evenement");
992 $inst_evenement = $this->get_inst_evenement($evenement_id);
993 if ($inst_evenement->getVal('notification') != null &&
994 $inst_evenement->getVal('notification') != '') {
995 // Des notifications ont été envoyé si il existe au moins une notification
996 // liées à l'instruction
997 $idsNotifs = $this->get_instruction_notification(
998 $this->getVal($this->clePrimaire),
999 array(
1000 'notification_recepisse',
1001 'notification_instruction',
1002 'notification_decision',
1003 ),
1004 true
1005 );
1006 if (isset($idsNotifs) && $idsNotifs !== array()) {
1007 return true;
1008 }
1009 }
1010 return false;
1011 }
1012
1013 /**
1014 * CONDITION - can_display_notification
1015 *
1016 * Vérifie que le champs "suivi_notification_service" est affichable
1017 *
1018 * @return boolean
1019 */
1020 function can_display_notification_service() {
1021 // Le suivi des notification est affiché si l'événement est notifiable
1022 // et si des notifications ont été envoyées
1023 $evenement_id = $this->getVal("evenement");
1024 $inst_evenement = $this->get_inst_evenement($evenement_id);
1025 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1026 // Des notifications ont été envoyé si il existe au moins une notification
1027 // de type notification_service_consulte liées à l'instruction
1028 $idsNotifs = $this->get_instruction_notification(
1029 $this->getVal($this->clePrimaire),
1030 'notification_service_consulte'
1031 );
1032 if (isset($idsNotifs) && $idsNotifs !== array()) {
1033 return true;
1034 }
1035 }
1036 return false;
1037 }
1038
1039
1040 /**
1041 * CONDITION - can_display_notification_tiers
1042 *
1043 * Vérifie que le champs "suivi_notification_tiers" est affichable
1044 *
1045 * @return boolean
1046 */
1047 function can_display_notification_tiers() {
1048 // Le suivi des notification est affiché si l'événement est notifiable
1049 // et si des notifications ont été envoyées
1050 $evenement_id = $this->getVal("evenement");
1051 $inst_evenement = $this->get_inst_evenement($evenement_id);
1052 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1053 // Des notifications ont été envoyé si il existe au moins une notification
1054 // de type notification_tiers_consulte liées à l'instruction
1055 $idsNotifs = $this->get_instruction_notification(
1056 $this->getVal($this->clePrimaire),
1057 'notification_tiers_consulte'
1058 );
1059 if (isset($idsNotifs) && $idsNotifs !== array()) {
1060 return true;
1061 }
1062 }
1063 return false;
1064 }
1065
1066 /**
1067 * CONDITION - can_display_notification_commune
1068 *
1069 * Vérifie que le champs "suivi_notification_commune" est affichable
1070 *
1071 * @return boolean
1072 */
1073 function can_display_notification_commune() {
1074 // Le suivi des notification si il existe au moins une notification
1075 // de type notification_depot_demat liées à l'instruction
1076 $idsNotifs = $this->get_instruction_notification(
1077 $this->getVal($this->clePrimaire),
1078 array('notification_depot_demat', 'notification_commune')
1079 );
1080 if (isset($idsNotifs) && $idsNotifs !== array()) {
1081 return true;
1082 }
1083 return false;
1084 }
1085
1086 /**
1087 * TREATMENT - disable_edition_integrale.
1088 *
1089 * Cette methode permet de passer la consultation en "lu"
1090 *
1091 * @return boolean true si maj effectué false sinon
1092 */
1093 function disable_edition_integrale() {
1094 // Cette méthode permet d'exécuter une routine en début des méthodes
1095 // dites de TREATMENT.
1096 $this->begin_treatment(__METHOD__);
1097 $this->correct = true;
1098 $valF = array(
1099 "flag_edition_integrale" => false,
1100 "titre_om_htmletat" => null,
1101 "corps_om_htmletatex" => null,
1102 );
1103 $res = $this->f->db->autoExecute(
1104 DB_PREFIXE.$this->table,
1105 $valF,
1106 DB_AUTOQUERY_UPDATE,
1107 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1108 );
1109 if ($this->f->isDatabaseError($res, true)) {
1110 // Appel de la methode de recuperation des erreurs
1111 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1112 $this->correct = false;
1113 // Termine le traitement
1114 return $this->end_treatment(__METHOD__, false);
1115 } else {
1116 $this->addToMessage(_("Rédaction par compléments activé."));
1117 return $this->end_treatment(__METHOD__, true);
1118 }
1119
1120 // Termine le traitement
1121 return $this->end_treatment(__METHOD__, false);
1122 }
1123
1124 /**
1125 * TREATMENT - enable_edition_integrale.
1126 *
1127 * Cette methode permet de passer la consultation en "lu"
1128 *
1129 * @return boolean true si maj effectué false sinon
1130 */
1131 function enable_edition_integrale() {
1132 // Cette méthode permet d'exécuter une routine en début des méthodes
1133 // dites de TREATMENT.
1134 $this->begin_treatment(__METHOD__);
1135 $this->correct = true;
1136
1137 // Récupère la collectivite du dossier d'instruction
1138 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1139 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1140 //
1141 $params = array(
1142 "specific" => array(
1143 "corps" => array(
1144 "mode" => "get",
1145 )
1146 ),
1147 );
1148 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1149 $corps = $result['pdf_output'];
1150 //
1151 $params = array(
1152 "specific" => array(
1153 "titre" => array(
1154 "mode" => "get",
1155 )
1156 ),
1157 );
1158 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1159 $titre = $result['pdf_output'];
1160 //
1161 $valF = array(
1162 "flag_edition_integrale" => true,
1163 "titre_om_htmletat" => $titre,
1164 "corps_om_htmletatex" => $corps,
1165 );
1166 $res = $this->f->db->autoExecute(
1167 DB_PREFIXE.$this->table,
1168 $valF,
1169 DB_AUTOQUERY_UPDATE,
1170 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1171 );
1172 if ($this->f->isDatabaseError($res, true)) {
1173 // Appel de la methode de recuperation des erreurs
1174 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1175 $this->correct = false;
1176 // Termine le traitement
1177 return $this->end_treatment(__METHOD__, false);
1178 } else {
1179 $this->addToMessage(_("Rédaction libre activé."));
1180 return $this->end_treatment(__METHOD__, true);
1181 }
1182
1183 // Termine le traitement
1184 return $this->end_treatment(__METHOD__, false);
1185 }
1186
1187 /**
1188 * Cette méthode instancie le dossier à partir de l'identifiant passé
1189 * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1190 * associé au dossier.
1191 * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1192 * renverra NULL
1193 *
1194 * @param string identifiant du dossier
1195 * @return null|string null ou identifiant du DA
1196 */
1197 function getNumDemandeAutorFromDossier($id) {
1198 if (!isset($id)) {
1199 return NULL;
1200 }
1201
1202 $dossier = $this->f->get_inst__om_dbform(array(
1203 'obj' => 'dossier',
1204 'idx' => $id,
1205 ));
1206
1207 return $dossier->getVal('dossier_autorisation');
1208 }
1209
1210
1211 function setType(&$form, $maj) {
1212 // Récupération du mode de l'action
1213 $crud = $this->get_action_crud($maj);
1214 // Récupère la collectivité du dossier d'instruction
1215 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1216
1217 // Cache tous les champs
1218 foreach ($this->champs as $value) {
1219 $form->setType($value, 'hidden');
1220 }
1221
1222 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1223 if ($this->can_display_parapheur() === true && $maj == 3) {
1224 $form->setType('statut_signature', 'selectstatic');
1225 $form->setType('historique_signature', 'jsontotab');
1226 if ($this->getVal('commentaire_signature') == null) {
1227 $form->setType('commentaire_signature', 'hidden');
1228 } else {
1229 $form->setType('commentaire_signature', 'hiddenstatic');
1230 }
1231 }
1232
1233 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1234 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1235 $form->setType('suivi_notification', 'jsontotab');
1236 }
1237 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1238 if ($maj == 3 && $this->can_display_notification_service() === true) {
1239 $form->setType('suivi_notification_service', 'jsontotab');
1240 }
1241 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1242 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1243 $form->setType('suivi_notification_tiers', 'jsontotab');
1244 }
1245 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1246 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1247 $form->setType('suivi_notification_commune', 'jsontotab');
1248 }
1249
1250 // MODE AJOUTER
1251 if ($this->getParameter('maj') == 0) {
1252 $form->setType('commentaire', 'textareahidden');
1253 // Si l'option est active passage du champ date en lecture seule
1254 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1255 $form->setType("date_evenement", "hiddenstaticdate");
1256 } else {
1257 $form->setType("date_evenement", "date");
1258 }
1259 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1260 $form->setType("evenement", "selecthiddenstatic");
1261 } else {
1262 $form->setType("evenement", "select");
1263 }
1264 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1265 $form->setType("signataire_arrete", "selecthiddenstatic");
1266 } else {
1267 $form->setType("signataire_arrete", "select");
1268 }
1269 if ($this->is_option_redaction_libre_enabled() === true) {
1270 $form->setType("flag_edition_integrale", "select");
1271 }
1272 }
1273
1274 // MODE MODIFIER
1275 if ($this->getParameter('maj') == 1) {
1276 // Si l'option est active passage du champ date en lecture seule
1277 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1278 $form->setType("date_evenement", "hiddenstaticdate");
1279 } else {
1280 $form->setType("date_evenement", "date");
1281 }
1282 $form->setType("evenement", "selecthiddenstatic");
1283 if ($this->has_an_edition() === true) {
1284 $form->setType('lettretype', 'hiddenstatic');
1285 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1286 $form->setType("signataire_arrete", "selecthiddenstatic");
1287 } else {
1288 $form->setType("signataire_arrete", "select");
1289 }
1290 if ($this->getVal("flag_edition_integrale") == "t") {
1291 $form->setType("titre_om_htmletat", "htmlEtat");
1292 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1293 } else {
1294 $form->setType("complement_om_html", "html");
1295 $form->setType("complement2_om_html", "html");
1296 $form->setType("complement3_om_html", "html");
1297 $form->setType("complement4_om_html", "html");
1298 $form->setType('bible_auto', 'httpclick');
1299 $form->setType('bible', 'httpclick');
1300 $form->setType('bible2', 'httpclick');
1301 $form->setType('bible3', 'httpclick');
1302 $form->setType('bible4', 'httpclick');
1303 }
1304 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1305 //
1306 $form->setType('btn_refresh', 'httpclickbutton');
1307 $form->setType('btn_preview', 'httpclickbutton');
1308 $form->setType('btn_redaction', 'httpclickbutton');
1309 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1310 // pour identifiant le champ de prévisualisation et régler sa taille à
1311 // l'affichage du champ. En cas de modification, le selecteur doit également
1312 // être mis à jour
1313 $form->setType('live_preview', 'previsualiser_pdf');
1314 }
1315
1316 // necessaire pour calcul de date en modification
1317 //$form->setType('delai', 'hiddenstatic');
1318 // les administrateurs technique et fonctionnel peuvent
1319 // modifier tous les champs de date
1320 // si l'instruction a déjà été finalisée au moins une fois
1321 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1322 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1323 && $this->getVal("date_finalisation_courrier") != '') {
1324 //
1325 $form->setType('date_envoi_signature', 'date');
1326 $form->setType('date_retour_signature', 'date');
1327 if ($this->is_sent_for_signature() === true
1328 && $this->is_signed() === true) {
1329 //
1330 $form->setType("date_envoi_signature", "datereadonly");
1331 $form->setType("date_retour_signature", "datereadonly");
1332 }
1333 $form->setType('date_envoi_rar', 'date');
1334 $form->setType('date_retour_rar', 'date');
1335 $form->setType('date_envoi_controle_legalite', 'date');
1336 if ($this->is_sent_to_cl() === true) {
1337 $form->setType("date_envoi_controle_legalite", "datedisabled");
1338 }
1339 $form->setType('date_retour_controle_legalite', 'date');
1340 $form->setType('date_finalisation_courrier', 'date');
1341 }
1342 }
1343 }
1344
1345 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1346 if ($this->getParameter('maj') == 3
1347 || $this->getParameter('maj') == 2
1348 || $this->getParameter('maj') == 125
1349 || $this->getParameter('maj') == 410) {
1350 //
1351 $form->setType("date_evenement", "datestatic");
1352 $form->setType("evenement", "selecthiddenstatic");
1353 if ($this->has_an_edition() === true) {
1354 $form->setType('lettretype', 'hiddenstatic');
1355 $form->setType("signataire_arrete", "selecthiddenstatic");
1356 if ($this->getVal("om_final_instruction") == 't') {
1357 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1358 } else {
1359 $form->setType('om_final_instruction_utilisateur', 'hidden');
1360 }
1361 }
1362 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1363 $form->setType('commentaire', 'textareastatic');
1364 }
1365 }
1366
1367 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1368 if ($this->getParameter('maj') == 3
1369 || $this->getParameter('maj') == 2
1370 || $this->getParameter('maj') == 410) {
1371 // Si il n'y a pas de lettre type (edition) associé à l'événement
1372 // les dates de suivi ne sont pas affichée
1373 if ($this->has_an_edition() === true) {
1374 $form->setType('date_envoi_signature', 'datestatic');
1375 $form->setType('date_retour_signature', 'datestatic');
1376 $form->setType('date_envoi_rar', 'datestatic');
1377 $form->setType('date_retour_rar', 'datestatic');
1378 $form->setType('date_envoi_controle_legalite', 'datestatic');
1379 $form->setType('date_retour_controle_legalite', 'datestatic');
1380 $form->setType('date_finalisation_courrier', 'datestatic');
1381 if ($this->getVal("flag_edition_integrale") == "t") {
1382 $form->setType("titre_om_htmletat", "htmlstatic");
1383 $form->setType("corps_om_htmletatex", "htmlstatic");
1384 } else {
1385 $form->setType("complement_om_html", "htmlstatic");
1386 $form->setType("complement2_om_html", "htmlstatic");
1387 $form->setType("complement3_om_html", "htmlstatic");
1388 $form->setType("complement4_om_html", "htmlstatic");
1389 }
1390 }
1391 }
1392
1393 // MODE SUIVI DES DATES 125
1394 if ($this->getParameter('maj') == 125) {
1395 $form->setType("date_evenement", "hiddenstaticdate");
1396 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1397 $form->setType('date_envoi_signature', 'date');
1398 $form->setType('date_retour_signature', 'date');
1399 if ($this->is_sent_for_signature() === true
1400 || $this->is_signed() === true) {
1401 //
1402 $form->setType("date_envoi_signature", "datereadonly");
1403 $form->setType("date_retour_signature", "datereadonly");
1404 }
1405 $form->setType('date_envoi_rar', 'date');
1406 $form->setType('date_retour_rar', 'date');
1407 $form->setType('date_envoi_controle_legalite', 'date');
1408 if ($this->is_sent_to_cl() === true) {
1409 $form->setType("date_envoi_controle_legalite", "datedisabled");
1410 }
1411 $form->setType('date_retour_controle_legalite', 'date');
1412 $form->setType('date_finalisation_courrier', 'date');
1413 }
1414
1415 if ($maj == 401) {
1416 foreach ($this->champs as $champ) {
1417 $form->setType($champ, 'hidden');
1418 }
1419 $form->setType('preview_edition', 'previsualiser');
1420 }
1421
1422 // Si l'instruction a été envoyé au contrôle de légalité et que la
1423 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1424 // l'utilisateur que l'envoi au cl est en cours de traitement.
1425 if ($this->is_sent_to_cl() === true
1426 && empty($this->getVal('date_envoi_controle_legalite'))
1427 && $maj == 3) {
1428 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1429 }
1430 }
1431
1432 function setOnchange(&$form,$maj){
1433 parent::setOnchange($form,$maj);
1434
1435 // MODE AJOUTER
1436 if ($this->getParameter('maj') == 0) {
1437 $form->setOnchange(
1438 "evenement",
1439 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1440 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1441 );
1442 }
1443 }
1444
1445 function evenement_has_an_edition($evenement_id) {
1446 $evenement = $this->get_inst_evenement($evenement_id);
1447 $lettretype = $evenement->getVal('lettretype');
1448 if ($lettretype !== '' && $lettretype !== null) {
1449 return true;
1450 }
1451 return false;
1452 }
1453
1454 function view_evenement_has_an_edition_json() {
1455 $json_return = array(
1456 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1457 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1458 );
1459 echo json_encode($json_return);
1460 }
1461
1462 function evenement_has_a_commentaire($evenement_id) {
1463 $evenement = $this->get_inst_evenement($evenement_id);
1464 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1465 }
1466
1467 function view_evenement_has_a_commentaire_json() {
1468 $json_return = array(
1469 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1470 );
1471 echo json_encode($json_return);
1472 }
1473
1474
1475 /**
1476 * CONDITION - can_be_sended_to_cl
1477 *
1478 * Vérifie que le contrôle de légalité est disponible
1479 *
1480 * @return boolean
1481 */
1482 function can_be_sended_to_cl() {
1483 // Si l'instruction a une édition
1484 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1485 // par Plat'AU
1486 // et que la date de retour signature est renseignée
1487 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1488 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1489 if ($this->has_an_edition() === true) {
1490 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1491 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1492 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1493 && empty($this->getVal('date_retour_signature')) === false
1494 && empty($this->getVal('date_envoi_controle_legalite')) === true
1495 && $this->getVal('envoye_cl_platau') === 'f'
1496 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1497 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1498 //
1499 return true;
1500 }
1501 }
1502 //
1503 return false;
1504 }
1505
1506 /**
1507 *
1508 * @return string
1509 */
1510 function get_var_sql_forminc__sql_signataire_arrete() {
1511 return sprintf(
1512 "SELECT
1513 signataire_arrete.signataire_arrete,
1514 CONCAT_WS(
1515 ' - ',
1516 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1517 signataire_habilitation.libelle,
1518 signataire_arrete.description
1519 )
1520 FROM
1521 %1\$ssignataire_arrete
1522 LEFT JOIN %1\$ssignataire_habilitation
1523 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1524 WHERE
1525 ((signataire_arrete.om_validite_debut IS NULL
1526 AND (signataire_arrete.om_validite_fin IS NULL
1527 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1528 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1529 AND (signataire_arrete.om_validite_fin IS NULL
1530 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1531 ORDER BY
1532 signataire_arrete.prenom,
1533 signataire_arrete.nom",
1534 DB_PREFIXE
1535 );
1536 }
1537
1538 /**
1539 *
1540 * @return string
1541 */
1542 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1543 return sprintf(
1544 "SELECT
1545 signataire_arrete.signataire_arrete,
1546 CONCAT_WS(
1547 ' - ',
1548 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1549 signataire_habilitation.libelle,
1550 signataire_arrete.description
1551 )
1552 FROM
1553 %1\$ssignataire_arrete
1554 LEFT JOIN %1\$ssignataire_habilitation
1555 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1556 WHERE
1557 signataire_arrete.signataire_arrete = <idx>",
1558 DB_PREFIXE
1559 );
1560 }
1561
1562 /**
1563 *
1564 * @return string
1565 */
1566 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1567 return sprintf(
1568 "SELECT
1569 signataire_arrete.signataire_arrete,
1570 CONCAT_WS(
1571 ' - ',
1572 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1573 signataire_habilitation.libelle,
1574 signataire_arrete.description
1575 )
1576 FROM
1577 %1\$ssignataire_arrete
1578 LEFT JOIN %1\$som_collectivite
1579 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1580 LEFT JOIN %1\$ssignataire_habilitation
1581 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1582 WHERE
1583 ((signataire_arrete.om_validite_debut IS NULL
1584 AND (signataire_arrete.om_validite_fin IS NULL
1585 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1586 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1587 AND (signataire_arrete.om_validite_fin IS NULL
1588 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1589 AND (om_collectivite.niveau = '2'
1590 OR signataire_arrete.om_collectivite = <collectivite_di>)
1591 ORDER BY
1592 signataire_arrete.prenom, signataire_arrete.nom",
1593 DB_PREFIXE
1594 );
1595 }
1596
1597 /**
1598 *
1599 * @return string
1600 */
1601 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1602 return sprintf(
1603 "SELECT
1604 signataire_arrete.signataire_arrete,
1605 CONCAT_WS(
1606 ' - ',
1607 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1608 signataire_habilitation.libelle,
1609 signataire_arrete.description
1610 )
1611 FROM
1612 %1\$ssignataire_arrete
1613 LEFT JOIN %1\$ssignataire_habilitation
1614 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1615 WHERE
1616 ((signataire_arrete.om_validite_debut IS NULL
1617 AND (signataire_arrete.om_validite_fin IS NULL
1618 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1619 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1620 AND (signataire_arrete.om_validite_fin IS NULL
1621 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1622 AND signataire_arrete.defaut IS TRUE
1623 ORDER BY
1624 signataire_arrete.prenom, signataire_arrete.nom",
1625 DB_PREFIXE
1626 );
1627 }
1628
1629 /**
1630 *
1631 * @return string
1632 */
1633 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1634 return sprintf(
1635 "SELECT
1636 signataire_arrete.signataire_arrete,
1637 CONCAT_WS(
1638 ' - ',
1639 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1640 signataire_habilitation.libelle,
1641 signataire_arrete.description
1642 )
1643 FROM
1644 %1\$ssignataire_arrete
1645 LEFT JOIN %1\$ssignataire_habilitation
1646 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1647 LEFT JOIN %1\$som_collectivite
1648 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1649 WHERE
1650 ((signataire_arrete.om_validite_debut IS NULL
1651 AND (signataire_arrete.om_validite_fin IS NULL
1652 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1653 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1654 AND (signataire_arrete.om_validite_fin IS NULL
1655 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1656 AND signataire_arrete.defaut IS TRUE
1657 AND (om_collectivite.niveau = '2'
1658 OR signataire_arrete.om_collectivite = <collectivite_di>)
1659 ORDER BY
1660 signataire_arrete.prenom,
1661 signataire_arrete.nom",
1662 DB_PREFIXE
1663 );
1664 }
1665
1666 /**
1667 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1668 * dont l'identifiant a été passé en paramètre dans l'url.
1669 *
1670 * @return array
1671 */
1672 function get_var_sql_forminc__sql_evenement() {
1673 // Récupération du numéro de dossier
1674 $dossier = $this->getParameter("idxformulaire");
1675 // Si changement de décision par instructeur commune
1676 $filter = '';
1677 if ($this->f->isUserInstructeur() === true
1678 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1679 && $this->isInstrCanChangeDecision($dossier) === true) {
1680 $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1681 }
1682 // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1683 // de déterminer si il s'agit d'évènements suggérés.
1684 $qres = $this->f->get_all_results_from_db_query(
1685 sprintf(
1686 'SELECT
1687 DISTINCT(evenement.evenement),
1688 evenement.libelle,
1689 -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1690 CASE WHEN evenement_suggere_dossier.evenement IS NULL
1691 THEN FALSE
1692 ELSE TRUE
1693 END AS is_suggested
1694 FROM
1695 -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1696 -- selon le type de dossier et l état du dossier.
1697 %1$sevenement
1698 JOIN %1$slien_dossier_instruction_type_evenement
1699 ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1700 JOIN %1$stransition
1701 ON evenement.evenement = transition.evenement
1702 JOIN %1$sdossier
1703 ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1704 AND transition.etat = dossier.etat
1705 -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1706 LEFT JOIN (
1707 SELECT
1708 lien_sig_contrainte_evenement.evenement,
1709 dossier.dossier
1710 FROM
1711 %1$slien_sig_contrainte_evenement
1712 JOIN %1$ssig_contrainte
1713 ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1714 JOIN %1$slien_sig_contrainte_dossier_instruction_type
1715 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1716 JOIN %1$slien_sig_contrainte_om_collectivite
1717 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1718 JOIN %1$scontrainte
1719 ON sig_contrainte.libelle = contrainte.libelle
1720 JOIN %1$sdossier_contrainte
1721 ON contrainte.contrainte = dossier_contrainte.contrainte
1722 JOIN %1$sdossier
1723 ON dossier_contrainte.dossier = dossier.dossier
1724 AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1725 JOIN %1$som_collectivite
1726 ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1727 AND (dossier.om_collectivite = om_collectivite.om_collectivite
1728 OR om_collectivite.niveau = \'2\')
1729 ) AS evenement_suggere_dossier
1730 ON evenement.evenement = evenement_suggere_dossier.evenement
1731 AND dossier.dossier = evenement_suggere_dossier.dossier
1732 WHERE
1733 dossier.dossier = \'%2$s\'
1734 %3$s
1735 ORDER BY
1736 is_suggested DESC,
1737 evenement.libelle',
1738 DB_PREFIXE,
1739 $this->f->db->escapeSimple($dossier),
1740 $filter
1741 ),
1742 array(
1743 "origin" => __METHOD__
1744 )
1745 );
1746 return $qres['result'];
1747 }
1748
1749 /**
1750 * Récupère un tableau contenant des évènements de la forme :
1751 * $events = array(
1752 * 1 => array(
1753 * 'libelle' => 'evenement_libelle',
1754 * 'evenement' => 'identifiant_evenement',
1755 * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1756 * ))
1757 * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1758 *
1759 * Le format de sorti est le suivant :
1760 * $select = array(
1761 * 0 => array( -> liste des id des événements
1762 * '0' => '',
1763 * '1' => array(
1764 * '0' => array(), -> liste des id des événements suggérés
1765 * '1' => array(), -> liste des libelles des événements suggérés
1766 * ),
1767 * ...,
1768 * n => 'id_evenement_n'
1769 * ),
1770 * 1 => array(
1771 * '0' => '__('choisir')." ".__('evenement')',
1772 * '1' => '💡 Suggestions',
1773 * ...,
1774 * 'n' => 'libelle_evenement_n',
1775 * )
1776 * )
1777 *
1778 * @param array tableau des événements
1779 * @return array
1780 */
1781 protected function convert_events_array_to_select_format($events) {
1782 // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1783 $contenu = array(
1784 0 => array("",),
1785 1 => array(__('choisir')." ".__('evenement'),)
1786 );
1787
1788 if (! empty($events)) {
1789 // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1790 $suggested_event_group = array_filter($events, function($a) {
1791 return $a['is_suggested'] === 't';
1792 });
1793 if (! empty($suggested_event_group)) {
1794 // Prépare les données qui permettront d'afficher le groupe des événements
1795 // suggérés.
1796 $values = array();
1797 $labels = array();
1798 foreach ($suggested_event_group as $index => $suggested_event) {
1799 $values[] = $suggested_event['evenement'];
1800 $labels[] = $suggested_event['libelle'];
1801 // Supprime les évènements suggérés de la liste des évènements
1802 unset($events[$index]);
1803 }
1804 // Remplissage du select pour le groupe
1805 $contenu[0][] = array($values, $labels);
1806 $contenu[1][] = __('💡 Suggestions');
1807 }
1808
1809 // Remplissage du select
1810 foreach ($events as $event) {
1811 $contenu[0][] = $event['evenement'];
1812 $contenu[1][] = $event['libelle'];
1813 }
1814 }
1815 return $contenu;
1816 }
1817
1818 /**
1819 * SETTER_FORM - setSelect.
1820 *
1821 * @return void
1822 */
1823 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1824 //parent::setSelect($form, $maj);
1825 /**
1826 * On ne surcharge pas la méthode parent car une requête sur la table
1827 * dossier est mauvaise pour les performances, car la requête qui
1828 * concerne evenement est plus complexe que celle générée et car les
1829 * champs action, avis_decision et etat ne sont pas utilisés comme des
1830 * select
1831 */
1832 //// action
1833 //$this->init_select($form, $this->f->db, $maj, null, "action",
1834 // $sql_action, $sql_action_by_id, false);
1835
1836 //// avis_decision
1837 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1838 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1839
1840 //// dossier
1841 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1842 // $sql_dossier, $sql_dossier_by_id, false);
1843
1844 //// etat
1845 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1846 // $sql_etat, $sql_etat_by_id, false);
1847
1848 //// evenement
1849 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1850 // $sql_evenement, $sql_evenement_by_id, false);
1851
1852 // signataire_arrete
1853 // si contexte DI
1854 if ($this->getParameter("retourformulaire") == "dossier"
1855 || $this->f->contexte_dossier_instruction()) {
1856 // on recupère les signataires de la multicollectivité et de celle du DI
1857 $di = $this->f->get_inst__om_dbform(array(
1858 "obj" => "dossier_instruction",
1859 "idx" => $this->getParameter('idxformulaire'),
1860 ));
1861 $sql_signataire_arrete_by_di = str_replace(
1862 '<collectivite_di>',
1863 $di->getVal("om_collectivite"),
1864 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1865 );
1866 $this->init_select(
1867 $form,
1868 $this->f->db,
1869 $maj,
1870 null,
1871 "signataire_arrete",
1872 $sql_signataire_arrete_by_di,
1873 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1874 true
1875 );
1876 } else {
1877 $this->init_select(
1878 $form,
1879 $this->f->db,
1880 $maj,
1881 null,
1882 "signataire_arrete",
1883 $this->get_var_sql_forminc__sql("signataire_arrete"),
1884 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1885 true
1886 );
1887 }
1888
1889 /**
1890 * Gestion du filtre sur les événements de workflow disponibles
1891 * On récupère ici en fonction de l'état du dossier d'instruction en
1892 * cours et du type du dossier d'instruction en cours la liste
1893 * événements disponibles.
1894 */
1895 if ($maj == 0) {
1896 $evenements = $this->get_var_sql_forminc__sql_evenement();
1897 $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1898 } else {
1899 // Instanciation de l'événement pour récupérer son libellé
1900 $evenement = $this->f->get_inst__om_dbform(array(
1901 "obj" => "evenement",
1902 "idx" => $this->getVal("evenement"),
1903 ));
1904
1905 $contenu = array(
1906 0 => array($this->getVal("evenement"),),
1907 1 => array($evenement->getVal('libelle'),)
1908 );
1909 $form->setSelect("evenement", $contenu);
1910 }
1911
1912 /**
1913 * Gesion des liens vers la bible
1914 */
1915 // lien bible_auto
1916 $contenu = array(_("automatique"));
1917 $form->setSelect("bible_auto",$contenu);
1918 // lien bible1
1919 $contenu = array(_("bible"));
1920 $form->setSelect("bible",$contenu);
1921 // lien bible2
1922 $contenu = array(_("bible"));
1923 $form->setSelect("bible2",$contenu);
1924 // lien bible3
1925 $contenu = array(_("bible"));
1926 $form->setSelect("bible3",$contenu);
1927 // lien bible4
1928 $contenu = array(_("bible"));
1929 $form->setSelect("bible4",$contenu);
1930
1931 if ($maj == 1) {
1932 $base64 = $this->init_pdf_temp();
1933 $form->setSelect('live_preview', array('base64'=>$base64));
1934 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1935 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1936 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1937 }
1938
1939 // Selection du type de rédaction à l'ajout
1940 $content = array(
1941 0 => array('f', 't', ),
1942 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1943 );
1944 $form->setSelect('flag_edition_integrale', $content);
1945
1946 $contenu = array();
1947 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1948 $contenu[0][] = $value;
1949 $contenu[1][] = $this->get_trad_for_statut($value);
1950 }
1951 $form->setSelect('statut_signature', $contenu);
1952
1953
1954 if ($maj == 401) {
1955 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1956 $form->setSelect('preview_edition', array(
1957 'base64' => base64_encode($file['file_content']),
1958 'mimetype' => $file['metadata']['mimetype'],
1959 'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1960 'href' => sprintf(
1961 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1962 $this->getVal($this->clePrimaire)
1963 )
1964 ));
1965 }
1966 }
1967
1968 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1969 //
1970 // Vérifie uniquementla cle secondaire : demande
1971 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1972
1973 $id = $this->getVal($this->clePrimaire);
1974
1975 //Requête de vérification que cet événement d'instruction n'est pas lié
1976 //à la création d'un dossier d'instruction
1977 $qres = $this->f->get_one_result_from_db_query(
1978 sprintf(
1979 'SELECT
1980 demande_type.dossier_instruction_type
1981 FROM
1982 %1$sdemande_type
1983 LEFT JOIN %1$sdemande
1984 ON demande.demande_type = demande_type.demande_type
1985 WHERE
1986 demande.instruction_recepisse = \'%2$d\'',
1987 DB_PREFIXE,
1988 intval($id)
1989 ),
1990 array(
1991 "origin" => __METHOD__,
1992 )
1993 );
1994
1995 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1996 //création de dossier d'instruction, l'événement d'instruction peut être
1997 //supprimé
1998 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1999 // Requête de vérification que cet événement d'instruction est lié
2000 // à une demande
2001 $qres = $this->f->get_one_result_from_db_query(
2002 sprintf(
2003 'SELECT
2004 demande
2005 FROM
2006 %1$sdemande
2007 WHERE
2008 instruction_recepisse = \'%2$d\'',
2009 DB_PREFIXE,
2010 intval($id)
2011 ),
2012 array(
2013 "origin" => __METHOD__,
2014 )
2015 );
2016
2017 //Si c'est un événement d'instruction lié à une demande
2018 if ($qres['result'] != null || $qres['result'] != ""){
2019 $demande = $this->f->get_inst__om_dbform(array(
2020 "obj" => "demande",
2021 "idx" => $qres['result'],
2022 ));
2023
2024 //On met à jour la demande en supprimant la liaison vers
2025 //l'événement d'instruction
2026 $demande->setParameter("maj", 1);
2027 $valF = array();
2028 foreach($demande->champs as $identifiant => $champ) {
2029 $valF[$champ] = $demande->val[$identifiant];
2030 }
2031 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2032 $valF['instruction_recepisse']=NULL;
2033 $ret = $demande->modifier($valF);
2034 }
2035
2036 /**
2037 * Vérification que l'élément supprimé est le dernier pour pouvoir
2038 * remodifier les données de manière itérative.
2039 */
2040 $qres = $this->f->get_one_result_from_db_query(
2041 sprintf(
2042 'SELECT
2043 max(instruction)
2044 FROM
2045 %1$sinstruction
2046 WHERE
2047 dossier = \'%2$s\'',
2048 DB_PREFIXE,
2049 $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2050 ),
2051 array(
2052 "origin" => __METHOD__,
2053 )
2054 );
2055
2056 // Si on se trouve effectivement sur le dernier evenement d'instruction
2057 // alors on valide la suppression sinon on l'annule
2058 $this->correct = false;
2059 $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2060 if ($qres['result'] == $id) {
2061 // Alors on valide la suppression
2062 $this->correct = true;
2063 $message = __('Destruction_chronologique');
2064 }
2065 $this->addToMessage($message);
2066 }
2067 }
2068
2069 /**
2070 * Vérification de la possibilité ou non de modifier des dates de suivi
2071 * @param string $champ champ date à vérifier
2072 */
2073 function updateDate($champ) {
2074
2075 //Si le retourformulaire est "dossier_instruction"
2076 if ($this->getParameter("retourformulaire") == "dossier"
2077 || $this->f->contexte_dossier_instruction()) {
2078
2079 // Vérification de la possibilité de modifier les dates si déjà éditées
2080 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2081 // si l'utilisateur n'est pas un admin
2082 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2083
2084 // si le champ concerné est 'date_envoi_signature'
2085 // et que le statut du parapheur est 'expired'
2086 // alors on autorise le changement de la date
2087 // pour tous les autres cas, on ne peut modifier la date
2088 if ($champ !== 'date_envoi_signature' || $this->getVal('statut_signature') !== 'expired') {
2089 $this->correct = false;
2090 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2091 }
2092 }
2093 }
2094 }
2095
2096 //
2097 return true;
2098 }
2099
2100 /**
2101 * SETTER_FORM - setValsousformulaire (setVal).
2102 *
2103 * @return void
2104 */
2105 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2106 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2107 //
2108 $this->retourformulaire = $retourformulaire;
2109 //
2110 if ($maj == 0) {
2111 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2112 $form->setVal("dossier", $this->getParameter("idxformulaire"));
2113 }
2114
2115 // Si l'instruction a été envoyé au contrôle de légalité et que la
2116 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2117 // l'utilisateur que l'envoi au cl est en cours de traitement.
2118 if ($this->is_sent_to_cl() === true
2119 && empty($this->getVal('date_envoi_controle_legalite'))
2120 && $maj == 3) {
2121 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2122 }
2123 //
2124 $this->set_form_default_values($form, $maj, $validation);
2125 }
2126
2127 /**
2128 * SETTER_FORM - set_form_default_values (setVal).
2129 *
2130 * @return void
2131 */
2132 function set_form_default_values(&$form, $maj, $validation) {
2133 //
2134 if ($maj == 0) {
2135 // si contexte DI
2136 if ($this->getParameter("retourformulaire") == "dossier"
2137 || $this->f->contexte_dossier_instruction()) {
2138 // on recupère les signataires de la multicollectivité et de celle du DI
2139 $di = $this->f->get_inst__om_dbform(array(
2140 "obj" => "dossier_instruction",
2141 "idx" => $this->getParameter("idxformulaire"),
2142 ));
2143 $sql = str_replace(
2144 "<collectivite_di>",
2145 $di->getVal("om_collectivite"),
2146 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2147 );
2148 } else {
2149 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2150 }
2151
2152 $qres = $this->f->get_all_results_from_db_query($sql, array(
2153 "origin" => __METHOD__));
2154 $row = array_shift($qres['result']);
2155 if (isset($row["signataire_arrete"])
2156 && is_numeric($row["signataire_arrete"])) {
2157 //
2158 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2159 }
2160 // Date du jour
2161 $form->setVal("date_evenement", date("Y-m-d"));
2162 }
2163 //
2164 if ($maj == 0 || $maj == 1 || $maj == 125) {
2165 $form->setVal("bible_auto", "bible_auto()");
2166 $form->setVal("bible", "bible(1)");
2167 $form->setVal("bible2", "bible(2)");
2168 $form->setVal("bible3", "bible(3)");
2169 $form->setVal("bible4", "bible(4)");
2170 }
2171 //
2172 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2173 if ($maj == 1
2174 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2175 && $this->has_an_edition() === true) {
2176 //
2177 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2178 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2179 $form->setVal("btn_preview", "show_instr_preview()");
2180 $form->setVal("btn_redaction", "show_instr_redaction()");
2181 }
2182
2183 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2184 // des communes
2185 if ($maj == 3) {
2186 if ($this->can_display_notification_demandeur()) {
2187 $typeNotification = array(
2188 'notification_recepisse',
2189 'notification_instruction',
2190 'notification_decision',
2191 );
2192 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2193 }
2194 if ($this->can_display_notification_service()) {
2195 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2196 }
2197 if ($this->can_display_notification_tiers()) {
2198 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2199 }
2200 if ($this->can_display_notification_commune()) {
2201 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2202 }
2203 if ($this->getVal('flag_edition_integrale') == 't') {
2204 $message = __("Aucun contenu à afficher.");
2205 if (empty($this->getVal('titre_om_htmletat'))) {
2206 $form->setVal("titre_om_htmletat", $message);
2207 }
2208 if (empty($this->getVal('corps_om_htmletatex'))) {
2209 $form->setVal("corps_om_htmletatex", $message);
2210 }
2211 }
2212 }
2213 }
2214
2215 function setLayout(&$form, $maj){
2216 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2217
2218 $form->setFieldset('evenement','D',_('Evenement'));
2219 $form->setFieldset('om_final_instruction_utilisateur','F','');
2220
2221 $form->setBloc('om_final_instruction_utilisateur','F');
2222 // Idem que pour le layout de la synthèse des DI, on est obligé de "casser" le setBloc en utilisant que la fin
2223 // afin de bypasser le fait de ne pas avoir le form-content et le portlet dans le meme container
2224 $form->setBloc('om_final_instruction_utilisateur','F');
2225 $form->setBloc('parapheur_lien_page_signature','D');
2226
2227 $form->setBloc('date_finalisation_courrier','D',"","");
2228
2229 $form->setFieldset('date_finalisation_courrier','D',_('Dates'),"instruction--suivi-dates");
2230 $form->setBloc('date_finalisation_courrier','D');
2231 $form->setBloc('date_envoi_rar','F');
2232
2233 $form->setBloc('date_retour_rar','D');
2234 $form->setBloc('date_retour_controle_legalite','F');
2235 $form->setFieldset('date_retour_controle_legalite','F','');
2236
2237 $form->setBloc('date_retour_controle_legalite','F');
2238
2239 $form->setBloc('statut_signature','D');
2240 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2241 $form->setBloc('commentaire_signature','F');
2242 $form->setBloc('historique_signature','D');
2243 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2244 $form->setBloc('historique_signature','F');
2245 $form->setFieldset('historique_signature','F');
2246
2247 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2248 $form->setFieldset('suivi_notification','F');
2249 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2250 $form->setFieldset('suivi_notification_service','F');
2251 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2252 $form->setFieldset('suivi_notification_tiers','F');
2253 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2254 $form->setFieldset('suivi_notification_commune','F');
2255
2256 if ($maj == 1) {
2257 // Récupère la collectivité du dossier d'instruction
2258 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2259
2260 //
2261 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2262 && $this->has_an_edition() === true) {
2263 //
2264 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2265 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2266 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2267 $form->setFieldset('complement_om_html','D',_('Complement'));
2268 $form->setFieldset('bible','F','');
2269 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2270 $form->setFieldset('bible2','F','');
2271 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2272 $form->setFieldset('bible3','F','');
2273 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2274 $form->setFieldset('bible4','F','');
2275 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2276 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2277 $form->setBloc('corps_om_htmletatex','F');
2278 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2279 $form->setBloc('btn_preview','F');
2280 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2281 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2282 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2283 $form->setFieldset('live_preview','F');
2284 $form->setBloc('live_preview','F');
2285 $form->setBloc('live_preview','F');
2286 } else {
2287 $form->setBloc('complement_om_html','D',"","hidelabel");
2288 $form->setFieldset('complement_om_html','D',_('Complement'));
2289 $form->setFieldset('bible','F','');
2290 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2291 $form->setFieldset('bible2','F','');
2292 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2293 $form->setFieldset('bible3','F','');
2294 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2295 $form->setFieldset('bible4','F','');
2296 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2297 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2298 $form->setBloc('corps_om_htmletatex','F');
2299 }
2300 } else {
2301 $form->setBloc('complement_om_html','D',"","hidelabel");
2302 $form->setFieldset('complement_om_html','D',_('Complement'));
2303 $form->setFieldset('bible','F','');
2304 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2305 $form->setFieldset('bible2','F','');
2306 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2307 $form->setFieldset('bible3','F','');
2308 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2309 $form->setFieldset('bible4','F','');
2310 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2311 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2312 $form->setBloc('corps_om_htmletatex','F');
2313 }
2314 }
2315
2316 function setLib(&$form, $maj) {
2317 //
2318 parent::setLib($form, $maj);
2319 //
2320 $form->setLib('bible_auto', "");
2321 $form->setLib('bible', "");
2322 $form->setLib('bible2', "");
2323 $form->setLib('bible3', "");
2324 $form->setLib('bible4', "");
2325 $form->setLib('btn_refresh', "");
2326 $form->setLib('btn_preview', "");
2327 $form->setLib('btn_redaction', "");
2328 $form->setLib('live_preview', "");
2329 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2330 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2331 $form->setLib('date_retour_rar', __("date_notification"));
2332 $form->setLib('statut_signature', __("statut"));
2333 $form->setLib('commentaire_signature', __("commentaire"));
2334 $form->setLib('historique_signature', '');
2335 $form->setLib('suivi_notification', '');
2336 $form->setLib('suivi_notification_service', '');
2337 $form->setLib('suivi_notification_tiers', '');
2338 $form->setLib('suivi_notification_commune', '');
2339 $form->setLib('preview_edition', "");
2340
2341 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2342 // ajout et que l'option de rédaction libre est activée sur la
2343 // collectivité du dossier
2344 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2345 //
2346 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2347 $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.");
2348 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2349 }
2350 else {
2351 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2352 }
2353
2354 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2355 // modification et que l'option de prévisualisation de l'édition est
2356 // activée sur la collectivité du dossier
2357 if ($maj === '1'
2358 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2359 //
2360 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2361 $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.");
2362 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2363 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2364 }
2365 }
2366
2367 /**
2368 * Surcharge om_dbform::set_form_specificity()
2369 *
2370 * Traitements spécifiques lié à l'affichage des formulaires.
2371 * Les traitements gérés ici sont les suivants :
2372 * - Affichage d'un message d'erreur si la lettretype de l'évènement n'a pas
2373 * pu être récupérée.
2374 * - Affichage d'un message d'information à l'attention de l'utilisateur si
2375 * la notification est activée mais qu'elle n'est pas possible à cause du
2376 * paramètrage.
2377 *
2378 * @param formulaire $form Instance formulaire.
2379 * @param string $maj
2380 *
2381 * @return void
2382 */
2383 function set_form_specificity(&$form, $maj) {
2384 parent::set_form_specificity($form, $maj);
2385
2386 // En consultation, vérifie si une lettretype est associée à l'instruction et a pu être récupérée.
2387 // Si ce n'est pas le cas affiche un message d'erreur.
2388 if ((! empty($maj) && $maj == 3)) {
2389 if (! empty($this->getVal('lettretype'))) {
2390
2391 $om_edition = $this->f->get_inst__om_edition();
2392 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
2393 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
2394 $edition = $om_edition->get_edition_from_collectivite('om_lettretype', $this->getVal("lettretype"), $collectivite['om_collectivite_idx']);
2395
2396 if (empty($edition)) {
2397 $this->display_error_message(__("Erreur de paramétrage, le modèle de document n'a pas pu être récupéré. Contactez votre administrateur."));
2398 }
2399 }
2400 }
2401
2402 $this->display_notification_info($maj);
2403 }
2404
2405 /**
2406 * En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2407 * citoyen, si la notification des demandeurs est activée sur l'évenement
2408 * d'instruction et que le paramétrage du demandeur principal n'est pas
2409 * correct alors un message a destination de l'instructeur est affiché.
2410 *
2411 * @param string $maj
2412 *
2413 * @return void
2414 */
2415 public function display_notification_info($maj) {
2416 if ((! empty($maj) && $maj == 3)) {
2417 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2418 // la requête permettant de savoir le type de demande à échouée) et si
2419 // la notification se fait par mail vérifie si il y a des erreurs de
2420 // paramétrage et si c'est le cas on affiche un message d'information
2421 if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2422 $erreurParam = $this->get_info_notification_fail();
2423 // Récupération de l'évenement d'instruction
2424 $instEV = $this->get_inst_evenement();
2425 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2426 $class = 'text-info ui-state-highlight ui-state-info';
2427 $message = __("La notification n'est pas possible.");
2428 $this->f->display_panel_information(
2429 $class,
2430 $message,
2431 $erreurParam,
2432 __('Les données suivantes doivent être modifiées'),
2433 'erreur_param_notif'
2434 );
2435 }
2436 }
2437 }
2438 }
2439
2440 /**
2441 * Méthode permettant d'afficher des messages d'erreur sur les formulaires.
2442 */
2443 public function display_error_message($msg) {
2444 $this->correct = false;
2445 $this->msg = $msg;
2446 }
2447
2448 /**
2449 * TRIGGER - triggerajouter.
2450 *
2451 * @return boolean
2452 */
2453 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2454 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2455 /**
2456 * Le code suivant permet de récupérer des valeurs des tables evenement
2457 * et dossier pour les stocker dans l'instruction :
2458 * DEPUIS L'EVENEMENT
2459 * - action
2460 * - delai
2461 * - accord_tacite
2462 * - etat
2463 * - avis_decision
2464 * - delai_notification
2465 * - lettretype
2466 * - autorite_competente
2467 * - pec_metier
2468 * - complement_om_html
2469 * - complement2_om_html
2470 * - complement3_om_html
2471 * - complement4_om_html
2472 * - complement5_om_html
2473 * DEPUIS LE DOSSIER D'INSTRUCTION
2474 * - archive_delai
2475 * - archive_accord_tacite
2476 * - archive_etat
2477 * - archive_avis
2478 * - date_complet
2479 * - date_rejet
2480 * - date_limite
2481 * - date_notification_delai
2482 * - date_decision
2483 * - date_validite
2484 * - date_achevement
2485 * - date_chantier
2486 * - date_conformite
2487 * - avis_decision
2488 */
2489 // Récupération de tous les paramètres de l'événement sélectionné
2490 // TODO : remplacer cette requête par l'instanciation de l'événement
2491 $qres = $this->f->get_all_results_from_db_query(
2492 sprintf(
2493 'SELECT
2494 *
2495 FROM
2496 %1$sevenement
2497 WHERE
2498 evenement = %2$d',
2499 DB_PREFIXE,
2500 intval($this->valF['evenement'])
2501 ),
2502 array(
2503 "origin" => __METHOD__,
2504 )
2505 );
2506 foreach ($qres['result'] as $row) {
2507 // Récupération de l'identifiant de l'action
2508 // si une action est paramétrée dans l'événement
2509 $this->valF['action'] = NULL;
2510 if (isset($row['action']) and !empty($row['action'])) {
2511 $this->valF['action']=$row['action'];
2512 }
2513 // Récupération de la valeur du délai
2514 $this->valF['delai'] = $row['delai'];
2515 // Récupération de l'identifiant de l'état
2516 // si un état est paramétré dans l'événement
2517 $this->valF['etat']=NULL;
2518 if (isset($row['etat']) and !empty($row['etat'])) {
2519 $this->valF['etat']=$row['etat'];
2520 }
2521 // Récupération de la valeur d'accord tacite
2522 $this->valF['accord_tacite']=$row['accord_tacite'];
2523 // Récupération de la valeur du délai de notification
2524 $this->valF['delai_notification']=$row['delai_notification'];
2525 // Récupération de l'identifiant de l'avis
2526 // si un avis est paramétré dans l'événement
2527 $this->valF['avis_decision'] = NULL;
2528 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2529 $this->valF['avis_decision']=$row['avis_decision'];
2530 }
2531 // Récupération de la valeur de l'autorité compétente
2532 // si l'autorité compétente est paramétré dans l'événement
2533 $this->valF['autorite_competente'] = NULL;
2534 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2535 $this->valF['autorite_competente']=$row['autorite_competente'];
2536 }
2537 // Récupération de la valeur de la lettre type
2538 $this->valF['lettretype']=$row['lettretype'];
2539 // Récupération de la valeur de la prise en compte métier
2540 // si la prise en compte métier est paramétrée dans l'événement
2541 $this->valF['pec_metier'] = NULL;
2542 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2543 $this->valF['pec_metier'] = $row['pec_metier'];
2544 }
2545 }
2546 // Récupération de toutes les valeurs du dossier d'instruction en cours
2547 // TODO : remplacer cette requête par l'instanciation de l'objet
2548 $qres = $this->f->get_all_results_from_db_query(
2549 sprintf(
2550 'SELECT
2551 *
2552 FROM
2553 %1$sdossier
2554 WHERE
2555 dossier = \'%2$s\'',
2556 DB_PREFIXE,
2557 $this->f->db->escapeSimple($this->valF['dossier'])
2558 ),
2559 array(
2560 "origin" => __METHOD__,
2561 )
2562 );
2563 $row = array_shift($qres['result']);
2564 $this->updateArchiveData($row);
2565
2566 // Récupération de la duree de validite du dossier d'autorisation
2567 $qres = $this->f->get_one_result_from_db_query(
2568 sprintf(
2569 'SELECT
2570 duree_validite_parametrage
2571 FROM
2572 %1$sdossier_autorisation_type_detaille
2573 LEFT JOIN %1$sdossier_autorisation
2574 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2575 LEFT JOIN %1$sdossier
2576 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2577 WHERE
2578 dossier.dossier = \'%2$s\'',
2579 DB_PREFIXE,
2580 $this->f->db->escapeSimple($this->valF['dossier'])
2581 ),
2582 array(
2583 "origin" => __METHOD__,
2584 )
2585 );
2586
2587 if ($qres['result'] != '') {
2588 $this->valF['duree_validite_parametrage'] = $qres['result'];
2589 }
2590
2591 // Identifiant du type de courrier
2592 $idTypeCourrier = '11';
2593 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2594 // Code barres
2595 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2596 }
2597
2598 /**
2599 * Test si une restriction est valide.
2600 *
2601 * @return boolean
2602 */
2603 function restrictionIsValid($restriction){
2604 if($this->restriction_valid != null) {
2605 return $this->restriction_valid;
2606 }
2607 if(empty($restriction)) {
2608 $this->restriction_valid = true;
2609 return $this->restriction_valid;
2610 }
2611 // Liste des opérateurs possibles sans espace
2612 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2613 // Liste identique mais avec le marqueur §
2614 $mark = "§";
2615 $operateurs_marked = array();
2616 foreach ($operateurs as $operateur) {
2617 $operateurs_marked[] = $mark.$operateur.$mark;
2618 }
2619
2620 // Supprime tous les espaces de la chaîne de caractère
2621 $restriction = preg_replace('/\s+/', '', $restriction);
2622
2623 // Met un marqueur avant et après les opérateurs
2624 // puis transforme la chaine en un tableau
2625 $restriction = str_replace($operateurs, $operateurs_marked,
2626 $restriction);
2627
2628 // Pour chaque opérateur logique
2629 foreach (array('&&', '||') as $operator) {
2630
2631 // S'il est absent on ne fait aucun traitement
2632 if (strpos($restriction, $mark.$operator.$mark) === false) {
2633 continue;
2634 }
2635 // Sinon on vérifie les deux conditions avec le OU/ET logique
2636 $restrictions = explode($mark.$operator.$mark, $restriction);
2637 $restrictions[0] = explode($mark, $restrictions[0]);
2638 $restrictions[1] = explode($mark, $restrictions[1]);
2639 $res_bool = false;
2640 if ($operator == '&&') {
2641 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2642 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2643 $res_bool = true;
2644 }
2645 }
2646 if ($operator == '||') {
2647 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2648 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2649 $res_bool = true;
2650 }
2651 }
2652 return $res_bool;
2653 }
2654 $tabRestriction = explode($mark, $restriction);
2655 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2656
2657 }
2658
2659 function is_restriction_satisfied($restriction, $operateurs) {
2660 // Tableau comprenant les résultat
2661 $res = array();
2662 // Compteur pour les résultat
2663 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2664 $j = 1;
2665 // Comparateur du calcul
2666 $comparateur = '';
2667 // Booléen retourné
2668 $res_bool = true;
2669
2670 // S'il y a un comparateur
2671 if (in_array(">=", $restriction)
2672 || in_array("<=", $restriction)
2673 || in_array("==", $restriction)
2674 || in_array("!=", $restriction)) {
2675
2676 // Si le tableau n'est pas vide
2677 if (count($restriction) > 0) {
2678
2679 // Boucle dans le tableau pour récupérer seulement les valeurs
2680 foreach ($restriction as $key => $value) {
2681 //
2682 if (!in_array($value, $operateurs)) {
2683 if ($this->getRestrictionValue($value) != false) {
2684 $res[] = $this->getRestrictionValue($value);
2685 } else {
2686 // Message d'erreur
2687 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2688 $this->addToMessage($error_message);
2689 // Arrête le traitement
2690 return false;
2691 }
2692 }
2693 }
2694
2695 // Boucle dans le tableau
2696 // commence à 1 car le 0 doit rester inchangé tout au long du
2697 // traitement
2698 for ($i = 1; $i<count($restriction); $i++) {
2699
2700 // Récupère le comparateur
2701 if ($restriction[$i] === ">="
2702 || $restriction[$i] === "<="
2703 || $restriction[$i] === "=="
2704 || $restriction[$i] === "!=") {
2705 $comparateur = $restriction[$i];
2706 }
2707
2708 // Si l'opérateur qui suit est un "+"
2709 if ($restriction[$i] === "+") {
2710 $dateDep = $res[$j];
2711 unset($res[$j]);$j++;
2712 $duree = $res[$j];
2713 unset($res[$j]);
2714 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2715 }
2716
2717 // Si l'opérateur qui suit est un "-"
2718 if ($restriction[$i] === "-") {
2719 $dateDep = $res[$j];
2720 unset($res[$j]);$j++;
2721 $duree = $res[$j];
2722 unset($res[$j]);
2723 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2724 }
2725 }
2726
2727 }
2728
2729 // Si les tableau des résultats n'est pas vide
2730 if (count($res) > 0) {
2731 //
2732 $res_bool = false;
2733 // Effectue le test
2734 if ($comparateur === ">=") {
2735 //
2736 if (strtotime($res[0]) >= strtotime($res[$j])) {
2737 $res_bool = true;
2738 }
2739 }
2740 if ($comparateur === "<=") {
2741 //
2742 if (strtotime($res[0]) <= strtotime($res[$j])) {
2743 $res_bool = true;
2744 }
2745 }
2746 if ($comparateur === "==") {
2747 //
2748 if (strtotime($res[0]) == strtotime($res[$j])) {
2749 $res_bool = true;
2750 }
2751 }
2752 if ($comparateur === "!=") {
2753 //
2754 if (strtotime($res[0]) != strtotime($res[$j])) {
2755 $res_bool = true;
2756 }
2757 }
2758 }
2759 // Sinon une erreur s'affiche
2760 } else {
2761
2762 // Message d'erreur
2763 $error_message = _("Mauvais parametrage de la restriction.")." ".
2764 _("Contactez votre administrateur");
2765 $this->addToMessage($error_message);
2766 // Arrête le traitement
2767 return false;
2768 }
2769
2770 return $res_bool;
2771
2772 }
2773
2774 /**
2775 * Permet de définir si l'événement passé en paramètre est un événement retour.
2776 * @param integer $evenement événement à tester
2777 *
2778 * @return boolean retourne true si événement retour sinon false
2779 */
2780 function is_evenement_retour($evenement) {
2781 if(empty($evenement) || !is_numeric($evenement)) {
2782 return "";
2783 }
2784
2785 $evenement = $this->f->get_inst__om_dbform(array(
2786 "obj" => "evenement",
2787 "idx" => $evenement,
2788 ));
2789
2790 return $evenement->getVal('retour') == 't';
2791 }
2792
2793 /**
2794 * Retourne le champ restriction de l'événement passé en paramètre.
2795 *
2796 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2797 *
2798 * @return string contenu du champ restriction
2799 */
2800 function get_restriction($evenement) {
2801 if(empty($evenement) || !is_numeric($evenement)) {
2802 return "";
2803 }
2804 //Récupère la restriction
2805 $evenement = $this->f->get_inst__om_dbform(array(
2806 "obj" => "evenement",
2807 "idx" => $evenement,
2808 ));
2809
2810 return $evenement->getVal('restriction');
2811 }
2812
2813 /**
2814 * Récupère la valeur du champ dans la restriction
2815 * @param string $restrictionValue Nom du champ
2816 * @return mixed Valeur du champ
2817 */
2818 function getRestrictionValue($restrictionValue){
2819
2820 // Initialisation de la valeur de retour
2821 $return = false;
2822
2823 // Récupére les valeurs du dossier
2824 $value_dossier = $this->get_dossier_actual();
2825
2826 //
2827 if (is_numeric($restrictionValue)) {
2828 $return = $restrictionValue;
2829 }elseif (isset($value_dossier[$restrictionValue])) {
2830 $return = $value_dossier[$restrictionValue];
2831 }elseif (isset($this->valF[$restrictionValue])) {
2832 $return = $this->valF[$restrictionValue];
2833 }
2834
2835 // Retourne la valeur du champ
2836 return $return;
2837 }
2838
2839
2840 /**
2841 * Calcul des règle d'action selon leur type.
2842 *
2843 * Types de règle :
2844 * - date
2845 * - numeric
2846 * - text
2847 * - bool
2848 * - specific
2849 * - technical_data
2850 *
2851 * @param string $rule Règle d'action.
2852 * @param string $rule_name Nom de la règle.
2853 * @param string $type Type de la règle.
2854 *
2855 * @return mixed Résultat de la règle
2856 */
2857 public function regle($rule, $rule_name, $type = null) {
2858
2859 // Supprime tous les espaces de la chaîne de caractère
2860 $rule = str_replace(' ', '', $rule);
2861 // Coupe la chaîne au niveau de l'opérateur
2862 $operands = explode ("+", $rule);
2863 // Nombre d'opérande
2864 $nb_operands = count($operands);
2865
2866 // Règle à null
2867 if ($rule == "null") {
2868 return null;
2869 }
2870
2871 // Tableau des champs de type date
2872 $rule_type_date = array(
2873 "regle_date_limite",
2874 "regle_date_notification_delai",
2875 "regle_date_complet",
2876 "regle_date_validite",
2877 "regle_date_decision",
2878 "regle_date_chantier",
2879 "regle_date_achevement",
2880 "regle_date_conformite",
2881 "regle_date_rejet",
2882 "regle_date_dernier_depot",
2883 "regle_date_limite_incompletude",
2884 "regle_date_cloture_instruction",
2885 "regle_date_premiere_visite",
2886 "regle_date_derniere_visite",
2887 "regle_date_contradictoire",
2888 "regle_date_retour_contradictoire",
2889 "regle_date_ait",
2890 "regle_date_transmission_parquet",
2891 "regle_date_affichage",
2892 );
2893 // Tableau des champs de type numérique
2894 $rule_type_numeric = array(
2895 "regle_delai",
2896 "regle_delai_incompletude",
2897 );
2898 // Tableau des champs de type text
2899 $rule_type_text = array(
2900 );
2901 // Tableau des champs de type booléen
2902 $rule_type_bool = array(
2903 "regle_a_qualifier",
2904 "regle_incompletude",
2905 "regle_incomplet_notifie",
2906 "regle_evenement_suivant_tacite_incompletude",
2907 );
2908 // Tableau des champs spécifiques
2909 $rule_type_specific = array(
2910 "regle_autorite_competente",
2911 "regle_etat",
2912 "regle_accord_tacite",
2913 "regle_avis",
2914 "regle_pec_metier",
2915 "regle_etat_pendant_incompletude",
2916 );
2917 // Tableau des champs de données techniques
2918 $rule_type_technical_data = array(
2919 'regle_donnees_techniques1',
2920 'regle_donnees_techniques2',
2921 'regle_donnees_techniques3',
2922 'regle_donnees_techniques4',
2923 'regle_donnees_techniques5',
2924 );
2925 // Tableau des champs simple
2926 $rule_type_simple = array(
2927 "regle_dossier_instruction_type",
2928 );
2929
2930 // Définit le type du champ
2931 if (in_array($rule_name, $rule_type_date) == true) {
2932 $type = "date";
2933 }
2934 if (in_array($rule_name, $rule_type_numeric) == true) {
2935 $type = "numeric";
2936 }
2937 if (in_array($rule_name, $rule_type_text) === true) {
2938 $type = "text";
2939 }
2940 if (in_array($rule_name, $rule_type_bool) === true) {
2941 $type = "bool";
2942 }
2943 if (in_array($rule_name, $rule_type_specific) === true) {
2944 $type = "specific";
2945 }
2946 if (in_array($rule_name, $rule_type_technical_data) === true) {
2947 $type = 'text';
2948 }
2949 if (in_array($rule_name, $rule_type_simple) === true) {
2950 $type = 'simple';
2951 }
2952
2953 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2954 // Récupère directement la valeur de l'opérande
2955 if ($type === 'specific') {
2956 //
2957 return $this->get_value_for_rule($rule);
2958 }
2959
2960 // Initialisation des variables
2961 $key_date = 0;
2962 $total_numeric = 0;
2963 $res_text = '';
2964
2965 // Pour chaque opérande
2966 foreach ($operands as $key => $operand) {
2967
2968 // Si c'est une règle de type date
2969 if ($type == 'date') {
2970 // Vérifie si au moins une des opérandes est une date
2971 if (is_numeric($operand) === false
2972 && $this->get_value_for_rule($operand) !== null
2973 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2974 // Récupère la position de la date
2975 $key_date = $key;
2976 }
2977 // Les autres opérandes doivent être que des numériques
2978 if (is_numeric($operand) == true) {
2979 // Ajoute l'opérande au total
2980 $total_numeric += $operand;
2981 }
2982 if (is_numeric($operand) === false
2983 && $this->get_value_for_rule($operand) !== null
2984 && is_numeric($this->get_value_for_rule($operand)) == true) {
2985 // Ajoute l'opérande au total
2986 $total_numeric += $this->get_value_for_rule($operand);
2987 }
2988 }
2989
2990 // Si c'est une règle de type numérique
2991 if ($type == 'numeric') {
2992 // Les opérandes doivent être que des numériques
2993 if (is_numeric($operand) == true) {
2994 // Ajoute l'opérande au total
2995 $total_numeric += $operand;
2996 }
2997 if (is_numeric($operand) === false
2998 && $this->get_value_for_rule($operand) !== null
2999 && is_numeric($this->get_value_for_rule($operand)) == true) {
3000 // Ajoute l'opérande au total
3001 $total_numeric += $this->get_value_for_rule($operand);
3002 }
3003 }
3004
3005 // Si c'est une règle de type text
3006 if ($type === 'text') {
3007 // Concatène toutes les chaînes de caractère
3008 $res_text .= $this->get_value_for_rule($operand);
3009 }
3010 }
3011
3012 // Résultat pour une règle de type date
3013 if ($type == 'date') {
3014 // Retourne le calcul de la date
3015 return $this->f->mois_date($this->valF[$operands[$key_date]],
3016 $total_numeric, "+");
3017 }
3018
3019 // Résultat pour une règle de type numérique
3020 if ($type == 'numeric') {
3021 // Retourne le calcul
3022 return $total_numeric;
3023 }
3024
3025 // Résultat pour une règle de type text
3026 if ($type === 'text') {
3027 // Retourne la chaîne de caractère
3028 return $res_text;
3029 }
3030 if ($type === 'simple' || $type === 'bool') {
3031 // Retourne la valeur du champs rule
3032 return $rule;
3033 }
3034 }
3035
3036
3037 /**
3038 * Récupère la valeur du champs dans l'instruction ou dans les données
3039 * techniques.
3040 * Spécifique au calcul des règles.
3041 *
3042 * @param string $field Champ
3043 *
3044 * @return mixed Valeur du champ
3045 */
3046 private function get_value_for_rule($field) {
3047 // Si le champ n'existe pas dans la table instruction
3048 if (array_key_exists($field, $this->valF) === false) {
3049 // Récupère l'instance de la classe donnees_techniques
3050 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
3051 // Retourne la valeur de la donnée technique
3052 return $inst_donnees_techniques->getVal($field);
3053 }
3054
3055 //
3056 return $this->valF[$field];
3057 }
3058
3059
3060 /**
3061 * [get_inst_donnees_techniques description]
3062 *
3063 * @param [type] $donnees_techniques [description]
3064 *
3065 * @return [type] [description]
3066 */
3067 function get_inst_donnees_techniques($donnees_techniques = null) {
3068 //
3069 if (isset($this->inst_donnees_techniques) === false or
3070 $this->inst_donnees_techniques === null) {
3071 //
3072 if (is_null($donnees_techniques)) {
3073 $donnees_techniques = $this->getDonneesTechniques();
3074 }
3075 //
3076 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
3077 "obj" => "donnees_techniques",
3078 "idx" => $donnees_techniques,
3079 ));
3080 }
3081 //
3082 return $this->inst_donnees_techniques;
3083 }
3084
3085
3086 /**
3087 * Retourne l'identifiant des données techniques liées du dossier
3088 * @return string L'identifiant des données techniques liées du dossier
3089 */
3090 function getDonneesTechniques() {
3091
3092 $qres = $this->f->get_one_result_from_db_query(
3093 sprintf(
3094 'SELECT
3095 donnees_techniques
3096 FROM
3097 %1$sdonnees_techniques
3098 WHERE
3099 dossier_instruction = \'%2$s\'',
3100 DB_PREFIXE,
3101 $this->f->db->escapeSimple($this->valF["dossier"])
3102 ),
3103 array(
3104 "origin" => __METHOD__,
3105 )
3106 );
3107
3108 return $qres['result'];
3109 }
3110
3111 /**
3112 * TRIGGER - triggerajouterapres.
3113 *
3114 * - Mise à jour des informations liées au workflow sur le dossier
3115 * - Interface avec le référentiel ERP [105][111]
3116 * - Mise à jour du DA
3117 * - Historisation de la vie du DI
3118 *
3119 * @return boolean
3120 */
3121 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3122 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3123
3124 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3125 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3126 // Instance de la classe evenement
3127 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3128 // Instance de l'état courant du dossier d'instruction
3129 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3130 "obj" => "etat",
3131 "idx" => $inst_di->get_id_etat(),
3132 ));
3133
3134 /**
3135 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3136 * par l'action
3137 */
3138 // état de complétude actuel du dossier
3139 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3140 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3141 $ev_suiv_tacite_incompletude = false;
3142 // Initialisation
3143 $valF = array();
3144 $valF_dt = array();
3145 //
3146 // Récupération des paramètres de l'action
3147 // TODO : remplacer cette requête par l'instanciation de l'action
3148 $qres = $this->f->get_all_results_from_db_query(
3149 sprintf(
3150 'SELECT
3151 *
3152 FROM
3153 %1$saction
3154 WHERE
3155 action = \'%2$s\'',
3156 DB_PREFIXE,
3157 $this->f->db->escapeSimple($this->valF['action'])
3158 ),
3159 array(
3160 "origin" => __METHOD__
3161 )
3162 );
3163 foreach ($qres['result'] as $row) {
3164
3165 // pour chacune des regles, on applique la regle
3166 if ($row['regle_delai'] != '') {
3167 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3168 }
3169 if ($row['regle_accord_tacite'] != '') {
3170 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3171 }
3172 if ($row['regle_avis'] != '') {
3173 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3174 }
3175 if ($row['regle_date_limite'] != '') {
3176 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3177 }
3178 if ($row['regle_date_complet'] != '') {
3179 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3180 }
3181 if ($row['regle_date_dernier_depot'] != '') {
3182 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3183 }
3184 if ($row['regle_date_notification_delai'] != '') {
3185 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3186 }
3187 if ($row['regle_date_decision'] != '') {
3188 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3189 }
3190 if ($row['regle_date_rejet'] != '') {
3191 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3192 }
3193 if ($row['regle_date_validite'] != '') {
3194 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3195 }
3196 if ($row['regle_date_chantier'] != '') {
3197 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3198 }
3199 if ($row['regle_date_achevement'] != '') {
3200 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3201 }
3202 if ($row['regle_date_conformite'] != '') {
3203 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3204 }
3205 if ($row['regle_date_limite_incompletude'] != '') {
3206 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3207 }
3208 if ($row['regle_delai_incompletude'] != '') {
3209 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3210 }
3211 if ($row['regle_autorite_competente'] != '') {
3212 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3213 }
3214 if ($row['regle_etat'] != '') {
3215 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3216 }
3217 if ($row['regle_date_cloture_instruction'] !== '') {
3218 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3219 }
3220 if ($row['regle_date_premiere_visite'] !== '') {
3221 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3222 }
3223 if ($row['regle_date_derniere_visite'] !== '') {
3224 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3225 }
3226 if ($row['regle_date_contradictoire'] !== '') {
3227 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3228 }
3229 if ($row['regle_date_retour_contradictoire'] !== '') {
3230 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3231 }
3232 if ($row['regle_date_ait'] !== '') {
3233 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3234 }
3235 if ($row['regle_donnees_techniques1'] !== '') {
3236 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3237 }
3238 if ($row['regle_donnees_techniques2'] !== '') {
3239 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3240 }
3241 if ($row['regle_donnees_techniques3'] !== '') {
3242 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3243 }
3244 if ($row['regle_donnees_techniques4'] !== '') {
3245 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3246 }
3247 if ($row['regle_donnees_techniques5'] !== '') {
3248 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3249 }
3250 if ($row['regle_date_transmission_parquet'] !== '') {
3251 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3252 }
3253 if ($row['regle_dossier_instruction_type'] !== '') {
3254 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3255 }
3256 // La date d'affichage est modifiée seulement si le champ n'est pas
3257 // renseigné
3258 if ($row['regle_date_affichage'] !== ''
3259 && ($inst_di->getVal('date_affichage') === ''
3260 || $inst_di->getVal('date_affichage') === null)) {
3261 //
3262 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3263 }
3264 //
3265 if ($row['regle_pec_metier'] != '') {
3266 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3267 }
3268 if ($row['regle_a_qualifier'] != '') {
3269 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3270 }
3271 //
3272 if ($row['regle_incompletude'] != '') {
3273 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3274 }
3275 if ($row['regle_incomplet_notifie'] != '') {
3276 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3277 }
3278 if ($row['regle_etat_pendant_incompletude'] != '') {
3279 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3280 }
3281 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3282 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3283 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3284 $ev_suiv_tacite_incompletude = true;
3285 }
3286 }
3287 }
3288
3289 // Si l'événement a un événement suivant tacite
3290 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3291 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3292 // pas associé de le même façon au dossier d'instruction
3293 if ($ev_suiv_tacite_incompletude === false) {
3294 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3295 }
3296 if ($ev_suiv_tacite_incompletude === true) {
3297 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3298 }
3299 }
3300 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3301 if (count($valF_dt) > 0) {
3302 $dt_id = $this->getDonneesTechniques();
3303 // On met à jour le dossier
3304 $cle = " donnees_techniques='".$dt_id."'";
3305 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3306 $this->addToLog(
3307 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3308 VERBOSE_MODE
3309 );
3310 $this->f->isDatabaseError($res1);
3311 // Affichage d'informations à l'utilisateur
3312 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3313 }
3314 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3315 if (count($valF) > 0) {
3316 //
3317 $inst_dossier = $this->f->get_inst__om_dbform(array(
3318 "obj" => "dossier",
3319 "idx" => $this->valF['dossier'],
3320 ));
3321 $valF['instruction'] = $id;
3322 $valF['crud'] = 'create';
3323 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3324 if ($update_by_instruction === false) {
3325 $this->cleanMessage();
3326 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3327 return false;
3328 }
3329 // Affichage d'informations à l'utilisateur
3330 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3331 }
3332
3333 /**
3334 * Interface avec le référentiel ERP.
3335 *
3336 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3337 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3338 * Déclencheur :
3339 * - L'option ERP est activée
3340 * - Le dossier est marqué comme "connecté au référentiel ERP"
3341 * - Le dossier est de type PC
3342 * - Le formulaire d'ajout d'un événement d'instruction est validé
3343 * avec un événement pour lequel les services ERP doivent être
3344 * informé
3345 */
3346 //
3347 if ($this->f->is_option_referentiel_erp_enabled() === true
3348 && $inst_di->is_connected_to_referentiel_erp() === true
3349 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3350 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3351 //
3352 $infos = array(
3353 "dossier_instruction" => $this->valF['dossier'],
3354 "decision" => $inst_evenement->getVal("libelle"),
3355 );
3356 //
3357 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3358 if ($ret !== true) {
3359 $this->cleanMessage();
3360 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3361 return false;
3362 }
3363 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3364 }
3365
3366 // Si le mode en rédaction intégrale est activé
3367 if (isset($this->valF['flag_edition_integrale']) === true
3368 && $this->valF['flag_edition_integrale'] === true) {
3369 $redactionIntegraleValF = array();
3370
3371 // Récupère la collectivite du dossier d'instruction
3372 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3373 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3374 // Récupère le corps de la lettre type
3375 $params = array(
3376 "specific" => array(
3377 "corps" => array(
3378 "mode" => "get",
3379 )
3380 ),
3381 );
3382 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3383 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3384 // Récupère le titre de la lettre type
3385 $params = array(
3386 "specific" => array(
3387 "titre" => array(
3388 "mode" => "get",
3389 )
3390 ),
3391 );
3392 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3393 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3394
3395 // mise à jour en base de données
3396 $res = $this->f->db->autoExecute(
3397 DB_PREFIXE.$this->table,
3398 $redactionIntegraleValF,
3399 DB_AUTOQUERY_UPDATE,
3400 $this->clePrimaire."=".$id
3401 );
3402 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3403 if ($this->f->isDatabaseError($res, true) === true) {
3404 return false;
3405 }
3406 }
3407
3408 /**
3409 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3410 */
3411 // Si la finalisation automatique de l'événement est activée
3412 // ET si l'instruction n'a pas déjà été finalisée
3413 // ET s'il existe une lettre type associée
3414 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3415 && $inst_evenement->getVal('om_final_instruction') !== 't'
3416 && $inst_evenement->getVal('lettretype') !== ''
3417 && $inst_evenement->getVal('lettretype') !== null) {
3418
3419 // On instancie l'instruction
3420 $inst_instruction = $this->f->get_inst__om_dbform(array(
3421 "obj" => "instruction",
3422 "idx" => $this->valF[$this->clePrimaire],
3423 ));
3424
3425 // On finalise l'instruction dans le contexte de finalisation : action 100
3426 $inst_instruction->setParameter('maj', 100);
3427 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3428
3429 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3430 // et dans le message d'erreur
3431 if ($finalize === false) {
3432 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3433 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3434 return false;
3435 }
3436 }
3437
3438 /**
3439 * Finalisation automatique des instructions tacites ou retours.
3440 */
3441 // Si l'option de finalisation automatique des instructions tacites ou
3442 // retours est activée et l'événement d'instruction a une lettre type
3443 // associée
3444 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3445 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3446 && $inst_evenement->getVal('lettretype') !== ''
3447 && $inst_evenement->getVal('lettretype') !== null) {
3448
3449 // Rècupère l'identifiant de l'événement
3450 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3451
3452 // Si l'événement d'instruction est identifié comme un événement
3453 // retour
3454 // OU l'événement d'instruction est l'événement suivant tacite du
3455 // dossier d'instruction (incomplétude prise en compte)
3456 // ET l'événement d'instruction n'a pas déjà été finalisé
3457 if (($inst_evenement->getVal("retour") === 't'
3458 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3459 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3460 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3461
3462 // Finalise l'instruction
3463 $inst_instruction = $this->f->get_inst__om_dbform(array(
3464 "obj" => "instruction",
3465 "idx" => $this->valF[$this->clePrimaire],
3466 ));
3467 $inst_instruction->setParameter('maj', 100);
3468 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3469 if ($finalize === false) {
3470 //
3471 return false;
3472 }
3473 }
3474 }
3475
3476 /**
3477 * Mise à jour de la version de clôture *version_clos* du dossier si et
3478 * seulement si l'instruction met à jour l'état du dossier.
3479 */
3480 if (isset($valF['etat']) === true
3481 && $valF['etat'] !== null
3482 && $valF['etat'] !== '') {
3483 // Instanciation de l'état appliqué sur le dossier par l'instruction
3484 $inst_etat = $this->f->get_inst__om_dbform(array(
3485 "obj" => "etat",
3486 "idx" => $valF['etat'],
3487 ));
3488 //
3489 $update_version_clos = null;
3490 // En cas d'instruction qui clôture le dossier
3491 if ($inst_etat->getVal('statut') === 'cloture') {
3492 $update_version_clos = $inst_di->update_version_clos('up');
3493 }
3494 // En cas d'instruction qui rouvre le dossier
3495 if ($inst_current_etat->getVal('statut') === 'cloture'
3496 && $inst_etat->getVal('statut') !== 'cloture') {
3497 //
3498 $update_version_clos = $inst_di->update_version_clos('down');
3499 //
3500 $params = array(
3501 'di_reopened' => true,
3502 );
3503 }
3504 //
3505 if ($update_version_clos === false) {
3506 $this->f->addToLog(sprintf(
3507 "%s() : ERREUR - %s %s",
3508 __METHOD__,
3509 sprintf(
3510 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3511 $inst_di->getVal($inst_di->clePrimaire)
3512 ),
3513 sprintf(
3514 __("L'instruction tente d'appliquer l'état %s."),
3515 $inst_etat->getVal($inst_etat->clePrimaire)
3516 )
3517 ));
3518 $this->addToMessage(sprintf(
3519 "%s %s",
3520 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3521 __("Veuillez contacter votre administrateur.")
3522 ));
3523 return false;
3524 }
3525 }
3526
3527 /**
3528 * Notification automatique
3529 */
3530 // Notification automatique à l'ajout de l'instruction si la notification
3531 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3532 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3533 ($inst_evenement->getVal('lettretype') === null ||
3534 $inst_evenement->getVal('lettretype') === '')) {
3535 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3536 $msgLog = sprintf(
3537 '%s %s : %d',
3538 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3539 __('Instruction notifiée'),
3540 $id
3541 );
3542
3543 // Récupération de la liste des demandeurs à notifier et de la catégorie
3544 $categorie = $this->f->get_param_option_notification($collectivite_di);
3545 $isPortal = $categorie === PORTAL;
3546 $demandeursANotifie = $this->get_demandeurs_notifiable(
3547 $this->valF['dossier'],
3548 $isPortal
3549 );
3550
3551 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3552 $demandeurPrincipalNotifie = false;
3553 foreach ($demandeursANotifie as $demandeur) {
3554 // Identifie si le demandeur principal a été notifié ou pas
3555 // et récupère ses informations
3556 if ($demandeur['petitionnaire_principal'] == 't') {
3557 $demandeurPrincipalNotifie = true;
3558 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3559 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3560 // suivante. On le considère également comme non notifié pour gérer l'envoie
3561 // des messages d'erreurs
3562 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3563 // d'impact sur la notification
3564 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3565 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3566 $demandeurPrincipalNotifie = false;
3567 continue;
3568 }
3569 }
3570 // Ajout de la notif et récupération de son id
3571 $idNotif = $this->ajouter_notification(
3572 $this->valF[$this->clePrimaire],
3573 $this->f->get_connected_user_login_name(),
3574 $demandeur,
3575 $collectivite_di,
3576 array(),
3577 true
3578 );
3579 if ($idNotif === false) {
3580 $this->addToLog(
3581 sprintf('%s() : %s', __METHOD__, $msgLog),
3582 DEBUG_MODE
3583 );
3584 return false;
3585 }
3586 // Création de la tache en lui donnant l'id de la notification
3587 $notification_by_task = $this->notification_by_task(
3588 $idNotif,
3589 $this->valF['dossier'],
3590 $categorie
3591 );
3592 if ($notification_by_task === false) {
3593 $this->addToLog(
3594 sprintf('%s() : %s', __METHOD__, $msgLog),
3595 DEBUG_MODE
3596 );
3597 $this->addToMessage(
3598 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3599 );
3600 return false;
3601 }
3602 }
3603 // Pour la notification par mail ou la notification via portal si le dossier a
3604 // été déposés via portal, si le demandeur principal n'est pas notifiable,
3605 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3606 // laquelle le demandeur principal n'a pas pu être notifié
3607 $depotPortal = $this->dossier_depose_sur_portail();
3608 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3609 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3610 // ' ' permet de mettre un espace entre les 2 msg de log.
3611 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3612 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3613 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3614 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3615 // Ajout de la notif et récupération de son id
3616 $idNotif = $this->ajouter_notification(
3617 $this->valF[$this->clePrimaire],
3618 $this->f->get_connected_user_login_name(),
3619 $demandeurPrincipal,
3620 $collectivite_di,
3621 array(),
3622 true,
3623 'Echec',
3624 implode(' ', $erreursParam)
3625 );
3626 if ($idNotif === false) {
3627 $this->addToLog(
3628 sprintf('%s() : %s', __METHOD__, $msgLog),
3629 DEBUG_MODE
3630 );
3631 $this->addToMessage(
3632 __('Erreur : la création de la notification a échouée.').
3633 __("Veuillez contacter votre administrateur.")
3634 );
3635 return false;
3636 }
3637 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3638 // de l'échec de la notification
3639 $dossier_message = $this->get_inst_dossier_message(0);
3640 $dossier_message_val = array(
3641 'dossier' => $val['dossier'],
3642 'type' => _('erreur expedition'),
3643 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3644 'login' => $_SESSION['login'],
3645 'date_emission' => date('Y-m-d H:i:s'),
3646 'contenu' => _('Échec lors de la notification de l\'instruction ').
3647 $inst_evenement->getVal('libelle').
3648 '.<br>'.
3649 implode("\n", $erreursParam).
3650 '<br>'.
3651 _('Veuillez corriger ces informations avant de renvoyer la notification.')
3652 );
3653 $add = $dossier_message->add_notification_message($dossier_message_val, true);
3654 // Si une erreur se produit pendant l'ajout
3655 if ($add !== true) {
3656 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3657 return false;
3658 }
3659 }
3660 $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.")));
3661 }
3662
3663 // Notification automatique en cas de dépôt de dossier dématérialisé
3664 // Vérifie si l'option de notification est active et si il s'agit bien d'une
3665 // instruction de récépissé
3666 if (
3667 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3668 && $this->is_instruction_recepisse()
3669 ) {
3670 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3671 $msgLog = sprintf(
3672 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3673 $val['dossier']
3674 );
3675 // Récupère l'instance de la demande
3676 $demande = $inst_di->get_inst_demande();
3677 // Vérifie que le dossier a été déposé via platau ou portal
3678 if (
3679 ($demande->getVal('source_depot') == PLATAU ||
3680 $demande->getVal('source_depot') == PORTAL)
3681 ) {
3682 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3683 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3684 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3685 if (empty($listeEmails)) {
3686 $this->addToLog(
3687 sprintf(
3688 '%s(): %s %s',
3689 __METHOD__,
3690 $msgLog,
3691 __('Aucun courriel paramétré.')
3692 ),
3693 DEBUG_MODE
3694 );
3695 } else {
3696 foreach ($listeEmails as $email) {
3697 // Ajout de la notif et récupération de son id
3698 $destinataire = array(
3699 'destinataire' => $email,
3700 'courriel' => $email
3701 );
3702 $idNotif = $this->ajouter_notification(
3703 $this->valF[$this->clePrimaire],
3704 $this->f->get_connected_user_login_name(),
3705 $destinataire,
3706 $collectivite_di,
3707 array(),
3708 true
3709 );
3710 if ($idNotif === false) {
3711 $this->addToLog(
3712 sprintf('%s(): %s', __METHOD__, $msgLog),
3713 DEBUG_MODE
3714 );
3715 return false;
3716 }
3717 // Création de la tache en lui donnant l'id de la notification
3718 $notification_by_task = $this->notification_by_task(
3719 $idNotif,
3720 $this->valF['dossier'],
3721 'mail',
3722 'notification_depot_demat'
3723 );
3724 if ($notification_by_task === false) {
3725 $this->addToMessage(
3726 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3727 );
3728 $this->addToLog(
3729 sprintf('%s(): %s', __METHOD__, $msgLog),
3730 DEBUG_MODE
3731 );
3732 return false;
3733 }
3734 }
3735 }
3736 }
3737 }
3738
3739 /**
3740 * Mise à jour de la date de dernière modification du dossier
3741 */
3742 $inst_di->update_last_modification_date();
3743
3744 /**
3745 * Mise à jour des données du DA.
3746 */
3747 $inst_da = $inst_di->get_inst_dossier_autorisation();
3748 $params['di_id'] = $this->valF['dossier'];
3749 if ($inst_da->majDossierAutorisation($params) === false) {
3750 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3751 $this->correct = false;
3752 return false;
3753 }
3754
3755 /**
3756 * Historisation de la vie du DI.
3757 */
3758 //
3759 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3760 }
3761
3762 /**
3763 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3764 * sont remplies.
3765 * Les conditions vérifiées sont les suivantes :
3766 * - L'option de notification *option_notification* doit être définie
3767 * - Le petitionnaire principal doit accepter les notifications
3768 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3769 * - Le pétitionnaire principal doit avoir une adresse mail correcte
3770 * Pour chaque vérification effectué un message d'erreur est ajouté si la
3771 * condition n'est pas remplie.
3772 * Renvoie le message d'erreur en sortie.
3773 *
3774 * @param string identifiant du dossier sur lequel les notifications ont échouée
3775 * @return string
3776 */
3777 protected function get_info_notification_fail($dossier = null) {
3778 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3779 // utilise celui associé à l'instruction
3780 if ($dossier == null) {
3781 $dossier = $this->getVal('dossier');
3782 }
3783 // Tableau contenant la liste des messages d'erreur
3784 $errorMessage = array();
3785 // Récupère l'option de notification
3786 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3787 $option_notification = $this->f->get_param_option_notification($collectivite_di);
3788 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3789 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3790 }
3791 // Récupère les informations du demandeurs principal
3792 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3793 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3794 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3795 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3796 }
3797 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3798 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3799 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3800 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3801 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3802 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3803 $infoPetitionnaire['courriel'].
3804 '.';
3805 }
3806 } else {
3807 // Si le courriel du pétitionnaire principal
3808 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3809 }
3810
3811 return $errorMessage;
3812 }
3813
3814 /**
3815 * Méthode servant à vérifier si un dossier a été déposé sur
3816 * le portail citoyen ou pas.
3817 * La verification se fait via une requête sql dans laquelle
3818 * on va chercher un dossier ayant pour id l'identifiant de
3819 * dossier associé à l'instruction et pour lequel la demande
3820 * associée la plus ancienne est une demande de création de
3821 * dossier via portail
3822 *
3823 * @param string identifiant du dossier. Si non renseigné c'est le dossier
3824 * associé à l'instruction qui est utilisé
3825 * @return boolean|void true : dossier déposé via portail, false : dossier
3826 * non déposé via portail et null : erreur de base de données.
3827 */
3828 protected function dossier_depose_sur_portail($dossier = null) {
3829 if (empty($dossier)) {
3830 $dossier = $this->getVal('dossier');
3831 }
3832 $qres = $this->f->get_one_result_from_db_query(
3833 sprintf(
3834 'SELECT
3835 dossier
3836 FROM
3837 %1$sdossier
3838 -- Récuperation de la première demande associée au dossier
3839 LEFT JOIN (
3840 SELECT
3841 demande,
3842 dossier_instruction,
3843 source_depot
3844 FROM
3845 %1$sdemande
3846 WHERE
3847 dossier_instruction = \'%2$s\'
3848 ORDER BY
3849 demande ASC
3850 LIMIT 1
3851 ) AS demande
3852 ON dossier.dossier = demande.dossier_instruction
3853 WHERE
3854 dossier.dossier = \'%2$s\'
3855 AND demande.source_depot = \'portal\'',
3856 DB_PREFIXE,
3857 $this->f->db->escapeSimple($dossier)
3858 ),
3859 array(
3860 "origin" => __METHOD__,
3861 "force_return" => true,
3862 )
3863 );
3864 if ($qres["code"] !== "OK") {
3865 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3866 return;
3867 }
3868 // Si on a un résultat c'est que le dossier a été déposé via le portail
3869 return ! empty($qres["result"]);
3870 }
3871
3872 public function is_service_notifiable() {
3873 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3874
3875 // Si l'instruction a une édition non finalisé quel que soit
3876 // le type de notification, il n'est pas notifiable
3877 if ($this->has_an_edition() === true) {
3878 if ($this->is_unfinalizable_without_bypass() === false) {
3879 return false;
3880 }
3881 }
3882 // Vérifie si la notification des tiers est active pour l'évènement
3883 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3884 }
3885
3886 public function is_tiers_notifiable() {
3887 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3888
3889 // Si l'instruction a une édition non finalisé quel que soit
3890 // le type de notification, il n'est pas notifiable
3891 if ($this->has_an_edition() === true) {
3892 if ($this->is_unfinalizable_without_bypass() === false) {
3893 return false;
3894 }
3895 }
3896 // Vérifie si la notification des tiers est active pour l'évènement
3897 return ! empty($evenement->getVal('notification_tiers'));
3898 }
3899
3900 /**
3901 * Méthode permettant de savoir si une instruction peut
3902 * être notifiée manuellement selon les différents types
3903 * de notification.
3904 *
3905 * Si l'instruction a une édition non finalisée alors elle n'est pas
3906 * manuellement notifiable.
3907 * Si l'instruction est associé à un événement de notification pour
3908 * lequel un retour signature est recquis, elle n'est notifiable que
3909 * si la date de retour de signature est remplie.
3910 * Par défaut si le type de notification n'est pas connu alors l'instruction
3911 * n'est pas notifiable.
3912 * Pour tous les autres cas l'instruction est manuellement notifiable.
3913 *
3914 * @return boolean true : notifiable | false : non notifiable
3915 */
3916 public function is_notifiable_by_task_manual() {
3917 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3918
3919 // Si l'instruction a une édition non finalisé quel que soit
3920 // le type de notification, il n'est pas notifiable
3921 if ($this->has_an_edition() === true) {
3922 if ($this->is_unfinalizable_without_bypass() === false) {
3923 return false;
3924 }
3925 }
3926
3927 // Gestion des différents cas selon la valeur du champs notification
3928 if ($ev->getVal('notification') == 'notification_manuelle' ||
3929 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3930 $ev->getVal('notification') == 'notification_automatique'
3931 ) {
3932 return true;
3933 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3934 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3935 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3936 $this->getVal('date_retour_signature') != null &&
3937 $this->getVal('date_retour_signature') != ''
3938 ) {
3939 return true ;
3940 }
3941 return false;
3942 }
3943
3944 /**
3945 * Crée une instance de notification et une tache notification_instruction de catégorie portal
3946 * pour le demandeur principal.
3947 *
3948 * @return boolean true si le traitement à réussi
3949 */
3950 protected function notifier_demandeur_principal_via_portal() {
3951 $this->begin_treatment(__METHOD__);
3952 $message = '';
3953 // Récupération des informations concernant le demandeur
3954 $dossier = $this->getVal('dossier');
3955 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3956 $demandeur = $this->get_demandeurs_notifiable(
3957 $dossier,
3958 true
3959 );
3960 if ($demandeur !== array()) {
3961 $destinataire = array_values($demandeur);
3962 // Ajout de la notif et récupération de son id
3963 $idNotification = $this->ajouter_notification(
3964 $this->getVal($this->clePrimaire),
3965 $this->f->get_connected_user_login_name(),
3966 $destinataire[0],
3967 $collectivite_di,
3968 array(),
3969 true
3970 );
3971 if ($idNotification === false) {
3972 return $this->end_treatment(__METHOD__, false);
3973 }
3974 // Création de la tâche en lui donnant l'id de la notification
3975 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3976 if ($notification_by_task === false) {
3977 $this->addToMessage(
3978 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3979 );
3980 return $this->end_treatment(__METHOD__, false);
3981 }
3982 $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.")));
3983 return $this->end_treatment(__METHOD__, true);
3984 }
3985 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3986 return $this->end_treatment(__METHOD__, false);
3987 }
3988
3989 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3990 // Si le type n'est pas correctement spécifié, alors il est calculé
3991 if ($type !== 'notification_recepisse'
3992 && $type !== 'notification_instruction'
3993 && $type !== 'notification_decision'
3994 && $type !== 'notification_service_consulte'
3995 && $type !== 'notification_tiers_consulte'
3996 && $type !== 'notification_depot_demat'
3997 && $type !== 'notification_commune'
3998 && $type !== 'notification_signataire') {
3999 //
4000 $type = 'notification_instruction';
4001 // Vérifie si l'instruction est un récépissé
4002 if ($this->is_instruction_recepisse()) {
4003 $type = 'notification_recepisse';
4004
4005 }
4006 // Vérifie si l'instruction est une décision
4007 if ($type !== 'notification_recepisse') {
4008 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
4009 if ($avis_decision !== null && $avis_decision !== '') {
4010 $type = 'notification_decision';
4011 }
4012 }
4013 }
4014 // Préparation des valeurs de la tâche
4015 $task_val = array(
4016 'type' => $type,
4017 'object_id' => $object_id,
4018 'dossier' => $dossier,
4019 'category' => $category,
4020 );
4021 // Préparation de la tache de notification
4022 $inst_task = $this->f->get_inst__om_dbform(array(
4023 "obj" => "task",
4024 "idx" => 0,
4025 ));
4026
4027 $add_task = $inst_task->add_task(array('val' => $task_val));
4028 if ($add_task === false) {
4029 $this->addToLog(
4030 sprintf(
4031 '%s(): %s %s : %s',
4032 __METHOD__,
4033 __('Echec de l\'ajout de la tâche de notification.'),
4034 __('Paramétrage de la tâche'),
4035 var_export($task_val, true)
4036 ),
4037 DEBUG_MODE
4038 );
4039 return false;
4040 }
4041
4042 return true;
4043 }
4044
4045 /**
4046 * Cette méthode permet de savoir si l'instruction est une instruction
4047 * de recepisse (instruction lié à l'ajout du dossier).
4048 *
4049 * Pour cela, on récupère la liste des actions qui ont menées à la création
4050 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
4051 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
4052 * l'instruction et donc qu'il s'agit d'un recepisse.
4053 *
4054 * @return boolean
4055 */
4056 protected function is_instruction_recepisse() {
4057 // Récupère la liste des actions qui ont mené à la création de
4058 // l'instruction
4059 $trace = debug_backtrace();
4060 // Parcours la liste des actions et si une de ces actions est lié
4061 // à la classe demande on cosidère que l'instruction est un recepisse
4062 foreach ($trace as $key => $value) {
4063 if (isset($trace[$key]['class']) === true
4064 && empty($trace[$key]['class']) === false) {
4065 if (strtolower($trace[$key]['class']) === 'demande') {
4066 return true;
4067 }
4068 }
4069 }
4070 return false;
4071 }
4072
4073 /**
4074 * A partir des informations passée en argument ajoute un nouvel élément
4075 * dans la table instruction_notification.
4076 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
4077 * paramètre si le paramétrage attendus est ok.
4078 * Ajoute également un nouvel élement dans instruction_notification_document
4079 * si l'instruction possède une lettretype.
4080 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
4081 * élement dans la table instruction_notification_document qui correspondra
4082 * à l'annexe de la notification.
4083 *
4084 * @param integer identifiant de l'instruction notifiée
4085 * @param string information concernant l'emetteur
4086 * @param array tableau contenant 2 entrées
4087 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
4088 * - courriel : adresse mail de la personne à notifier
4089 * @param integer identifiant de la collectivité permettant de récupèrer les
4090 * paramètres à valider
4091 * @param boolean indique si la notification est automatique ou manuelle
4092 * @param integer identifiant d'une instruction dont l'édition sera annexé
4093 * à la notification
4094 *
4095 * @return integer|boolean identifiant de la notification créée si le traitement
4096 * a réussie, false sinon.
4097 */
4098 protected function ajouter_notification(
4099 $idInstruction,
4100 $emetteur,
4101 $destinataire,
4102 $collectiviteId,
4103 $annexes = array(),
4104 $demandeAuto = false,
4105 $statut = 'en cours d\'envoi',
4106 $commentaire = 'Notification en cours de traitement'
4107 ) {
4108 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4109 // de créer la notification
4110 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4111 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4112 $this->addToMessage($msgErreur);
4113 $this->addToLog(
4114 sprintf('%s() : %s', __METHOD__, $msgErreur),
4115 DEBUG_MODE
4116 );
4117 return false;
4118 }
4119 // Préparation de la notification
4120 $inst_notif = $this->f->get_inst__om_dbform(array(
4121 "obj" => "instruction_notification",
4122 "idx" => "]",
4123 ));
4124 $notif_val = array(
4125 'instruction_notification' => null,
4126 'instruction' => $idInstruction,
4127 'automatique' => $demandeAuto,
4128 'emetteur' => $emetteur,
4129 'date_envoi' => null,
4130 'destinataire' => $destinataire['destinataire'],
4131 'courriel' => $destinataire['courriel'],
4132 'date_premier_acces' => null,
4133 'statut' => $statut,
4134 'commentaire' => $commentaire
4135 );
4136
4137 // Création de la notification
4138 $add_notif = $inst_notif->ajouter($notif_val);
4139 if ($add_notif === false) {
4140 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4141 $this->addToLog(
4142 sprintf(
4143 '%s() : %s %s : %s',
4144 __METHOD__,
4145 __("Echec de l'ajout de la notification en base de données."),
4146 __('Paramétrage de la notification'),
4147 var_export($notif_val, true)
4148 ),
4149 DEBUG_MODE
4150 );
4151 return false;
4152 }
4153
4154 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4155 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4156 $add_notif_doc = $this->ajouter_notification_document(
4157 $inst_notif->getVal($inst_notif->clePrimaire),
4158 $this->getVal($this->clePrimaire),
4159 'instruction'
4160 );
4161 if ($add_notif_doc === false) {
4162 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4163 return false;
4164 }
4165 }
4166 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4167 if (! empty($annexes) && is_array($annexes)) {
4168 $add_notif_annexe = $this->ajouter_notification_document_multiple(
4169 $inst_notif->getVal($inst_notif->clePrimaire),
4170 $annexes
4171 );
4172 if ($add_notif_annexe === false) {
4173 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4174 return false;
4175 }
4176 }
4177
4178 // Renvoie l'id de la nouvelle instance de instruction_notification
4179 return $inst_notif->getVal($inst_notif->clePrimaire);
4180 }
4181
4182 /**
4183 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4184 * instance dans la table instruction_notification_document lié a la
4185 * notification dont l'id est passé en paramètre.
4186 *
4187 * @param array tableau contenant les informations nécessaires pour créer les annexes
4188 *
4189 * @return integer|boolean identifiant de la notification créée si le traitement
4190 * a réussie, false sinon.
4191 */
4192 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4193 foreach ($listeDocument as $paramDoc) {
4194 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4195 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4196 return false;
4197 }
4198 }
4199 return true;
4200 }
4201
4202 /**
4203 * Ajoute un élément dans la table instruction_notification_document en utilisant
4204 * les éléments fourni en paramètre
4205 *
4206 * @param integer $idNotification : id de la notification à laquelle on associe le document
4207 * @param integer $idDocument : id de l'objet auquel est rattaché le document
4208 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4209 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4210 *
4211 * @return boolean indique si le traitement a réussi
4212 */
4213 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4214 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4215 "obj" => "instruction_notification_document",
4216 "idx" => "]",
4217 ));
4218 // l'attribut instruction doit obligatoirement être renseigné
4219 // pour éviter toutes confusion avec d'autres instruction l'id
4220 // 0 est donné au document n'appartenant pas aux instructions
4221 $notif_doc_val = array(
4222 'instruction_notification_document' => null,
4223 'instruction_notification' => $idNotification,
4224 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4225 'document_type' => $tableDocument,
4226 'document_id' => $idDocument,
4227 'cle' => $this->getCleAccesDocument(),
4228 'annexe' => $isAnnexe
4229 );
4230
4231 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4232 if ($add_notif_doc === false) {
4233 $this->addToLog(
4234 sprintf(
4235 '%s() : %s %s : %s',
4236 __METHOD__,
4237 __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4238 __('Paramétrage du document'),
4239 var_export($notif_doc_val, true)
4240 ),
4241 DEBUG_MODE
4242 );
4243 return false;
4244 }
4245 return true;
4246 }
4247
4248 /**
4249 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4250 *
4251 * @param integer identifiant de la collectivité
4252 * @return boolean
4253 */
4254 protected function is_parametrage_notification_correct($collectiviteId) {
4255 $categorie = $this->f->get_param_option_notification($collectiviteId);
4256 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4257 if ($categorie === 'mail' && $urlAccesNotif === null) {
4258 return false;
4259 }
4260 return true;
4261 }
4262
4263 /**
4264 * TRIGGER - triggermodifierapres.
4265 *
4266 * @return boolean
4267 */
4268 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4269 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4270 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4271 $message = '';
4272
4273 // Définit si le dossier d'instruction doit être mis à jour
4274 $update_dossier = true;
4275 // Les actions de mise à jour des dates ne doivent pas appliquer
4276 // l'action de l'événement et donc ne pas mettre à jour le dossier
4277 if ($this->getParameter("maj") == 125
4278 || $this->getParameter("maj") == 170
4279 || $this->getParameter("maj") == 175) {
4280 $update_dossier = false;
4281 }
4282
4283 // Traitement en cas de mise à jour du dossier
4284 if ($update_dossier === true) {
4285 /**
4286 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4287 * si la date de l'evenement est modifiee
4288 */
4289 // Initialisation
4290 $valF = array();
4291 $valF_dt = array();
4292 // Initialisation du type d'événement
4293 $type_evmt = "";
4294 // Récupération de l'action correspondante à l'événement
4295 $evenement = $this->f->get_inst__om_dbform(array(
4296 "obj" => "evenement",
4297 "idx" => $this->valF['evenement']
4298 ));
4299
4300 // Récupération des paramètres de l'action
4301 // TODO : remplacer cette requête par l'instanciation de l'action
4302 $qres = $this->f->get_all_results_from_db_query(
4303 sprintf(
4304 'SELECT
4305 *
4306 FROM
4307 %1$saction
4308 WHERE
4309 action = \'%2$s\'',
4310 DB_PREFIXE,
4311 $this->f->db->escapeSimple($evenement->getVal('action'))
4312 ),
4313 array(
4314 "origin" => __METHOD__
4315 )
4316 );
4317 foreach ($qres['result'] as $row) {
4318 // application des regles sur le courrier + delai
4319 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4320 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4321 }
4322 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4323 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4324 }
4325 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4326 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4327 }
4328 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4329 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4330 }
4331 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4332 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4333 }
4334 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4335 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4336 }
4337 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4338 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4339 }
4340 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4341 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4342 }
4343 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4344 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4345 }
4346 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4347 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4348 }
4349 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4350 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4351 }
4352 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4353 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4354 }
4355 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4356 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4357 }
4358 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4359 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4360 }
4361 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4362 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4363 }
4364 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4365 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4366 }
4367 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4368 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4369 }
4370 if ($row['regle_donnees_techniques1'] !== '') {
4371 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4372 }
4373 if ($row['regle_donnees_techniques2'] !== '') {
4374 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4375 }
4376 if ($row['regle_donnees_techniques3'] !== '') {
4377 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4378 }
4379 if ($row['regle_donnees_techniques4'] !== '') {
4380 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4381 }
4382 if ($row['regle_donnees_techniques5'] !== '') {
4383 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4384 }
4385 if ($row['regle_dossier_instruction_type'] !== '') {
4386 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4387 }
4388 }
4389 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4390 if (count($valF_dt) > 0) {
4391 $dt_id = $this->getDonneesTechniques();
4392 // On met à jour le dossier
4393 $cle = " donnees_techniques='".$dt_id."'";
4394 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4395 $this->addToLog(
4396 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4397 VERBOSE_MODE
4398 );
4399 $this->f->isDatabaseError($res1);
4400 // Affichage d'informations à l'utilisateur
4401 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4402 }
4403 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4404 if (count($valF) > 0) {
4405 $inst_dossier = $this->f->get_inst__om_dbform(array(
4406 "obj" => "dossier",
4407 "idx" => $this->valF['dossier'],
4408 ));
4409 $valF['instruction'] = $id;
4410 $valF['crud'] = 'update';
4411 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4412 if ($update_by_instruction === false) {
4413 $this->cleanMessage();
4414 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4415 return false;
4416 }
4417 // Affichage d'informations à l'utilisateur
4418 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4419 }
4420 }
4421
4422 // Par défaut les instructions à ajouter suite à la saisie d'une date
4423 // de retour signature ou de notification, utilisent l'action 0
4424 // Si la création d'événement d'instruction suivant est déclenchée par
4425 // une notification suite au traitement d'une tâche (démat') alors l'ajout
4426 // de la nouvelle instruction se fait avec l'action 176
4427 // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4428 // nouvelle instruction, depuis la méthode verifier()
4429 $code_action_add = 0;
4430 if ($this->getParameter("maj") == 175) {
4431 $code_action_add = 176;
4432 }
4433 $restriction = $this->get_restriction($val['evenement']);
4434 $this->restriction_valid = $this->restrictionIsValid($restriction);
4435
4436 if($restriction == "" || $this->restriction_valid ){
4437 // Récupération de tous les paramètres de l'événement sélectionné
4438 // TODO : remplacer cette requête par l'instanciation de l'evenement
4439 $qres = $this->f->get_all_results_from_db_query(
4440 sprintf(
4441 'SELECT
4442 *
4443 FROM
4444 %1$sevenement
4445 WHERE
4446 evenement = %2$d',
4447 DB_PREFIXE,
4448 intval($this->valF['evenement'])
4449 ),
4450 array(
4451 "origin" => __METHOD__
4452 )
4453 );
4454 $current_id = $this->getVal($this->clePrimaire);
4455 foreach ($qres['result'] as $row) {
4456 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4457 if ($this->getVal('date_retour_signature') == "" AND
4458 $this->valF['date_retour_signature'] != "" AND
4459 $row['evenement_retour_signature'] != "") {
4460 $new_instruction = $this->f->get_inst__om_dbform(array(
4461 "obj" => "instruction",
4462 "idx" => "]",
4463 ));
4464 // Création d'un tableau avec la liste des champs de l'instruction
4465 foreach($new_instruction->champs as $champ) {
4466 $valNewInstr[$champ] = "";
4467 }
4468 // Définition des valeurs de la nouvelle instruction
4469 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4470 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4471 $valNewInstr["dossier"] = $this->valF['dossier'];
4472 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4473 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4474 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4475 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4476 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4477 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4478 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4479 $new_instruction->setParameter("maj", $code_action_add);
4480 $new_instruction->class_actions[$code_action_add]["identifier"] =
4481 sprintf(
4482 __("Ajout suite au retour signature de l'instruction %s"),
4483 $current_id
4484 );
4485 $retour = $new_instruction->ajouter($valNewInstr);
4486
4487 //Si une erreur s'est produite et qu'il s'agit d'un problème
4488 //de restriction
4489 if ($retour == false && !$new_instruction->restriction_valid){
4490 $error_message = $this->get_restriction_error_message($restriction);
4491 $this->f->displayMessage("error", $error_message);
4492 $this->addToLog(__METHOD__."(): evenement retour ".
4493 "instruction ".$this->valF[$this->clePrimaire]." : ".
4494 $new_instruction->msg);
4495 }
4496 //Si une erreur s'est produite après le test de la restriction
4497 elseif ($retour == false && $new_instruction->restriction_valid){
4498 $this->correct = false ;
4499 $this->msg .= $new_instruction->msg;
4500 return false;
4501 }
4502 }
4503 // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4504 if ($this->getVal('date_retour_rar') == "" AND
4505 $this->valF['date_retour_rar'] != "") {
4506
4507 if($row['evenement_retour_ar'] != "") {
4508 $new_instruction = $this->f->get_inst__om_dbform(array(
4509 "obj" => "instruction",
4510 "idx" => "]",
4511 ));
4512 // Création d'un tableau avec la liste des champs de l'instruction
4513 foreach($new_instruction->champs as $champ) {
4514 $valNewInstr[$champ] = "";
4515 }
4516 // Définition des valeurs de la nouvelle instruction
4517 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4518 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4519 $valNewInstr["dossier"] = $this->valF['dossier'];
4520 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4521 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4522 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4523 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4524 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4525 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4526 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4527 $new_instruction->setParameter("maj", $code_action_add);
4528 $new_instruction->class_actions[$code_action_add]["identifier"] =
4529 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4530 $retour = $new_instruction->ajouter($valNewInstr);
4531
4532 //Si une erreur s'est produite et qu'il s'agit d'un problème
4533 //de restriction
4534 if ($retour == false && !$new_instruction->restriction_valid) {
4535 $error_message = $this->get_restriction_error_message($restriction);
4536 $this->f->displayMessage("error", $error_message);
4537 $this->addToLog(
4538 __METHOD__."(): evenement retour instruction ".
4539 $this->valF[$this->clePrimaire]." : ".
4540 $new_instruction->msg
4541 );
4542 }
4543 //Si une erreur s'est produite après le test de la restriction
4544 elseif ($retour == false && $new_instruction->restriction_valid){
4545 $this->correct = false ;
4546 $this->msg .= $new_instruction->msg;
4547 return false;
4548 }
4549 }
4550 }
4551 }
4552 }
4553
4554 // Traitement en cas de mise à jour du dossier
4555 if ($update_dossier === true) {
4556 /**
4557 * Mise à jour de la date de dernière modification du dossier
4558 * d'instruction
4559 */
4560 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4561 $inst_di->update_last_modification_date();
4562
4563 // Mise à jour des données du dossier d'autorisation
4564 $da = $this->f->get_inst__om_dbform(array(
4565 "obj" => "dossier_autorisation",
4566 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4567 ));
4568 $params = array(
4569 'di_id' => $this->getVal('dossier'),
4570 );
4571 if($da->majDossierAutorisation($params) === false) {
4572 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4573 $this->correct = false;
4574 return false;
4575 }
4576 }
4577
4578 // mise à jour des métadonnées issues des dates de suivi
4579 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4580 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4581 if ($dateRetourSignatureModified || $dateRetourRARModified) {
4582
4583 // Calculs des nouvelles métadonnées
4584 $metadata = $this->getMetadata("om_fichier_instruction");
4585
4586 // On vérifie si l'instruction à finaliser a un événement de type arrete
4587 // TODO : A voir pour remplacer par une instanciation de l'événement.
4588 // Voir également si l'événement ne dois pas être instancié en début de
4589 // méthode pour pouvoir être réutilisé.
4590 $qres = $this->f->get_one_result_from_db_query(
4591 sprintf(
4592 'SELECT
4593 type
4594 FROM
4595 %1$sevenement
4596 WHERE
4597 evenement = \'%2$d\'',
4598 DB_PREFIXE,
4599 intval($this->getVal("evenement"))
4600 ),
4601 array(
4602 "origin" => __METHOD__,
4603 "force_return" => true,
4604 )
4605 );
4606
4607 if ($qres["code"] !== "OK") {
4608 $this->correct = false;
4609 $this->addToMessage(__("Erreur de traitement de fichier."));
4610 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4611 return false;
4612 }
4613
4614 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4615 if ($qres['result'] == 'arrete'){
4616 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4617 }
4618
4619 // Filtre pour conserver uniquement les métadonnées liées aux dates
4620 $metadataToKeep = array(
4621 "statutAutorisation",
4622 "dateEvenementDocument",
4623 'date_cloture_metier',
4624 "NotificationArrete",
4625 "dateNotificationArrete",
4626 "controleLegalite",
4627 "dateSignature",
4628 "nomSignataire",
4629 "qualiteSignataire",
4630 "dateControleLegalite",
4631 );
4632 $metadata = array_filter(
4633 $metadata,
4634 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4635 ARRAY_FILTER_USE_KEY
4636 );
4637
4638 // Mise à jour des métadonnées du document en GED
4639 $docUid = $this->getVal("om_fichier_instruction");
4640 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4641 if ($operationOrUID == 'OP_FAILURE') {
4642 $this->correct = false;
4643 $this->addToMessage(__("Erreur de traitement de fichier."));
4644 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4645 return false;
4646 }
4647
4648 // mise à jour de l'UID du document en BDD
4649 else {
4650 $valF = array('om_fichier_instruction' => $operationOrUID);
4651 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4652 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4653 if ($this->f->isDatabaseError($res, true) === true) {
4654 $this->correct = false;
4655 $this->addToMessage(__("Erreur de traitement de fichier."));
4656 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4657 return false;
4658 }
4659 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4660 }
4661 }
4662
4663 // Déclenchement des notifications automatique après finalisation et
4664 // retour de signature
4665 if ($dateRetourSignatureModified === true
4666 && $this->valF['date_retour_signature'] !== ''
4667 && $this->valF['date_retour_signature'] !== null) {
4668
4669 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4670 $msgLog = sprintf(
4671 '%s %s : %d',
4672 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4673 __('Instruction notifiée'),
4674 $id
4675 );
4676
4677 // Récupération de l'instance de l'événement pour accéder au paramètrage
4678 // des notifications
4679 $ev = $this->get_inst_evenement($this->valF['evenement']);
4680 // Si la notification automatique des tiers consulté est active
4681 // déclenche le traitement de notification.
4682 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4683 $typeNotifTiers = $ev->getVal('notification_tiers');
4684 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4685 if ($typeNotifTiers === 'notification_automatique') {
4686 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4687 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4688 $this->correct = false;
4689 }
4690 }
4691
4692 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4693 // Récupération de la liste des demandeurs à notifier et de la catégorie
4694 $categorie = $this->f->get_param_option_notification($collectivite_di);
4695 $isPortal = $categorie === PORTAL;
4696 $demandeursANotifie = $this->get_demandeurs_notifiable(
4697 $this->valF['dossier'],
4698 $isPortal
4699 );
4700
4701 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4702 $demandeurPrincipalNotifie = false;
4703 foreach ($demandeursANotifie as $demandeur) {
4704 // Identifie si le demandeur principal a été notifié ou pas
4705 // et récupère ses informations
4706 if ($demandeur['petitionnaire_principal'] == 't') {
4707 $demandeurPrincipalNotifie = true;
4708 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4709 // son paramétrage, on effectue pas le traitement et on passe à l'itération
4710 // suivante. On le considère également comme non notifié pour gérer l'envoie
4711 // des messages d'erreurs
4712 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4713 // d'impact sur la notification
4714 $erreursParam = $this->get_info_notification_fail();
4715 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4716 $demandeurPrincipalNotifie = false;
4717 continue;
4718 }
4719 }
4720 // Ajout de la notif et récupération de son id
4721 $idNotif = $this->ajouter_notification(
4722 $this->valF[$this->clePrimaire],
4723 $this->f->get_connected_user_login_name(),
4724 $demandeur,
4725 $collectivite_di,
4726 array(),
4727 true
4728 );
4729 if ($idNotif === false) {
4730 $this->addToLog(
4731 sprintf('%s() : %s',__METHOD__, $msgLog),
4732 DEBUG_MODE
4733 );
4734 return false;
4735 }
4736 // Création de la tache en lui donnant l'id de la notification
4737 $notification_by_task = $this->notification_by_task(
4738 $idNotif,
4739 $this->valF['dossier'],
4740 $categorie
4741 );
4742 if ($notification_by_task === false) {
4743 $this->addToLog(
4744 sprintf('%s() : %s',__METHOD__, $msgLog),
4745 DEBUG_MODE
4746 );
4747 $this->addToMessage(
4748 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4749 );
4750 return false;
4751 }
4752 }
4753 // Pour la notification par mail ou la notification via portal si le dossier a
4754 // été déposés via portal, si le demandeur principal n'est pas notifiable,
4755 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4756 // laquelle le demandeur principal n'a pas pu être notifié
4757 $depotPortal = $this->dossier_depose_sur_portail();
4758 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4759 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4760 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4761 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4762 $erreursParam = $this->get_info_notification_fail();
4763 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4764 // Ajout de la notif et récupération de son id
4765 $idNotif = $this->ajouter_notification(
4766 $this->valF[$this->clePrimaire],
4767 $this->f->get_connected_user_login_name(),
4768 $demandeurPrincipal,
4769 $collectivite_di,
4770 array(),
4771 true,
4772 'Echec',
4773 implode(' ', $erreursParam)
4774 );
4775 if ($idNotif === false) {
4776 $this->addToLog(
4777 sprintf('%s() : %s', __METHOD__, $msgLog),
4778 DEBUG_MODE
4779 );
4780 $this->addToMessage(
4781 __('Erreur : la création de la notification a échouée.').
4782 __("Veuillez contacter votre administrateur.")
4783 );
4784 return false;
4785 }
4786 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4787 // de l'échec de la notification
4788 $dossier_message = $this->get_inst_dossier_message(0);
4789 $dossier_message_val = array(
4790 'dossier' => $this->getVal('dossier'),
4791 'type' => _('erreur expedition'),
4792 'emetteur' => $this->f->get_connected_user_login_name(),
4793 'login' => $_SESSION['login'],
4794 'date_emission' => date('Y-m-d H:i:s'),
4795 'contenu' => _('Échec lors de la notification de l\'instruction ').
4796 $ev->getVal('libelle').
4797 '.<br>'.
4798 implode("\n", $erreursParam).
4799 '<br>'.
4800 _('Veuillez corriger ces informations avant de renvoyer la notification.')
4801 );
4802 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4803 // Si une erreur se produit pendant l'ajout
4804 if ($add !== true) {
4805 $this->addToLog(
4806 sprintf(
4807 '%s() : %s',
4808 __METHOD__,
4809 __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4810 ),
4811 DEBUG_MODE
4812 );
4813 return false;
4814 }
4815 }
4816 $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.")));
4817 }
4818 }
4819
4820 return $this->add_log_to_dossier($id, $val);
4821 }
4822
4823 /**
4824 * TRIGGER - triggersupprimer.
4825 *
4826 * @return boolean
4827 */
4828 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4829 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4830 /**
4831 * L'objectif ici est de repositionner les valeurs récupérées en
4832 * archive dans le dossier d'instruction avant de supprimer l'événement
4833 * d'instruction si les valeurs du dossier sont différentes
4834 */
4835 $valF = array();
4836 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4837 foreach ($inst_di->champs as $key => $champ) {
4838 // Si le champ du DI à une archive dans l'instruction
4839 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4840 // Si la valeur entre le champ du DI et son archive dans instruction
4841 // est différente
4842 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4843 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4844 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
4845 // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
4846 if ($champ === "accord_tacite" && $valF[$champ] === null) {
4847 $valF[$champ] = ' ';
4848 }
4849 }
4850 }
4851 }
4852 // Spécificité du champ avis_decision dont le champ archive est nommé
4853 // différemment
4854 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4855 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4856 }
4857 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4858 // par l'archive
4859 unset($valF['date_affichage']);
4860
4861 /**
4862 * Mise à jour de la version de clôture *version_clos* du dossier si et
4863 * seulement si l'instruction met à jour l'état du dossier.
4864 */
4865 if (isset($valF['etat']) === true
4866 && $valF['etat'] !== null
4867 && $valF['etat'] !== '') {
4868 // Récupère l'état actuel du dossier d'instruction
4869 $inst_current_etat = $this->f->get_inst__om_dbform(array(
4870 "obj" => "etat",
4871 "idx" => $inst_di->get_id_etat(),
4872 ));
4873 // Instanciation de l'état archivé appliqué sur le dossier
4874 $inst_etat = $this->f->get_inst__om_dbform(array(
4875 "obj" => "etat",
4876 "idx" => $valF['etat'],
4877 ));
4878 //
4879 $update_version_clos = null;
4880 // En cas de clôture du dossier par l'état archivé
4881 if ($inst_etat->getVal('statut') === 'cloture') {
4882 $update_version_clos = $inst_di->update_version_clos('up');
4883 }
4884 // En cas de réouverture du dossier par l'état archivé
4885 if ($inst_current_etat->getVal('statut') === 'cloture'
4886 && $inst_etat->getVal('statut') !== 'cloture') {
4887 //
4888 $update_version_clos = $inst_di->update_version_clos('down');
4889 //
4890 $this->set_att_di_reopened(true);
4891 }
4892 //
4893 if ($update_version_clos === false) {
4894 $this->f->addToLog(sprintf(
4895 "%s() : ERREUR - %s %s",
4896 __METHOD__,
4897 sprintf(
4898 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4899 $inst_di->getVal($inst_di->clePrimaire)
4900 ),
4901 sprintf(
4902 __("L'instruction tente d'appliquer l'état %s."),
4903 $inst_etat->getVal($inst_etat->clePrimaire)
4904 )
4905 ));
4906 $this->addToMessage(sprintf(
4907 "%s %s",
4908 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4909 __("Veuillez contacter votre administrateur.")
4910 ));
4911 return false;
4912 }
4913 }
4914 // On supprime toutes les notications liées à l'instruction
4915 $notifASupprimer = $this->get_instruction_notification(
4916 $this->getVal($this->clePrimaire),
4917 array(
4918 'notification_recepisse',
4919 'notification_instruction',
4920 'notification_decision',
4921 'notification_service_consulte',
4922 'notification_tiers_consulte',
4923 'notification_depot_demat',
4924 'notification_commune',
4925 'notification_signataire'
4926 ),
4927 true
4928 );
4929
4930 foreach ($notifASupprimer as $idNotif) {
4931 $inst_notif = $this->f->get_inst__om_dbform(array(
4932 "obj" => "instruction_notification",
4933 "idx" => $idNotif,
4934 ));
4935 $val_notif = array();
4936 foreach ($inst_notif->champs as $champ) {
4937 $val_notif[$champ] = $inst_notif->getVal($champ);
4938 }
4939 // La suppression des notifications entrainera la suppression des tâches qui y sont
4940 // liées
4941 $supprNotif = $inst_notif->supprimer($val_notif);
4942 if ($supprNotif == false) {
4943 $this->addToMessage(sprintf(
4944 "%s %s",
4945 __("Erreur lors de la suppression des notifications de l'instruction."),
4946 __("Veuillez contacter votre administrateur.")
4947 ));
4948 return false;
4949 }
4950 }
4951
4952 // On met à jour le dossier
4953 $valF['instruction'] = $id;
4954 $valF['crud'] = 'delete';
4955 $update_by_instruction = $inst_di->update_by_instruction($valF);
4956 if ($update_by_instruction === false) {
4957 $this->cleanMessage();
4958 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4959 return false;
4960 }
4961
4962 // Affichage d'informations à l'utilisateur
4963 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4964
4965 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4966 }
4967
4968 /**
4969 * TRIGGER - triggersupprimerapres.
4970 *
4971 * @return boolean
4972 */
4973 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4974 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4975 /**
4976 * Mise à jour de la date de dernière modification du dossier
4977 * d'instruction
4978 */
4979 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4980 $inst_di->update_last_modification_date();
4981
4982 /**
4983 * Mise à jour des données du dossier d'autorisation
4984 */
4985 $da = $this->f->get_inst__om_dbform(array(
4986 "obj" => "dossier_autorisation",
4987 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4988 ));
4989 $params = array(
4990 'di_id' => $this->getVal('dossier'),
4991 'di_reopened' => $this->get_att_di_reopened(),
4992 );
4993 if($da->majDossierAutorisation($params) === false) {
4994 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4995 $this->correct = false;
4996 return false;
4997 }
4998
4999 /**
5000 * Gestion des tâches pour la dématérialisation
5001 */
5002 $inst_task_empty = $this->f->get_inst__om_dbform(array(
5003 "obj" => "task",
5004 "idx" => 0,
5005 ));
5006 foreach ($inst_di->task_types as $task_type) {
5007 $task_exists = $inst_task_empty->task_exists($task_type, $id);
5008 if ($task_exists !== false) {
5009 $inst_task = $this->f->get_inst__om_dbform(array(
5010 "obj" => "task",
5011 "idx" => $task_exists,
5012 ));
5013 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
5014 $task_val = array(
5015 'state' => $inst_task::STATUS_CANCELED,
5016 );
5017 $update_task = $inst_task->update_task(array('val' => $task_val));
5018 if ($update_task === false) {
5019 $this->addToMessage(sprintf('%s %s',
5020 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
5021 __("Veuillez contacter votre administrateur.")
5022 ));
5023 $this->correct = false;
5024 return false;
5025 }
5026 }
5027 }
5028 }
5029
5030 //
5031 $val['evenement'] = $this->getVal('evenement');
5032 return $this->add_log_to_dossier($id, $val);
5033 }
5034
5035 /**
5036 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
5037 * "di_reopened".
5038 *
5039 * @param boolean $val
5040 */
5041 function set_att_di_reopened($val) {
5042 $this->di_reopened = $val;
5043 }
5044
5045 /**
5046 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
5047 *
5048 * @return boolean
5049 */
5050 function get_att_di_reopened() {
5051 return $this->di_reopened;
5052 }
5053
5054 /**
5055 * Permet de composer un message d'erreur sur restriction non valide en
5056 * fonction du contexte.
5057 *
5058 * @param string $restriction formule de la restriction
5059 *
5060 * @return string message d'erreur
5061 */
5062 function get_restriction_error_message($restriction) {
5063 // Affichage du message si la restriction s'applique
5064 // Contexte du suivi des dates (message simple)
5065 $message_restrict = _("Probleme de dates :");
5066 // Split restriction
5067 $champs_restrict = preg_split(
5068 '/(\W+)/',
5069 $restriction,
5070 null,
5071 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
5072 );
5073 $formated_restrict = "";
5074 // Ajout des chaînes à traduire
5075 foreach ($champs_restrict as $value) {
5076 $formated_restrict .= _($value)." ";
5077 }
5078 $formated_restrict = substr($formated_restrict, 0, -1);
5079 // Message d'erreur dans le contexte du suivi des dates
5080 if($this->getParameter("maj") == 170) {
5081 $message_restrict .= " "._("contactez l'instructeur du dossier");
5082 $message_restrict .= "<br/>(".$formated_restrict.")";
5083 } else {
5084 // Affichage du message si la restriction s'applique
5085 // Contexte instruction
5086 $message_restrict .= "<br/>".$formated_restrict;
5087 }
5088
5089 return $message_restrict;
5090 }
5091
5092 /**
5093 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5094 * les vérifications suivantes :
5095 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5096 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5097 * le message d'erreur associé à la restriction
5098 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5099 * et / ou la modification et affiche un message d'erreur
5100 * -
5101 * -
5102 * -
5103 * -
5104 * -
5105 * -
5106 *
5107 * @param array val : tableau contenant les valeurs issues du formulaire.
5108 * @param - dnu1 : Paramètre déprécié et non utilisé.
5109 * @param - dnu2 : Paramètre déprécié et non utilisé.
5110 *
5111 * @return void
5112 */
5113 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5114 parent::verifier($val);
5115 //
5116 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5117 $restriction = $this->get_restriction($val['evenement']);
5118
5119 //Test qu'une restriction est présente
5120 if ($restriction != "" ){
5121
5122 // Vérifie le contexte de la modification et test si la restriction est valide.
5123 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5124 // Il n'est donc pas nécessaire de vérifier les restrictions.
5125 $this->restriction_valid = $this->restrictionIsValid($restriction);
5126 if ($this->getParameter("maj") != 176
5127 && !$this->restriction_valid) {
5128
5129 // Affichage du message si la restriction s'applique
5130 $this->addToMessage(
5131 $this->get_restriction_error_message($restriction)
5132 );
5133 $this->correct=false;
5134 return false;
5135 }
5136
5137 // Liste des opérateurs possible
5138 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5139 // Supprime tous les espaces de la chaîne de caractère
5140 $restriction = str_replace(' ', '', $restriction);
5141
5142 // Met des espace avant et après les opérateurs puis transforme la
5143 // chaine en un tableau
5144 $tabRestriction = str_replace($operateurs, " ", $restriction);
5145 // Tableau des champ
5146 $tabRestriction = explode(" ", $tabRestriction);
5147 // Supprime les numériques du tableau
5148 foreach ($tabRestriction as $key => $value) {
5149 if (is_numeric($value)) {
5150 unset($tabRestriction[$key]);
5151 }
5152 }
5153
5154 // Vérifie les champs utilisés pour la restriction
5155 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5156 if ($check_field_exist !== true) {
5157
5158 // Liste des champs en erreur
5159 $string_error_fields = implode(", ", $check_field_exist);
5160
5161 // Message d'erreur
5162 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5163 if (count($check_field_exist) > 1) {
5164 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5165 }
5166
5167 // Affiche l'erreur
5168 $this->correct=false;
5169 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5170 $this->addToMessage(_("Veuillez contacter votre administrateur."));
5171 }
5172 }
5173
5174 }
5175 if(!$this->updateDate("date_envoi_signature")) {
5176 return false;
5177 }
5178 if(!$this->updateDate("date_retour_signature")) {
5179 return false;
5180 }
5181 if(!$this->updateDate("date_envoi_rar")) {
5182 return false;
5183 }
5184 if(!$this->updateDate("date_retour_rar")) {
5185 return false;
5186 }
5187 if(!$this->updateDate("date_envoi_controle_legalite")) {
5188 return false;
5189 }
5190 if(!$this->updateDate("date_retour_controle_legalite")) {
5191 return false;
5192 }
5193
5194 }
5195
5196 /**
5197 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5198 * principal du dossier auquel appartiens l'instruction.
5199 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5200 *
5201 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5202 * et affiche un message dans les logs.
5203 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5204 *
5205 * @param string identifiant du dossier
5206 * @return array|boolean
5207 */
5208 protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5209 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5210 // l'objet courant
5211 if (empty($dossier)) {
5212 $dossier = $this->getVal('dossier');
5213 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5214 // false et on affiche un message d'erreur dans les logs
5215 if (empty($dossier)) {
5216 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5217 return false;
5218 }
5219 }
5220
5221 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5222 // principal
5223 $qres = $this->f->get_all_results_from_db_query(
5224 sprintf(
5225 'SELECT
5226 -- Récupère toutes les informations du demandeur principal
5227 demandeur.*,
5228 CASE
5229 WHEN demandeur.qualite=\'particulier\'
5230 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5231 ELSE
5232 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5233 END AS destinataire
5234 FROM
5235 %1$sdossier
5236 LEFT JOIN %1$slien_dossier_demandeur
5237 ON lien_dossier_demandeur.dossier = dossier.dossier
5238 LEFT JOIN %1$sdemandeur
5239 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5240 WHERE
5241 dossier.dossier = \'%2$s\'
5242 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5243 DB_PREFIXE,
5244 $this->f->db->escapeSimple($dossier)
5245 ),
5246 array(
5247 "origin" => __METHOD__,
5248 )
5249 );
5250 if (is_array($qres["result"]) === true
5251 && array_key_exists(0, $qres["result"]) === true) {
5252 //
5253 return $qres["result"][0];
5254 }
5255 return null;
5256 }
5257
5258
5259
5260 /**
5261 * Finalisation des documents.
5262 * @param string $champ champ du fichier à finaliser
5263 * @param booleen $status permet de définir si on finalise ou définalise
5264 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5265 */
5266 function manage_finalizing($mode = null, $val = array()) {
5267 //
5268 $this->begin_treatment(__METHOD__);
5269
5270 //
5271 $id_inst = $this->getVal($this->clePrimaire);
5272
5273 //
5274 $admin_msg_error = _("Veuillez contacter votre administrateur.");
5275 $file_msg_error = _("Erreur de traitement de fichier.")
5276 ." ".$admin_msg_error;
5277 $bdd_msg_error = _("Erreur de base de données.")
5278 ." ".$admin_msg_error;
5279 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5280
5281 // Si on finalise le document
5282 if ($mode == "finalize"){
5283 //
5284 $etat = _('finalisation');
5285
5286 // Récupère la collectivite du dossier d'instruction
5287 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5288
5289 //
5290 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5291
5292 //
5293 $params = array(
5294 "specific" => array(),
5295 );
5296 // Si la rédaction libre est activée sur l'instruction
5297 if ($this->getVal("flag_edition_integrale") == 't') {
5298 $params["specific"]["corps"] = array(
5299 "mode" => "set",
5300 "value" => $this->getVal("corps_om_htmletatex"),
5301 );
5302 $params["specific"]["titre"] = array(
5303 "mode" => "set",
5304 "value" => $this->getVal("titre_om_htmletat"),
5305 );
5306 }
5307 // Génération du PDF
5308 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5309 $pdf_output = $result['pdf_output'];
5310
5311 //Métadonnées du document
5312 $metadata = array(
5313 'filename' => 'instruction_'.$id_inst.'.pdf',
5314 'mimetype' => 'application/pdf',
5315 'size' => strlen($pdf_output)
5316 );
5317
5318 // Récupération des métadonnées calculées après validation
5319 $spe_metadata = $this->getMetadata("om_fichier_instruction");
5320
5321 //On vérifie si l'instruction à finaliser a un événement de type arrete
5322 // TODO : A voir pour remplacer par une instanciation de l'événement.
5323 // Voir également si l'événement ne dois pas être instancié en début de
5324 // méthode pour pouvoir être réutilisé.
5325 $qres = $this->f->get_one_result_from_db_query(
5326 sprintf(
5327 'SELECT
5328 type
5329 FROM
5330 %1$sevenement
5331 WHERE
5332 evenement = \'%2$d\'',
5333 DB_PREFIXE,
5334 intval($this->getVal("evenement"))
5335 ),
5336 array(
5337 "origin" => __METHOD__,
5338 "force_return" => true,
5339 )
5340 );
5341
5342 if ($qres["code"] !== "OK") {
5343 $this->correct = false;
5344 $this->addToMessage($bdd_msg_error);
5345 return $this->end_treatment(__METHOD__, false);
5346 }
5347
5348 //Initialisation de la variable
5349 $arrete_metadata = array();
5350 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5351 if ($qres['result'] === 'arrete'){
5352 $arrete_metadata = $this->getMetadata("arrete");
5353 }
5354
5355 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5356
5357 /*
5358 // transforme le tableau de métadonnées en objet
5359 $mdf = new MetadataFactory();
5360 $md = $mdf->build('Instruction', $metadata);
5361 */
5362
5363 // Si le document a déjà été finalisé on le met à jour
5364 // en conservant son UID
5365 if ($this->getVal("om_fichier_instruction") != ''){
5366 $uid = $this->f->storage->update(
5367 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5368 }
5369 // Sinon on crée un nouveau document et dont on récupère l'UID
5370 else {
5371 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5372 }
5373 }
5374
5375 // Si on définalise le document
5376 if ($mode == "unfinalize") {
5377 //
5378 $etat = _('définalisation');
5379 // Récupération de l'uid du document finalisé
5380 $uid = $this->getVal("om_fichier_instruction");
5381 }
5382
5383 // Si on définalise l'UID doit être défini
5384 // Si on finalise la création/modification du fichier doit avoir réussi
5385 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5386 $this->correct = false;
5387 $this->addToMessage($file_msg_error);
5388 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5389 return $this->end_treatment(__METHOD__, false);
5390 }
5391
5392 //
5393 foreach ($this->champs as $key => $champ) {
5394 //
5395 $val[$champ] = $this->val[$key];
5396 }
5397
5398 //
5399 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5400 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5401 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5402 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5403 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5404 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5405 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5406 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5407 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5408 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5409 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5410 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5411 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5412 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5413 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5414 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5415 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5416 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5417 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5418 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5419 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5420 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5421 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5422 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5423 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5424 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5425 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5426 $this->setvalF($val);
5427
5428 // Verification de la validite des donnees
5429 $this->verifier($this->val);
5430 // Si les verifications precedentes sont correctes, on procede a
5431 // la modification, sinon on ne fait rien et on retourne une erreur
5432 if ($this->correct === true) {
5433 //
5434 $valF = array(
5435 "om_fichier_instruction" => $uid,
5436 "date_finalisation_courrier" => date('Y-m-d')
5437 );
5438 //
5439 if($mode=="finalize") {
5440 // état finalisé vrai
5441 $valF["om_final_instruction"] = true;
5442 // ajout log utilisateur
5443 $login = $_SESSION['login'];
5444 $nom = "";
5445 $this->f->getUserInfos();
5446 if (isset($this->f->om_utilisateur["nom"])
5447 && !empty($this->f->om_utilisateur["nom"])) {
5448 $nom = $this->f->om_utilisateur["nom"];
5449 }
5450 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5451 if ($nom != "") {
5452 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5453 }
5454 } else {
5455 // état finalisé faux
5456 $valF["om_final_instruction"] = false;
5457 // suppression log utilisateur
5458 $valF["om_final_instruction_utilisateur"] = '';
5459 }
5460
5461 // Execution de la requête de modification des donnees de l'attribut
5462 // valF de l'objet dans l'attribut table de l'objet
5463 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5464 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5465 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5466 //
5467 if ($this->f->isDatabaseError($res, true) === true) {
5468 $this->correct = false;
5469 $this->addToMessage($bdd_msg_error);
5470 return $this->end_treatment(__METHOD__, false);
5471 }
5472
5473 //
5474 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5475 //
5476 if ($this->add_log_to_dossier($id_inst, $val) === false) {
5477 return $this->end_treatment(__METHOD__, false);
5478 }
5479 //
5480 return $this->end_treatment(__METHOD__, true);
5481 }
5482 // L'appel de verifier() a déjà positionné correct à false
5483 // et défini un message d'erreur.
5484 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5485 return $this->end_treatment(__METHOD__, false);
5486 }
5487
5488 /**
5489 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5490 * @return string numéro de dossier d'instruction
5491 */
5492 protected function getDossier($champ = null) {
5493 if(empty($this->specificMetadata)) {
5494 $this->getSpecificMetadata();
5495 }
5496 return $this->specificMetadata->dossier;
5497 }
5498 /**
5499 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5500 * @return int Version
5501 */
5502 protected function getDossierVersion() {
5503 if(empty($this->specificMetadata)) {
5504 $this->getSpecificMetadata();
5505 }
5506 return $this->specificMetadata->version;
5507 }
5508 /**
5509 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5510 * @return string numéro de dossier d'autorisation
5511 */
5512 protected function getNumDemandeAutor() {
5513 if(empty($this->specificMetadata)) {
5514 $this->getSpecificMetadata();
5515 }
5516 return $this->specificMetadata->dossier_autorisation;
5517 }
5518 /**
5519 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5520 * @return date de la demande initiale
5521 */
5522 protected function getAnneemoisDemandeAutor() {
5523 if(empty($this->specificMetadata)) {
5524 $this->getSpecificMetadata();
5525 }
5526 return $this->specificMetadata->date_demande_initiale;
5527 }
5528 /**
5529 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5530 * @return string type du dossier d'instruction
5531 */
5532 protected function getTypeInstruction() {
5533 if(empty($this->specificMetadata)) {
5534 $this->getSpecificMetadata();
5535 }
5536 return $this->specificMetadata->dossier_instruction_type;
5537 }
5538 /**
5539 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5540 * @return string avis
5541 */
5542 protected function getStatutAutorisation() {
5543 if(empty($this->specificMetadata)) {
5544 $this->getSpecificMetadata();
5545 }
5546 return $this->specificMetadata->statut;
5547 }
5548 /**
5549 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5550 * @return string type du dossier d'autorisation
5551 */
5552 protected function getTypeAutorisation() {
5553 if(empty($this->specificMetadata)) {
5554 $this->getSpecificMetadata();
5555 }
5556 return $this->specificMetadata->dossier_autorisation_type;
5557 }
5558 /**
5559 * Récupération de la date d'ajout de document à ajouter aux métadonnées
5560 * @return date de l'évènement
5561 */
5562 protected function getDateEvenementDocument() {
5563 return date("Y-m-d");
5564 }
5565 /**
5566 * Récupération du groupe d'instruction à ajouter aux métadonnées
5567 * @return string Groupe d'instruction
5568 */
5569 protected function getGroupeInstruction() {
5570 if(empty($this->specificMetadata)) {
5571 $this->getSpecificMetadata();
5572 }
5573 return $this->specificMetadata->groupe_instruction;
5574 }
5575 /**
5576 * Récupération du libellé du type du document à ajouter aux métadonnées
5577 * @return string Groupe d'instruction
5578 */
5579 protected function getTitle() {
5580
5581 // Récupère le champ événement
5582 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5583 $evenement = $this->valF["evenement"];
5584 } else {
5585 $evenement = $this->getVal("evenement");
5586 }
5587
5588 // Requête sql
5589 $evenement = $this->f->get_inst__om_dbform(array(
5590 "obj" => "evenement",
5591 "idx" => $evenement
5592 ));
5593
5594 // Retourne le libelle de l'événement
5595 return $evenement->getVal('libelle');
5596 }
5597
5598
5599 /**
5600 * Récupération du champ ERP du dossier d'instruction.
5601 *
5602 * @return boolean
5603 */
5604 public function get_concerne_erp() {
5605 //
5606 if(empty($this->specificMetadata)) {
5607 $this->getSpecificMetadata();
5608 }
5609 //
5610 return $this->specificMetadata->erp;
5611 }
5612
5613
5614 /**
5615 * Cette méthode permet de stocker en attribut toutes les métadonnées
5616 * nécessaire à l'ajout d'un document.
5617 */
5618 public function getSpecificMetadata() {
5619 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5620 $dossier = $this->valF["dossier"];
5621 } else {
5622 $dossier = $this->getVal("dossier");
5623 }
5624 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5625 $qres = $this->f->get_all_results_from_db_query(
5626 sprintf(
5627 'SELECT
5628 dossier.dossier AS dossier,
5629 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5630 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5631 dossier_instruction_type.code AS dossier_instruction_type,
5632 etat_dossier_autorisation.libelle AS statut,
5633 dossier_autorisation_type.code AS dossier_autorisation_type,
5634 groupe.code AS groupe_instruction,
5635 CASE WHEN dossier.erp IS TRUE
5636 THEN \'true\'
5637 ELSE \'false\'
5638 END AS erp
5639 FROM
5640 %1$sdossier
5641 LEFT JOIN %1$sdossier_instruction_type
5642 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5643 LEFT JOIN %1$sdossier_autorisation
5644 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5645 LEFT JOIN %1$setat_dossier_autorisation
5646 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5647 LEFT JOIN %1$sdossier_autorisation_type_detaille
5648 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5649 LEFT JOIN %1$sdossier_autorisation_type
5650 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5651 LEFT JOIN %1$sgroupe
5652 ON dossier_autorisation_type.groupe = groupe.groupe
5653 WHERE
5654 dossier.dossier = \'%2$s\'',
5655 DB_PREFIXE,
5656 $this->f->db->escapeSimple($dossier)
5657 ),
5658 array(
5659 "origin" => __METHOD__,
5660 )
5661 );
5662 $row = array_shift($qres['result']);
5663
5664 //Si il y a un résultat
5665 if (! empty($row)) {
5666
5667 // Instrance de la classe dossier
5668 $inst_dossier = $this->get_inst_dossier($dossier);
5669 // TODO : améliorer ce code
5670 //
5671 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5672 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5673 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5674 // valeurs issues de la requête en objet.
5675 $metadata = (object)$row;
5676 // Insère l'attribut version à l'objet
5677 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5678
5679 //Alors on créé l'objet dossier_instruction
5680 $this->specificMetadata = $metadata;
5681
5682 }
5683 }
5684
5685 /**
5686 * Retourne le statut du dossier d'instruction
5687 * @param string $idx Identifiant du dossier d'instruction
5688 * @return string Le statut du dossier d'instruction
5689 */
5690 function getStatutAutorisationDossier($idx){
5691
5692 $statut = '';
5693
5694 //Si l'identifiant du dossier d'instruction fourni est correct
5695 if ( $idx != '' ){
5696
5697 //On récupère le statut de l'état du dossier à partir de l'identifiant du
5698 //dossier
5699 $qres = $this->f->get_one_result_from_db_query(
5700 sprintf(
5701 'SELECT
5702 etat.statut
5703 FROM
5704 %1$sdossier
5705 LEFT JOIN
5706 %1$setat
5707 ON
5708 dossier.etat = etat.etat
5709 WHERE
5710 dossier = \'%2$s\'',
5711 DB_PREFIXE,
5712 $this->f->db->escapeSimple($idx)
5713 ),
5714 array(
5715 "origin" => __METHOD__,
5716 )
5717 );
5718 }
5719
5720 return $qres['result'];
5721 }
5722
5723 /**
5724 * Récupère les données du dossier
5725 * @return array
5726 */
5727 function get_dossier_actual() {
5728
5729 // Initialisation de la valeur de retour
5730 $return = array();
5731
5732 // Récupération de toutes les valeurs du dossier d'instruction en cours
5733 // TODO : remplacer cette requête par une instanciation de l'objet
5734 $qres = $this->f->get_all_results_from_db_query(
5735 sprintf(
5736 'SELECT
5737 *
5738 FROM
5739 %1$sdossier
5740 WHERE
5741 dossier = \'%2$s\'',
5742 DB_PREFIXE,
5743 $this->f->db->escapeSimple($this->valF['dossier'])
5744 ),
5745 array(
5746 'origin' => __METHOD__
5747 )
5748 );
5749
5750 foreach ($qres['result'] as $row) {
5751
5752 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5753 // de l'état et de l'avis du dossier d'instruction
5754 $return['archive_delai'] = $row['delai'];
5755 $return['archive_accord_tacite'] = $row['accord_tacite'];
5756 $return['archive_etat'] = $row['etat'];
5757 $return['archive_avis'] = $row['avis_decision'];
5758 // Récupération de la valeur actuelle des dates du dossier
5759 // d'instruction
5760 $return['archive_date_complet'] = $row['date_complet'];
5761 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5762 $return['archive_date_rejet'] = $row['date_rejet'];
5763 $return['archive_date_limite'] = $row['date_limite'];
5764 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5765 $return['archive_date_decision'] = $row['date_decision'];
5766 $return['archive_date_validite'] = $row['date_validite'];
5767 $return['archive_date_achevement'] = $row['date_achevement'];
5768 $return['archive_date_chantier'] = $row['date_chantier'];
5769 $return['archive_date_conformite'] = $row['date_conformite'];
5770 $return['archive_incompletude'] = $row['incompletude'];
5771 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5772 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5773 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5774 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5775 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5776 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5777 $return['archive_autorite_competente'] = $row['autorite_competente'];
5778 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5779 $return['duree_validite'] = $row['duree_validite'];
5780 $return['date_depot'] = $row['date_depot'];
5781 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5782 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5783 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5784 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5785 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5786 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5787 $return['archive_date_ait'] = $row['date_ait'];
5788 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5789 $return['archive_date_affichage'] = $row['date_affichage'];
5790 $return['archive_pec_metier'] = $row['pec_metier'];
5791 $return['archive_a_qualifier'] = $row['a_qualifier'];
5792 }
5793
5794 // Retour de la fonction
5795 return $return;
5796
5797 }
5798
5799 /**
5800 * Permet de vérifier qu'un événement est verrouillable
5801 * @param integer $idx Identifiant de l'instruction
5802 * @return boolean
5803 */
5804 function checkEvenementNonVerrouillable($idx) {
5805 // Si la condition n'est pas vide
5806 if ($idx != "") {
5807
5808 // Requête SQL
5809 $qres = $this->f->get_one_result_from_db_query(
5810 sprintf(
5811 'SELECT
5812 evenement.non_verrouillable
5813 FROM
5814 %1$sevenement
5815 LEFT JOIN %1$sinstruction
5816 ON instruction.evenement = evenement.evenement
5817 WHERE
5818 instruction.instruction = \'%2$s\'',
5819 DB_PREFIXE,
5820 intval($idx)
5821 ),
5822 array(
5823 "origin" => __METHOD__,
5824 )
5825 );
5826 }
5827
5828 // Si on a un résultat et que ce résultat indique que l'événement n'est
5829 // pas vérrouillable renvoie true, sinon renvoie false
5830 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5831 }
5832
5833 /**
5834 * Mise à jour des champs archive_*
5835 * @param mixed $row La ligne de données
5836 */
5837 public function updateArchiveData($row){
5838
5839 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5840 // de l'état et de l'avis du dossier d'instruction
5841 $this->valF['archive_delai']=$row['delai'];
5842 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5843 $this->valF['archive_etat']=$row['etat'];
5844 $this->valF['archive_avis']=$row['avis_decision'];
5845 // Récupération de la valeur actuelle des 9 dates du dossier
5846 // d'instruction
5847 if ($row['date_complet'] != '') {
5848 $this->valF['archive_date_complet']=$row['date_complet'];
5849 }
5850 if ($row['date_dernier_depot'] != '') {
5851 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5852 }
5853 if ($row['date_rejet'] != '') {
5854 $this->valF['archive_date_rejet']= $row['date_rejet'];
5855 }
5856 if ($row['date_limite'] != '') {
5857 $this->valF['archive_date_limite']= $row['date_limite'];
5858 }
5859 if ($row['date_notification_delai'] != '') {
5860 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5861 }
5862 if ($row['date_decision'] != '') {
5863 $this->valF['archive_date_decision']= $row['date_decision'];
5864 }
5865 if ($row['date_validite'] != '') {
5866 $this->valF['archive_date_validite']= $row['date_validite'];
5867 }
5868 if ($row['date_achevement'] != '') {
5869 $this->valF['archive_date_achevement']= $row['date_achevement'];
5870 }
5871 if ($row['date_chantier'] != '') {
5872 $this->valF['archive_date_chantier']= $row['date_chantier'];
5873 }
5874 if ($row['date_conformite'] != '') {
5875 $this->valF['archive_date_conformite']= $row['date_conformite'];
5876 }
5877 if ($row['incompletude'] != '') {
5878 $this->valF['archive_incompletude']= $row['incompletude'];
5879 }
5880 if ($row['incomplet_notifie'] != '') {
5881 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5882 }
5883 if ($row['evenement_suivant_tacite'] != '') {
5884 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5885 }
5886 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5887 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5888 }
5889 if ($row['etat_pendant_incompletude'] != '') {
5890 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5891 }
5892 if ($row['date_limite_incompletude'] != '') {
5893 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5894 }
5895 if ($row['delai_incompletude'] != '') {
5896 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5897 }
5898 if ($row['autorite_competente'] != '') {
5899 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5900 }
5901 if ($row['duree_validite'] != '') {
5902 $this->valF['duree_validite']= $row['duree_validite'];
5903 }
5904 if ($row['date_depot'] != '') {
5905 $this->valF['date_depot']= $row['date_depot'];
5906 }
5907 if ($row['date_depot_mairie'] != '') {
5908 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5909 }
5910 // Dates concernant les dossiers contentieux
5911 if ($row['date_cloture_instruction'] != '') {
5912 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5913 }
5914 if ($row['date_premiere_visite'] != '') {
5915 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5916 }
5917 if ($row['date_derniere_visite'] != '') {
5918 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5919 }
5920 if ($row['date_contradictoire'] != '') {
5921 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5922 }
5923 if ($row['date_retour_contradictoire'] != '') {
5924 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5925 }
5926 if ($row['date_ait'] != '') {
5927 $this->valF['archive_date_ait']= $row['date_ait'];
5928 }
5929 if ($row['date_transmission_parquet'] != '') {
5930 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5931 }
5932 //
5933 if ($row['dossier_instruction_type'] != '') {
5934 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5935 }
5936 if ($row['date_affichage'] != '') {
5937 $this->valF['archive_date_affichage']= $row['date_affichage'];
5938 }
5939 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5940 $this->valF['archive_pec_metier']= $row['pec_metier'];
5941 }
5942 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5943 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5944 }
5945 }
5946
5947 // {{{
5948 // Méthodes de récupération des métadonnées arrêté
5949 /**
5950 * @return string Retourne le numéro d'arrêté
5951 */
5952 function getNumArrete() {
5953 return $this->getVal("numero_arrete");
5954 }
5955 /**
5956 * @return chaîne vide
5957 */
5958 function getReglementaireArrete() {
5959 return 'true';
5960 }
5961 /**
5962 * @return boolean de notification au pétitionnaire
5963 */
5964 function getNotificationArrete() {
5965 return 'true';
5966 }
5967 /**
5968 * @return date de notification au pétitionnaire
5969 */
5970 function getDateNotificationArrete() {
5971 if (empty($this->metadonneesArrete)) {
5972 $this->getArreteMetadata();
5973 }
5974 return $this->metadonneesArrete["datenotification"];
5975 }
5976 /**
5977 * @return boolean check si le document est passé au contrôle de légalité
5978 */
5979 function getControleLegalite() {
5980 return 'true';
5981 }
5982 /**
5983 * @return date de signature de l'arrêté
5984 */
5985 function getDateSignature() {
5986 if (empty($this->metadonneesArrete)) {
5987 $this->getArreteMetadata();
5988 }
5989 return $this->metadonneesArrete["datesignaturearrete"];
5990 }
5991 /**
5992 * @return string nom du signataire
5993 */
5994 function getNomSignataire() {
5995 if (empty($this->metadonneesArrete)) {
5996 $this->getArreteMetadata();
5997 }
5998 return $this->metadonneesArrete["nomsignataire"];
5999 }
6000 /**
6001 * @return string qualité du signataire
6002 */
6003 function getQualiteSignataire() {
6004 if (empty($this->metadonneesArrete)) {
6005 $this->getArreteMetadata();
6006 }
6007 return $this->metadonneesArrete["qualitesignataire"];
6008 }
6009 /**
6010 * @return string numéro du terrain
6011 */
6012 function getAp_numRue() {
6013 if (empty($this->metadonneesArrete)) {
6014 $this->getArreteMetadata();
6015 }
6016 return $this->metadonneesArrete["ap_numrue"];
6017 }
6018 /**
6019 * @return string nom de la rue du terrain
6020 */
6021 function getAp_nomDeLaVoie() {
6022 if (empty($this->metadonneesArrete)) {
6023 $this->getArreteMetadata();
6024 }
6025 return $this->metadonneesArrete["ap_nomdelavoie"];
6026 }
6027 /**
6028 * @return string code postal du terrain
6029 */
6030 function getAp_codePostal() {
6031 if (empty($this->metadonneesArrete)) {
6032 $this->getArreteMetadata();
6033 }
6034 return $this->metadonneesArrete["ap_codepostal"];
6035 }
6036 /**
6037 * @return string ville du terrain
6038 */
6039 function getAp_ville() {
6040 if (empty($this->metadonneesArrete)) {
6041 $this->getArreteMetadata();
6042 }
6043 return $this->metadonneesArrete["ap_ville"];
6044 }
6045 /**
6046 * @return string activité
6047 */
6048 function getActivite() {
6049 return "Droit du sol";
6050 }
6051 /**
6052 * @return string date du retour de controle légalité
6053 */
6054 function getDateControleLegalite() {
6055 if (empty($this->metadonneesArrete)) {
6056 $this->getArreteMetadata();
6057 }
6058 return $this->metadonneesArrete["datecontrolelegalite"];
6059 }
6060
6061 // Fin des méthodes de récupération des métadonnées
6062 // }}}
6063
6064 /**
6065 * Méthode de récupération des métadonnées arrêtés dans la base de données,
6066 * les données sont stockés dans l'attribut $this->metadonneesArrete
6067 */
6068 function getArreteMetadata() {
6069
6070 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
6071 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
6072 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
6073 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
6074 "ap_codepostal"=>"", "ap_ville"=>"");
6075
6076 $qres = $this->f->get_all_results_from_db_query(
6077 sprintf(
6078 'SELECT
6079 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
6080 signataire_arrete.qualite as qualitesignataire,
6081 instruction.etat as decisionarrete,
6082 instruction.date_retour_rar as datenotification,
6083 instruction.date_retour_signature as datesignaturearrete,
6084 instruction.date_retour_controle_legalite as datecontrolelegalite,
6085 dossier.terrain_adresse_voie_numero as ap_numrue,
6086 dossier.terrain_adresse_voie as ap_nomdelavoie,
6087 dossier.terrain_adresse_code_postal as ap_codepostal,
6088 dossier.terrain_adresse_localite as ap_ville
6089 FROM
6090 %1$sinstruction
6091 LEFT JOIN %1$ssignataire_arrete
6092 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6093 LEFT JOIN %1$sdossier
6094 ON instruction.dossier = dossier.dossier
6095 LEFT JOIN %1$sdonnees_techniques
6096 ON donnees_techniques.dossier_instruction = dossier.dossier
6097 WHERE
6098 instruction.instruction = %2$d',
6099 DB_PREFIXE,
6100 intval($this->getVal('instruction'))
6101 ),
6102 array(
6103 'origin' => __METHOD__
6104 )
6105 );
6106 $this->metadonneesArrete = array_shift($qres['result']);
6107 }
6108
6109 /**
6110 * CONDITION - has_an_edition.
6111 *
6112 * Condition pour afficher le bouton de visualisation de l'édition.
6113 *
6114 * @return boolean
6115 */
6116 function has_an_edition() {
6117 // Récupère la valeur du champ lettretype
6118 $lettretype = $this->getVal("lettretype");
6119 // Si le champ est vide
6120 if ($lettretype !== '' && $lettretype !== null) {
6121 //
6122 return true;
6123 }
6124
6125 //
6126 return false;
6127 }
6128
6129 /**
6130 * CONDITION - is_modifiable.
6131 *
6132 * Controle si l'évenement est modifiable.
6133 *
6134 * @return boolean
6135 */
6136 function is_evenement_modifiable() {
6137 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6138 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6139 }
6140
6141 /**
6142 * CONDITION - is_editable.
6143 *
6144 * Condition pour la modification.
6145 *
6146 * @return boolean
6147 */
6148 function is_editable() {
6149
6150 // XXX
6151 // 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é)
6152 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6153
6154 // Contrôle si l'utilisateur possède un bypass
6155 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6156 //
6157 if ($bypass == true) {
6158 //
6159 return true;
6160 }
6161
6162 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6163 // que l'événement n'est pas identifié comme non verrouillable
6164 if ($this->f->isUserInstructeur()
6165 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6166 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6167 //
6168 return false;
6169 }
6170
6171 // Si l'utilisateur est un intructeur qui correspond à la division du
6172 // dossier
6173 if ($this->is_instructeur_from_division_dossier() === true) {
6174 //
6175 return true;
6176 }
6177
6178 // Si l'utilisateur est instructeur de la commune du dossier et que
6179 // l'instruction est créée par un instructeur de la commune
6180 if ($this->is_instructeur_from_collectivite_dossier() === true and
6181 $this->getVal('created_by_commune') === 't') {
6182 return true;
6183 }
6184
6185 //
6186 return false;
6187 }
6188
6189 /**
6190 * Vérifie si l'événement est supprimable ou pas.
6191 *
6192 * @return boolean
6193 */
6194 function is_evenement_supprimable() {
6195 // Controle si l'évenement est supprimable
6196 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6197 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6198 }
6199
6200 /**
6201 * CONDITION - is_deletable.
6202 *
6203 * Condition pour la suppression.
6204 *
6205 * @return boolean
6206 */
6207 function is_deletable() {
6208
6209 // XXX
6210 // 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é)
6211 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6212
6213 // Contrôle si l'utilisateur possède un bypass intégral
6214 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6215 //
6216 if ($bypass == true) {
6217
6218 //
6219 return true;
6220 }
6221
6222 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6223 // division du dossier et si l'utilisateur n'a pas la permission bypass
6224 // de la division
6225 if ($this->is_instructeur_from_division_dossier() === false
6226 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6227
6228 //
6229 return false;
6230 }
6231
6232 // l'événement est-il le dernier ?
6233 $dernier_evenement = false;
6234 // instanciation dossier
6235 $dossier = $this->f->get_inst__om_dbform(array(
6236 "obj" => "dossier",
6237 "idx" => $this->getVal('dossier'),
6238 ));
6239 // récupération dernier événement
6240 $id_dernier_evenement = $dossier->get_dernier_evenement();
6241 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6242 $dernier_evenement = true;
6243 }
6244
6245 // Si dossier cloturé ou si pas dernier événement
6246 // ou de type retour ou si une date est renseignée
6247 // ET utilisateur non administrateur
6248 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6249 || $dernier_evenement == false
6250 || $this->is_evenement_retour($this->getVal("evenement")) == true
6251 || $this->getVal('date_envoi_signature') != ''
6252 || $this->getVal('date_retour_signature') != ''
6253 || $this->getVal('date_envoi_rar') != ''
6254 || $this->getVal('date_retour_rar') != ''
6255 || $this->getVal('date_envoi_controle_legalite') != ''
6256 || $this->getVal('date_retour_controle_legalite') != '') {
6257 // pas le droit de supprimer
6258 return false;;
6259 }
6260
6261 //
6262 return true;
6263 }
6264
6265
6266 /**
6267 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6268 * dossier.
6269 *
6270 * @return, boolean true/false
6271 */
6272 function is_instructeur_from_collectivite_dossier() {
6273 if ($this->f->isUserInstructeur() === true and
6274 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6275 return true;
6276 }
6277 return false;
6278 }
6279
6280 /**
6281 * CONDITION - is_addable.
6282 *
6283 * Condition pour afficher les boutons modifier et supprimer.
6284 *
6285 * @return boolean
6286 */
6287 function is_addable() {
6288 // Contrôle si l'utilisateur possède un bypass
6289 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6290 //
6291 if ($bypass == true) {
6292
6293 //
6294 return true;
6295 }
6296 // Si l'utilisateur est un intructeur qui correspond à la
6297 // division du dossier ou qu'il peut changer la décision
6298 if ($this->is_instructeur_from_division_dossier() === true or
6299 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6300 //
6301 return true;
6302 }
6303
6304 //
6305 return false;
6306 }
6307
6308 /**
6309 * CONDITION - is_finalizable.
6310 *
6311 * Condition pour afficher le bouton.
6312 *
6313 * @return boolean
6314 */
6315 function is_finalizable() {
6316 // Contrôle si l'utilisateur possède un bypass
6317 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6318 //
6319 if ($bypass == true) {
6320 //
6321 return true;
6322 }
6323
6324 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6325 // que l'événement n'est pas identifié comme non verrouillable
6326 if ($this->f->isUserInstructeur()
6327 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6328 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6329 //
6330 return false;
6331 }
6332
6333 // Si l'utilisateur est un intructeur qui correspond à la division du
6334 // dossier
6335 if ($this->is_instructeur_from_division_dossier() === true) {
6336 //
6337 return true;
6338 }
6339
6340 // Si l'utilisateur est instructeur de la commune du dossier et que
6341 // l'instruction est créée par un instructeur de la commune
6342 if ($this->is_instructeur_from_collectivite_dossier() === true and
6343 $this->getVal('created_by_commune') === 't') {
6344 return true;
6345 }
6346
6347 //
6348 return false;
6349 }
6350
6351 /**
6352 * CONDITION - is_finalize_without_bypass.
6353 *
6354 * Condition pour afficher le bouton sans le bypass.
6355 *
6356 * @return boolean [description]
6357 */
6358 function is_finalizable_without_bypass() {
6359 // Récupère la valeur du champ finalisé
6360 $om_final_instruction = $this->getVal('om_final_instruction');
6361
6362 // Si le rapport n'est pas finalisé
6363 if (empty($om_final_instruction)
6364 || $om_final_instruction == 'f') {
6365 //
6366 return true;
6367 }
6368
6369 //
6370 return false;
6371 }
6372
6373 /**
6374 * CONDITION - is_unfinalizable.
6375 *
6376 * Condition pour afficher le bouton.
6377 *
6378 * @return boolean
6379 */
6380 function is_unfinalizable(){
6381 // Contrôle si l'utilisateur possède un bypass
6382 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6383 //
6384 if ($bypass == true) {
6385 //
6386 return true;
6387 }
6388
6389 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6390 // que l'événement n'est pas identifié comme non verrouillable
6391 if ($this->f->isUserInstructeur()
6392 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6393 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6394 //
6395 return false;
6396 }
6397
6398 // Si l'utilisateur est un intructeur qui correspond à la division du
6399 // dossier
6400 if ($this->is_instructeur_from_division_dossier() === true) {
6401 //
6402 return true;
6403 }
6404
6405 // Si l'utilisateur est instructeur de la commune du dossier et que
6406 // l'instruction est créée par un instructeur de la commune
6407 if ($this->is_instructeur_from_collectivite_dossier() === true and
6408 $this->getVal('created_by_commune') === 't') {
6409 return true;
6410 }
6411
6412 //
6413 return false;
6414 }
6415
6416 /**
6417 * CONDITION - is_unfinalizable_without_bypass.
6418 *
6419 * Condition pour afficher le bouton sans le bypass.
6420 *
6421 * @return boolean
6422 */
6423 function is_unfinalizable_without_bypass() {
6424 // Récupère la valeur du champ finalisé
6425 $om_final_instruction = $this->getVal('om_final_instruction');
6426
6427 // Si l'instruction est finalisée
6428 if ($om_final_instruction == 't') {
6429 //
6430 return true;
6431 }
6432
6433 //
6434 return false;
6435 }
6436
6437
6438 /**
6439 * Permet de définir si un instructeur commune peut editer une instruction
6440 *
6441 * @return boolean true si il peut
6442 */
6443 function isInstrCanChangeDecision($idx) {
6444
6445 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6446 $this->f->isUserInstructeur() !== true) {
6447 return false;
6448 }
6449
6450
6451
6452 // Sinon on vérifie l'éligibilité du dossier au changement de décision
6453 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6454 // de décision :
6455 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6456 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6457 $sql = sprintf(
6458 'SELECT
6459 dossier.dossier
6460 FROM
6461 %1$sdossier
6462 JOIN %1$setat
6463 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6464 JOIN %1$slien_dossier_demandeur
6465 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6466 JOIN %1$sdossier_instruction_type
6467 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6468 JOIN %1$sinstruction
6469 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6470 ON instruction.instruction = (
6471 SELECT instruction
6472 FROM %1$sinstruction
6473 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6474 AND evenement.retour IS FALSE
6475 WHERE instruction.dossier = dossier.dossier
6476 ORDER BY date_evenement DESC, instruction DESC
6477 LIMIT 1
6478 )
6479 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6480 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6481 -- non signée, non notifié, etc.
6482 AND (instruction.om_final_instruction IS TRUE
6483 OR instruction.created_by_commune IS TRUE)
6484 AND instruction.date_retour_signature IS NULL
6485 AND instruction.date_envoi_rar IS NULL
6486 AND instruction.date_retour_rar IS NULL
6487 AND instruction.date_envoi_controle_legalite IS NULL
6488 AND instruction.date_retour_controle_legalite IS NULL
6489 -- On vérifie que l instruction soit un arrêté ou un changement de décision
6490 JOIN %1$sevenement
6491 ON instruction.evenement=evenement.evenement
6492 AND (evenement.type = \'arrete\'
6493 OR evenement.type = \'changement_decision\')
6494 -- Recherche les informations du pétitionnaire principal pour l affichage
6495 JOIN %1$sdemandeur
6496 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6497 -- Recherche la collectivité rattachée à l instructeur
6498 JOIN %1$sinstructeur
6499 ON dossier.instructeur=instructeur.instructeur
6500 JOIN %1$sdivision
6501 ON instructeur.division=division.division
6502 JOIN %1$sdirection
6503 ON division.direction=direction.direction
6504 JOIN %1$som_collectivite
6505 ON direction.om_collectivite=om_collectivite.om_collectivite
6506 WHERE
6507 -- Vérification que la décision a été prise par l agglo
6508 om_collectivite.niveau = \'2\'
6509 AND dossier.dossier = \'%2$s\'
6510 ',
6511 DB_PREFIXE,
6512 $this->f->db->escapeSimple($idx)
6513 );
6514
6515
6516 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6517 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6518 $sql .= sprintf(
6519 ' AND dossier.om_collectivite = %1$d',
6520 intval($_SESSION['collectivite'])
6521 );
6522 }
6523 $qres = $this->f->get_one_result_from_db_query(
6524 $sql,
6525 array(
6526 "origin" => __METHOD__,
6527 )
6528 );
6529
6530 return $qres['result'] !== null;
6531 }
6532
6533
6534 /**
6535 * CONDITION - can_monitoring_dates.
6536 *
6537 * Condition pour afficher le bouton de suivi des dates.
6538 *
6539 * @return boolean
6540 */
6541 public function can_monitoring_dates() {
6542 // Récupère la valeur du champ finalisé
6543 $om_final_instruction = $this->getVal('om_final_instruction');
6544
6545 // Si l'instruction n'est pas finalisée
6546 if ($om_final_instruction !== 't') {
6547 //
6548 return false;
6549 }
6550
6551 // Contrôle si l'utilisateur possède un bypass
6552 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6553 if ($bypass === true) {
6554 return true;
6555 }
6556
6557 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6558 // un utilisateur lié à un instructeur
6559 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6560
6561 // On vérifie en premier lieu que le DI n'est pas clôturé et que
6562 // l'utilisateur ne possède pas la permission de modifier le suivi des
6563 // dates sur un dossier clôturé
6564 $inst_dossier = $this->get_inst_dossier();
6565 if ($inst_dossier->getStatut() === 'cloture'
6566 && $perm_moni_dates_d_closed === false) {
6567 //
6568 return false;
6569 }
6570 // On récupère ses infos
6571 $coll_di = $inst_dossier->getVal('om_collectivite');
6572 $div_di = $this->getDivisionFromDossier();
6573 // et celles de son éventuel instructeur
6574 $instr_di = $inst_dossier->getVal('instructeur');
6575
6576 // Il faut disposer d'une entrée instructeur
6577 if ($this->f->isUserInstructeur() === false) {
6578 return false;
6579 }
6580
6581 // Par défaut on prétend que l'instructeur n'est pas multi
6582 $instr_di_coll_multi = false;
6583 // Si un instructeur est affecté au dossier
6584 if ($instr_di !== '' && $instr_di !== null) {
6585 // Vérifie si l'instructeur est de la collectivité de niveau 2
6586 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6587 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6588 //
6589 $instr_di_coll_multi = true;
6590 }
6591 }
6592
6593 // Il faut qu'il instruise le dossier ou soit de la même division
6594 if ($this->f->om_utilisateur['instructeur'] === $instr_di
6595 || $this->f->om_utilisateur['division'] === $div_di) {
6596 //
6597 return true;
6598 }
6599
6600 // On donne également le droit s'il est de la même collectivité que
6601 // le dossier ET si l'instruction est déléguée à la communauté
6602 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6603 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6604 && $instr_di_coll_multi === true) {
6605 //
6606 return true;
6607 }
6608
6609 // Si l'instructeur ne rentre pas dans les deux cas précédents
6610 return false;
6611 }
6612
6613
6614 /**
6615 * CONDITION - is_finalized.
6616 *
6617 * Condition pour vérifier si une instruction est finalisée.
6618 *
6619 * @return boolean
6620 */
6621 public function is_finalized() {
6622
6623 return $this->getVal('om_final_instruction') === "t";
6624 }
6625
6626 /**
6627 * CONDITION - is_not_date_retour_signature_set.
6628 *
6629 * Condition pour vérifier si une date de retour signature n'est pas définie.
6630 *
6631 * @return boolean
6632 */
6633 public function is_not_date_retour_signature_set() {
6634
6635 return $this->getVal('date_retour_signature') == null;
6636
6637 }
6638
6639
6640 /**
6641 * TREATMENT - finalize.
6642 *
6643 * Permet de finaliser un enregistrement.
6644 *
6645 * @param array $val valeurs soumises par le formulaire
6646 *
6647 * @return boolean
6648 */
6649 function finalize($val = array()) {
6650
6651 // Cette méthode permet d'exécuter une routine en début des méthodes
6652 // dites de TREATMENT.
6653 $this->begin_treatment(__METHOD__);
6654 $message = '';
6655 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6656
6657 // Controle du signataire
6658 if (! $this->controle_signataire($ev)) {
6659 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6660 // Termine le traitement
6661 return $this->end_treatment(__METHOD__, false);
6662 }
6663
6664 // Traitement de la finalisation
6665 $ret = $this->manage_finalizing("finalize", $val);
6666
6667 // Si le traitement retourne une erreur
6668 if ($ret !== true) {
6669
6670 // Termine le traitement
6671 return $this->end_treatment(__METHOD__, false);
6672 }
6673
6674 // Envoi des notifications aux demandeurs si la notification est automatique
6675 // et que la signature n'est pas requise
6676 if ($ev->getVal('notification') === 'notification_automatique') {
6677 // Préparation du message de log en cas d'erreur de notification
6678 $msgLog = sprintf(
6679 '%s %s : %d',
6680 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6681 __('Instruction notifiée'),
6682 $this->getVal($this->clePrimaire)
6683 );
6684 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6685 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6686 // Récupération de la liste des demandeurs à notifier et de la catégorie
6687 $categorie = $this->f->get_param_option_notification($collectivite_di);
6688 $isPortal = $categorie === PORTAL;
6689 $demandeursANotifie = $this->get_demandeurs_notifiable(
6690 $this->getVal('dossier'),
6691 $isPortal
6692 );
6693
6694 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6695 $demandeurPrincipalNotifie = false;
6696 if (count($demandeursANotifie) > 0) {
6697 foreach ($demandeursANotifie as $demandeur) {
6698 // Identifie si le demandeur principal a été notifié ou pas
6699 // et récupère ses informations
6700 if ($demandeur['petitionnaire_principal'] == 't') {
6701 $demandeurPrincipalNotifie = true;
6702 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6703 // son paramétrage, on effectue pas le traitement et on passe à l'itération
6704 // suivante. On le considère également comme non notifié pour gérer l'envoie
6705 // des messages d'erreurs
6706 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6707 // d'impact sur la notification
6708 $erreursParam = $this->get_info_notification_fail();
6709 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6710 $demandeurPrincipalNotifie = false;
6711 continue;
6712 }
6713 }
6714 // Ajout de la notif et récupération de son id
6715 $idNotif = $this->ajouter_notification(
6716 $this->getVal($this->clePrimaire),
6717 $this->f->get_connected_user_login_name(),
6718 $demandeur,
6719 $collectivite_di,
6720 array(),
6721 true
6722 );
6723 if ($idNotif === false) {
6724 // Termine le traitement
6725 $this->addToLog(
6726 sprintf('%s() : %s', __METHOD__, $msgLog),
6727 DEBUG_MODE
6728 );
6729 return $this->end_treatment(__METHOD__, false);
6730 }
6731 $notification_by_task = $this->notification_by_task(
6732 $idNotif,
6733 $this->getVal('dossier'),
6734 $categorie
6735 );
6736 if ($notification_by_task === false) {
6737 $this->addToLog(
6738 sprintf('%s() : %s', __METHOD__, $msgLog),
6739 DEBUG_MODE
6740 );
6741 $this->addToMessage(
6742 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6743 );
6744 // Termine le traitement
6745 return $this->end_treatment(__METHOD__, false);
6746 }
6747 $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.")));
6748 }
6749 }
6750 // Pour la notification par mail ou la notification via portal si le dossier a
6751 // été déposés via portal, si le demandeur principal n'est pas notifiable,
6752 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6753 // laquelle le demandeur principal n'a pas pu être notifié
6754 $depotPortal = $this->dossier_depose_sur_portail();
6755 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6756 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6757 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6758 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6759 $erreursParam = $this->get_info_notification_fail();
6760 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6761 // Ajout de la notif et récupération de son id
6762 $idNotif = $this->ajouter_notification(
6763 $this->valF[$this->clePrimaire],
6764 $this->f->get_connected_user_login_name(),
6765 $demandeurPrincipal,
6766 $collectivite_di,
6767 array(),
6768 true,
6769 'Echec',
6770 implode(' ', $erreursParam)
6771 );
6772 if ($idNotif === false) {
6773 $this->addToMessage(
6774 __('Erreur : la création de la notification a échouée.').
6775 __("Veuillez contacter votre administrateur.")
6776 );
6777 $this->addToLog(
6778 sprintf('%s() : %s', __METHOD__, $msgLog),
6779 DEBUG_MODE
6780 );
6781 return false;
6782 }
6783 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6784 // de l'échec de la notification
6785 $dossier_message = $this->get_inst_dossier_message(0);
6786 $dossier_message_val = array(
6787 'dossier' => $this->getVal('dossier'),
6788 'type' => _('erreur expedition'),
6789 'emetteur' => $this->f->get_connected_user_login_name(),
6790 'login' => $_SESSION['login'],
6791 'date_emission' => date('Y-m-d H:i:s'),
6792 'contenu' => _('Échec lors de la notification de l\'instruction ').
6793 $ev->getVal('libelle').
6794 '.<br>'.
6795 implode("\n", $erreursParam).
6796 '<br>'.
6797 _('Veuillez corriger ces informations avant de renvoyer la notification.')
6798 );
6799 $add = $dossier_message->add_notification_message($dossier_message_val, true);
6800 // Si une erreur se produit pendant l'ajout
6801 if ($add !== true) {
6802 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6803 return false;
6804 }
6805 }
6806 }
6807
6808 // Termine le traitement
6809 return $this->end_treatment(__METHOD__, true);
6810 }
6811
6812 /**
6813 * Récupère l'instance de dossier message.
6814 *
6815 * @param string $dossier_message Identifiant du message.
6816 *
6817 * @return object
6818 */
6819 private function get_inst_dossier_message($dossier_message = null) {
6820 //
6821 return $this->get_inst_common("dossier_message", $dossier_message);
6822 }
6823
6824 /**
6825 * Vérifie si le signataire est obligatoire pour finaliser
6826 * le document apartir du paramétrage de l'événement.
6827 * Si c'est le cas, vérifie si il y a bien un signataire
6828 * renseigné.
6829 * Si c'est le cas renvoie true, sinon renvoie false.
6830 *
6831 * @param evenement évenement de l'instruction permettant de
6832 * récupérer le paramétrage
6833 * @return boolean
6834 */
6835 protected function controle_signataire($evenement) {
6836 // Vérifie si le signataire est obligatoire et si c'est le cas
6837 // vérifie si il y a bien un signataire pour le document
6838 if ($evenement->is_signataire_obligatoire() &&
6839 ($this->getVal('signataire_arrete') === null ||
6840 $this->getVal('signataire_arrete') === '')) {
6841 return false;
6842 }
6843 return true;
6844 }
6845
6846 /**
6847 * TREATMENT - unfinalize.
6848 *
6849 * Permet de définaliser un enregistrement.
6850 *
6851 * @param array $val valeurs soumises par le formulaire
6852 *
6853 * @return boolean
6854 */
6855 function unfinalize($val = array()) {
6856
6857 // Cette méthode permet d'exécuter une routine en début des méthodes
6858 // dites de TREATMENT.
6859 $this->begin_treatment(__METHOD__);
6860
6861 // Traitement de la finalisation
6862 $ret = $this->manage_finalizing("unfinalize", $val);
6863
6864 // Si le traitement retourne une erreur
6865 if ($ret !== true) {
6866
6867 // Termine le traitement
6868 return $this->end_treatment(__METHOD__, false);
6869 }
6870
6871 // Termine le traitement
6872 return $this->end_treatment(__METHOD__, true);
6873 }
6874
6875 /**
6876 * VIEW - view_edition
6877 *
6878 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6879 *
6880 * @return null Si l'action est incorrecte
6881 */
6882 function view_edition() {
6883
6884 // Si l'instruction est finalisée
6885 if($this->getVal("om_final_instruction") == 't'
6886 && $this->getVal("om_final_instruction") != null) {
6887
6888 // Ouvre le document
6889 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6890 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6891 //
6892 header("Location: ".$lien);
6893 } else {
6894
6895 // Récupère la collectivite du dossier d'instruction
6896 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6897
6898 //
6899 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6900
6901 // Paramètre du PDF
6902 $params = array(
6903 "watermark" => true,
6904 "specific" => array(
6905 "mode" => "previsualisation",
6906 ),
6907 );
6908 // Si la rédaction libre est activée sur l'instruction
6909 if ($this->getVal("flag_edition_integrale") == 't') {
6910 $params["specific"]["corps"] = array(
6911 "mode" => "set",
6912 "value" => $this->getVal("corps_om_htmletatex"),
6913 );
6914 $params["specific"]["titre"] = array(
6915 "mode" => "set",
6916 "value" => $this->getVal("titre_om_htmletat"),
6917 );
6918 }
6919
6920 // Génération du PDF
6921 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6922 // Affichage du PDF
6923 $this->expose_pdf_output(
6924 $result['pdf_output'],
6925 $result['filename']
6926 );
6927 }
6928 }
6929
6930 /**
6931 * Récupère la collectivité du dossier d'instruction.
6932 *
6933 * @param string $dossier_instruction_id Identifiant du DI.
6934 *
6935 * @return integer
6936 */
6937 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6938
6939 // Si l'identifiant n'est pas renseigné
6940 if ($dossier_instruction_id === null) {
6941 // Récupère la valeur
6942 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6943 $dossier_instruction_id = $this->getVal('dossier');
6944 } elseif ($this->getParameter('idxformulaire') !== null
6945 && $this->getParameter('idxformulaire') !== '') {
6946 //
6947 $dossier_instruction_id = $this->getParameter('idxformulaire');
6948 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6949 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6950 //
6951 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6952 }
6953 }
6954
6955 //
6956 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6957 "obj" => "dossier_instruction",
6958 "idx" => $dossier_instruction_id,
6959 ));
6960
6961 //
6962 return $dossier_instruction->getVal('om_collectivite');
6963 }
6964
6965 /**
6966 * VIEW - view_bible
6967 *
6968 * Affiche la bible manuelle.
6969 *
6970 * @return void
6971 */
6972 function view_bible() {
6973 // Vérification de l'accessibilité sur l'élément
6974 $this->checkAccessibility();
6975
6976 /**
6977 * Affichage de la structure HTML
6978 */
6979 //
6980 if ($this->f->isAjaxRequest()) {
6981 //
6982 header("Content-type: text/html; charset=".HTTPCHARSET."");
6983 } else {
6984 //
6985 $this->f->setFlag("htmlonly");
6986 $this->f->display();
6987 }
6988 //
6989 $this->f->displayStartContent();
6990 //
6991 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6992 $this->f->displayTitle();
6993
6994 /**
6995 *
6996 */
6997 //
6998 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6999 $evenement = intval($evenement);
7000 //
7001 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
7002 // Récupération du code du type de DA
7003 $code_da_type = '';
7004 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7005 $code_da_type = $matches[0];
7006 }
7007 //
7008 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
7009
7010 // Récupération de la collectivité du dossier
7011 $dossier = $this->f->get_inst__om_dbform(array(
7012 "obj" => "dossier",
7013 "idx" => $idx,
7014 ));
7015
7016 $qres = $this->f->get_all_results_from_db_query(
7017 sprintf(
7018 'SELECT
7019 *,
7020 bible.libelle as bible_lib
7021 FROM
7022 %1$sbible
7023 LEFT OUTER JOIN %1$sdossier_autorisation_type
7024 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7025 LEFT JOIN %1$som_collectivite
7026 ON bible.om_collectivite = om_collectivite.om_collectivite
7027 WHERE
7028 (evenement = %2$d
7029 OR evenement IS NULL)
7030 AND (complement = %3$d
7031 OR complement IS NULL)
7032 AND (bible.dossier_autorisation_type IS NULL
7033 OR dossier_autorisation_type.code = \'%4$s\')
7034 AND (om_collectivite.niveau = \'2\'
7035 OR bible.om_collectivite = %5$d)
7036 ORDER BY
7037 bible_lib ASC',
7038 DB_PREFIXE,
7039 intval($evenement),
7040 intval($complement),
7041 $this->f->db->escapeSimple($code_da_type),
7042 intval($dossier->getVal("om_collectivite"))
7043 ),
7044 array(
7045 'origin' => __METHOD__
7046 )
7047 );
7048 //
7049 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
7050 //
7051 if ($qres['row_count'] > 0) {
7052 //
7053 echo "\t<table id='tab-bible' width='100%'>\n";
7054 //
7055 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
7056 echo "<th>"._("Choisir")."</th>";
7057 echo "<th>"._("Libelle")."</th>";
7058 echo "</tr>\n";
7059 //
7060 $i = 0;
7061 //
7062 foreach ($qres['result'] as $row) {
7063 //
7064 echo "\t\t<tr";
7065 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
7066 echo ">";
7067 //
7068 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
7069 // XXX utilisation de l'attribut titre pour afficher une infobulle
7070 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
7071 //
7072 echo "</tr>\n";
7073 //
7074 $i++;
7075 }
7076 echo "\t</table>\n";
7077 //
7078 echo "<div class=\"formControls\">\n";
7079 $this->f->layout->display_form_button(array(
7080 "value" => _("Valider"),
7081 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
7082 ));
7083 $this->f->displayLinkJsCloseWindow();
7084 echo "</div>\n";
7085
7086 } else {
7087 //
7088 $message_class = "error";
7089 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
7090 $this->f->displayMessage($message_class, $message);
7091 //
7092 echo "<div class=\"formControls\">\n";
7093 $this->f->displayLinkJsCloseWindow();
7094 echo "</div>\n";
7095 }
7096 //
7097 echo "</form>\n";
7098
7099 /**
7100 * Affichage de la structure HTML
7101 */
7102 //
7103 $this->f->displayEndContent();
7104 }
7105
7106 /**
7107 * VIEW - view_bible_auto
7108 *
7109 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7110 *
7111 * @return void
7112 */
7113 function view_bible_auto() {
7114 // Vérification de l'accessibilité sur l'élément
7115 $this->checkAccessibility();
7116 //
7117 $this->f->disableLog();
7118
7119 $formatDate="AAAA-MM-JJ";
7120
7121 // Récupération des paramètres
7122 $idx = $this->f->get_submitted_get_value('idx');
7123 $evenement = $this->f->get_submitted_get_value('ev');
7124
7125 // Initialisation de la variable de retour
7126 $retour['complement_om_html'] = '';
7127 $retour['complement2_om_html'] = '';
7128 $retour['complement3_om_html'] = '';
7129 $retour['complement4_om_html'] = '';
7130
7131 // Vérification d'une consultation liée à l'événement
7132 $instEvenement = $this->f->get_inst__om_dbform(array(
7133 "obj" => "evenement",
7134 "idx" => $evenement,
7135 ));
7136
7137 // Si consultation liée, récupération du retour d'avis
7138 if($instEvenement->getVal('consultation') == 'Oui'){
7139
7140 $qres = $this->f->get_all_results_from_db_query(
7141 sprintf(
7142 'SELECT
7143 date_retour,
7144 avis_consultation.libelle as avis_consultation,
7145 COALESCE(service.libelle, tiers_consulte.libelle) as service
7146 FROM
7147 %1$sconsultation
7148 LEFT JOIN %1$stiers_consulte
7149 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7150 LEFT JOIN %1$sservice
7151 ON consultation.service = service.service
7152 LEFT JOIN %1$savis_consultation
7153 ON consultation.avis_consultation = avis_consultation.avis_consultation
7154 WHERE
7155 dossier = \'%2$s\'
7156 AND consultation.visible',
7157 DB_PREFIXE,
7158 $this->f->db->escapeSimple($idx)
7159 ),
7160 array(
7161 'origin' => __METHOD__
7162 )
7163 );
7164 // Récupération des consultations
7165 foreach ($qres['result'] as $row) {
7166 $correct=false;
7167 // date retour
7168 if ($row['date_retour']<>""){
7169 if ($formatDate=="AAAA-MM-JJ"){
7170 $date = explode("-", $row['date_retour']);
7171 // controle de date
7172 if (count($date) == 3 and
7173 checkdate($date[1], $date[2], $date[0])) {
7174 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7175 $correct=true;
7176 }else{
7177 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7178 $correct=false;
7179 }
7180 }
7181 }
7182 //
7183 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7184 if($correct == true){
7185 $temp=$temp." du ".$date_retour_f;
7186 }
7187 // Concaténation des retours d'avis de consultation
7188 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7189 } // while
7190
7191 } // consultation
7192 // Récupération des bibles automatiques pour le champ complement_om_html
7193 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7194 // Récupération des bibles automatiques pour le champ complement2_om_html
7195 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7196 // Récupération des bibles automatiques pour le champ complement3_om_html
7197 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7198 // Récupération des bibles automatiques pour le champ complement4_om_html
7199 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7200
7201
7202
7203 echo json_encode($retour);
7204 }
7205
7206 /**
7207 * VIEW - view_pdf_temp
7208 *
7209 * @return void
7210 */
7211 function view_pdf_temp() {
7212 $this->checkAccessibility();
7213 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7214 $this->f->set_submitted_value();
7215 $merge_fields = array();
7216 //
7217 if (array_key_exists('c1', $_POST) === true) {
7218 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7219 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7220 }
7221 if (array_key_exists('c2', $_POST) === true) {
7222 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7223 }
7224 if (array_key_exists('c3', $_POST) === true) {
7225 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7226 }
7227 if (array_key_exists('c4', $_POST) === true) {
7228 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7229 }
7230 $params = array(
7231 "watermark" => true,
7232 "specific" => array(
7233 "merge_fields" => $merge_fields,
7234 ),
7235 );
7236 //
7237 if (array_key_exists('corps', $_POST) === true) {
7238 $params["specific"]["corps"] = array(
7239 "mode" => "set",
7240 "value" => $_POST['corps'],
7241 );
7242 }
7243 if (array_key_exists('titre', $_POST) === true) {
7244 $params["specific"]["titre"] = array(
7245 "mode" => "set",
7246 "value" => $_POST['titre'],
7247 );
7248 }
7249 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7250 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7251 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7252 $retour = array(
7253 'base' => base64_encode($result['pdf_output']),
7254 );
7255 echo json_encode($retour);
7256 }
7257
7258 /**
7259 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7260 * PDF sans prise en compte de la valeur des compléments et le retourne en
7261 * base 64.
7262 *
7263 * @return string Rendu PDF converti en base 64.
7264 */
7265 function init_pdf_temp() {
7266 $params = array(
7267 "watermark" => true,
7268 );
7269 // Si la rédaction libre est activée sur l'instruction
7270 if ($this->getVal("flag_edition_integrale") == 't') {
7271 $params["specific"]["corps"] = array(
7272 "mode" => "set",
7273 "value" => $this->getVal("corps_om_htmletatex"),
7274 );
7275 $params["specific"]["titre"] = array(
7276 "mode" => "set",
7277 "value" => $this->getVal("titre_om_htmletat"),
7278 );
7279 }
7280 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7281 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7282 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7283
7284 return base64_encode($result['pdf_output']);
7285 }
7286
7287 /**
7288 * Récupération des éléments de bible.
7289 *
7290 * @param integer $event id de l'événement
7291 * @param string $idx id du dossier
7292 * @param integer $compnb numéro du champ complement
7293 *
7294 * @return string Chaîne de texte à insérer dans le champ complement
7295 */
7296 function getBible($event, $idx, $compnb) {
7297 // Récupération de la collectivité du dossier
7298 $dossier = $this->f->get_inst__om_dbform(array(
7299 "obj" => "dossier",
7300 "idx" => $idx,
7301 ));
7302 // Récupération du code du type de DA
7303 $code_da_type = '';
7304 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7305 $code_da_type = $matches[0];
7306 }
7307
7308 $qres = $this->f->get_all_results_from_db_query(
7309 sprintf(
7310 'SELECT
7311 *
7312 FROM
7313 %1$sbible
7314 LEFT OUTER JOIN %1$sdossier_autorisation_type
7315 ON bible.dossier_autorisation_type =
7316 dossier_autorisation_type.dossier_autorisation_type
7317 LEFT JOIN %1$som_collectivite
7318 ON bible.om_collectivite = om_collectivite.om_collectivite
7319 WHERE
7320 (evenement = %2$d
7321 OR evenement IS NULL)
7322 AND (complement = %3$d
7323 OR complement IS NULL)
7324 AND automatique = \'Oui\'
7325 AND (dossier_autorisation_type.code = \'%4$s\'
7326 OR bible.dossier_autorisation_type IS NULL)
7327 AND (om_collectivite.niveau = \'2\'
7328 OR bible.om_collectivite = %5$d)',
7329 DB_PREFIXE,
7330 intval($event),
7331 intval($compnb),
7332 $this->f->db->escapeSimple($code_da_type),
7333 intval($dossier->getVal("om_collectivite"))
7334 ),
7335 array(
7336 "origin" => __METHOD__
7337 )
7338 );
7339 $temp = "";
7340 foreach ($qres['result'] as $row) {
7341 // Remplacement des retours à la ligne par des br
7342 $temp .= preg_replace(
7343 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7344 );
7345 // Ajout d'un saut de ligne entre chaque bible.
7346 $temp .= '<br/>';
7347 } // fin while
7348 return $temp;
7349 }
7350
7351 /**
7352 * VIEW - view_suivi_bordereaux.
7353 *
7354 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7355 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7356 * collectivité des dossiers affichés.
7357 *
7358 * @return void
7359 */
7360 function view_suivi_bordereaux() {
7361 // Vérification de l'accessibilité sur l'élément
7362 $this->checkAccessibility();
7363
7364 /**
7365 * Validation du formulaire
7366 */
7367 // Si le formulaire a été validé
7368 if ($this->f->get_submitted_post_value("validation") !== null) {
7369 // Si un bordereau à été sélectionné
7370 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7371 // Si aucun bordereau n'a été sélectionné
7372 $message_class = "error";
7373 $message = _("Veuillez selectionner un bordereau.");
7374 }
7375 // Sinon si les dates ne sont pas valide
7376 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7377 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7378 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7379 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7380 // Si aucune date n'a été saisie
7381 $message_class = "error";
7382 $message = _("Veuillez saisir une date valide.");
7383 }
7384 // Sinon si les dates ne sont pas valides
7385 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7386 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7387 // Si aucune date n'a été saisie
7388 $message_class = "error";
7389 $message = _("Erreur de parametrage. Contactez votre administrateur.");
7390 }
7391 // Affiche le message de validation
7392 else {
7393 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7394 $etat = $this->f->get_inst__om_dbform(array(
7395 "obj" => "om_etat",
7396 "idx" => $this->f->get_submitted_post_value("bordereau")
7397 ));
7398 $qres = $this->f->get_one_result_from_db_query(
7399 sprintf(
7400 'SELECT
7401 om_etat.libelle
7402 FROM
7403 %som_etat
7404 WHERE
7405 om_etat.id = \'%s\'',
7406 DB_PREFIXE,
7407 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7408 ),
7409 array(
7410 "origin" => __METHOD__,
7411 )
7412 );
7413
7414 //
7415 $message_class = "valid";
7416 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7417 $message .= " : <br/><br/>";
7418 $message .= "<a class='om-prev-icon pdf-16'";
7419 $message .= " title=\""._("Bordereau")."\"";
7420 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7421 $message .= "&action=220";
7422 $message .= "&idx=0";
7423 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7424 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7425 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7426 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7427 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7428 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7429 }
7430 $message .= "'"." target='_blank'>";
7431 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7432 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7433 $message .= "</a>";
7434 }
7435 }
7436
7437 /**
7438 * Affichage des messages et du formulaire
7439 */
7440 // Affichage du message de validation ou d'erreur
7441 if (isset($message) && isset($message_class) && $message != "") {
7442 $this->f->displayMessage($message_class, $message);
7443 }
7444 // Ouverture du formulaire
7445 printf("\t<form");
7446 printf(" method=\"post\"");
7447 printf(" id=\"suivi_bordereaux_form\"");
7448 printf(" action=\"\"");
7449 printf(">\n");
7450 // Paramétrage des champs du formulaire
7451 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7452 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7453 // collectivité dans le formulaire
7454 if ($_SESSION["niveau"] == 2) {
7455 array_push($champs, "om_collectivite");
7456 }
7457 // Création d'un nouvel objet de type formulaire
7458 $form = $this->f->get_inst__om_formulaire(array(
7459 "validation" => 0,
7460 "maj" => 0,
7461 "champs" => $champs,
7462 ));
7463 // Paramétrage du champ date_bordereau_debut
7464 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7465 $form->setType("date_bordereau_debut", "date");
7466 $form->setTaille("date_bordereau_debut", 12);
7467 $form->setMax("date_bordereau_debut", 12);
7468 $form->setRequired("date_bordereau_debut");
7469 $form->setOnchange("date_bordereau_debut", "fdate(this)");
7470 $form->setVal("date_bordereau_debut", date("d/m/Y"));
7471 // Paramétrage du champ date_bordereau_fin
7472 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7473 $form->setType("date_bordereau_fin", "date");
7474 $form->setTaille("date_bordereau_fin", 12);
7475 $form->setMax("date_bordereau_fin", 12);
7476 $form->setRequired("date_bordereau_fin");
7477 $form->setOnchange("date_bordereau_fin", "fdate(this)");
7478 $form->setVal("date_bordereau_fin", date("d/m/Y"));
7479 // Paramétrage du champ bordereau
7480 $form->setLib("bordereau", _("bordereau"));
7481 $form->setType("bordereau", "select");
7482 $form->setRequired("bordereau");
7483 // Valeurs des champs
7484 if ($this->f->get_submitted_post_value("validation") !== null) {
7485 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7486 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7487 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7488 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7489 }
7490 // Données du select - On récupère ici la liste de tous les états disponibles
7491 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7492 // 'bordereau_'
7493 $qres = $this->f->get_all_results_from_db_query(
7494 sprintf(
7495 'SELECT
7496 om_etat.id,
7497 om_etat.libelle
7498 FROM
7499 %1$som_etat
7500 WHERE
7501 om_etat.id LIKE \'bordereau_%%\'
7502 ORDER BY
7503 om_etat.id',
7504 DB_PREFIXE
7505 ),
7506 array(
7507 "origin" => __METHOD__
7508 )
7509 );
7510 // Données du select
7511 $contenu = array(
7512 0 => array("", ),
7513 1 => array(_("choisir bordereau")),
7514 );
7515 foreach ($qres['result'] as $row) {
7516 $contenu[0][] = $row['id'];
7517 $contenu[1][] = $row['libelle'];
7518 }
7519 $form->setSelect("bordereau", $contenu);
7520 //
7521 if ($_SESSION["niveau"] == 2) {
7522 $form->setLib("om_collectivite", _("collectivite"));
7523 $form->setType("om_collectivite", "select");
7524
7525 // Données du select - On récupère ici la liste de tous toutes les collectivités
7526 // de niveau 1
7527 $qres = $this->f->get_all_results_from_db_query(
7528 sprintf(
7529 'SELECT
7530 om_collectivite,
7531 libelle
7532 FROM
7533 %1$som_collectivite
7534 WHERE
7535 niveau = \'1\'
7536 ORDER BY
7537 libelle',
7538 DB_PREFIXE
7539 ),
7540 array(
7541 "origin" => __METHOD__
7542 )
7543 );
7544 // La valeur par défaut du select est Toutes
7545 $list_collectivites = array(
7546 0 => array("", ),
7547 1 => array(_("toutes"))
7548 );
7549
7550 $id_colls = "";
7551 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7552 // par des virgules, pour un traitement plus facile dans la requête de sous-état
7553 foreach ($qres['result'] as $row) {
7554 if ($id_colls != "") {
7555 $id_colls .= ",";
7556 }
7557 $id_colls .= $row['om_collectivite'];
7558 $list_collectivites[0][] = $row['om_collectivite'];
7559 $list_collectivites[1][] = $row['libelle'];
7560 }
7561 // On affecte la liste d'identifiants à l'option Toutes
7562 $list_collectivites[0][0] = $id_colls ;
7563 $form->setSelect("om_collectivite", $list_collectivites);
7564 }
7565 // Affichage du formulaire
7566 $form->entete();
7567 $form->afficher($champs, 0, false, false);
7568 $form->enpied();
7569 // Affichage du bouton
7570 printf("\t<div class=\"formControls\">\n");
7571 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7572 printf("\t</div>\n");
7573 // Fermeture du formulaire
7574 printf("\t</form>\n");
7575 }
7576
7577
7578 /**
7579 * VIEW - view_generate_suivi_bordereaux.
7580 *
7581 * Génère et affiche les bordereaux de suivi.
7582 *
7583 * @return [void]
7584 */
7585 function view_generate_suivi_bordereaux() {
7586 // Vérification de l'accessibilité sur l'élément
7587 $this->checkAccessibility();
7588 // Récupération du type de bordereau
7589 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7590 // Génération du PDF
7591 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7592 // Affichage du PDF
7593 $this->expose_pdf_output(
7594 $result['pdf_output'],
7595 $result['filename']
7596 );
7597 }
7598
7599
7600 /**
7601 * VIEW - view_suivi_envoi_lettre_rar.
7602 *
7603 * Vue pour imprimer les AR.
7604 *
7605 * @return void
7606 */
7607 function view_suivi_envoi_lettre_rar() {
7608 // Vérification de l'accessibilité sur l'élément
7609 $this->checkAccessibility();
7610
7611 //
7612 if ($this->f->get_submitted_post_value("date") !== null) {
7613 $date = $this->f->get_submitted_post_value("date");
7614 } else {
7615 $date = "";
7616 }
7617 //
7618 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7619 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7620 } else {
7621 $liste_code_barres_instruction = "";
7622 }
7623
7624 // Compteur du nombre de page générées
7625 $nbLettres = 0;
7626 // Liste d'id des instructions
7627 $id4Gen = array();
7628 //
7629 $error = "";
7630
7631 // Initialisation du tableau qui va contenir les DI pour lister les liens
7632 $dossierTab = array();
7633 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7634 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7635 $hasHidden = true;
7636 // S'il ne peut pas les consulter il aura des dossiers caché
7637 if ($isAccredited === true) {
7638 $hasHidden = false;
7639 }
7640
7641 /**
7642 * Validation du formulaire
7643 */
7644 // Si le formulaire a été validé
7645 if ($this->f->get_submitted_post_value('validation') !== null) {
7646 //
7647 if (empty($date) || empty($liste_code_barres_instruction)) {
7648 //
7649 $message_class = "error";
7650 $message = _("Tous les champs doivent etre remplis.");
7651 } else {
7652 // Création d'un tableau d'instruction
7653 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7654 //
7655 foreach ($liste as $code_barres) {
7656 // On enlève les éventuels espaces saisis
7657 $code_barres = trim($code_barres);
7658 // Vérification de l'existence de l'instruction
7659 if ($code_barres != "") {
7660 // Si la valeur transmise est numérique
7661 if (is_numeric($code_barres)) {
7662 //
7663 $sql = "SELECT count(*)
7664 FROM ".DB_PREFIXE."instruction
7665 INNER JOIN ".DB_PREFIXE."dossier
7666 ON dossier.dossier=instruction.dossier
7667 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7668 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7669 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7670 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7671 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7672 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7673 INNER JOIN ".DB_PREFIXE."groupe
7674 ON dossier_autorisation_type.groupe = groupe.groupe
7675 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7676
7677 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7678 $group_clause = array();
7679 foreach ($_SESSION["groupe"] as $key => $value) {
7680 $group_clause[$key] = "(groupe.code = '".$key."'";
7681 if($value["confidentiel"] !== true) {
7682 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7683 }
7684 $group_clause[$key] .= ")";
7685 }
7686 $conditions = implode(" OR ", $group_clause);
7687 $sql .= " AND (" . $conditions . ")";
7688
7689 $qres = $this->f->get_one_result_from_db_query(
7690 $sql,
7691 array(
7692 "origin" => __METHOD__,
7693 )
7694 );
7695
7696 if ($qres['result'] == "1") {
7697 // Récupération de la date d'envoi de l'instruction bippé
7698 $qres = $this->f->get_all_results_from_db_query(
7699 sprintf(
7700 'SELECT
7701 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7702 instruction
7703 FROM
7704 %1$sinstruction
7705 WHERE
7706 code_barres = \'%2$s\'',
7707 DB_PREFIXE,
7708 $this->f->db->escapeSimple($code_barres)
7709 ),
7710 array(
7711 'origin' => __METHOD__
7712 )
7713 );
7714 $row = array_shift($qres['result']);
7715 // Si pas de date ou correspond à la date du formulaire on
7716 // effectue le traitement
7717 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7718 $instr = $this->f->get_inst__om_dbform(array(
7719 "obj" => "instruction",
7720 "idx" => $row['instruction'],
7721 ));
7722 $valF = array();
7723 foreach($instr->champs as $id => $champ) {
7724 $valF[$champ] = $instr->val[$id];
7725 }
7726
7727 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7728 if ($isAccredited === true
7729 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7730 $dossier = $this->f->get_inst__om_dbform(array(
7731 "obj" => "dossier",
7732 "idx" => $instr->getVal("dossier"),
7733 ));
7734 if ($dossier->is_user_from_allowed_collectivite()){
7735 $dossierTab[$instr->getVal("dossier")] = $dossier;
7736 } else {
7737 $hasHidden = true;
7738 }
7739 }
7740
7741 $valF['date_evenement']=
7742 $instr->dateDBToForm($valF['date_evenement']);
7743 $valF['archive_date_complet']=
7744 $instr->dateDBToForm($valF['archive_date_complet']);
7745 $valF['archive_date_rejet']=
7746 $instr->dateDBToForm($valF['archive_date_rejet']);
7747 $valF['archive_date_limite']=
7748 $instr->dateDBToForm($valF['archive_date_limite']);
7749 $valF['archive_date_notification_delai']=
7750 $instr->dateDBToForm($valF['archive_date_notification_delai']);
7751 $valF['archive_date_decision']=
7752 $instr->dateDBToForm($valF['archive_date_decision']);
7753 $valF['archive_date_validite']=
7754 $instr->dateDBToForm($valF['archive_date_validite']);
7755 $valF['archive_date_achevement']=
7756 $instr->dateDBToForm($valF['archive_date_achevement']);
7757 $valF['archive_date_chantier']=
7758 $instr->dateDBToForm($valF['archive_date_chantier']);
7759 $valF['archive_date_conformite']=
7760 $instr->dateDBToForm($valF['archive_date_conformite']);
7761 $valF['archive_date_dernier_depot']=
7762 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7763 $valF['archive_date_limite_incompletude']=
7764 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7765 $valF['date_finalisation_courrier']=
7766 $instr->dateDBToForm($valF['date_finalisation_courrier']);
7767 $valF['date_envoi_signature']=
7768 $instr->dateDBToForm($valF['date_envoi_signature']);
7769 $valF['date_retour_signature']=
7770 $instr->dateDBToForm($valF['date_retour_signature']);
7771 $valF['date_envoi_rar']=
7772 $instr->dateDBToForm($valF['date_envoi_rar']);
7773 $valF['date_retour_rar']=
7774 $instr->dateDBToForm($valF['date_retour_rar']);
7775 $valF['date_envoi_controle_legalite']=
7776 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7777 $valF['date_retour_controle_legalite']=
7778 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7779 $valF['date_envoi_rar'] = $date;
7780
7781 // Vérification de la finalisation du document
7782 // correspondant au code barres
7783 if($instr->getVal("om_final_instruction") === 't') {
7784 $instr->setParameter('maj', 1);
7785 $instr->class_actions[1]["identifier"] =
7786 "envoi lettre RAR (depuis le menu suivi des pièces)";
7787 if ($instr->modifier($valF) == true) {
7788 $id4Gen[] = $code_barres;
7789 $nbLettres ++;
7790 } else {
7791 //
7792 if ($error != "") {
7793 $error .= "<br/>";
7794 }
7795 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7796 $code_barres);
7797 $error .= " ";
7798 $error .= _("Veuillez contacter votre administrateur.");
7799 }
7800 } else {
7801 //
7802 if ($error != "") {
7803 $error .= "<br/>";
7804 }
7805 $error .= sprintf(_("Le document correspondant au
7806 code barres %s n'est pas finalise,
7807 le bordereau ne sera pas genere."),
7808 $code_barres);
7809 }
7810
7811 } else {
7812 //
7813 if ($error != "") {
7814 $error .= "<br/>";
7815 }
7816 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7817 }
7818 } else {
7819 //
7820 if ($error != "") {
7821 $error .= "<br/>";
7822 }
7823 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7824 }
7825 } else {
7826 //
7827 if ($error != "") {
7828 $error .= "<br/>";
7829 }
7830 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7831 }
7832 }
7833 }
7834 }
7835 }
7836
7837 /**
7838 * Affichage des messages et du formulaire
7839 */
7840 // Affichage du message de validation ou d'erreur
7841 if (isset($message) && isset($message_class) && $message != "") {
7842 $this->f->displayMessage($message_class, $message);
7843 }
7844 // Affichage du message d'erreur
7845 if(!empty($error)) {
7846 $this->f->displayMessage("error", $error);
7847 }
7848 // Affichage du message de validation de la saisie
7849 if ($nbLettres > 0) {
7850 //
7851 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7852 echo "\n<p>";
7853 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7854 echo "\n<span class=\"text\">";
7855 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7856 echo " : \n<br/><br/>";
7857 echo "\n<a class='om-prev-icon pdf-16'";
7858 echo "\n title=\""._("imprimer les AR")."\"";
7859 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7860 echo "\n target='_blank'>";
7861 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7862 echo "\n</a>";
7863 echo "\n</span>";
7864 echo "\n</p>";
7865 echo "\n<br/>\n";
7866 if ($isAccredited === true) {
7867 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7868 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7869 echo _('Dossiers concernés par ce traitement');
7870 echo "\n</legend>";
7871 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7872
7873 if ($hasHidden === true) {
7874 echo "\n<br/>";
7875 echo "\n<p>";
7876 echo "\n<span class='text'>";
7877 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.");
7878 echo "</span>";
7879 echo "\n</p>";
7880 echo "\n<br/>";
7881 }
7882 foreach ($dossierTab as $dossier) {
7883
7884 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7885 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7886 $code_datd = $inst_datd->getVal('code');
7887
7888 $obj = "dossier_instruction";
7889 if ($code_datd === 'REC' OR $code_datd === 'REG') {
7890 $obj = "dossier_contentieux_tous_recours";
7891 }
7892 if ($code_datd === 'IN') {
7893 $obj = "dossier_contentieux_toutes_infractions";
7894 }
7895
7896 echo "\n<div class=\"bloc group\">";
7897 echo "\n<div class=\"field field-type-text\">";
7898
7899 echo "\n<p>";
7900 echo "\n<span class='text'>";
7901 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7902 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7903 echo $dossier->getVal("dossier");
7904 echo "\">";
7905 echo "\n</a>";
7906
7907 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7908 echo " href=\"".OM_ROUTE_FORM."&obj=";
7909 echo $obj;
7910 echo "&action=3&idx=";
7911 echo $dossier->getVal("dossier");
7912 echo "\">";
7913 echo $dossier->getVal("dossier_libelle");
7914 echo "\n</a>";
7915 echo "\n</span>";
7916 echo "\n</p>";
7917
7918 echo "\n</div>";
7919 echo "\n</div>";
7920 }
7921 echo "\n</div>";
7922 echo "\n</fieldset>";
7923 }
7924 echo "\n</div>";
7925 echo "\n</div>";
7926 }
7927 // Ouverture du formulaire
7928 echo "\t<form";
7929 echo " method=\"post\"";
7930 echo " id=\"suivi_envoi_lettre_rar_form\"";
7931 echo " action=\"\"";
7932 echo ">\n";
7933 // Paramétrage des champs du formulaire
7934 $champs = array("date", "liste_code_barres_instruction");
7935 // Création d'un nouvel objet de type formulaire
7936 $form = $this->f->get_inst__om_formulaire(array(
7937 "validation" => 0,
7938 "maj" => 0,
7939 "champs" => $champs,
7940 ));
7941 // Paramétrage du champ date du formulaire
7942 $form->setLib("date", _("Date")."* :");
7943 $form->setType("date", "date");
7944 $form->setOnchange("date", "fdate(this)");
7945 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7946 $form->setTaille("date", 10);
7947 $form->setMax("date", 10);
7948 // Paramétrage du champ liste_code_barres_instruction du formulaire
7949 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7950 $form->setType("liste_code_barres_instruction", "textarea");
7951 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7952 $form->setTaille("liste_code_barres_instruction", 20);
7953 $form->setMax("liste_code_barres_instruction", 20);
7954 // Affichage du formulaire
7955 $form->entete();
7956 $form->afficher($champs, 0, false, false);
7957 $form->enpied();
7958 // Affichage du bouton
7959 echo "\t<div class=\"formControls\">\n";
7960 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7961 echo "\t</div>\n";
7962 // Fermeture du formulaire
7963 echo "\t</form>\n";
7964 }
7965
7966 /**
7967 * VIEW - view_suivi_mise_a_jour_des_dates.
7968 *
7969 * Vu pour mettre à jour les dates de suivi de l'instruction.
7970 *
7971 * @return void
7972 */
7973 function view_suivi_mise_a_jour_des_dates() {
7974 // Vérification de l'accessibilité sur l'élément
7975 $this->checkAccessibility();
7976
7977 // Récupération des valeur passées en POST ou GET
7978 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7979 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7980 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7981 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7982 } else {
7983 $type_mise_a_jour = "";
7984 }
7985 if($this->f->get_submitted_post_value('date') !== null) {
7986 $date = $this->f->get_submitted_post_value('date');
7987 } elseif($this->f->get_submitted_get_value('date') !== null) {
7988 $date = $this->f->get_submitted_get_value('date');
7989 } else {
7990 $date = "";
7991 }
7992 if($this->f->get_submitted_post_value('code_barres') !== null) {
7993 $code_barres = $this->f->get_submitted_post_value('code_barres');
7994 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7995 $code_barres = $this->f->get_submitted_get_value('code_barres');
7996 } else {
7997 $code_barres = "";
7998 }
7999 // Booléen permettant de définir si un enregistrement à eu lieu
8000 $correct = false;
8001 // Booléen permettant de définir si les dates peuvent êtres enregistrées
8002 $date_error = false;
8003 // Champs date à mettre à jour
8004 $liste_champs=array();
8005
8006 // Si le formulaire a été validé
8007 if ($this->f->get_submitted_post_value('validation') !== null) {
8008 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
8009
8010 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
8011 $group_clause = array();
8012 foreach ($_SESSION["groupe"] as $key => $value) {
8013 $group_clause[$key] = "(groupe.code = '".$key."'";
8014 if($value["confidentiel"] !== true) {
8015 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
8016 }
8017 $group_clause[$key] .= ")";
8018 }
8019 $conditions = implode(" OR ", $group_clause);
8020 $groupFilter = " AND (" . $conditions . ")";
8021
8022 $qres = $this->f->get_all_results_from_db_query(
8023 sprintf(
8024 'SELECT
8025 instruction
8026 FROM
8027 %1$sinstruction
8028 INNER JOIN %1$sdossier
8029 ON dossier.dossier = instruction.dossier
8030 INNER JOIN %1$sdossier_instruction_type
8031 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8032 INNER JOIN %1$sdossier_autorisation_type_detaille
8033 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8034 INNER JOIN %1$sdossier_autorisation_type
8035 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8036 INNER JOIN %1$sgroupe
8037 ON dossier_autorisation_type.groupe = groupe.groupe
8038 WHERE
8039 code_barres = \'%2$s\'
8040 %3$s',
8041 DB_PREFIXE,
8042 $this->f->db->escapeSimple($code_barres),
8043 $groupFilter
8044 ),
8045 array(
8046 'origin' => __METHOD__
8047 )
8048 );
8049 if($qres['row_count'] === 1) {
8050 $liste_champs = explode(";", $type_mise_a_jour);
8051 $row = array_shift($qres['result']);
8052 $instr = $this->f->get_inst__om_dbform(array(
8053 "obj" => "instruction",
8054 "idx" => $row['instruction'],
8055 ));
8056 // Mise à jour des dates après l'écran de verification
8057 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
8058 $valF = array();
8059 foreach($instr->champs as $id => $champ) {
8060 $valF[$champ] = $instr->val[$id];
8061 }
8062 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
8063 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
8064 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
8065 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
8066 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
8067 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
8068 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
8069 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
8070 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
8071 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
8072 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
8073 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
8074 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
8075 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
8076 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
8077 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
8078 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
8079 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
8080 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
8081 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
8082 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
8083 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
8084 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
8085 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
8086 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
8087 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
8088
8089 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
8090 $valF[$maj_date]=$date;
8091 }
8092
8093 // Vérification de la finalisation du document
8094 // correspondant au code barres
8095 if($valF["om_final_instruction"] === 't' or
8096 $valF["lettretype"] == '') {
8097 $code_barres = "";
8098
8099 //Désactivation de l'autocommit
8100 $this->f->db->autoCommit(false);
8101
8102 //On modifie les valeurs de l'instruction
8103 $instr->setParameter('maj', 170);
8104 $instr->class_actions[170]["identifier"] =
8105 "mise à jour des dates (depuis le menu suivi des pièces)";
8106 $retour = $instr->modifier($valF);
8107
8108 //Si une erreur s'est produite, on défait les modifications
8109 //qui ont été faites
8110 if (!$retour){
8111 $instr->undoValidation();
8112 }
8113 //Sinon, on valide en base de données les modifications
8114 else {
8115 $this->f->db->commit();
8116 }
8117
8118 // Variable correct retourné depuis la classe instruction
8119 $correct = $instr->correct;
8120
8121 // Si la modification sur l'instruction a échoué
8122 if ($correct === false) {
8123
8124 // Message d'erreur de la classe instruction
8125 $error = $instr->msg;
8126 }
8127
8128 } else {
8129 // Indique que le traitement est en erreur
8130 $correct = false;
8131 // Message d'erreur
8132 $error = sprintf(_("Le document n'est pas finalise."),
8133 "<span class='bold'>".$code_barres."</span>");
8134 }
8135 } else {
8136 // Récupération des infos du dossier
8137 $qres = $this->f->get_all_results_from_db_query(
8138 sprintf(
8139 'SELECT
8140 dossier.dossier_libelle,
8141 evenement.libelle as evenement,
8142 autorite_competente.code as autorite_competente_code,
8143 autorite_competente.libelle as autorite_competente,
8144 evenement.type as evenement_type,
8145 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8146 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8147 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8148 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8149 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8150 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8151 FROM
8152 %1$sinstruction
8153 INNER JOIN %1$sdossier
8154 ON dossier.dossier=instruction.dossier
8155 LEFT JOIN %1$sautorite_competente
8156 ON dossier.autorite_competente=autorite_competente.autorite_competente
8157 INNER JOIN %1$sevenement
8158 ON instruction.evenement=evenement.evenement
8159 WHERE
8160 code_barres = \'%2$s\'',
8161 DB_PREFIXE,
8162 $this->f->db->escapeSimple($code_barres)
8163 ),
8164 array(
8165 "origin" => __METHOD__
8166 )
8167 );
8168 $infos = array_shift($qres['result']);
8169
8170 // Vérification de la non modification des dates de suivi
8171 foreach(explode(";", $type_mise_a_jour) as $champ) {
8172 if ($champ === 'date_envoi_controle_legalite') {
8173 if ($instr->is_sent_to_cl() === true) {
8174 $error = __("Les dates de suivis ne peuvent etre modifiees");
8175 $date_error = true;
8176 break;
8177 }
8178 }
8179 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8180 $error = _("Les dates de suivis ne peuvent etre modifiees");
8181 $date_error = true;
8182 break;
8183 }
8184 }
8185 }
8186 } else {
8187 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8188 }
8189
8190 } else {
8191 $error = _("Tous les champs doivent etre remplis.");
8192 }
8193 }
8194
8195 /**
8196 * Affichage des messages et du formulaire
8197 */
8198 // Affichage du message de validation ou d'erreur
8199 if (isset($message) && isset($message_class) && $message != "") {
8200 $this->f->displayMessage($message_class, $message);
8201 }
8202 // Affichage du message d'erreur
8203 if(!empty($error)) {
8204 $this->f->displayMessage("error", $error);
8205 }
8206
8207 // Affichage du message de validation de la saisie
8208 if($correct === true) {
8209 $this->f->displayMessage("ok", _("Saisie enregistree"));
8210 }
8211 // Ouverture du formulaire
8212 echo "\t<form";
8213 echo " method=\"post\"";
8214 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8215 echo " action=\"\"";
8216 echo ">\n";
8217 // Paramétrage des champs du formulaire
8218 if(isset($infos)) {
8219 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8220 , "autorite_competente", "date_envoi_signature",
8221 "date_retour_signature", "date_envoi_controle_legalite",
8222 "date_retour_controle_legalite", "date_envoi_rar",
8223 "date_retour_rar", "is_valid");
8224 } else {
8225 $champs = array("type_mise_a_jour", "date", "code_barres");
8226 }
8227 // Création d'un nouvel objet de type formulaire
8228 $form = $this->f->get_inst__om_formulaire(array(
8229 "validation" => 0,
8230 "maj" => 0,
8231 "champs" => $champs,
8232 ));
8233 // Paramétrage des champs du formulaire
8234 // Parametrage du champ type_mise_a_jour
8235 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8236 if(isset($infos)) {
8237 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8238
8239 } else {
8240 $form->setType("type_mise_a_jour", "select");
8241
8242 }
8243 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8244 $contenu = array();
8245
8246 $contenu[0][0] = "date_envoi_signature";
8247 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8248
8249 $contenu[0][1] = "date_retour_signature";
8250 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8251
8252 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8253 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8254
8255 $contenu[0][3] = "date_envoi_controle_legalite";
8256 $contenu[1][3] = _("date d'envoi au controle de legalite");
8257
8258 $contenu[0][4] = "date_retour_controle_legalite";
8259 $contenu[1][4] = _("date de retour de controle de legalite");
8260
8261 $contenu[0][5] = "date_retour_rar";
8262 $contenu[1][5] = __("date de notification du correspondant");
8263
8264 $form->setSelect("type_mise_a_jour", $contenu);
8265
8266 // Parametrage du champ date
8267 $form->setLib("date", _("Date")."* :");
8268 if(isset($infos)) {
8269 $form->setType("date", "hiddenstaticdate");
8270
8271 } else {
8272 $form->setType("date", "date");
8273 }
8274 $form->setVal("date", $date);
8275 $form->setTaille("date", 10);
8276 $form->setMax("date", 10);
8277
8278 // Parametrage du champ code_barres
8279 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8280 if(isset($infos)) {
8281 $form->setType("code_barres", "hiddenstatic");
8282 } else {
8283 $form->setType("code_barres", "text");
8284 }
8285 $form->setVal("code_barres", $code_barres);
8286 $form->setTaille("code_barres", 20);
8287 $form->setMax("code_barres", 20);
8288
8289 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8290 if(isset($infos)) {
8291
8292 // Tous les champs sont défini par defaut à static
8293 foreach ($infos as $key => $value) {
8294 $form->setType($key, "static");
8295 if(in_array($key, $liste_champs)) {
8296 $form->setVal($key, $date);
8297 } else {
8298 $form->setVal($key, $value);
8299 }
8300 }
8301
8302 // Les champs dont on viens de définir la valeur sont en gras
8303 foreach ($liste_champs as $value) {
8304 $form->setBloc($value,'DF',"",'bold');
8305 }
8306
8307 // Parametrage du champ dossier
8308 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8309 $form->setType("dossier_libelle", "static");
8310 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8311
8312 // Parametrage du champ evenement
8313 $form->setLib("evenement", _("evenement")." :");
8314 $form->setType("evenement", "static");
8315 $form->setVal("evenement", $infos['evenement']);
8316
8317 // Parametrage du champ autorite_competente
8318 $form->setLib("autorite_competente", _("Autorite competente")." :");
8319 $form->setType("autorite_competente", "static");
8320 $form->setVal("autorite_competente", $infos['autorite_competente']);
8321
8322 // Parametrage des libellés d'envoi avec AR
8323 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8324 $form->setLib("date_retour_rar", __("date_notification")." :");
8325
8326 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8327 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8328 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8329 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8330 // Configuration des libellé en fonction de l'autorité compétente
8331 if($infos['autorite_competente_code'] == 'ETAT') {
8332 $form->setType("date_envoi_controle_legalite", "hiddendate");
8333 $form->setType("date_retour_controle_legalite", "hiddendate");
8334 }
8335
8336 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8337 $form->setLib("is_valid", _("Valide")." :");
8338 $form->setType("is_valid", "hidden");
8339 $form->setVal("is_valid", 'true');
8340
8341 $form->setFieldset('dossier_libelle','D',_('Synthese'));
8342 $form->setFieldset('is_valid','F');
8343
8344 }
8345
8346
8347 // Création du fieldset regroupant les champs permettant la mise à jour des date
8348 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8349 $form->setFieldset('code_barres','F');
8350 // Affichage du formulaire
8351 $form->entete();
8352 $form->afficher($champs, 0, false, false);
8353 $form->enpied();
8354 // Affichage du bouton
8355 echo "\t<div class=\"formControls\">\n";
8356 //
8357 if(!$date_error) {
8358 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8359 }
8360 // Si pas sur l'écran de validation
8361 if(isset($infos)) {
8362 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8363 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8364 echo "\">Retour</a>";
8365 }
8366 echo "\t</div>\n";
8367 // Fermeture du formulaire
8368 echo "\t</form>\n";
8369 }
8370
8371 /**
8372 * [view_pdf_lettre_rar description]
8373 *
8374 * @return [type] [description]
8375 */
8376 function view_pdf_lettre_rar() {
8377 // Vérification de l'accessibilité sur l'élément
8378 $this->checkAccessibility();
8379 //
8380 $this->f->disableLog();
8381
8382 if($this->f->get_submitted_get_value('liste') != null) {
8383 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8384
8385 // Classe permettant la mise en page de l'édition pdf
8386 require_once "../obj/pdf_lettre_rar.class.php";
8387 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8388 // Initialisation de la mise en page
8389 $pdf_lettre_rar->init($this->f);
8390
8391 foreach ($listeCodeBarres as $code_barres) {
8392
8393 // On récupère le dossier
8394 $qres = $this->f->get_one_result_from_db_query(
8395 sprintf(
8396 'SELECT
8397 dossier
8398 FROM
8399 %1$sinstruction
8400 WHERE
8401 code_barres = \'%2$s\'',
8402 DB_PREFIXE,
8403 $this->f->db->escapeSimple($code_barres)
8404 ),
8405 array(
8406 "origin" => __METHOD__,
8407 )
8408 );
8409
8410 $inst_dossier = $this->f->get_inst__om_dbform(array(
8411 "obj" => "dossier",
8412 "idx" => $qres['result'],
8413 ));
8414
8415 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8416 $groupe = $inst_dossier->get_type_affichage_formulaire();
8417 switch ($groupe) {
8418 case 'CTX IN':
8419 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8420 break;
8421 case 'CTX RE':
8422 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8423 break;
8424 case 'ADS':
8425 case 'DPC':
8426 case 'CONSULTATION ENTRANTE':
8427 default:
8428 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8429 break;
8430 }
8431
8432 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8433 $qres = $this->f->get_all_results_from_db_query(
8434 sprintf(
8435 'SELECT
8436 dossier.dossier_libelle,
8437 evenement.type,
8438 count(lien_dossier_demandeur) as nbdemandeur,
8439 CASE
8440 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8441 THEN CONCAT(phase.code, \' - \', division.libelle)
8442 ELSE
8443 phase.code
8444 END AS code_phase
8445 FROM
8446 %1$sinstruction
8447 LEFT JOIN %1$sdossier
8448 ON instruction.dossier = dossier.dossier
8449 LEFT JOIN %1$sdivision
8450 ON dossier.division = division.division
8451 INNER JOIN %1$sevenement
8452 ON instruction.evenement=evenement.evenement
8453 LEFT JOIN %1$sphase
8454 ON evenement.phase = phase.phase
8455 inner JOIN %1$slien_dossier_demandeur
8456 ON instruction.dossier=lien_dossier_demandeur.dossier
8457 inner join %1$sdemandeur
8458 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8459 WHERE
8460 code_barres = \'%2$s\'
8461 AND %3$s
8462 GROUP BY
8463 dossier.dossier_libelle,
8464 evenement.type,
8465 phase.code,
8466 division.libelle',
8467 DB_PREFIXE,
8468 $this->f->db->escapeSimple($code_barres),
8469 $sql_demandeur
8470 ),
8471 array(
8472 "origin" => __METHOD__
8473 )
8474 );
8475 $testDemandeur = array_shift($qres['result']);
8476
8477
8478 // Recuperation de l'adresse de destination
8479 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8480 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8481 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8482 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8483 }
8484
8485 $qres = $this->f->get_all_results_from_db_query(
8486 sprintf(
8487 'SELECT
8488 CASE WHEN demandeur.qualite = \'particulier\'
8489 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8490 ELSE TRIM(demandeur.personne_morale_denomination)
8491 END as ligne1,
8492 CASE WHEN demandeur.qualite = \'personne_morale\'
8493 THEN TRIM(demandeur.personne_morale_raison_sociale)
8494 ELSE \'\'
8495 END as ligne1_1,
8496 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8497 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8498 ELSE \'\'
8499 END as ligne1_2,
8500 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8501 CASE demandeur.complement
8502 WHEN null THEN \'\'
8503 ELSE trim(demandeur.complement)
8504 END as ligne3,
8505 CASE demandeur.lieu_dit
8506 WHEN null THEN \'\'
8507 ELSE trim(demandeur.lieu_dit)
8508 END as ligne4,
8509 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8510 (CASE WHEN demandeur.bp IS NOT NULL
8511 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8512 ELSE \'\'
8513 END),
8514 (CASE WHEN demandeur.cedex IS NOT NULL
8515 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8516 ELSE \'\'
8517 END))
8518 as ligne5,
8519 code_barres as code_barres
8520 FROM
8521 %1$sinstruction
8522 INNER JOIN %1$sdossier
8523 ON dossier.dossier = instruction.dossier
8524 INNER JOIN %1$slien_dossier_demandeur
8525 ON dossier.dossier = lien_dossier_demandeur.dossier
8526 INNER JOIN %1$sdemandeur
8527 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8528 LEFT OUTER JOIN %1$scivilite AS pc
8529 ON demandeur.particulier_civilite = pc.civilite
8530 OR demandeur.personne_morale_civilite = pc.civilite
8531 WHERE
8532 instruction.code_barres = \'%2$s\'
8533 %3$s',
8534 DB_PREFIXE,
8535 $this->f->db->escapeSimple($code_barres),
8536 $sqlAdresse
8537 ),
8538 array(
8539 "origin" => __METHOD__
8540 )
8541 );
8542 $adresse_dest = array_shift($qres['result']);
8543
8544 // Création adresse destinataire sans ligne vide
8545 $adresse_destinataire = array();
8546 if (!empty($adresse_dest['ligne1'])) {
8547 $adresse_destinataire[] = $adresse_dest['ligne1'];
8548 }
8549 if (!empty($adresse_dest['ligne1_1'])) {
8550 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8551 }
8552 if (!empty($adresse_dest['ligne1_2'])) {
8553 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8554 }
8555 $adresse_destinataire[] = $adresse_dest['ligne2'];
8556 if (!empty($adresse_dest['ligne3'])) {
8557 $adresse_destinataire[] = $adresse_dest['ligne3'];
8558 }
8559 if (!empty($adresse_dest['ligne4'])) {
8560 $adresse_destinataire[] = $adresse_dest['ligne4'];
8561 }
8562 $adresse_destinataire[] = $adresse_dest['ligne5'];
8563
8564 // Création du champ specifique
8565 $specifique_content = array();
8566 $specifique_content[] = $adresse_dest['ligne1'];
8567 $specifique_content[] = $adresse_dest['ligne1_1'];
8568 $specifique_content[] = $adresse_dest['ligne1_2'];
8569 $specifique_content[] = $testDemandeur['dossier_libelle'];
8570 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8571 unset($adresse_dest['code_barres']);
8572 // Ajout d'une page aux pdf
8573 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8574
8575 }
8576 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8577 $om_edition = $this->f->get_inst__om_edition();
8578 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8579 }
8580 }
8581
8582 /**
8583 * VIEW - view_bordereau_envoi_maire.
8584 *
8585 * Formulaire demandant :
8586 * - le code-barres de l'événement d'instruction
8587 * - la date d'envoi du courrier pour signature par le maire
8588 *
8589 * Lors de la validation :
8590 * => met à jour cette date dans l'événement d'instruction
8591 * => crée un lien permettant de générer en PDF le bordereau
8592 *
8593 * @return void
8594 */
8595 function view_bordereau_envoi_maire() {
8596 // Vérification de l'accessibilité sur l'élément
8597 $this->checkAccessibility();
8598
8599 // Récupération des valeur passées en POST ou GET
8600 $code_barres = "";
8601 if($this->f->get_submitted_post_value('code_barres') !== null) {
8602 $code_barres = $this->f->get_submitted_post_value('code_barres');
8603 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8604 $code_barres = $this->f->get_submitted_get_value('code_barres');
8605 }
8606 $date = "";
8607 if($this->f->get_submitted_post_value('date') !== null) {
8608 $date = $this->f->get_submitted_post_value('date');
8609 } elseif($this->f->get_submitted_get_value('date') !== null) {
8610 $date = $this->f->get_submitted_get_value('date');
8611 }
8612 $validation = 0;
8613 if($this->f->get_submitted_post_value('validation') !== null) {
8614 $validation = $this->f->get_submitted_post_value('validation');
8615 } elseif($this->f->get_submitted_get_value('validation') !== null) {
8616 $validation = $this->f->get_submitted_get_value('validation');
8617 }
8618
8619 // Si le formulaire a été validé
8620 if ($this->f->get_submitted_post_value('validation') !== null) {
8621 // Tous les champs doivent obligatoirement être remplis
8622 if (!empty($date) && !empty($code_barres)) {
8623 $date_en = $this->dateDB($date);
8624 // Si date valide
8625 if ($date_en != "") {
8626 $id_instruction = $this->get_instruction_by_barcode($code_barres);
8627 // Si un événement d'instruction a été trouvé pour ce code-barres
8628 if ($id_instruction !== null) {
8629 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8630 // Si mise à jour réussie de la date d'envoi du courrier
8631 // pour signature par l'autorité compétente
8632 if($ret === true) {
8633 // Message de validation avec lien PDF
8634 $message_class = "valid";
8635 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8636 $message .= " : <br/><br/>";
8637 $message .= "<a class='om-prev-icon pdf-16'";
8638 $message .= " id=\"generer_bordereau_envoi_maire\"";
8639 $message .= " title=\""._("Bordereau")."\"";
8640 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8641 $message .= "&action=200";
8642 $message .= "&idx=".$id_instruction."'";
8643 $message .= " target='_blank'>";
8644 $message .= _("Bordereau d'envoi au maire");
8645 $message .= "</a><br/><br/>";
8646 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8647 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8648 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8649
8650 } else {
8651 // Message d'erreur
8652 $message_class = "error";
8653 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8654 $code_barres);
8655 }
8656 }
8657 else {
8658 $message_class = "error";
8659 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8660 }
8661 }
8662 else {
8663 $message_class = "error";
8664 $message = _("La date est invalide.");
8665 }
8666 } else {
8667 $message_class = "error";
8668 $message = _("Tous les champs doivent etre remplis.");
8669 }
8670 }
8671
8672 /**
8673 * Affichage des messages et du formulaire
8674 */
8675
8676 // Affichage du message de validation ou d'erreur
8677 if (isset($message) && isset($message_class) && $message != "") {
8678 $this->f->displayMessage($message_class, $message);
8679 }
8680
8681 // Ouverture du formulaire
8682 $datasubmit = $this->getDataSubmit();
8683 echo "\n<!-- ########## START DBFORM ########## -->\n";
8684 echo "<form";
8685 echo " id=\"bordereau_envoi_maire\"";
8686 echo " method=\"post\"";
8687 echo " name=\"f1\"";
8688 echo " action=\"";
8689 echo $datasubmit;
8690 echo "\"";
8691 echo ">\n";
8692
8693 // Paramétrage des champs du formulaire
8694 $champs = array("code_barres","date");
8695
8696 // Création d'un nouvel objet de type formulaire
8697 $form = $this->f->get_inst__om_formulaire(array(
8698 "validation" => 0,
8699 "maj" => 0,
8700 "champs" => $champs,
8701 ));
8702
8703 $template_required_label = '%s *';
8704 // Parametrage du champ code_barres
8705 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8706 $form->setType("code_barres", "text");
8707 $form->setVal("code_barres", $code_barres);
8708 $form->setTaille("code_barres", 20);
8709 $form->setMax("code_barres", 20);
8710 // Parametrage du champ date
8711 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8712 $form->setType("date", "date") ;
8713 if (empty($date)) {
8714 $date = date('d/m/Y');
8715 }
8716 $form->setVal("date", $date);
8717 $form->setTaille("date", 10);
8718 $form->setMax("date", 10);
8719
8720 // Création du bloc regroupant les champs
8721 $form->setBloc('code_barres','D');
8722 $form->setBloc('date','F');
8723 // Affichage du formulaire
8724 $form->entete();
8725 $form->afficher($champs, 0, false, false);
8726 $form->enpied();
8727 // Affichage du bouton
8728 printf("\t<div class=\"formControls\">\n");
8729 //
8730 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8731 printf("\t</div>\n");
8732 // Fermeture du formulaire
8733 printf("\t</form>\n");
8734 }
8735
8736 /**
8737 * VIEW - view_bordereau_envoi_maire.
8738 *
8739 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8740 *
8741 * @return [void]
8742 */
8743 function view_generate_bordereau_envoi_maire() {
8744 // Vérification de l'accessibilité sur l'élément
8745 $this->checkAccessibility();
8746 // Récupération de la collectivité du dossier d'instruction
8747 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8748 // Récupération de ses paramètres
8749 $collectivite = $this->f->getCollectivite($collectivite_di);
8750 // Génération du PDF
8751 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8752 // Affichage du PDF
8753 $this->expose_pdf_output(
8754 $result['pdf_output'],
8755 $result['filename']
8756 );
8757 }
8758
8759 /**
8760 * VIEW - view_rapport_instruction.
8761 *
8762 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8763 * Cette action est bindée pour utiliser la fonction popUpIt.
8764 *
8765 * @return void
8766 */
8767 function view_overlay_notification_manuelle() {
8768
8769 // Vérification de l'accessibilité sur l'élément
8770 $this->checkAccessibility();
8771
8772 printf(
8773 '<script type="text/javascript" >
8774 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8775 </script>',
8776 'instruction_notification_manuelle',
8777 OM_ROUTE_SOUSFORM,
8778 $this->getVal($this->clePrimaire),
8779 $this->getVal('dossier')
8780 );
8781 }
8782
8783 /**
8784 * VIEW - view_overlay_notification_service_consulte.
8785 *
8786 * Ouvre le sous-formulaire de notification des services consulte
8787 * en ajaxIt dans un overlay.
8788 * Cette action est bindée pour utiliser la fonction popUpIt.
8789 *
8790 * @return void
8791 */
8792 function view_overlay_notification_service_consulte() {
8793
8794 // Vérification de l'accessibilité sur l'élément
8795 $this->checkAccessibility();
8796
8797 printf(
8798 '<script type="text/javascript" >
8799 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8800 </script>',
8801 'instruction_notification_manuelle',
8802 OM_ROUTE_SOUSFORM,
8803 $this->getVal($this->clePrimaire),
8804 $this->getVal('dossier')
8805 );
8806 }
8807
8808 /**
8809 * VIEW - overlay_notification_tiers_consulte.
8810 *
8811 * Ouvre le sous-formulaire de notification des tiers consulte
8812 * en ajaxIt dans un overlay.
8813 * Cette action est bindée pour utiliser la fonction popUpIt.
8814 *
8815 * @return void
8816 */
8817 function view_overlay_notification_tiers_consulte() {
8818
8819 // Vérification de l'accessibilité sur l'élément
8820 $this->checkAccessibility();
8821
8822 printf(
8823 '<script type="text/javascript" >
8824 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8825 </script>',
8826 'instruction_notification_manuelle',
8827 OM_ROUTE_SOUSFORM,
8828 $this->getVal($this->clePrimaire),
8829 $this->getVal('dossier')
8830 );
8831 }
8832
8833 /**
8834 * VIEW - view_modale_selection_document_signe
8835 *
8836 * Ouvre le sous-formulaire de notification des services consulte
8837 * en ajaxIt dans un overlay.
8838 * Cette action est bindée pour utiliser la fonction popUpIt.
8839 *
8840 * @return void
8841 */
8842 function view_modale_selection_document_signe() {
8843
8844 // Vérification de l'accessibilité sur l'élément
8845 $this->checkAccessibility();
8846
8847 printf(
8848 '<script type="text/javascript" >
8849 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8850 </script>',
8851 'instruction_modale',
8852 OM_ROUTE_SOUSFORM,
8853 $this->getVal($this->clePrimaire),
8854 $this->getVal('dossier')
8855 );
8856 }
8857
8858 /**
8859 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8860 * pour exclure les dossiers du groupe contentieux.
8861 *
8862 * @param [string] $barcode numéro du code-barres
8863 * @return [mixed] ID de son instruction ou null si aucun code
8864 */
8865 function get_instruction_by_barcode($barcode) {
8866 // Begin
8867 $this->begin_treatment(__METHOD__);
8868
8869 // Vérification de l'existence de l'événement d'instruction
8870 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8871 $qres = $this->f->get_one_result_from_db_query(
8872 sprintf(
8873 'SELECT
8874 instruction
8875 FROM
8876 %1$sinstruction
8877 INNER JOIN %1$sdossier
8878 ON dossier.dossier=instruction.dossier
8879 INNER JOIN %1$sdossier_instruction_type
8880 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8881 INNER JOIN %1$sdossier_autorisation_type_detaille
8882 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8883 INNER JOIN %1$sdossier_autorisation_type
8884 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8885 INNER JOIN %1$sgroupe
8886 ON dossier_autorisation_type.groupe = groupe.groupe
8887 AND groupe.code != \'CTX\'
8888 WHERE
8889 code_barres = \'%2$s\'',
8890 DB_PREFIXE,
8891 $this->f->db->escapeSimple($barcode)
8892 ),
8893 array(
8894 "origin" => __METHOD__,
8895 )
8896 );
8897
8898 // Retourne résultat
8899 return $this->end_treatment(__METHOD__, $qres['result']);
8900 }
8901
8902 /**
8903 * Met à jour le champ date d'envoi signature
8904 * avec la date fournie et pour l'instruction donnée
8905 *
8906 * @param [string] $id ID de l'événement d'instruction
8907 * @param [string] $date date au format EN
8908 * @return [boolean] true si mise à jour avec succès
8909 */
8910 function update_date_envoi_signature($id, $date) {
8911 // Préparation du tableau
8912 $valF = array();
8913 $valF['date_envoi_signature'] = $date;
8914 // Begin
8915 $this->begin_treatment(__METHOD__);
8916 // Requête
8917 $res = $this->f->db->autoexecute(
8918 DB_PREFIXE.$this->table,
8919 $valF,
8920 DB_AUTOQUERY_UPDATE,
8921 $this->getCle($id)
8922 );
8923 $this->addToLog(
8924 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8925 VERBOSE_MODE
8926 );
8927 if ($this->f->isDatabaseError($res, true) !== false) {
8928 $this->end_treatment(__METHOD__, false);
8929 }
8930 //
8931 return $this->end_treatment(__METHOD__, true);
8932 }
8933
8934 /**
8935 * Méthode permettant de définir des valeurs à envoyer en base après
8936 * validation du formulaire d'ajout.
8937 * @param array $val tableau des valeurs retournées par le formulaire
8938 */
8939 function setValFAjout($val = array()) {
8940 // Mise à jour du flag created_by_commune lors d'un changement de décision
8941 // par un utilisateur de commune sur un dossier instruit par la comcom
8942 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8943 $this->valF['created_by_commune'] = true;
8944 }
8945
8946 //
8947 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8948 if (isset($this->valF['flag_edition_integrale']) === true) {
8949 unset($this->valF['flag_edition_integrale']);
8950 }
8951 if (isset($this->valF['signataire_arrete']) === true) {
8952 unset($this->valF['signataire_arrete']);
8953 }
8954 }
8955 }
8956
8957
8958 /**
8959 * Récupère l'instance d'un événement de workflow.
8960 *
8961 * @param mixed $evenement Identifiant de l'événement.
8962 *
8963 * @return object
8964 */
8965 function get_inst_evenement($evenement = null) {
8966 //
8967 return $this->get_inst_common("evenement", $evenement);
8968 }
8969
8970 /**
8971 * Logue l'action de l'instruction dans son DI.
8972 *
8973 * @param string $id Clé primaire de l'instruction.
8974 * @param array $val Valeurs de l'instruction.
8975 *
8976 * @return bool Vrai si traitement effectué avec succès
8977 */
8978 private function add_log_to_dossier($id, array $val) {
8979 $maj = $this->getParameter("maj");
8980 // Action = Trace par défaut
8981 $action = $this->get_backtrace();
8982 // Action = Identifant de l'action si contexte connu
8983 if (empty($maj) === false
8984 || (empty($maj) === true && $maj === 0)) {
8985 $action = $this->get_action_param($maj, 'identifier');
8986 if ($action === 'modifier_suivi') {
8987 $action = "modifier (via l'action suivi des dates)";
8988 }
8989 if ($action === 'notifier_commune'
8990 && isset($val['mails_destinataires']) === true) {
8991 $action = "notification de la commune (courriels : ";
8992 $action .= $val['mails_destinataires'].")";
8993 }
8994 }
8995 // Création du log
8996 $log = array(
8997 'date' => date('Y-m-d H:i:s'),
8998 'user' => $_SESSION['login'],
8999 'action' => $action,
9000 'values' => array(
9001 'date_evenement' => $this->dateDB($val['date_evenement']),
9002 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
9003 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
9004 'evenement' => $val['evenement'],
9005 'action' => $val['action'],
9006 'instruction' => $id,
9007 'etat' => $val['etat'],
9008 ),
9009 );
9010 // Ajout du log
9011 $di = $this->get_inst_dossier($val['dossier']);
9012 $ret = $di->add_log_instructions($log);
9013 if ($ret === false) {
9014 $this->correct = false;
9015 $this->msg = '';
9016 $this->addToMessage($di->msg);
9017 }
9018 return $ret;
9019 }
9020
9021
9022 /**
9023 * Retourne le contexte de déboguage formaté en HTML.
9024 *
9025 * @return string Une ligne par trace
9026 */
9027 private function get_backtrace() {
9028 $trace = debug_backtrace();
9029 $backtrace = '';
9030 $i = 1;
9031 foreach ($trace as $key => $value) {
9032 $func = $trace[$key]['function'];
9033 // On ne s'autolog pas
9034 if ($func === 'get_backtrace'
9035 || $func === 'add_log_to_dossier') {
9036 continue;
9037 }
9038 $backtrace .= $i.') ';
9039 // Si dans une classe
9040 if (isset($trace[$key]['class']) === true
9041 && empty($trace[$key]['class']) === false) {
9042 $backtrace .= $trace[$key]['class'].'->'.$func;
9043 }
9044 // Si procédural
9045 else {
9046 $file = $trace[$key]['file'];
9047 $line = $trace[$key]['line'];
9048 $truncated_file = $this->f->get_relative_path($file);
9049 if ($truncated_file !== false) {
9050 $file = $truncated_file;
9051 }
9052 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
9053 }
9054 $backtrace .= '<br/>';
9055 $i++;
9056 }
9057 return $backtrace;
9058 }
9059
9060 /**
9061 * CONDITION - is_notifiable.
9062 *
9063 * Condition pour afficher l'action notifier_commune.
9064 *
9065 * @return boolean
9066 */
9067 public function is_notifiable() {
9068 // L'instruction doit être finalisée, ce qui revient à dire
9069 // définalisable sans bypass
9070 if ($this->is_unfinalizable_without_bypass() === false) {
9071 return false;
9072 }
9073 // La collectivité de l'utilisateur doit être de niveau multi
9074 if ($this->f->has_collectivite_multi() === false) {
9075 return false;
9076 }
9077 // Le paramètre multi de l'objet du courriel doit exister
9078 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
9079 return false;
9080 }
9081 // Le paramètre multi du modèle du courriel doit exister
9082 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
9083 return false;
9084 }
9085 // A ce stade toutes les conditions sont satisfaites
9086 return true;
9087 }
9088
9089 /**
9090 * TREATMENT - notifier_commune.
9091 *
9092 * Notifie aux communes et par courriel la finalisation d'une instruction.
9093 *
9094 * @return boolean
9095 */
9096 public function notifier_commune() {
9097 // Cette méthode permet d'exécuter une routine en début des méthodes
9098 // dites de TREATMENT.
9099 $this->begin_treatment(__METHOD__);
9100 $message = __('Erreur de paramétrage :');
9101 $erreurParametrage = false;
9102 // Récupération du paramétrage de la collectivité du dossier
9103 $id_di = $this->getVal('dossier');
9104 $di = $this->get_inst_dossier($id_di);
9105 $collectivite_di = $di->getVal('om_collectivite');
9106 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9107 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9108 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9109 $erreurParametrage = true;
9110 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9111 }
9112
9113 // Récupération de la liste des mails
9114 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9115 if (empty($adresses)) {
9116 $erreurParametrage = true;
9117 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9118 }
9119
9120 // Vérification du paramétrage des mails
9121 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9122 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9123 $erreurParametrage = true;
9124 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9125 }
9126 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9127 $erreurParametrage = true;
9128 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9129 }
9130
9131 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9132 // un message a destination de l'utilisateur est affiché
9133 if ($erreurParametrage) {
9134 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9135 $this->addToMessage($message);
9136 return $this->end_treatment(__METHOD__, false);
9137 }
9138
9139 // Création d'un notification et de sa tâche associé pour chaque mail
9140 foreach ($adresses as $adresse) {
9141 // Ajout de la notif et récupération de son id
9142 $destinataire = array(
9143 'destinataire' => $adresse,
9144 'courriel' => $adresse
9145 );
9146 $idNotif = $this->ajouter_notification(
9147 $this->getVal($this->clePrimaire),
9148 $this->f->get_connected_user_login_name(),
9149 $destinataire,
9150 $collectivite_di
9151 );
9152 if ($idNotif === false) {
9153 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9154 return $this->end_treatment(__METHOD__, false);
9155 }
9156 // Création de la tache en lui donnant l'id de la notification
9157 $notification_by_task = $this->notification_by_task(
9158 $idNotif,
9159 $this->getVal('dossier'),
9160 'mail',
9161 'notification_commune'
9162 );
9163 if ($notification_by_task === false) {
9164 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9165 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9166 return $this->end_treatment(__METHOD__, false);
9167 }
9168 }
9169 $this->addToMessage(__('La commune a été notifiée.'));
9170 return $this->end_treatment(__METHOD__, true);
9171 }
9172
9173 /**
9174 * Récupère l'instance de l'instructeur
9175 *
9176 * @param integer $instructeur Identifiant de l'instructeur.
9177 *
9178 * @return object
9179 */
9180 protected function get_inst_instructeur($instructeur) {
9181 //
9182 return $this->get_inst_common("instructeur", $instructeur);
9183 }
9184
9185
9186 /**
9187 * Récupère l'instance de l'utilisateur
9188 *
9189 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9190 *
9191 * @return object
9192 */
9193 protected function get_inst_om_utilisateur($om_utilisateur) {
9194 //
9195 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9196 }
9197
9198
9199 /**
9200 * Récupère l'instance de la division.
9201 *
9202 * @param integer $division Identifiant de la division.
9203 *
9204 * @return object
9205 */
9206 protected function get_inst_division($division) {
9207 //
9208 return $this->get_inst_common("division", $division);
9209 }
9210
9211
9212 /**
9213 * Récupère l'instance de la direction.
9214 *
9215 * @param integer $direction Identifiant de la direction.
9216 *
9217 * @return object
9218 */
9219 protected function get_inst_direction($direction) {
9220 //
9221 return $this->get_inst_common("direction", $direction);
9222 }
9223
9224
9225 /**
9226 * Récupère la collectivité d'un instructeur en passant par sa division puis
9227 * par sa direction.
9228 *
9229 * @param integer $instructeur Identifiant de l'instructeur.
9230 *
9231 * @return integer
9232 */
9233 protected function get_instructeur_om_collectivite($instructeur) {
9234 // Chemin vers la collectivité d'un instructeur
9235 $inst_instr = $this->get_inst_instructeur($instructeur);
9236 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9237 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9238
9239 // Collectivité
9240 $om_collectivite = $inst_direction->getVal('om_collectivite');
9241
9242 //
9243 return $om_collectivite;
9244 }
9245
9246 /*
9247 * CONDITION - can_user_access_dossier_contexte_ajout
9248 *
9249 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9250 * formulaire d'ajout.
9251 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9252 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9253 *
9254 */
9255 function can_user_access_dossier_contexte_ajout() {
9256
9257 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9258 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9259 //
9260 if ($id_dossier !== "") {
9261 $dossier = $this->f->get_inst__om_dbform(array(
9262 "obj" => "dossier_instruction",
9263 "idx" => $id_dossier,
9264 ));
9265 //
9266 return $dossier->can_user_access_dossier();
9267 }
9268 return false;
9269 }
9270
9271 /*
9272 * CONDITION - can_user_access_dossier
9273 *
9274 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9275 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9276 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9277 *
9278 */
9279 function can_user_access_dossier_contexte_modification() {
9280
9281 $id_dossier = $this->getVal('dossier');
9282 //
9283 if ($id_dossier !== "" && $id_dossier !== null) {
9284 $dossier = $this->f->get_inst__om_dbform(array(
9285 "obj" => "dossier_instruction",
9286 "idx" => $id_dossier,
9287 ));
9288 //
9289 return $dossier->can_user_access_dossier();
9290 }
9291 return false;
9292 }
9293
9294 /**
9295 * TREATMENT - envoyer_a_signature_sans_relecture
9296 *
9297 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9298 *
9299 * @return boolean true si l'envoi a été effectué avec succès false sinon
9300 */
9301 function envoyer_a_signature_sans_relecture() {
9302 return $this->envoyer_a_signature();
9303 }
9304
9305 /**
9306 * TREATMENT - envoyer_a_signature_avec_relecture
9307 *
9308 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9309 *
9310 * @return boolean true si l'envoi a été effectué avec succès false sinon
9311 */
9312 function envoyer_a_signature_avec_relecture() {
9313 $is_forced_view_files = true;
9314 return $this->envoyer_a_signature($is_forced_view_files);
9315 }
9316
9317 /**
9318 * TREATMENT - envoyer_a_signature
9319 *
9320 * Permet d'envoyer le document de l'instruction au parapheur pour signature
9321 *
9322 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9323 *
9324 * @return boolean true si l'envoi a été effectué avec succès false sinon
9325 */
9326 function envoyer_a_signature($is_forced_view_files = false) {
9327 $this->begin_treatment(__METHOD__);
9328 $this->correct = true;
9329
9330 // Instanciation de l'objet signataire_arrete
9331 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9332 'obj' => 'signataire_arrete',
9333 'idx' => $this->getVal('signataire_arrete'),
9334 ));
9335
9336 // Instanciation de l'objet dossier
9337 $inst_dossier = $this->f->get_inst__om_dbform(array(
9338 'obj' => 'dossier',
9339 'idx' => $this->getVal('dossier'),
9340 ));
9341
9342 //Instanciation de la classe electronicsignature
9343 $inst_es = $this->get_electronicsignature_instance();
9344 if ($inst_es === false) {
9345 $this->correct = false;
9346 return $this->end_treatment(__METHOD__, false);
9347 }
9348
9349 // Vérifie si la notification se fait via l'application ou via le parapheur
9350 try {
9351 $notification_required = $inst_es->signer_notification_is_delegated();
9352 } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9353 // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9354 $notification_required = false;
9355 }
9356
9357 // Si la notification est faite par l'application vérifie que l'adresse mail du
9358 // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9359 // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9360 // notification
9361 if ($notification_required === true) {
9362 $signer_mail = $inst_signataire_arrete->getVal('email');
9363 $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9364
9365 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9366
9367 if (empty($signer_mail)) {
9368 $this->correct = false;
9369 $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9370 $this->addToMessage($err_msg.$err_detail);
9371 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9372 return $this->end_treatment(__METHOD__, false);
9373 }
9374 if (! $this->f->checkValidEmailAddress($signer_mail)) {
9375 $this->correct = false;
9376 $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9377 $this->addToMessage($err_msg.$err_detail);
9378 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9379 return $this->end_treatment(__METHOD__, false);
9380 }
9381 }
9382
9383 // Récupération du document à signer
9384 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9385 if ($file === OP_FAILURE) {
9386 $this->correct = false;
9387 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9388 // Termine le traitement
9389 return $this->end_treatment(__METHOD__, false);
9390 }
9391
9392 // Initialisation des paramètre à passer pour l'envoi en signature
9393 $data = array(
9394 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9395 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9396 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9397 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9398 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9399 // Permet d'envoyer en signature l'instruction le jour de la date limite
9400 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9401 "dossier" => $this->getVal('dossier'),
9402 "is_forced_view_files" => $is_forced_view_files,
9403 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9404 );
9405
9406 // Initialisation des métadonnées
9407 $metadonnee_dossier = $file['metadata'];
9408 // récupération de l'extension du fichier
9409 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9410 // Modification du libellé du document transmis au parapheur
9411 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9412 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9413 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9414
9415 $metadonnee_dossier['url_di'] = sprintf(
9416 '%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',
9417 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9418 $this->getVal('dossier')
9419 );
9420
9421 $optional_data = null;
9422 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9423 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9424 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9425 if (json_last_error() !== JSON_ERROR_NONE) {
9426 $this->correct = false;
9427 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9428 $this->addToLog(__METHOD__."(): ".
9429 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9430 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9431 );
9432 // Termine le traitement
9433 return $this->end_treatment(__METHOD__, false);
9434 }
9435 }
9436
9437 // Appel de la méthode de l'abstracteur send_for_signature()
9438 // Cette méthode doit retourner un tableau de valeur
9439 try {
9440 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9441 } catch (electronicsignature_exception $e) {
9442 $this->handle_electronicsignature_exception($e);
9443 return $this->end_treatment(__METHOD__, false);
9444 }
9445
9446 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9447 $valF = array();
9448
9449 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9450 foreach($this->champs as $identifiant => $champ) {
9451 $valF[$champ] = $this->val[$identifiant];
9452 }
9453 // On fait ensuite nos modifications spécifiques
9454 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9455 $valF['statut_signature'] = $result['statut'];
9456 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9457 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9458 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9459 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9460 $ret = $this->modifier($valF);
9461
9462 if ($ret === false) {
9463 $this->correct = false;
9464 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9465 // Termine le traitement
9466 return $this->end_treatment(__METHOD__, false);
9467 }
9468
9469 // Notification du signataire
9470 if ($notification_required === true) {
9471 if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9472 $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9473 $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9474 $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9475 // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9476 // precedemment
9477 $this->init_record_data($this->getVal($this->clePrimaire));
9478 $this->annuler_envoi_en_signature();
9479 $this->correct = false;
9480 return $this->end_treatment(__METHOD__, true);
9481 }
9482 }
9483
9484 // Message
9485 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9486 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9487 && array_key_exists('signature_page_url', $result) === true) {
9488 $this->addToMessage(sprintf(
9489 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9490 $result['signature_page_url'],
9491 __("Signez directement le document")
9492 ));
9493 }
9494 if ($notification_required !== true) {
9495 $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9496 }
9497
9498 // Tout s'est bien passé, on termine le traitement
9499 return $this->end_treatment(__METHOD__, true);
9500 }
9501
9502 /**
9503 * Notifie le signataire d'un document à signer.
9504 * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9505 * En cas d'erreur ajoute une ligne dans les logs de l'application.
9506 *
9507 * @param string $signer_name Nom du signataire
9508 * @param string $signer_mail Mail du signataire
9509 * @param string $user_name Nom de l'utilisateur openADS courant
9510 *
9511 * @return boolean true si succés, false si erreur
9512 */
9513 protected function notify_signer($signer_name, $signer_mail, $user_name) {
9514 // message d'erreur
9515 $err_msg_log = sprintf(
9516 __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9517 $signer_name,
9518 $signer_mail,
9519 $this->getVal($this->clePrimaire)
9520 );
9521 $err_msg = sprintf(
9522 '%s %s (%s)"',
9523 __("Échec de la notification du signataire"),
9524 $signer_name,
9525 $signer_mail
9526 );
9527
9528 // vérification des informations requises
9529 if (empty($signer_name)) {
9530 $err_detail = __("le nom du signataire est vide");
9531 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9532 $this->addToMessage($err_msg.', '.$err_detail);
9533 return false;
9534 }
9535 if (empty($signer_mail)) {
9536 $err_detail = __("le courriel du signataire est vide");
9537 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9538 $this->addToMessage($err_msg.', '.$err_detail);
9539 return false;
9540 }
9541 if (empty($this->getVal('dossier'))) {
9542 $err_detail = __("l'identifiant du dossier est vide");
9543 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9544 $this->addToMessage($err_msg.', '.$err_detail);
9545 return false;
9546 }
9547
9548 // ajout de la notification à la liste des notifications de l'instruction
9549 $instruction_id = $this->getVal($this->clePrimaire);
9550 $inst_notif = $this->f->get_inst__om_dbform(array(
9551 "obj" => "instruction_notification",
9552 "idx" => "]",
9553 ));
9554 $notif_val = array(
9555 'instruction_notification' => null,
9556 'instruction' => $instruction_id,
9557 'automatique' => true,
9558 'emetteur' => $user_name,
9559 'date_envoi' => null,
9560 'destinataire' => "$signer_name <$signer_mail>",
9561 'courriel' => $signer_mail,
9562 'date_premier_acces' => null,
9563 'statut' => '',
9564 'commentaire' => ''
9565 );
9566 $add_notif = $inst_notif->ajouter($notif_val);
9567 if ($add_notif === false) {
9568 $err_detail = __("Échec de l'ajout de la notification.");
9569 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9570 $this->addToMessage($err_msg);
9571 return false;
9572 }
9573 $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9574
9575 // ajout d'une tâche de notification (envoi du mail)
9576 $notification_task = $this->notification_by_task(
9577 $notification_id,
9578 $this->getVal('dossier'),
9579 'mail',
9580 'notification_signataire'
9581 );
9582 if ($notification_task === false) {
9583 $err_detail = sprintf(
9584 __("Échec de l'ajout de la tâche de notification (notification %s)."),
9585 $notification_id);
9586 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9587 $this->addToMessage($err_msg);
9588 return false;
9589 }
9590
9591 // Vérification de la réussite de l'envoi du mail
9592 // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9593 // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9594 // qui viens d'être créée.
9595 // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9596 $qres = $this->f->get_one_result_from_db_query(
9597 sprintf(
9598 'SELECT
9599 state
9600 FROM
9601 %1$stask
9602 WHERE
9603 type = \'notification_signataire\'
9604 AND category = \'mail\'
9605 AND dossier = \'%2$s\'
9606 ORDER BY
9607 task DESC
9608 LIMIT 1',
9609 DB_PREFIXE,
9610 $this->f->db->escapeSimple($this->getVal('dossier'))
9611 ),
9612 array(
9613 'origin' => __METHOD__
9614 )
9615 );
9616 if ($qres['result'] === 'error') {
9617 $err_detail = sprintf(
9618 __("Échec de l'envoi du mail de notification (notification %s)."),
9619 $notification_id);
9620 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9621 $this->addToMessage($err_msg);
9622 return false;
9623 }
9624
9625 // succès de la planification de la notification
9626 $this->addToMessage(sprintf(
9627 __('Le signataire "%s (%s)" sera notifié prochainement'),
9628 $signer_name,
9629 $signer_mail));
9630 return true;
9631 }
9632
9633 /**
9634 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9635 * est en incomplet notifié ou non.
9636 * On peut ajouter des jours à cette date grâce au paramètre "delay".
9637 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9638 * l'instruction en signature le jour de la date limite.
9639 *
9640 * @param int $delay Le nombre de jour à ajouter à la date limite.
9641 *
9642 * @return string $date_limite la date limite calculé ou false
9643 */
9644 private function compute_date_limite($delay) {
9645 // Instanciation de l'objet dossier
9646 $inst_dossier = $this->f->get_inst__om_dbform(array(
9647 'obj' => 'dossier',
9648 'idx' => $this->getVal('dossier'),
9649 ));
9650
9651 $date_to_compute = null;
9652 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9653 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9654 } else {
9655 $date_to_compute = $inst_dossier->getVal('date_limite');
9656 }
9657 if ($date_to_compute != null) {
9658 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9659 }
9660
9661 return null;
9662 }
9663
9664 /**
9665 * Permet de récupérer la traduction de la valeur de statut_signature
9666 *
9667 * @return string la valeur de statut_signature traduite | false
9668 */
9669 function get_trad_for_statut($value_to_trad){
9670 $statut_signature_tab = array(
9671 'waiting' => __('en préparation'),
9672 'in_progress' => __('en cours de signature'),
9673 'canceled' => __('signature annulée'),
9674 'expired' => __('délai de signature expiré'),
9675 'finished' => __('signé')
9676 );
9677 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9678 return $statut_signature_tab[$value_to_trad];
9679 }
9680
9681 return false;
9682 }
9683
9684 /**
9685 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9686 *
9687 * @return string (json) la valeur de historique_signature mis à jour | false
9688 */
9689 function get_updated_historique_signature($historique_signature_values) {
9690
9691 $historique_signature_value_tab = $this->get_historique_signature_decoded();
9692
9693 if ($historique_signature_value_tab === false) {
9694 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9695 return false;
9696 }
9697
9698 $last_val_historique_signature = array();
9699
9700 // Si la tableau récupéré n'est pas vide alors
9701 // on récupère la dernière ligne du tableau
9702 if (empty($historique_signature_value_tab) === false) {
9703 $last_val_historique_signature = end($historique_signature_value_tab);
9704 }
9705
9706 $format_date = '';
9707 $format_date_hour = '';
9708 $date_converted=array();
9709
9710 $date_to_convert = array(
9711 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9712 'date_limite_instruction' => $this->compute_date_limite(0),
9713 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9714 );
9715
9716 // Conversion des dates en fonction de leur format
9717 foreach ($date_to_convert as $key => $value) {
9718 $date_converted[$key] = null;
9719 if ($value != null) {
9720 $format_date = 'd/m/Y';
9721 $format_date_hour = 'd/m/Y H:i:s';
9722 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9723 }
9724 }
9725
9726 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9727 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9728 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9729 $tab_for_columns_trad = array(
9730 __('entry_date'),
9731 __('id_parapheur_signature'),
9732 __('emetteur'),
9733 __('signataire'),
9734 __('date_envoi'),
9735 __('date_limite'),
9736 __('date_retour'),
9737 __('statut_signature'),
9738 __('commentaire_signature')
9739 );
9740
9741 array_push($historique_signature_value_tab, array(
9742 'entry_date' => date('d/m/Y H:i:s'),
9743 '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'],
9744 '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'],
9745 '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'],
9746 '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'],
9747 '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'],
9748 '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'],
9749 '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']),
9750 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9751 ));
9752
9753 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9754 }
9755
9756 /**
9757 * TREATMENT - annuler_envoi_en_signature
9758 *
9759 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9760 *
9761 * @return boolean true si l'annulation a été effectué avec succès false sinon
9762 */
9763 function annuler_envoi_en_signature() {
9764 $this->begin_treatment(__METHOD__);
9765 $this->correct = true;
9766
9767 //Instanciation de la classe electronicsignature
9768 $inst_es = $this->get_electronicsignature_instance();
9769 if ($inst_es === false) {
9770 $this->correct = false;
9771 return $this->end_treatment(__METHOD__, false);
9772 }
9773
9774 $data = array();
9775 if (! empty($this->getVal('id_parapheur_signature'))) {
9776 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9777 } else {
9778 $this->correct = false;
9779 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9780 return $this->end_treatment(__METHOD__, false);
9781 }
9782
9783 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9784 // Cette méthode doit retourner un tableau de valeur
9785 try {
9786 $result = $inst_es->cancel_send_for_signature($data);
9787 } catch (electronicsignature_exception $e) {
9788 $this->handle_electronicsignature_exception($e);
9789 return $this->end_treatment(__METHOD__, false);
9790 }
9791
9792 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9793 $valF = array();
9794
9795 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9796 foreach($this->champs as $identifiant => $champ) {
9797 $valF[$champ] = $this->val[$identifiant];
9798 }
9799 // On fait ensuite nos modifications spécifiques
9800 $valF['id_parapheur_signature'] = null;
9801 $valF['statut_signature'] = $result['statut'];
9802 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9803 $valF['date_envoi_signature'] = null;
9804 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9805
9806 $ret = $this->modifier($valF);
9807
9808 if ($ret === false) {
9809 $this->correct = false;
9810 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9811 // Termine le traitement
9812 return $this->end_treatment(__METHOD__, false);
9813 }
9814
9815 // Message
9816 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9817
9818 // Tout s'est bien passé, on termine le traitement
9819 return $this->end_treatment(__METHOD__, true);
9820 }
9821
9822
9823 /**
9824 * Récupère le contenu du champ historique_signature et le converti en tableau
9825 *
9826 * @return array sinon false en cas d'erreur
9827 */
9828 protected function get_historique_signature_decoded() {
9829 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9830 if ($val === '' || $val == 'false') {
9831 $val = json_encode(array());
9832 }
9833 if($this->isJson($val) === false) {
9834 return false;
9835 }
9836 return json_decode($val, true);
9837 }
9838
9839 /**
9840 * Récupère les informations à afficher dans le tableau de suivi à l'aide
9841 * d'une requête sql. Stocke ces informations dans un tableau.
9842 * Converti le tableau au format json et renvoi le json obtenu.
9843 *
9844 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9845 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9846 * La clause where de la requête est construite à partir du tableau contenant les types
9847 * de tâches fourni en paramètre.
9848 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9849 *
9850 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9851 * la date de premier accès ne sera pas affichée.
9852 *
9853 * @param array liste des tâches permettant d'identifier quelles notification afficher
9854 * @param boolean permet d'afficher les notifications non liées à des tâches
9855 * @return json
9856 */
9857 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9858 $whereTypeTache = '';
9859 $sqlTaskNull = 'INNER';
9860
9861 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9862 $listeChampsTrad = array(
9863 __('emetteur'),
9864 __('date_envoi'),
9865 __('destinataire'),
9866 __('date_premier_acces'),
9867 __('instruction'),
9868 __('annexes'),
9869 __('statut'),
9870 __('commentaire')
9871 );
9872 $listeChamps = array(
9873 'emetteur',
9874 'date_envoi',
9875 'destinataire',
9876 'date_premier_acces',
9877 'instruction',
9878 'annexes',
9879 'statut',
9880 'commentaire'
9881 );
9882
9883 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9884 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9885 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9886 // paramétrage
9887 if(is_bool($nonLieTache) && $nonLieTache === true) {
9888 $sqlTaskNull = 'LEFT';
9889 }
9890 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9891 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9892 // tiers consulté
9893 if (is_array($typeTache) && $typeTache != array()) {
9894 if (is_array($typeTache)) {
9895 $whereTypeTache = sprintf(
9896 'AND (task.task IS NULL OR (task.task IS NOT NULL AND task.type IN (%1$s)))',
9897 "'".implode("', '", $typeTache)."'"
9898 );
9899 }
9900 // La date de premier accès n'a pas besoin d'être renseigné pour
9901 // les notifications des demandeurs via le portail citoyen.
9902 // Les notifications des demandeurs sont liés à 3 types de tâches
9903 // notification_recepisse, notification_instruction, notification_decision
9904 // Si le suivi de la notification concerne un de ces types de tâches on
9905 // considère que c'est une notification de demandeurs.
9906 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9907 // via le portail. Par défaut si rien n'est paramétré on considère que la
9908 // notification est faite via le portail
9909 if ((in_array('notification_recepisse', $typeTache) ||
9910 in_array('notification_instruction', $typeTache) ||
9911 in_array('notification_decision', $typeTache))) {
9912 $dossier = $this->getVal('dossier');
9913 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9914 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9915 if ($modeNotification === PORTAL) {
9916 $listeChamps = array(
9917 'emetteur',
9918 'date_envoi',
9919 'destinataire',
9920 'instruction',
9921 'annexes',
9922 'statut',
9923 'commentaire'
9924 );
9925 }
9926 }
9927 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9928 // de les afficher dans le suivi
9929 if (in_array('notification_depot_demat', $typeTache)) {
9930 $listeChamps = array(
9931 'emetteur',
9932 'date_envoi',
9933 'destinataire',
9934 'instruction',
9935 'statut',
9936 'commentaire'
9937 );
9938 }
9939 }
9940
9941 $valSuivi = array();
9942 // Récupération des infos nécessaires à l'affichage du tableau
9943 $sql = sprintf(
9944 'SELECT DISTINCT
9945 instruction_notification.instruction_notification,
9946 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9947 CASE WHEN instruction_notification.automatique = TRUE
9948 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9949 ELSE instruction_notification.emetteur
9950 END as emetteur,
9951 date_envoi,
9952 instruction_notification.destinataire,
9953 instruction_notification.date_premier_acces,
9954 evenement.libelle as instruction,
9955 instruction_notification.statut,
9956 instruction_notification.commentaire,
9957 annexes.instruction_annexe as annexes
9958 FROM
9959 %1$sinstruction_notification
9960 LEFT JOIN %1$sinstruction
9961 ON instruction.instruction = instruction_notification.instruction
9962 LEFT JOIN %1$sevenement
9963 ON instruction.evenement = evenement.evenement
9964 LEFT JOIN %1$sinstruction_notification_document
9965 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9966 AND instruction_notification_document.annexe = true
9967 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9968 %4$s JOIN %1$stask
9969 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9970 AND task.type LIKE \'notification%%\'
9971 -- Récupération de la liste des annexes sous la forme d une liste
9972 LEFT JOIN (
9973 SELECT
9974 instruction_notification,
9975 -- Récupère la liste des annexes de la notification
9976 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9977 -- à l affichage du lien vers les annexes
9978 CONCAT(
9979 \'[\',
9980 STRING_AGG(
9981 -- Affiche le nom du fichier selon le type de document/pièce
9982 CASE
9983 WHEN instruction_notification_document.document_type = \'instruction\'
9984 THEN CONCAT(
9985 \'{
9986 "obj" : "instruction",
9987 "champs" : "om_fichier_instruction",
9988 "label" : "\', evenement.libelle, \'",
9989 "id" : "\', instruction.instruction,\'"
9990 }\'
9991 )
9992 WHEN instruction_notification_document.document_type = \'consultation\'
9993 THEN CONCAT(
9994 \'{
9995 "obj" : "consultation",
9996 "champs" : "fichier",
9997 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
9998 "id" : "\', consultation.consultation, \'"
9999 }\'
10000 )
10001 ELSE
10002 CONCAT(
10003 \'{
10004 "obj" : "document_numerise",
10005 "champs" : "uid",
10006 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
10007 "id" : "\', document_numerise.document_numerise,\'"
10008 }\'
10009 )
10010 END,
10011 \', \'),
10012 \']\'
10013 ) AS instruction_annexe
10014 FROM
10015 %1$sinstruction_notification_document
10016 LEFT JOIN %1$sinstruction
10017 ON instruction_notification_document.instruction = instruction.instruction
10018 LEFT JOIN %1$sevenement
10019 ON instruction.evenement = evenement.evenement
10020 LEFT JOIN %1$sconsultation
10021 ON instruction_notification_document.document_id = consultation.consultation
10022 LEFT JOIN %1$sservice
10023 ON consultation.service = service.service
10024 LEFT JOIN %1$sdocument_numerise
10025 ON instruction_notification_document.document_id = document_numerise.document_numerise
10026 LEFT JOIN %1$sdocument_numerise_type
10027 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
10028 WHERE
10029 instruction_notification_document.annexe = \'t\'
10030 GROUP BY
10031 instruction_notification
10032 ) AS annexes
10033 ON
10034 annexes.instruction_notification = instruction_notification.instruction_notification
10035 WHERE
10036 instruction.instruction = %2$s
10037 %3$s
10038 ORDER BY
10039 date_envoi ASC, instruction_notification.destinataire ASC',
10040 DB_PREFIXE,
10041 intval($this->getVal('instruction')),
10042 $whereTypeTache,
10043 $sqlTaskNull
10044 );
10045 $qres = $this->f->get_all_results_from_db_query($sql, array(
10046 "origin" => __METHOD__
10047 )
10048 );
10049 // Préparation du lien de téléchargement des annexes
10050 $htmlList =
10051 '<style>
10052 #content .gridjs-td a.lien_annexe {
10053 text-decoration : underline dotted 1px;
10054 }
10055 #content a.lien_annexe:hover {
10056 text-decoration : underline solid 1px;
10057 color : #46aede;
10058 }
10059 ol {padding-left : 10px;}
10060 </style>
10061 <ol>%1$s</ol>';
10062 $lienTelechargement =
10063 '<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">
10064 Annexe
10065 </a>';
10066 // Stockage des infos de chaque notification dans un tableau
10067 foreach ($qres['result'] as $row) {
10068 $valNotif = array();
10069 foreach($listeChamps as $champ) {
10070 $valNotif[$champ] = $row[$champ];
10071 if (($champ === 'date_envoi'
10072 || $champ === 'date_premier_acces')
10073 && $row[$champ] !== null
10074 && $row[$champ] !== '') {
10075 //
10076 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
10077 } else if ($champ === 'annexes') {
10078 $listeAnnexe = '';
10079 $infoAnnexes = json_decode($row[$champ], true);
10080 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
10081 // A partir des infos récupérées prépare le code html du lien vers chacune
10082 // des annexes et ajoute un élément de liste par annexe
10083 foreach($infoAnnexes as $annexe) {
10084 $listeAnnexe .= sprintf(
10085 '<li>%s</li>',
10086 sprintf($lienTelechargement,
10087 $annexe['obj'],
10088 $annexe['champs'],
10089 $annexe['id'],
10090 $annexe['label']
10091 )
10092 );
10093 }
10094 // Construction de la liste des annexes
10095 $valNotif[$champ] = sprintf(
10096 $htmlList,
10097 $listeAnnexe
10098 );
10099 }
10100 }
10101 }
10102 array_push($valSuivi, $valNotif);
10103 }
10104
10105 // Passage du tableau au format json
10106 return json_encode($valSuivi, JSON_HEX_APOS);
10107 }
10108
10109 /**
10110 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10111 *
10112 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10113 *
10114 * @return void
10115 */
10116 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10117 $this->f->displayMessage('error', $exception->getMessage());
10118 }
10119
10120
10121 /**
10122 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10123 *
10124 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10125 * @return electronicsignature Instance de l'abstracteur.
10126 */
10127 public function get_electronicsignature_instance($with_handle_error = true) {
10128 if(isset($this->electronicsignature_instance)) {
10129 return $this->electronicsignature_instance;
10130 }
10131 // Instanciation du connecteur electronicsignature
10132 try {
10133 require_once "electronicsignature.class.php";
10134 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10135 $this->electronicsignature_instance = new electronicsignature($collectivites);
10136 } catch (electronicsignature_exception $e) {
10137 if ($with_handle_error === true) {
10138 $this->handle_electronicsignature_exception($e);
10139 }
10140 return false;
10141 }
10142 return $this->electronicsignature_instance;
10143 }
10144
10145 /**
10146 * TREATMENT - envoyer_au_controle_de_legalite
10147 *
10148 * Ajoute la tâche envoi_CL.
10149 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10150 *
10151 * @return [type] [description]
10152 */
10153 function envoyer_au_controle_de_legalite() {
10154 $this->begin_treatment(__METHOD__);
10155 $this->correct = true;
10156
10157 //
10158 if ($this->can_be_sended_to_cl() === true) {
10159 // Création de la task 'envoi_CL'
10160 $inst_task = $this->f->get_inst__om_dbform(array(
10161 "obj" => "task",
10162 "idx" => 0,
10163 ));
10164 $task_val = array(
10165 'type' => 'envoi_CL',
10166 'object_id' => $this->getVal('instruction'),
10167 'dossier' => $this->getVal('dossier'),
10168 );
10169 // Change l'état de la tâche de notification en fonction de l'état de
10170 // transmission du dossier d'instruction
10171 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10172 if ($this->f->is_option_mode_service_consulte_enabled() === false
10173 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10174 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10175 //
10176 $task_val['state'] = $inst_task::STATUS_DRAFT;
10177 }
10178 $add_task = $inst_task->add_task(array('val' => $task_val));
10179 if ($add_task === false) {
10180 $this->addToMessage(sprintf('%s %s',
10181 __("Une erreur s'est produite lors de la création tâche."),
10182 __("Veuillez contacter votre administrateur.")
10183 ));
10184 $this->correct = false;
10185 return $this->end_treatment(__METHOD__, false);
10186 }
10187 // Mise à jour du champs 'envoye_cl_platau'
10188 $instr_val = array(
10189 'envoye_cl_platau' => 't',
10190 );
10191 $res = $this->f->db->autoExecute(
10192 DB_PREFIXE.$this->table,
10193 $instr_val,
10194 DB_AUTOQUERY_UPDATE,
10195 $this->getCle($this->getVal($this->clePrimaire))
10196 );
10197 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
10198 if ($this->f->isDatabaseError($res, true) === true) {
10199 $this->addToMessage(sprintf('%s %s',
10200 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10201 __("Veuillez contacter votre administrateur.")
10202 ));
10203 $this->correct = false;
10204 return $this->end_treatment(__METHOD__, false);
10205 }
10206 // Message de validation à l'utilisateur
10207 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10208 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10209 }
10210 //
10211 return $this->end_treatment(__METHOD__, true);
10212 }
10213
10214
10215 /**
10216 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10217 *
10218 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10219 * la vue 'sousformulaire'.
10220 *
10221 * @return string
10222 */
10223 function get_back_link($view = "formulaire") {
10224 //
10225 $href = parent::get_back_link($view);
10226 //
10227 $crud = $this->get_action_crud();
10228
10229 // Redirection vers le formulaire de modification à la validation du
10230 // formulaire d'ajout si l'événement associé possède une lettre type
10231 if (($crud === 'create'
10232 || ($crud === null
10233 && $this->getParameter('maj') == 0))
10234 && $this->correct == true
10235 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10236
10237 // On instancie l'instruction
10238 $inst_instruction = $this->f->get_inst__om_dbform(array(
10239 "obj" => "instruction",
10240 "idx" => $this->valF[$this->clePrimaire],
10241 ));
10242
10243 // Si l'instruction n'est pas finalisée automatiquement
10244 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10245 $href = str_replace("&action=3", "&action=1", $href);
10246 //
10247 if (strpos($href, "&retour=tab") !== false) {
10248 $href = str_replace("&retour=tab", "&retour= form", $href);
10249 } else {
10250 $href .= "&retour=form";
10251 }
10252 }
10253 }
10254
10255 //
10256 return $href;
10257 }
10258
10259 public function view_json_data() {
10260 $this->checkAccessibility();
10261 $this->f->disableLog();
10262 $view = $this->get_json_data();
10263 printf(json_encode($view));
10264 }
10265
10266 public function get_json_data() {
10267 $val = array_combine($this->champs, $this->val);
10268 foreach ($val as $key => $value) {
10269 $val[$key] = strip_tags($value);
10270 }
10271 $val['tacite'] = 'f';
10272 $inst_ad = $this->f->get_inst__om_dbform(array(
10273 "obj" => "avis_decision",
10274 "idx" => $val['avis_decision'],
10275 ));
10276 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10277 $val['tacite'] = 't';
10278 }
10279 return $val;
10280 }
10281
10282 /**
10283 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10284 * comme événement lié le suivant définit dans l'événement de l'instruction
10285 * instanciée.
10286 *
10287 * @param string $next_type Correspond aux trois déclenchement automatique
10288 * de création d'instruction paramétré sur un événement.
10289 * @param integer $instruction Identifiant de l'instruction à instancier.
10290 * @return mixed Identifiant de l'instruction recherchée ou false.
10291 */
10292 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10293 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10294 return false;
10295 }
10296 $result = array();
10297 $evenements = array();
10298 if ($instruction === null) {
10299 $instruction = $this->getVal($this->clePrimaire);
10300 $evenement = $this->getVal('evenement');
10301 $dossier = $this->getVal('dossier');
10302 } else {
10303 $inst = $this->f->get_inst__om_dbform(array(
10304 "obj" => "instruction",
10305 "idx" => $instruction,
10306 ));
10307 $evenement = $inst->getVal('evenement');
10308 $dossier = $inst->getVal('dossier');
10309 }
10310 // Récupération de l'identifiant de l'événement paramétré comme suivant
10311 // sur l'instruction instanciée
10312 $qres = $this->f->get_one_result_from_db_query(
10313 sprintf(
10314 'SELECT
10315 evenement_%3$s
10316 FROM
10317 %1$sevenement
10318 WHERE
10319 evenement = %2$s',
10320 DB_PREFIXE,
10321 intval($evenement),
10322 $next_type
10323 ),
10324 array(
10325 "origin" => __METHOD__,
10326 "force_return" => true,
10327 )
10328 );
10329 if ($qres["code"] !== "OK") {
10330 return false;
10331 }
10332 $ev_next = $qres["result"];
10333 // Récupération de l'instruction dans le dossier utilisant l'événement
10334 // suivant identifié dans la requête précédente
10335 $qres = $this->f->get_one_result_from_db_query(
10336 sprintf(
10337 'SELECT
10338 MAX(instruction.instruction) as instruction
10339 FROM
10340 %1$sinstruction
10341 WHERE
10342 dossier = \'%3$s\'
10343 AND evenement = %2$s',
10344 DB_PREFIXE,
10345 intval($ev_next),
10346 $this->f->db->escapeSimple($dossier)
10347 ),
10348 array(
10349 "origin" => __METHOD__,
10350 "force_return" => true,
10351 )
10352 );
10353 if ($qres["code"] !== "OK") {
10354 return false;
10355 }
10356 return $qres["result"];
10357 }
10358
10359 public function get_related_instructions($instruction = null) {
10360 $result = array();
10361 $evenements = array();
10362 if ($instruction === null) {
10363 $instruction = $this->getVal($this->clePrimaire);
10364 $evenement = $this->getVal('evenement');
10365 $dossier = $this->getVal('dossier');
10366 } else {
10367 $inst = $this->f->get_inst__om_dbform(array(
10368 "obj" => "instruction",
10369 "idx" => $instruction,
10370 ));
10371 $evenement = $inst->getVal('evenement');
10372 $dossier = $inst->getVal('dossier');
10373 }
10374 //
10375 $qres = $this->f->get_one_result_from_db_query(
10376 sprintf(
10377 'SELECT
10378 evenement
10379 FROM
10380 %1$sevenement
10381 WHERE
10382 evenement_retour_ar = %2$s
10383 OR evenement_retour_signature = %2$s',
10384 DB_PREFIXE,
10385 intval($evenement)
10386 ),
10387 array(
10388 "origin" => __METHOD__,
10389 "force_return" => true,
10390 )
10391 );
10392 if ($qres["code"] !== "OK") {
10393 return false;
10394 }
10395 $ev_parent = $qres["result"];
10396 //
10397 $qres = $this->f->get_one_result_from_db_query(
10398 sprintf(
10399 'SELECT
10400 MAX(instruction.instruction) as instruction
10401 FROM
10402 %1$sinstruction
10403 WHERE
10404 dossier = \'%3$s\'
10405 AND evenement = %2$s',
10406 DB_PREFIXE,
10407 intval($ev_parent),
10408 $this->f->db->escapeSimple($dossier)
10409 ),
10410 array(
10411 "origin" => __METHOD__,
10412 "force_return" => true,
10413 )
10414 );
10415 if ($qres["code"] !== "OK") {
10416 return false;
10417 }
10418 $result[] = $qres["result"];
10419 //
10420 $qres = $this->f->get_one_result_from_db_query(
10421 sprintf(
10422 'SELECT
10423 evenement_retour_ar
10424 FROM
10425 %1$sevenement
10426 WHERE
10427 evenement = %2$d
10428 AND evenement_retour_ar != %3$d',
10429 DB_PREFIXE,
10430 intval($ev_parent),
10431 intval($evenement)
10432 ),
10433 array(
10434 "origin" => __METHOD__,
10435 "force_return" => true,
10436 )
10437 );
10438 if ($qres["code"] !== "OK") {
10439 return false;
10440 }
10441 $evenements[] = $qres["result"];
10442 //
10443 $qres = $this->f->get_one_result_from_db_query(
10444 sprintf(
10445 'SELECT
10446 evenement_retour_signature
10447 FROM
10448 %1$sevenement
10449 WHERE
10450 evenement = %2$s
10451 AND evenement_retour_signature != %3$s
10452 ',
10453 DB_PREFIXE,
10454 intval($ev_parent),
10455 intval($evenement)
10456 ),
10457 array(
10458 "origin" => __METHOD__,
10459 "force_return" => true,
10460 )
10461 );
10462 if ($qres["code"] !== "OK") {
10463 return false;
10464 }
10465 $evenements[] = $qres["result"];
10466 foreach ($evenements as $value) {
10467 if ($value !== null) {
10468 $qres = $this->f->get_one_result_from_db_query(
10469 sprintf(
10470 'SELECT
10471 MAX(instruction.instruction) as instruction
10472 FROM
10473 %1$sinstruction
10474 WHERE
10475 dossier = \'%3$s\'
10476 AND evenement = %2$s',
10477 DB_PREFIXE,
10478 intval($value),
10479 $this->f->db->escapeSimple($dossier)
10480 ),
10481 array(
10482 "origin" => __METHOD__,
10483 "force_return" => true,
10484 )
10485 );
10486 if ($qres["code"] !== "OK") {
10487 return false;
10488 }
10489 $result[] = $qres["result"];
10490 }
10491 }
10492 return $result;
10493 }
10494
10495 protected function getDocumentType($champ = null) {
10496 $evenementId = $this->getVal('evenement');
10497 if (! empty($evenementId)) {
10498 $evenement = $this->f->findObjectById('evenement', $evenementId);
10499 if (! empty($evenement)) {
10500 return __("Instruction").':'.$evenement->getVal('libelle');
10501 }
10502 }
10503 return parent::getDocumentType();
10504 }
10505
10506 /**
10507 * Récupère à l'aide d'une requête sql la liste des demandeurs
10508 * pouvant être notifié. C'est à dire les demandeurs acceptant
10509 * les notifications et pour lesquels une adresse mail existe.
10510 *
10511 * Dans le cas, d'une notification pour le portail citoyen, seul
10512 * le pétitionnaire principal doit être notifier et uniquement si
10513 * il a une adress mail et qu'il accepte les notifications.
10514 *
10515 * @param string identifiant du dossier
10516 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10517 * pour une notification de categorie portail
10518 * @return array liste des demandeurs pouvant être notifié
10519 */
10520 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10521 if ($idDossier === null) {
10522 $idDossier = $this->getVal('dossier');
10523 }
10524 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10525 // pour une notification depuis le portail citoyen
10526 $sqlPetitionnairePrincipal = '';
10527 // Gestion des champs nécessaires pour la notification d'un demandeur
10528 $condition_demandeur = "AND demandeur.notification = 't'
10529 AND demandeur.courriel IS NOT NULL";
10530 if ($portail === true) {
10531 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10532 $condition_demandeur = "AND (
10533 (notification = 't' AND courriel IS NOT NULL)
10534 OR demande.source_depot = 'portal'
10535 )";
10536 }
10537
10538 $listeDemandeursNotifiable = array();
10539
10540 // Requête de récupération des demandeurs
10541 $qres = $this->f->get_all_results_from_db_query(
10542 sprintf(
10543 'SELECT
10544 demandeur.demandeur,
10545 CASE
10546 WHEN demandeur.qualite=\'particulier\'
10547 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10548 ELSE
10549 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10550 END AS destinataire,
10551 demandeur.courriel,
10552 petitionnaire_principal
10553 FROM
10554 %1$sdossier
10555 INNER JOIN %1$slien_dossier_demandeur
10556 ON dossier.dossier = lien_dossier_demandeur.dossier
10557 INNER JOIN %1$sdemandeur
10558 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10559 -- Récupération de la plus ancienne demande associée au dossier (la demande
10560 -- de création du dossier)
10561 INNER JOIN (
10562 SELECT
10563 demande,
10564 dossier_instruction,
10565 source_depot
10566 FROM
10567 %1$sdemande
10568 WHERE
10569 dossier_instruction = \'%2$s\'
10570 ORDER BY
10571 demande ASC
10572 LIMIT 1
10573 ) as demande
10574 ON dossier.dossier = demande.dossier_instruction
10575 WHERE
10576 dossier.dossier = \'%2$s\'
10577 %3$s
10578 %4$s',
10579 DB_PREFIXE,
10580 $this->f->db->escapeSimple($idDossier),
10581 $condition_demandeur,
10582 $sqlPetitionnairePrincipal
10583 ),
10584 array(
10585 "origin" => __METHOD__
10586 )
10587 );
10588 // Récupération des infos des demandeurs et stockage dans un tableau
10589 // ayant pour clé les id des demandeurs
10590 foreach ($qres['result'] as $row) {
10591 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10592 }
10593
10594 return $listeDemandeursNotifiable;
10595 }
10596
10597 /**
10598 * Renvoie la liste des notifications liées à l'instruction
10599 *
10600 * @param integer id de l'instruction dont on cherche les notifications
10601 * @return array liste des instruction_notification liés à l'instruction
10602 */
10603 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10604 $whereTypeTache = '';
10605 $sqlTaskNull = 'INNER';
10606 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10607 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10608 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10609 // paramétrage
10610 if(is_bool($nonLieTache) && $nonLieTache === true) {
10611 $sqlTaskNull = 'LEFT';
10612 }
10613 if ($typeNotification != null) {
10614 if (is_array($typeNotification)) {
10615 $whereTypeTache = sprintf(
10616 'AND (task.type IN (%1$s))',
10617 "'".implode("', '", $typeNotification)."'"
10618 );
10619 } else {
10620 $whereTypeTache = sprintf(
10621 'AND (task.type = \'%1$s\')',
10622 $typeNotification
10623 );
10624 }
10625 }
10626 $listeInstrNotif = array();
10627 $qres = $this->f->get_all_results_from_db_query(
10628 sprintf('
10629 SELECT
10630 instruction_notification.instruction_notification
10631 FROM
10632 %1$sinstruction_notification
10633 %4$s JOIN %1$stask
10634 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10635 %3$s
10636 WHERE
10637 instruction = %2$s',
10638 DB_PREFIXE,
10639 intval($id_instruction),
10640 $whereTypeTache,
10641 $sqlTaskNull
10642 ),
10643 array(
10644 "origin" => __METHOD__
10645 )
10646 );
10647 foreach ($qres['result'] as $row) {
10648 $listeInstrNotif[] = $row['instruction_notification'];
10649 }
10650 return $listeInstrNotif;
10651 }
10652
10653 /**
10654 * Crée une clé d'accès unique permettant à un utilisateur
10655 * anonyme de récupérer le document.
10656 *
10657 * @return string clé d'accès du document
10658 */
10659 protected function getCleAccesDocument() {
10660 // Initialisation d'un tableau
10661 $number_list = array();
10662
10663 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10664 for ($i = 0; $i < 4; $i++) {
10665 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10666 }
10667
10668 // Transformation en chaîne tout en séparant les nombres par un "-"
10669 $result = implode('-', $number_list);
10670
10671 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10672 if ($this->getUidDocumentInstructionWithKey($result) != null) {
10673 return $this->getCleAccesDocument();
10674 }
10675
10676 //
10677 return $result;
10678 }
10679
10680 /**
10681 * Récupère une clé et renvoie l'uid du document liée à cette
10682 * clé. Si la clé n'existe pas renvoie null.
10683 *
10684 * @param string $cleGen clé dont on cherche l'instruction
10685 * @return integer|null
10686 */
10687 protected function getUidDocumentInstructionWithKey($cleGen) {
10688 $qres = $this->f->get_one_result_from_db_query(
10689 sprintf(
10690 'SELECT
10691 instruction.om_fichier_instruction
10692 FROM
10693 %1$sinstruction_notification_document
10694 LEFT JOIN %1$sinstruction
10695 ON instruction_notification_document.instruction = instruction.instruction
10696 WHERE
10697 instruction_notification_document.cle = \'%2$s\'',
10698 DB_PREFIXE,
10699 $this->f->db->escapeSimple($cleGen)
10700 ),
10701 array(
10702 "origin" => __METHOD__,
10703 )
10704 );
10705
10706 return $qres['result'];
10707 }
10708
10709 /**
10710 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10711 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10712 *
10713 * @param string $cleGen
10714 * @return instruction_notification
10715 */
10716 protected function getInstanceNotificationWithKey($key) {
10717 $qres = $this->f->get_one_result_from_db_query(
10718 sprintf(
10719 'SELECT
10720 instruction_notification
10721 FROM
10722 %1$sinstruction_notification_document
10723 WHERE
10724 cle = \'%2$s\'',
10725 DB_PREFIXE,
10726 $this->f->db->escapeSimple($key)
10727 ),
10728 array(
10729 "origin" => __METHOD__,
10730 )
10731 );
10732
10733 // Récupération de l'instance de notification
10734 $instNotif = $this->f->get_inst__om_dbform(array(
10735 "obj" => "instruction_notification",
10736 "idx" => $qres['result'],
10737 ));
10738 return $instNotif;
10739 }
10740
10741
10742 /**
10743 * Affiche la page de téléchargement du document de la notification.
10744 *
10745 * @param boolean $content_only Affiche le contenu seulement.
10746 *
10747 * @return void
10748 */
10749 public function view_telecharger_document_anonym() {
10750 // Par défaut on considère qu'on va afficher le formulaire
10751 $idx = 0;
10752 // Flag d'erreur
10753 $error = false;
10754 // Message d'erreur
10755 $message = '';
10756
10757 // Paramètres GET : récupération de la clé d'accès
10758 $cle_acces_document = $this->f->get_submitted_get_value('key');
10759 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10760 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10761 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10762 if ($uidFichier != null) {
10763 // Récupération du document
10764 $file = $this->f->storage->get($uidFichier);
10765
10766 // Headers
10767 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10768 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10769 header("Content-Type: ".$file['metadata']['mimetype']);
10770 header("Accept-Ranges: bytes");
10771 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10772 // Affichage du document
10773 echo $file['file_content'];
10774
10775 // Récupération de la date de premier accès et maj du suivi uniquement
10776 // si la date de 1er accès n'a pas encore été remplis
10777 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10778 if ($inst_notif->getVal('date_premier_acces') == null ||
10779 $inst_notif->getVal('date_premier_acces') == '') {
10780 $notif_val = array();
10781 foreach ($inst_notif->champs as $champ) {
10782 $notif_val[$champ] = $inst_notif->getVal($champ);
10783 }
10784 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10785 $notif_val['statut'] = 'vu';
10786 $notif_val['commentaire'] = 'Le document a été vu';
10787 $suivi_notif = $inst_notif->modifier($notif_val);
10788 }
10789
10790 } else {
10791 // Page vide 404
10792 printf('Ressource inexistante');
10793 header('HTTP/1.0 404 Not Found');
10794 }
10795 }
10796
10797 /**
10798 * Récupère le titre du document envoyé au parapheur
10799 */
10800 protected function getDocumentTitre($champ = null) {
10801 $title = $this->getTitle();
10802 $dossier = $this->getDossier();
10803 return $dossier.' '.$title;
10804 }
10805
10806 /**
10807 * Compose le nom du document à transmettre au parapheur.
10808 * Le nom ets composé de cette manière :
10809 * instruction_xxx_libelle_de_la_lettre_type_associee
10810 * ou xxx correspond au numéro de l'instruction
10811 */
10812 protected function getDocumentLibelle() {
10813 // Récupère le champ instruction
10814 $instruction = $this->getVal("instruction");
10815
10816 // Requête sql servant à récupérer le titre du document
10817 // TO_CHAR() introduit un espace avant l'affichage du nombre
10818 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10819 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10820 $documentLibelle = $this->f->get_one_result_from_db_query(
10821 sprintf(
10822 'SELECT
10823 CONCAT(
10824 \'instruction\',
10825 TO_CHAR(instruction.instruction, \'000\'),
10826 \'_\',
10827 LOWER(om_lettretype.libelle)
10828 ) AS nom_fichier
10829 FROM
10830 %1$sinstruction
10831 LEFT JOIN %1$som_lettretype
10832 ON om_lettretype.id = instruction.lettretype
10833 WHERE
10834 instruction = %2$d',
10835 DB_PREFIXE,
10836 intval($instruction)
10837 ),
10838 array(
10839 "origin" => __METHOD__,
10840 )
10841 );
10842
10843 $documentLibelle = $documentLibelle['result'];
10844
10845 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10846 // caractères spéciaux en '_'
10847 // La méthode normalize_string est utilisé pour gérer les accents
10848 $documentLibelle = $this->f->normalize_string($documentLibelle);
10849 // TODO : comparer cette liste et celle de la méthode normalize_string
10850 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10851 // liste
10852 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10853 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10854 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10855 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10856 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10857 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10858 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10859 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10860 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10861 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10862 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10863 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10864 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10865 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10866 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10867 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10868 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10869 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10870 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10871 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10872 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10873 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10874 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10875 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10876 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10877 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10878 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10879 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10880 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10881 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10882 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10883 );
10884
10885 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10886 }
10887
10888 /**
10889 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10890 * l'overlay de notification des demandeurs.
10891 */
10892 function getSubFormTitle($ent) {
10893 $actionSansPath = array('411', '420', '430');
10894 if (in_array($this->getParameter('maj'), $actionSansPath)) {
10895 return '';
10896 }
10897 return parent::getSubFormTitle($ent);
10898 }
10899
10900 /**
10901 * Traitement de la notification automatique des tiers consulté.
10902 *
10903 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10904 * récupérées ajoute une notification et une tâche de notification par mail.
10905 * La création de la tâche de notification par mail déclenchera l'envoi du mail
10906 * et la mise à jour du suivi.
10907 *
10908 * Les tiers notifiables sont ceux :
10909 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10910 * - ayant une habilitation dont le type est listé dans les paramètres de
10911 * notification de l’événement,
10912 * - intervenant sur la commune ou le département du dossier
10913 * - ayant au moins une adresse mail valide
10914 *
10915 * @param evenement instance de l'événement associée à l'instruction
10916 * @param dossier instance du dossier de l'instruction
10917 * @return boolean indique si le traitement à réussi
10918 */
10919 protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10920 // Récupération de l'identifiant plat'au du service consultant
10921 $consultationEntrante = $dossier->get_inst_consultation_entrante();
10922 // Récupération de la liste des types d'habilitations autorisées pour
10923 // cette notification
10924 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10925 // Récupération du département et de la commune du dossier
10926 $commune = $dossier->getVal('commune');
10927 // Le département est récupéré à partir de la commune du dossier donc si la
10928 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10929 $idDepartement = null;
10930 if (! empty($commune)) {
10931 $departement = $dossier->get_inst_departement_dossier();
10932 $idDepartement = $departement->getVal($departement->clePrimaire);
10933 }
10934 // Récupération des courriels des tiers notifiables
10935 $tiersANotifier = $this->get_courriels_tiers_notifiable(
10936 $typesHabilitationsNotifiable,
10937 $consultationEntrante->getVal('service_consultant_id'),
10938 $commune,
10939 $idDepartement
10940 );
10941 // Traitement de chacune des listes de diffusion pour extraire les
10942 // courriels, vérifier la validité des courriels et envoyer la
10943 // notification
10944 $notificationSend = false;
10945 if (empty($tiersANotifier)) {
10946 $this->addToLog(
10947 sprintf(
10948 '%s() : %s %s : %s',
10949 __METHOD__,
10950 __("La récupération des tiers à échoué."),
10951 __('Paramétrage'),
10952 var_export(
10953 array(
10954 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10955 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10956 'id_commune' => $commune,
10957 'id_departement' => $idDepartement
10958 ),
10959 true
10960 )
10961 ),
10962 DEBUG_MODE
10963 );
10964 return false;
10965 }
10966 foreach($tiersANotifier as $tierANotifier) {
10967 // Découpe la liste de diffusion pour stocker les adresses mails
10968 // des tiers dans un tableau
10969 $courriels =
10970 array_filter(
10971 array_map(
10972 'trim',
10973 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10974
10975 foreach ($courriels as $courriel) {
10976 // Pour chaque adresse mail vérifie si l'adresse est valide
10977 if (! $this->f->checkValidEmailAddress($courriel)) {
10978 continue;
10979 }
10980 $destinataire = array(
10981 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10982 'courriel' => $courriel
10983 );
10984 // Si l'adresse est valide ajoute une nouvelle notification
10985 // et une tâche d'envoi de mails
10986 $idNotif = $this->ajouter_notification(
10987 $this->getVal($this->clePrimaire),
10988 $this->f->get_connected_user_login_name(),
10989 $destinataire,
10990 $this->get_dossier_instruction_om_collectivite(),
10991 array(),
10992 true
10993 );
10994 if ($idNotif === false) {
10995 $this->addToLog(
10996 __METHOD__.
10997 __("L'ajout de la notification a échoué."),
10998 DEBUG_MODE
10999 );
11000 return false;
11001 }
11002 // Création de la tache en lui donnant l'id de la notification
11003 $notification_by_task = $this->notification_by_task(
11004 $idNotif,
11005 $dossier->getVal('dossier'),
11006 'mail',
11007 'notification_tiers_consulte'
11008 );
11009 if ($notification_by_task === false) {
11010 $this->addToLog(
11011 __METHOD__.
11012 __("L'ajout de la tâche de notification a échoué."),
11013 DEBUG_MODE
11014 );
11015 $this->addToMessage(
11016 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
11017 );
11018 return false;
11019 }
11020 $notificationSend = true;
11021 }
11022 }
11023 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
11024 // valide, affiche un message dans les logs pour avoir un suivi.
11025 if (! $notificationSend) {
11026 $this->addToLog(
11027 sprintf(
11028 '%s %s : %s %s : %s',
11029 __METHOD__,
11030 __("Il n'y a pas de tiers notifiable pour l'instruction"),
11031 $evenement->getVal('libelle'),
11032 __("du dossier"),
11033 $this->getVal('dossier')
11034 ),
11035 DEBUG_MODE
11036 );
11037 }
11038 return true;
11039 }
11040
11041 /**
11042 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
11043 * respectant les conditions suvantes :
11044 * - le tiers consulté dois accepté les notifications
11045 * - la liste de diffusion ne dois pas être vide
11046 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
11047 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
11048 * du tiers
11049 * - le type d'habilitation des tiers dois appartenir à la liste
11050 * fournie en paramètre
11051 * - le tiers dois être associé à la commune ou au département passé
11052 * en paramètre
11053 *
11054 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
11055 * pouvant être notifiée
11056 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
11057 * @param integer $commune identifiant de la commune du dossier
11058 * @param integer $departement identifiant du département du dossier
11059 *
11060 * @return array listes de diffusion des tiers notifiable
11061 */
11062 protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
11063 // Si paramètre non renseigné alors ne renvoie rien
11064 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
11065 return false;
11066 }
11067 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
11068 $filtreServiceConsulteDI = '';
11069 if (! empty($idPlatau)) {
11070 $filtreServiceConsulteDI = sprintf(
11071 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
11072 -- en charge du dossier
11073 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
11074 OR tiers_consulte.uid_platau_acteur IS NULL)",
11075 $this->f->db->escapeSimple($idPlatau)
11076 );
11077 }
11078 $rst = $this->f->get_all_results_from_db_query(
11079 sprintf(
11080 'SELECT
11081 -- Tiers notifiables lié à la commune du dossier
11082 tiers_consulte.liste_diffusion,
11083 tiers_consulte.libelle
11084 FROM
11085 %1$shabilitation_tiers_consulte
11086 LEFT JOIN %1$stiers_consulte
11087 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11088 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
11089 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
11090 -- Conservation uniquement des tiers acteur de dossiers
11091 JOIN %1$slien_dossier_tiers
11092 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11093 WHERE
11094 tiers_consulte.accepte_notification_email IS TRUE
11095 AND tiers_consulte.liste_diffusion IS NOT NULL
11096 %3$s
11097 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11098 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11099 -- Filtre sur les tiers acteur du dossier
11100 AND lien_dossier_tiers.dossier = \'%6$s\'
11101 UNION
11102 SELECT
11103 -- Tiers notifiables lié au département du dossier
11104 tiers_consulte.liste_diffusion,
11105 tiers_consulte.libelle
11106 FROM
11107 %1$shabilitation_tiers_consulte
11108 LEFT JOIN %1$stiers_consulte
11109 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11110 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11111 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11112 -- Conservation uniquement des tiers acteur de dossiers
11113 JOIN %1$slien_dossier_tiers
11114 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11115 WHERE
11116 tiers_consulte.accepte_notification_email IS TRUE
11117 AND tiers_consulte.liste_diffusion IS NOT NULL
11118 %3$s
11119 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11120 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11121 -- Filtre sur les tiers acteur du dossier
11122 AND lien_dossier_tiers.dossier = \'%6$s\'',
11123 DB_PREFIXE,
11124 implode(', ', $typesHabilitations),
11125 $filtreServiceConsulteDI,
11126 intval($commune),
11127 intval($departement),
11128 $this->f->db->escapeSimple($this->getVal('dossier'))
11129 ),
11130 array(
11131 "origin" => __METHOD__
11132 )
11133 );
11134 // Faire un order by sur un union ne fonctionne pas. A la place
11135 // c'est le tableau des résultats qui est ordonné.
11136 usort($rst['result'], function($a, $b) {
11137 return strcmp($a['libelle'], $b['libelle']);
11138 });
11139 return $rst['result'];
11140 }
11141 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26