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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 13137 - (show annotations)
Thu Oct 27 20:34:03 2022 UTC (2 years, 1 month ago) by softime
File size: 457377 byte(s)
* Fusion de la branche d'intégration 5.14.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 ),
191 );
192
193 // ACTION - 115 - Modification d'un document généré par une instruction
194 // Permet à un instructeur de modifier un document généré par une instruction
195 $this->class_actions[115] = array(
196 "identifier" => "modale_selection_document_signe",
197 "portlet" => array(
198 "type" => "action-self",
199 "libelle" => _("Remplacer par le document signé"),
200 "order" => 115,
201 "class" => "selection-document-signé",
202 ),
203 "view" => "view_modale_selection_document_signe",
204 "permission_suffix" => "selection_document_signe",
205 "condition" => array(
206 "is_finalized",
207 "is_not_date_retour_signature_set",
208 ),
209 );
210
211 // ACTION - 120 - edition
212 // Affiche l'édition
213 $this->class_actions[120] = array(
214 "identifier" => "edition",
215 "portlet" => array(
216 "type" => "action-blank",
217 "libelle" => _("Edition"),
218 "order" => 100,
219 "class" => "pdf-16",
220 ),
221 "view" => "view_edition",
222 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
223 "permission_suffix" => "om_fichier_instruction_telecharger",
224 );
225
226 // ACTION - 125 - modifier_suivi
227 // Suivi des dates
228 $this->class_actions[125] = array(
229 "identifier" => "modifier_suivi",
230 "portlet" => array(
231 "type" => "action-self",
232 "libelle" => _("Suivi des dates"),
233 "order" => 125,
234 "class" => "suivi-dates-16",
235 ),
236 "crud" => "update",
237 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
238 "permission_suffix" => "modification_dates",
239 );
240
241 // ACTION - 130 - bible
242 // Affiche la bible
243 $this->class_actions[130] = array(
244 "identifier" => "bible",
245 "view" => "view_bible",
246 "permission_suffix" => "modifier",
247 );
248
249 // ACTION - 140 - bible_auto
250 // Active la bible automatique
251 $this->class_actions[140] = array(
252 "identifier" => "bible_auto",
253 "view" => "view_bible_auto",
254 "permission_suffix" => "modifier",
255 );
256
257 // ACTION - 150 - suivi_bordereaux
258 // Imprimer un bordereau d'envoi
259 $this->class_actions[150] = array(
260 "identifier" => "suivi_bordereaux",
261 "view" => "view_suivi_bordereaux",
262 "permission_suffix" => "consulter",
263 );
264
265 // ACTION - 160 - suivi_envoi_lettre_rar
266 // Imprimer un bordereau d'envoi
267 $this->class_actions[160] = array(
268 "identifier" => "suivi_envoi_lettre_rar",
269 "view" => "view_suivi_envoi_lettre_rar",
270 "permission_suffix" => "consulter",
271 );
272
273 // ACTION - 170 - suivi_mise_a_jour_des_dates
274 // Mettre à jour les dates de l'instruction
275 $this->class_actions[170] = array(
276 "identifier" => "suivi_mise_a_jour_des_dates",
277 "view" => "view_suivi_mise_a_jour_des_dates",
278 "permission_suffix" => "consulter",
279 );
280
281 // ACTION - 175 - modifier_by_notification_task
282 // Action à utiliser lors de la mise à jour des instructions par notification
283 $this->class_actions[175] = array(
284 "identifier" => "modifier_by_notification_task",
285 "view" => "formulaire",
286 "permission_suffix" => "modifier",
287 "crud" => "update",
288 );
289
290 // ACTION - 180 - pdf_lettre_rar
291 // Génère PDF sur bordereaux de lettres AR
292 $this->class_actions[180] = array(
293 "identifier" => "pdf_lettre_rar",
294 "view" => "view_pdf_lettre_rar",
295 "permission_suffix" => "consulter",
296 );
297
298 // ACTION - 190 - bordereau_envoi_maire
299 // Formulaire pour générer le bordereau d'envoi au maire
300 // Met à jour la date d'envoi à signature du maire
301 $this->class_actions[190] = array(
302 "identifier" => "bordereau_envoi_maire",
303 "view" => "view_bordereau_envoi_maire",
304 "permission_suffix" => "bordereau_envoi_maire",
305 );
306
307 // ACTION - 200 - generate_bordereau_envoi_maire
308 // Génère PDF bordereau d'envoi au maire
309 $this->class_actions[200] = array(
310 "identifier" => "generate_bordereau_envoi_maire",
311 "view" => "view_generate_bordereau_envoi_maire",
312 "permission_suffix" => "bordereau_envoi_maire",
313 );
314
315 // ACTION - 210 - notifier_commune
316 // Notifie la commune par mail d'un évément d'instruction finalisé
317 $this->class_actions[210] = array(
318 "identifier" => "notifier_commune",
319 "portlet" => array(
320 "type" => "action-direct-with-confirmation",
321 "libelle" => _("Notifier la commune par courriel"),
322 "order" => 210,
323 "class" => "notifier_commune-16",
324 ),
325 "view" => "formulaire",
326 "method" => "notifier_commune",
327 "permission_suffix" => "notifier_commune",
328 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
329 );
330
331 // ACTION - 220 - generate_suivi_bordereaux
332 // GénÚre PDF bordereaux
333 $this->class_actions[220] = array(
334 "identifier" => "generate_suivi_bordereaux",
335 "view" => "view_generate_suivi_bordereaux",
336 "permission_suffix" => "consulter",
337 );
338
339 // ACTION - 777 - pdf_temp
340 // Crée un PDF temporaire et affiche son contenu en base64
341 $this->class_actions[777] = array(
342 "identifier" => "pdf_temp",
343 "view" => "view_pdf_temp",
344 "permission_suffix" => "modifier",
345 "condition" => array("can_user_access_dossier_contexte_modification"),
346 );
347
348 // ACTION - 701
349 $this->class_actions[701] = array(
350 "identifier" => "enable-edition-integrale",
351 "portlet" => array(
352 "type" => "action-direct-with-confirmation",
353 "libelle" => _("Rédaction libre"),
354 "order" => 50,
355 "class" => "redac-libre-16",
356 ),
357 "view" => "formulaire",
358 "method" => "enable_edition_integrale",
359 "permission_suffix" => "modifier",
360 "condition" => array(
361 "is_editable",
362 "is_finalizable_without_bypass",
363 "can_user_access_dossier_contexte_modification",
364 "is_edition_integrale_not_enabled",
365 "is_option_redaction_libre_enabled",
366 "has_an_edition",
367 ),
368 );
369 // ACTION - 702
370 $this->class_actions[702] = array(
371 "identifier" => "disable-edition-integrale",
372 "portlet" => array(
373 "type" => "action-direct-with-confirmation",
374 "libelle" => _("Rédaction par compléments"),
375 "order" => 50,
376 "class" => "redac-complement-16",
377 ),
378 "view" => "formulaire",
379 "method" => "disable_edition_integrale",
380 "permission_suffix" => "modifier",
381 "condition" => array(
382 "is_editable",
383 "is_finalizable_without_bypass",
384 "can_user_access_dossier_contexte_modification",
385 "is_edition_integrale_enabled",
386 "is_option_redaction_libre_enabled",
387 "has_an_edition",
388 ),
389 );
390 // ACTION - 300 - evenement_has_an_edition_json
391 //
392 $this->class_actions[300] = array(
393 "identifier" => "evenement_has_an_edition_json",
394 "view" => "view_evenement_has_an_edition_json",
395 "permission_suffix" => "consulter",
396 );
397
398 // ACTION - 301 - evenement_has_a_commentaire
399 //
400 $this->class_actions[301] = array(
401 "identifier" => "evenement_has_a_commentaire_json",
402 "view" => "view_evenement_has_a_commentaire_json",
403 "permission_suffix" => "consulter",
404 );
405
406 // ACTION - 400 - Envoyer en signature
407 // Cet évenement permet d'envoyer le document au parapheur pour signature
408 $this->class_actions[400] = array(
409 "identifier" => "envoyer_a_signature",
410 "portlet" => array(
411 "libelle" => _("Envoyer à signature"),
412 "type" => "action-direct-with-confirmation",
413 "class" => "envoyer_a_signature-16",
414 ),
415 "view" => "formulaire",
416 "method" => "envoyer_a_signature_sans_relecture",
417 "condition" => array(
418 "can_be_signed",
419 ),
420 "permission_suffix" => "envoyer_a_signature",
421 );
422
423 // ACTION - 402 - Envoyer en signature avec relecture
424 // Cet évenement permet d'envoyer le document au parapheur pour signature
425 $this->class_actions[402] = array(
426 "identifier" => "envoyer_a_signature_relecture",
427 "portlet" => array(
428 "libelle" => __("Envoyer à signature avec relecture"),
429 "type" => "action-direct-with-confirmation",
430 "class" => "envoyer_a_signature-16",
431 ),
432 "view" => "formulaire",
433 "method" => "envoyer_a_signature_avec_relecture",
434 "condition" => array(
435 "can_be_signed",
436 "is_parapheur_relecture_parameter_enabled"
437 ),
438 "permission_suffix" => "envoyer_a_signature",
439 );
440
441 // ACTION - 404 - Annuler l'envoi en signature
442 // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
443 $this->class_actions[404] = array(
444 "identifier" => "annuler_envoi_signature",
445 "portlet" => array(
446 "libelle" => __("Annuler l'envoi en signature"),
447 "type" => "action-direct-with-confirmation",
448 "class" => "annuler_envoi_signature-16",
449 ),
450 "view" => "formulaire",
451 "method" => "annuler_envoi_en_signature",
452 "condition" => array(
453 "is_sent_for_signature",
454 "is_parapheur_annulation_parameter_enabled"
455 ),
456 "permission_suffix" => "envoyer_a_signature",
457 );
458
459 //
460 $this->class_actions[401] = array(
461 "identifier" => "preview_edition",
462 "view" => "formulaire",
463 "permission_suffix" => "tab",
464 );
465
466 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
467 $this->class_actions[410] = array(
468 "identifier" => "overlay_notification_manuelle",
469 "portlet" => array(
470 "libelle" => __("Notifier les pétitionnaires"),
471 "type" => "action-self",
472 "class" => "notifier_commune-16",
473 ),
474 "condition" => array(
475 "is_notifiable_by_task_manual",
476 "is_not_portail_notification_sans_annexe"
477 ),
478 "view" => "view_overlay_notification_manuelle",
479 "permission_suffix" => "modifier",
480 );
481
482 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
483 $this->class_actions[411] = array(
484 "identifier" => "notification_manuelle_portal",
485 "portlet" => array(
486 "libelle" => __("Notifier les pétitionnaires"),
487 "type" => "action-direct-with-confirmation",
488 "class" => "notifier_commune-16",
489 ),
490 "condition" => array(
491 "is_notifiable_by_task_manual",
492 "is_portail_notification_sans_annexe"
493 ),
494 "method" => "notifier_demandeur_principal",
495 "permission_suffix" => "modifier",
496 );
497
498 // ACTION - 420 - Notifier les services consultés (mail)
499 $this->class_actions[420] = array(
500 "identifier" => "overlay_notification_service_consulte",
501 "portlet" => array(
502 "libelle" => __("Notifier les services consultés"),
503 "type" => "action-self",
504 "class" => "notifier_commune-16",
505 ),
506 "condition" => array(
507 "is_service_notifiable"
508 ),
509 "view" => "view_overlay_notification_service_consulte",
510 "permission_suffix" => "tab",
511 );
512
513 // ACTION - 430 - Notifier les tiers consultés (mail)
514 $this->class_actions[430] = array(
515 "identifier" => "overlay_notification_tiers_consulte",
516 "portlet" => array(
517 "libelle" => __("Notifier les tiers consultés"),
518 "type" => "action-self",
519 "class" => "notifier_commune-16",
520 ),
521 "condition" => array(
522 "is_tiers_notifiable"
523 ),
524 "view" => "view_overlay_notification_tiers_consulte",
525 "permission_suffix" => "tab",
526 );
527
528 //
529 $this->class_actions[403] = array(
530 "identifier" => "envoyer_au_controle_de_legalite",
531 "portlet" => array(
532 "libelle" => __("Envoyer au contrôle de légalité"),
533 "type" => "action-direct-with-confirmation",
534 "class" => "envoyer_au_controle_de_legalite-16",
535 ),
536 "view" => "formulaire",
537 "method" => "envoyer_au_controle_de_legalite",
538 "condition" => array(
539 "can_be_sended_to_cl"
540 ),
541 "permission_suffix" => "envoyer_au_controle_de_legalite",
542 );
543
544 //
545 $this->class_actions[998] = array(
546 "identifier" => "json_data",
547 "view" => "view_json_data",
548 "permission_suffix" => "consulter",
549 );
550 }
551
552 /**
553 * Clause select pour la requête de sélection des données de l'enregistrement.
554 *
555 * @return array
556 */
557 function get_var_sql_forminc__champs() {
558 return array(
559 "instruction",
560 "destinataire",
561 "instruction.evenement",
562 "instruction.commentaire",
563 "date_evenement",
564 "instruction.lettretype",
565 "signataire_arrete",
566 "flag_edition_integrale",
567 "om_final_instruction_utilisateur",
568 "date_finalisation_courrier",
569 "date_envoi_signature",
570 "date_envoi_rar",
571 "date_envoi_controle_legalite",
572
573 "date_retour_signature",
574 "date_retour_rar",
575 "date_retour_controle_legalite",
576
577 "numero_arrete",
578
579 "complement_om_html",
580 "'' as bible_auto",
581 "'' as bible",
582 "complement2_om_html",
583 "'' as bible2",
584 "complement3_om_html",
585 "'' as bible3",
586 "complement4_om_html",
587 "'' as bible4",
588
589 "titre_om_htmletat",
590 "corps_om_htmletatex",
591
592 "'' as btn_preview",
593 "'' as btn_redaction",
594
595 "'' as btn_refresh",
596 "'' as live_preview",
597
598 "dossier",
599 "instruction.action",
600 "instruction.delai",
601 "instruction.etat",
602 "instruction.autorite_competente",
603 "instruction.accord_tacite",
604 "instruction.delai_notification",
605 "instruction.avis_decision",
606 "archive_delai",
607 "archive_accord_tacite",
608 "archive_etat",
609 "archive_avis",
610 "archive_date_complet",
611 "archive_date_rejet",
612 "archive_date_limite",
613 "archive_date_notification_delai",
614 "archive_date_decision",
615 "archive_date_validite",
616 "archive_date_achevement",
617 "archive_date_conformite",
618 "archive_date_chantier",
619 "archive_date_dernier_depot",
620 "date_depot",
621 "date_depot_mairie",
622 "complement5_om_html",
623 "'' as bible5",
624 "complement6_om_html",
625 "'' as bible6",
626 "complement7_om_html",
627 "'' as bible7",
628 "complement8_om_html",
629 "'' as bible8",
630 "complement9_om_html",
631 "'' as bible9",
632 "complement10_om_html",
633 "'' as bible10",
634 "complement11_om_html",
635 "'' as bible11",
636 "complement12_om_html",
637 "complement13_om_html",
638 "complement14_om_html",
639 "complement15_om_html",
640 "archive_incompletude",
641 "archive_incomplet_notifie",
642 "archive_evenement_suivant_tacite",
643 "archive_evenement_suivant_tacite_incompletude",
644 "archive_etat_pendant_incompletude",
645 "archive_date_limite_incompletude",
646 "archive_delai_incompletude",
647 "archive_autorite_competente",
648 "code_barres",
649 "om_fichier_instruction",
650 "om_final_instruction",
651 "om_fichier_instruction_dossier_final",
652 "document_numerise",
653 "duree_validite_parametrage",
654 "duree_validite",
655 "created_by_commune",
656 "archive_date_cloture_instruction",
657 "archive_date_premiere_visite",
658 "archive_date_derniere_visite",
659 "archive_date_contradictoire",
660 "archive_date_retour_contradictoire",
661 "archive_date_ait",
662 "archive_date_transmission_parquet",
663 "archive_dossier_instruction_type",
664 "archive_date_affichage",
665 "pec_metier",
666 "archive_pec_metier",
667 "archive_a_qualifier",
668 "id_parapheur_signature",
669 "statut_signature",
670 "commentaire_signature",
671 "historique_signature",
672 "'' as suivi_notification",
673 "'' as suivi_notification_service",
674 "'' as suivi_notification_tiers",
675 "'' as suivi_notification_commune",
676
677 "'' as preview_edition",
678 "envoye_cl_platau",
679 "'' as log_instruction"
680 );
681 }
682
683 /**
684 * CONDITION - is_edition_integrale_enabled
685 *
686 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
687 *
688 * @return boolean
689 */
690 function is_edition_integrale_enabled() {
691 if ($this->getVal("flag_edition_integrale") == 't') {
692 return true;
693 }
694 return false;
695 }
696
697 /**
698 * CONDITION - is_edition_integrale_not_enabled
699 *
700 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
701 *
702 * @return boolean
703 */
704 function is_edition_integrale_not_enabled() {
705 return !$this->is_edition_integrale_enabled();
706 }
707
708 /**
709 * CONDITION - is_option_redaction_libre_enabled
710 *
711 * Vérifie que l'option de rédaction libre est activée.
712 *
713 * @return boolean
714 */
715 function is_option_redaction_libre_enabled() {
716 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
717 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
718 }
719
720 /**
721 * CONDITION - is_option_parapheur_relecture_enabled
722 *
723 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
724 *
725 * @return boolean
726 */
727 function is_parapheur_relecture_parameter_enabled() {
728 //Instanciation de la classe electronicsignature
729 $inst_es = $this->get_electronicsignature_instance();
730 if ($inst_es === false) {
731 return false;
732 }
733
734 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
735 return false;
736 }
737
738 return true;
739 }
740
741 /**
742 * CONDITION - is_parapheur_annulation_parameter_enabled
743 *
744 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
745 *
746 * @return boolean
747 */
748 function is_parapheur_annulation_parameter_enabled() {
749 //Instanciation de la classe electronicsignature
750 $inst_es = $this->get_electronicsignature_instance();
751 if ($inst_es === false) {
752 return false;
753 }
754
755 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
756 return false;
757 }
758
759 return true;
760 }
761
762
763 /**
764 * CONDITION - is_sent_for_signature
765 *
766 * Vérifie que l'instruction a été envoyé à signature
767 *
768 * @return boolean
769 */
770 function is_sent_for_signature() {
771 // Si un parapheur a été configuré
772 // et que le champ id_parapheur_signature n'est pas vide
773 // que le status est différent de "canceled" ou "expired"
774 // alors l'évènement a été envoyé en signature
775 if ($this->has_connector_electronicsignature() === true
776 && empty($this->getVal("id_parapheur_signature")) === false
777 && ($this->getVal("statut_signature") != "canceled"
778 && $this->getVal("statut_signature") != "expired"
779 && $this->getVal("statut_signature") != "finished")) {
780 //
781 return true;
782 }
783
784 return false;
785 }
786
787 /**
788 * CONDITION - is_not_sent_for_signature
789 *
790 * Vérifie que l'instruction n'a pas été envoyé à signature
791 *
792 * @return boolean
793 */
794 function is_not_sent_for_signature() {
795 // Contrôle si l'utilisateur possède un bypass
796 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
797 if ($bypass == true) {
798 return true;
799 }
800
801 return !$this->is_sent_for_signature();
802 }
803
804
805 /**
806 * CONDITION - is_signed
807 *
808 * Vérifie que l'instruction a été signé
809 *
810 * @return boolean
811 */
812 function is_signed() {
813 // Si un parapheur a été configuré
814 // et que le champ id_parapheur_signature n'est pas vide
815 // et que le statut est égal à "finished"
816 // alors le document de l'instruciton à été signé
817 if ($this->has_connector_electronicsignature() === true
818 && empty($this->getVal("id_parapheur_signature")) === false
819 && $this->getVal("statut_signature") == "finished") {
820 //
821 return true;
822 }
823
824 return false;
825 }
826
827
828 /**
829 * is_sent_to_cl
830 *
831 * Vérifie que l'instruction a été envoyé au contrôle de légalité
832 *
833 * @return boolean
834 */
835 function is_sent_to_cl() {
836 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
837 if ($this->getVal('envoye_cl_platau') === 't') {
838 //
839 return true;
840 }
841 //
842 return false;
843 }
844
845 /**
846 * CONDITION - is_portail_notification
847 *
848 * Vérifie si la notification est une notification de catégorie portail
849 *
850 * @return boolean
851 */
852 function is_portail_notification_sans_annexe() {
853 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
854 $ev = $this->get_inst_evenement($this->getVal('evenement'));
855 if (($this->f->get_param_option_notification($collectiviteDi) === null ||
856 $this->f->get_param_option_notification($collectiviteDi) === PORTAL)
857 && $ev->getVal('notification') != 'notification_manuelle_annexe'
858 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
859 ) {
860 return true;
861 }
862 return false;
863 }
864
865 /**
866 * CONDITION - is_not_portail_notification
867 *
868 * Vérifie si la notification n'est pas une notification de catégorie portail
869 *
870 * @return boolean
871 */
872 function is_not_portail_notification_sans_annexe() {
873 return (! $this->is_portail_notification_sans_annexe());
874 }
875
876 /**
877 * CONDITION - can_be_signed
878 *
879 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
880 *
881 * @return boolean
882 */
883 function can_be_signed() {
884 // Instanciation de l'objet signataire_arrete
885 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
886 "obj" => "signataire_arrete",
887 "idx" => $this->getVal("signataire_arrete"),
888 ));
889 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
890 // possède une adresse email, on vérifie le champ id_parapheur_signature
891 // S'il est vide l'évènement peut être envoyé en signature
892 // S'il ne l'est pas, alors on vérifie le champ statut_signature
893 // Si la valeur de ce champ est égal à "canceled" ou "expired"
894 // alors l'évènement peut être envoyé en signature
895 if ($this->has_connector_electronicsignature() === true
896 && $this->getVal("om_final_instruction") == 't'
897 && empty($inst_signataire_arrete->getVal('email')) === false) {
898 //
899 if (empty($this->getVal("id_parapheur_signature")) === true
900 || $this->getVal("statut_signature") == "canceled"
901 || $this->getVal("statut_signature") == "expired") {
902 //
903 return true;
904 }
905 }
906
907 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
908 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
909 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
910 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
911 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
912
913 return false;
914 }
915
916 /**
917 * CONDITION - has_connector_electronicsignature
918 *
919 * Vérifie qu'un parapheur est paramétré
920 *
921 * @return boolean
922 */
923 function has_connector_electronicsignature() {
924 $inst_es = $this->get_electronicsignature_instance(false);
925 if ($inst_es === false) {
926 return false;
927 }
928 return true;
929 }
930
931 /**
932 * CONDITION - can_display_parapheur
933 *
934 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
935 *
936 * @return boolean
937 */
938 function can_display_parapheur() {
939 $evenement_id = $this->getVal("evenement");
940 $inst_evenement = $this->get_inst_evenement($evenement_id);
941 if ($this->has_connector_electronicsignature() === true
942 && $inst_evenement->getVal('lettretype') !== ''
943 && $inst_evenement->getVal('lettretype') !== null
944 && (empty($this->getVal("id_parapheur_signature")) === false
945 || empty($this->getVal("historique_signature")) === false)) {
946 //
947 return true;
948 }
949
950 return false;
951 }
952
953 /**
954 * CONDITION - can_display_notification
955 *
956 * Vérifie que le champs "Suivi notification" est affichable
957 *
958 * @return boolean
959 */
960 function can_display_notification_demandeur() {
961 // Le suivi des notification est affiché si l'événement est notifiable
962 // et si des notifications ont été envoyées
963 $evenement_id = $this->getVal("evenement");
964 $inst_evenement = $this->get_inst_evenement($evenement_id);
965 if ($inst_evenement->getVal('notification') != null &&
966 $inst_evenement->getVal('notification') != '') {
967 // Des notifications ont été envoyé si il existe au moins une notification
968 // liées à l'instruction
969 $idsNotifs = $this->get_instruction_notification(
970 $this->getVal($this->clePrimaire),
971 array(
972 'notification_recepisse',
973 'notification_instruction',
974 'notification_decision',
975 ),
976 true
977 );
978 if (isset($idsNotifs) && $idsNotifs !== array()) {
979 return true;
980 }
981 }
982 return false;
983 }
984
985 /**
986 * CONDITION - can_display_notification
987 *
988 * Vérifie que le champs "suivi_notification_service" est affichable
989 *
990 * @return boolean
991 */
992 function can_display_notification_service() {
993 // Le suivi des notification est affiché si l'événement est notifiable
994 // et si des notifications ont été envoyées
995 $evenement_id = $this->getVal("evenement");
996 $inst_evenement = $this->get_inst_evenement($evenement_id);
997 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
998 // Des notifications ont été envoyé si il existe au moins une notification
999 // de type notification_service_consulte liées à l'instruction
1000 $idsNotifs = $this->get_instruction_notification(
1001 $this->getVal($this->clePrimaire),
1002 'notification_service_consulte'
1003 );
1004 if (isset($idsNotifs) && $idsNotifs !== array()) {
1005 return true;
1006 }
1007 }
1008 return false;
1009 }
1010
1011
1012 /**
1013 * CONDITION - can_display_notification_tiers
1014 *
1015 * Vérifie que le champs "suivi_notification_tiers" est affichable
1016 *
1017 * @return boolean
1018 */
1019 function can_display_notification_tiers() {
1020 // Le suivi des notification est affiché si l'événement est notifiable
1021 // et si des notifications ont été envoyées
1022 $evenement_id = $this->getVal("evenement");
1023 $inst_evenement = $this->get_inst_evenement($evenement_id);
1024 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1025 // Des notifications ont été envoyé si il existe au moins une notification
1026 // de type notification_tiers_consulte liées à l'instruction
1027 $idsNotifs = $this->get_instruction_notification(
1028 $this->getVal($this->clePrimaire),
1029 'notification_tiers_consulte'
1030 );
1031 if (isset($idsNotifs) && $idsNotifs !== array()) {
1032 return true;
1033 }
1034 }
1035 return false;
1036 }
1037
1038 /**
1039 * CONDITION - can_display_notification_commune
1040 *
1041 * Vérifie que le champs "suivi_notification_commune" est affichable
1042 *
1043 * @return boolean
1044 */
1045 function can_display_notification_commune() {
1046 // Le suivi des notification si il existe au moins une notification
1047 // de type notification_depot_demat liées à l'instruction
1048 $idsNotifs = $this->get_instruction_notification(
1049 $this->getVal($this->clePrimaire),
1050 array('notification_depot_demat', 'notification_commune')
1051 );
1052 if (isset($idsNotifs) && $idsNotifs !== array()) {
1053 return true;
1054 }
1055 return false;
1056 }
1057
1058 /**
1059 * TREATMENT - disable_edition_integrale.
1060 *
1061 * Cette methode permet de passer la consultation en "lu"
1062 *
1063 * @return boolean true si maj effectué false sinon
1064 */
1065 function disable_edition_integrale() {
1066 // Cette méthode permet d'exécuter une routine en début des méthodes
1067 // dites de TREATMENT.
1068 $this->begin_treatment(__METHOD__);
1069 $this->correct = true;
1070 $valF = array(
1071 "flag_edition_integrale" => false,
1072 "titre_om_htmletat" => null,
1073 "corps_om_htmletatex" => null,
1074 );
1075 $res = $this->f->db->autoExecute(
1076 DB_PREFIXE.$this->table,
1077 $valF,
1078 DB_AUTOQUERY_UPDATE,
1079 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1080 );
1081 if ($this->f->isDatabaseError($res, true)) {
1082 // Appel de la methode de recuperation des erreurs
1083 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1084 $this->correct = false;
1085 // Termine le traitement
1086 return $this->end_treatment(__METHOD__, false);
1087 } else {
1088 $this->addToMessage(_("Rédaction par compléments activé."));
1089 return $this->end_treatment(__METHOD__, true);
1090 }
1091
1092 // Termine le traitement
1093 return $this->end_treatment(__METHOD__, false);
1094 }
1095
1096 /**
1097 * TREATMENT - enable_edition_integrale.
1098 *
1099 * Cette methode permet de passer la consultation en "lu"
1100 *
1101 * @return boolean true si maj effectué false sinon
1102 */
1103 function enable_edition_integrale() {
1104 // Cette méthode permet d'exécuter une routine en début des méthodes
1105 // dites de TREATMENT.
1106 $this->begin_treatment(__METHOD__);
1107 $this->correct = true;
1108
1109 // Récupère la collectivite du dossier d'instruction
1110 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1111 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1112 //
1113 $params = array(
1114 "specific" => array(
1115 "corps" => array(
1116 "mode" => "get",
1117 )
1118 ),
1119 );
1120 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1121 $corps = $result['pdf_output'];
1122 //
1123 $params = array(
1124 "specific" => array(
1125 "titre" => array(
1126 "mode" => "get",
1127 )
1128 ),
1129 );
1130 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1131 $titre = $result['pdf_output'];
1132 //
1133 $valF = array(
1134 "flag_edition_integrale" => true,
1135 "titre_om_htmletat" => $titre,
1136 "corps_om_htmletatex" => $corps,
1137 );
1138 $res = $this->f->db->autoExecute(
1139 DB_PREFIXE.$this->table,
1140 $valF,
1141 DB_AUTOQUERY_UPDATE,
1142 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1143 );
1144 if ($this->f->isDatabaseError($res, true)) {
1145 // Appel de la methode de recuperation des erreurs
1146 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1147 $this->correct = false;
1148 // Termine le traitement
1149 return $this->end_treatment(__METHOD__, false);
1150 } else {
1151 $this->addToMessage(_("Rédaction libre activé."));
1152 return $this->end_treatment(__METHOD__, true);
1153 }
1154
1155 // Termine le traitement
1156 return $this->end_treatment(__METHOD__, false);
1157 }
1158
1159 /**
1160 * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier
1161 */
1162 function getNumDemandeAutorFromDossier($id) {
1163 //
1164 if (!isset($id)) {
1165 return NULL;
1166 }
1167 //
1168 $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";
1169 $sql .= " where dossier='".$id."'";
1170 //
1171 $dossier_autorisation = $this->f->db->getone($sql);
1172 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
1173 $this->f->isDatabaseError($dossier_autorisation);
1174 //
1175 return $dossier_autorisation;
1176 }
1177
1178 // }}}
1179
1180 function setType(&$form, $maj) {
1181 // Récupération du mode de l'action
1182 $crud = $this->get_action_crud($maj);
1183 // Récupère la collectivité du dossier d'instruction
1184 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1185
1186 // Cache tous les champs
1187 foreach ($this->champs as $value) {
1188 $form->setType($value, 'hidden');
1189 }
1190
1191 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1192 if ($this->can_display_parapheur() === true && $maj == 3) {
1193 $form->setType('statut_signature', 'selectstatic');
1194 $form->setType('historique_signature', 'jsontotab');
1195 if ($this->getVal('commentaire_signature') == null) {
1196 $form->setType('commentaire_signature', 'hidden');
1197 } else {
1198 $form->setType('commentaire_signature', 'hiddenstatic');
1199 }
1200 }
1201
1202 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1203 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1204 $form->setType('suivi_notification', 'jsontotab');
1205 }
1206 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1207 if ($maj == 3 && $this->can_display_notification_service() === true) {
1208 $form->setType('suivi_notification_service', 'jsontotab');
1209 }
1210 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1211 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1212 $form->setType('suivi_notification_tiers', 'jsontotab');
1213 }
1214 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1215 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1216 $form->setType('suivi_notification_commune', 'jsontotab');
1217 }
1218
1219 // MODE AJOUTER
1220 if ($this->getParameter('maj') == 0) {
1221 $form->setType('commentaire', 'textareahidden');
1222 // Si l'option est active passage du champ date en lecture seule
1223 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1224 $form->setType("date_evenement", "hiddenstaticdate");
1225 } else {
1226 $form->setType("date_evenement", "date");
1227 }
1228 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1229 $form->setType("evenement", "selecthiddenstatic");
1230 } else {
1231 $form->setType("evenement", "select");
1232 }
1233 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1234 $form->setType("signataire_arrete", "selecthiddenstatic");
1235 } else {
1236 $form->setType("signataire_arrete", "select");
1237 }
1238 if ($this->is_option_redaction_libre_enabled() === true) {
1239 $form->setType("flag_edition_integrale", "select");
1240 }
1241 }
1242
1243 // MODE MODIFIER
1244 if ($this->getParameter('maj') == 1) {
1245 // Si l'option est active passage du champ date en lecture seule
1246 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1247 $form->setType("date_evenement", "hiddenstaticdate");
1248 } else {
1249 $form->setType("date_evenement", "date");
1250 }
1251 $form->setType("evenement", "selecthiddenstatic");
1252 if ($this->has_an_edition() === true) {
1253 $form->setType('lettretype', 'hiddenstatic');
1254 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1255 $form->setType("signataire_arrete", "selecthiddenstatic");
1256 } else {
1257 $form->setType("signataire_arrete", "select");
1258 }
1259 if ($this->getVal("flag_edition_integrale") == "t") {
1260 $form->setType("titre_om_htmletat", "htmlEtat");
1261 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1262 } else {
1263 $form->setType("complement_om_html", "html");
1264 $form->setType("complement2_om_html", "html");
1265 $form->setType("complement3_om_html", "html");
1266 $form->setType("complement4_om_html", "html");
1267 $form->setType('bible_auto', 'httpclick');
1268 $form->setType('bible', 'httpclick');
1269 $form->setType('bible2', 'httpclick');
1270 $form->setType('bible3', 'httpclick');
1271 $form->setType('bible4', 'httpclick');
1272 }
1273 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1274 //
1275 $form->setType('btn_refresh', 'httpclickbutton');
1276 $form->setType('btn_preview', 'httpclickbutton');
1277 $form->setType('btn_redaction', 'httpclickbutton');
1278 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1279 // pour identifiant le champ de prévisualisation et régler sa taille à
1280 // l'affichage du champ. En cas de modification, le selecteur doit également
1281 // être mis à jour
1282 $form->setType('live_preview', 'previsualiser_pdf');
1283 }
1284
1285 // necessaire pour calcul de date en modification
1286 //$form->setType('delai', 'hiddenstatic');
1287 // les administrateurs technique et fonctionnel peuvent
1288 // modifier tous les champs de date
1289 // si l'instruction a déjà été finalisée au moins une fois
1290 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1291 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1292 && $this->getVal("date_finalisation_courrier") != '') {
1293 //
1294 $form->setType('date_envoi_signature', 'date');
1295 $form->setType('date_retour_signature', 'date');
1296 if ($this->is_sent_for_signature() === true
1297 && $this->is_signed() === true) {
1298 //
1299 $form->setType("date_envoi_signature", "datereadonly");
1300 $form->setType("date_retour_signature", "datereadonly");
1301 }
1302 $form->setType('date_envoi_rar', 'date');
1303 $form->setType('date_retour_rar', 'date');
1304 $form->setType('date_envoi_controle_legalite', 'date');
1305 if ($this->is_sent_to_cl() === true) {
1306 $form->setType("date_envoi_controle_legalite", "datedisabled");
1307 }
1308 $form->setType('date_retour_controle_legalite', 'date');
1309 $form->setType('date_finalisation_courrier', 'date');
1310 }
1311 }
1312 }
1313
1314 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1315 if ($this->getParameter('maj') == 3
1316 || $this->getParameter('maj') == 2
1317 || $this->getParameter('maj') == 125
1318 || $this->getParameter('maj') == 410) {
1319 //
1320 $form->setType("date_evenement", "datestatic");
1321 $form->setType("evenement", "selecthiddenstatic");
1322 if ($this->has_an_edition() === true) {
1323 $form->setType('lettretype', 'hiddenstatic');
1324 $form->setType("signataire_arrete", "selecthiddenstatic");
1325 if ($this->getVal("om_final_instruction") == 't') {
1326 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1327 } else {
1328 $form->setType('om_final_instruction_utilisateur', 'hidden');
1329 }
1330 }
1331 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1332 $form->setType('commentaire', 'textareastatic');
1333 }
1334 }
1335
1336 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1337 if ($this->getParameter('maj') == 3
1338 || $this->getParameter('maj') == 2
1339 || $this->getParameter('maj') == 410) {
1340 // Si il n'y a pas de lettre type (edition) associé à l'événement
1341 // les dates de suivi ne sont pas affichée
1342 if ($this->has_an_edition() === true) {
1343 $form->setType('date_envoi_signature', 'datestatic');
1344 $form->setType('date_retour_signature', 'datestatic');
1345 $form->setType('date_envoi_rar', 'datestatic');
1346 $form->setType('date_retour_rar', 'datestatic');
1347 $form->setType('date_envoi_controle_legalite', 'datestatic');
1348 $form->setType('date_retour_controle_legalite', 'datestatic');
1349 $form->setType('date_finalisation_courrier', 'datestatic');
1350 if ($this->getVal("flag_edition_integrale") == "t") {
1351 $form->setType("titre_om_htmletat", "htmlstatic");
1352 $form->setType("corps_om_htmletatex", "htmlstatic");
1353 } else {
1354 $form->setType("complement_om_html", "htmlstatic");
1355 $form->setType("complement2_om_html", "htmlstatic");
1356 $form->setType("complement3_om_html", "htmlstatic");
1357 $form->setType("complement4_om_html", "htmlstatic");
1358 }
1359 }
1360 }
1361
1362 // MODE SUIVI DES DATES 125
1363 if ($this->getParameter('maj') == 125) {
1364 $form->setType("date_evenement", "hiddenstaticdate");
1365 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1366 $form->setType('date_envoi_signature', 'date');
1367 $form->setType('date_retour_signature', 'date');
1368 if ($this->is_sent_for_signature() === true
1369 || $this->is_signed() === true) {
1370 //
1371 $form->setType("date_envoi_signature", "datereadonly");
1372 $form->setType("date_retour_signature", "datereadonly");
1373 }
1374 $form->setType('date_envoi_rar', 'date');
1375 $form->setType('date_retour_rar', 'date');
1376 $form->setType('date_envoi_controle_legalite', 'date');
1377 if ($this->is_sent_to_cl() === true) {
1378 $form->setType("date_envoi_controle_legalite", "datedisabled");
1379 }
1380 $form->setType('date_retour_controle_legalite', 'date');
1381 $form->setType('date_finalisation_courrier', 'date');
1382 }
1383
1384 if ($maj == 401) {
1385 foreach ($this->champs as $champ) {
1386 $form->setType($champ, 'hidden');
1387 }
1388 $form->setType('preview_edition', 'previsualiser');
1389 }
1390
1391 // Si l'instruction a été envoyé au contrôle de légalité et que la
1392 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1393 // l'utilisateur que l'envoi au cl est en cours de traitement.
1394 if ($this->is_sent_to_cl() === true
1395 && empty($this->getVal('date_envoi_controle_legalite'))
1396 && $maj == 3) {
1397 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1398 }
1399 }
1400
1401 function setOnchange(&$form,$maj){
1402 parent::setOnchange($form,$maj);
1403
1404 // MODE AJOUTER
1405 if ($this->getParameter('maj') == 0) {
1406 $form->setOnchange(
1407 "evenement",
1408 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1409 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1410 );
1411 }
1412 }
1413
1414 function evenement_has_an_edition($evenement_id) {
1415 $evenement = $this->get_inst_evenement($evenement_id);
1416 $lettretype = $evenement->getVal('lettretype');
1417 if ($lettretype !== '' && $lettretype !== null) {
1418 return true;
1419 }
1420 return false;
1421 }
1422
1423 function view_evenement_has_an_edition_json() {
1424 $json_return = array(
1425 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1426 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1427 );
1428 echo json_encode($json_return);
1429 }
1430
1431 function evenement_has_a_commentaire($evenement_id) {
1432 $evenement = $this->get_inst_evenement($evenement_id);
1433 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1434 }
1435
1436 function view_evenement_has_a_commentaire_json() {
1437 $json_return = array(
1438 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1439 );
1440 echo json_encode($json_return);
1441 }
1442
1443
1444 /**
1445 * CONDITION - can_be_sended_to_cl
1446 *
1447 * Vérifie que le contrôle de légalité est disponible
1448 *
1449 * @return boolean
1450 */
1451 function can_be_sended_to_cl() {
1452 // Si l'instruction a une édition
1453 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1454 // par Plat'AU
1455 // et que la date de retour signature est renseignée
1456 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1457 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1458 if ($this->has_an_edition() === true) {
1459 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1460 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1461 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1462 && empty($this->getVal('date_retour_signature')) === false
1463 && empty($this->getVal('date_envoi_controle_legalite')) === true
1464 && $this->getVal('envoye_cl_platau') === 'f'
1465 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1466 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1467 //
1468 return true;
1469 }
1470 }
1471 //
1472 return false;
1473 }
1474
1475 /**
1476 *
1477 * @return string
1478 */
1479 function get_var_sql_forminc__sql_signataire_arrete() {
1480 return sprintf(
1481 "SELECT
1482 signataire_arrete.signataire_arrete,
1483 CONCAT_WS(
1484 ' - ',
1485 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1486 signataire_habilitation.libelle,
1487 signataire_arrete.description
1488 )
1489 FROM
1490 %1\$ssignataire_arrete
1491 LEFT JOIN %1\$ssignataire_habilitation
1492 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1493 WHERE
1494 ((signataire_arrete.om_validite_debut IS NULL
1495 AND (signataire_arrete.om_validite_fin IS NULL
1496 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1497 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1498 AND (signataire_arrete.om_validite_fin IS NULL
1499 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1500 ORDER BY
1501 signataire_arrete.prenom,
1502 signataire_arrete.nom",
1503 DB_PREFIXE
1504 );
1505 }
1506
1507 /**
1508 *
1509 * @return string
1510 */
1511 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1512 return sprintf(
1513 "SELECT
1514 signataire_arrete.signataire_arrete,
1515 CONCAT_WS(
1516 ' - ',
1517 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1518 signataire_habilitation.libelle,
1519 signataire_arrete.description
1520 )
1521 FROM
1522 %1\$ssignataire_arrete
1523 LEFT JOIN %1\$ssignataire_habilitation
1524 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1525 WHERE
1526 signataire_arrete.signataire_arrete = <idx>",
1527 DB_PREFIXE
1528 );
1529 }
1530
1531 /**
1532 *
1533 * @return string
1534 */
1535 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1536 return sprintf(
1537 "SELECT
1538 signataire_arrete.signataire_arrete,
1539 CONCAT_WS(
1540 ' - ',
1541 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1542 signataire_habilitation.libelle,
1543 signataire_arrete.description
1544 )
1545 FROM
1546 %1\$ssignataire_arrete
1547 LEFT JOIN %1\$som_collectivite
1548 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1549 LEFT JOIN %1\$ssignataire_habilitation
1550 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1551 WHERE
1552 ((signataire_arrete.om_validite_debut IS NULL
1553 AND (signataire_arrete.om_validite_fin IS NULL
1554 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1555 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1556 AND (signataire_arrete.om_validite_fin IS NULL
1557 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1558 AND (om_collectivite.niveau = '2'
1559 OR signataire_arrete.om_collectivite = <collectivite_di>)
1560 ORDER BY
1561 signataire_arrete.prenom, signataire_arrete.nom",
1562 DB_PREFIXE
1563 );
1564 }
1565
1566 /**
1567 *
1568 * @return string
1569 */
1570 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1571 return sprintf(
1572 "SELECT
1573 signataire_arrete.signataire_arrete,
1574 CONCAT_WS(
1575 ' - ',
1576 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1577 signataire_habilitation.libelle,
1578 signataire_arrete.description
1579 )
1580 FROM
1581 %1\$ssignataire_arrete
1582 LEFT JOIN %1\$ssignataire_habilitation
1583 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1584 WHERE
1585 ((signataire_arrete.om_validite_debut IS NULL
1586 AND (signataire_arrete.om_validite_fin IS NULL
1587 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1588 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1589 AND (signataire_arrete.om_validite_fin IS NULL
1590 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1591 AND signataire_arrete.defaut IS TRUE
1592 ORDER BY
1593 signataire_arrete.prenom, signataire_arrete.nom",
1594 DB_PREFIXE
1595 );
1596 }
1597
1598 /**
1599 *
1600 * @return string
1601 */
1602 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1603 return sprintf(
1604 "SELECT
1605 signataire_arrete.signataire_arrete,
1606 CONCAT_WS(
1607 ' - ',
1608 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1609 signataire_habilitation.libelle,
1610 signataire_arrete.description
1611 )
1612 FROM
1613 %1\$ssignataire_arrete
1614 LEFT JOIN %1\$ssignataire_habilitation
1615 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1616 LEFT JOIN %1\$som_collectivite
1617 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1618 WHERE
1619 ((signataire_arrete.om_validite_debut IS NULL
1620 AND (signataire_arrete.om_validite_fin IS NULL
1621 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1622 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1623 AND (signataire_arrete.om_validite_fin IS NULL
1624 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1625 AND signataire_arrete.defaut IS TRUE
1626 AND (om_collectivite.niveau = '2'
1627 OR signataire_arrete.om_collectivite = <collectivite_di>)
1628 ORDER BY
1629 signataire_arrete.prenom,
1630 signataire_arrete.nom",
1631 DB_PREFIXE
1632 );
1633 }
1634
1635 /**
1636 * SETTER_FORM - setSelect.
1637 *
1638 * @return void
1639 */
1640 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1641 //parent::setSelect($form, $maj);
1642 /**
1643 * On ne surcharge pas la méthode parent car une requête sur la table
1644 * dossier est mauvaise pour les performances, car la requête qui
1645 * concerne evenement est plus complexe que celle générée et car les
1646 * champs action, avis_decision et etat ne sont pas utilisés comme des
1647 * select
1648 */
1649 //// action
1650 //$this->init_select($form, $this->f->db, $maj, null, "action",
1651 // $sql_action, $sql_action_by_id, false);
1652
1653 //// avis_decision
1654 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1655 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1656
1657 //// dossier
1658 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1659 // $sql_dossier, $sql_dossier_by_id, false);
1660
1661 //// etat
1662 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1663 // $sql_etat, $sql_etat_by_id, false);
1664
1665 //// evenement
1666 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1667 // $sql_evenement, $sql_evenement_by_id, false);
1668
1669 // signataire_arrete
1670 // si contexte DI
1671 if ($this->getParameter("retourformulaire") == "dossier"
1672 || $this->f->contexte_dossier_instruction()) {
1673 // on recupère les signataires de la multicollectivité et de celle du DI
1674 $di = $this->f->get_inst__om_dbform(array(
1675 "obj" => "dossier_instruction",
1676 "idx" => $this->getParameter('idxformulaire'),
1677 ));
1678 $sql_signataire_arrete_by_di = str_replace(
1679 '<collectivite_di>',
1680 $di->getVal("om_collectivite"),
1681 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1682 );
1683 $this->init_select(
1684 $form,
1685 $this->f->db,
1686 $maj,
1687 null,
1688 "signataire_arrete",
1689 $sql_signataire_arrete_by_di,
1690 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1691 true
1692 );
1693 } else {
1694 $this->init_select(
1695 $form,
1696 $this->f->db,
1697 $maj,
1698 null,
1699 "signataire_arrete",
1700 $this->get_var_sql_forminc__sql("signataire_arrete"),
1701 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1702 true
1703 );
1704 }
1705
1706 /**
1707 * Gestion du filtre sur les événements de workflow disponibles
1708 * On récupère ici en fonction de l'état du dossier d'instruction en
1709 * cours et du type du dossier d'instruction en cours la liste
1710 * événements disponibles.
1711 */
1712 if ($maj == 0) {
1713 // Récupération des événements par une jointure entre la table dossier
1714 // et la table transition et la table evenement et la table
1715 // lien_dossier_instruction_type_evenement en fonction de l'identifiant
1716 // du dossier d'instruction en cours
1717 $sql = "SELECT
1718 evenement.evenement,
1719 evenement.libelle as lib
1720 FROM ".DB_PREFIXE."dossier
1721 INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
1722 ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
1723 INNER JOIN ".DB_PREFIXE."evenement
1724 ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
1725 INNER JOIN ".DB_PREFIXE."transition
1726 ON evenement.evenement = transition.evenement
1727 AND dossier.etat=transition.etat
1728 WHERE dossier.dossier='".$this->getParameter("idxformulaire")."' ";
1729
1730 // Si changement de décision par instructeur commune
1731 if($this->f->isUserInstructeur() === true
1732 && $this->getDivisionFromDossier($this->getParameter("idxformulaire")) != $_SESSION["division"]
1733 && $this->isInstrCanChangeDecision($this->getParameter("idxformulaire")) === true) {
1734 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
1735 }
1736 $sql .= "ORDER BY evenement.libelle, evenement.action";
1737 $res = $this->f->db->query($sql);
1738 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
1739 $this->f->isDatabaseError($res);
1740 // Remplissage du tableau du select
1741 $contenu = array(
1742 0 => array("",),
1743 1 => array(_('choisir')." "._('evenement'),)
1744 );
1745 while ($row=& $res->fetchRow()) {
1746 $contenu[0][] = $row[0];
1747 $contenu[1][] = $row[1];
1748 }
1749 $form->setSelect("evenement", $contenu);
1750
1751 } else {
1752 $sql = "SELECT
1753 evenement.libelle as lib
1754 FROM ".DB_PREFIXE."evenement
1755 WHERE evenement.evenement=".$this->getVal("evenement")."";
1756 $res = $this->f->db->getone($sql);
1757 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1758 $this->f->isDatabaseError($res);
1759 //
1760 $contenu = array(
1761 0 => array($this->getVal("evenement"),),
1762 1 => array($res,)
1763 );
1764 $form->setSelect("evenement", $contenu);
1765 }
1766
1767 /**
1768 * Gesion des liens vers la bible
1769 */
1770 // lien bible_auto
1771 $contenu = array(_("automatique"));
1772 $form->setSelect("bible_auto",$contenu);
1773 // lien bible1
1774 $contenu = array(_("bible"));
1775 $form->setSelect("bible",$contenu);
1776 // lien bible2
1777 $contenu = array(_("bible"));
1778 $form->setSelect("bible2",$contenu);
1779 // lien bible3
1780 $contenu = array(_("bible"));
1781 $form->setSelect("bible3",$contenu);
1782 // lien bible4
1783 $contenu = array(_("bible"));
1784 $form->setSelect("bible4",$contenu);
1785
1786 if ($maj == 1) {
1787 $base64 = $this->init_pdf_temp();
1788 $form->setSelect('live_preview', array('base64'=>$base64));
1789 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1790 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1791 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1792 }
1793
1794 // Selection du type de rédaction à l'ajout
1795 $content = array(
1796 0 => array('f', 't', ),
1797 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1798 );
1799 $form->setSelect('flag_edition_integrale', $content);
1800
1801 $contenu = array();
1802 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1803 $contenu[0][] = $value;
1804 $contenu[1][] = $this->get_trad_for_statut($value);
1805 }
1806 $form->setSelect('statut_signature', $contenu);
1807
1808
1809 if ($maj == 401) {
1810 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1811 $form->setSelect('preview_edition', array(
1812 'base64' => base64_encode($file['file_content']),
1813 'mimetype' => $file['metadata']['mimetype'],
1814 'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1815 'href' => sprintf(
1816 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1817 $this->getVal($this->clePrimaire)
1818 )
1819 ));
1820 }
1821 }
1822
1823 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1824 //
1825 // Vérifie uniquementla cle secondaire : demande
1826 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1827
1828 $id = $this->getVal($this->clePrimaire);
1829
1830
1831 //Requête de vérification que cet événement d'instruction n'est pas lié
1832 //à la création d'un dossier d'instruction
1833 $sql = "SELECT demande_type.dossier_instruction_type
1834 FROM ".DB_PREFIXE."demande_type
1835 LEFT JOIN ".DB_PREFIXE."demande
1836 ON demande.demande_type = demande_type.demande_type
1837 WHERE demande.instruction_recepisse = ".$id;
1838 $res = $this->f->db->getone($sql);
1839 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1840 $this->f->isDatabaseError($res);
1841
1842 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1843 //création de dossier d'instruction, l'événement d'instruction peut être
1844 //supprimé
1845 if ( $this->correct !== false || $res == null || $res == ""){
1846
1847 // Requête de vérification que cet événement d'instruction est lié
1848 // à une demande
1849 $sql = "SELECT demande
1850 FROM ".DB_PREFIXE."demande
1851 WHERE instruction_recepisse = ".$id;
1852 $res = $this->f->db->getone($sql);
1853 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1854 $this->f->isDatabaseError($res);
1855
1856 //Si c'est un événement d'instruction lié à une demande
1857 if ($res != null || $res != ""){
1858 $demande = $this->f->get_inst__om_dbform(array(
1859 "obj" => "demande",
1860 "idx" => $res,
1861 ));
1862
1863 //On met à jour la demande en supprimant la liaison vers
1864 //l'événement d'instruction
1865 $demande->setParameter("maj", 1);
1866 $valF = array();
1867 foreach($demande->champs as $identifiant => $champ) {
1868 $valF[$champ] = $demande->val[$identifiant];
1869 }
1870 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
1871 $valF['instruction_recepisse']=NULL;
1872 $ret = $demande->modifier($valF);
1873 }
1874
1875 /**
1876 * Vérification que l'élément supprimé est le dernier pour pouvoir
1877 * remodifier les données de manière itérative.
1878 */
1879 // Initialisation
1880 $dernierevenement = "";
1881 // Récupération du dernier élément de la table d'instruction qui
1882 // concerne le dossier en cours
1883 $sql = "SELECT max(instruction)
1884 FROM ".DB_PREFIXE."instruction
1885 WHERE dossier ='".$this->getParameter("idxformulaire")."'";
1886 $dernierevenement = $this->f->db->getone($sql);
1887 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1888 $this->f->isDatabaseError($dernierevenement);
1889 // Si on se trouve effectivement sur le dernier evenement d'instruction
1890 if ($dernierevenement == $id) {
1891 // Alors on valide la suppression
1892 $this->correct = true;
1893 $this->addToMessage(_('Destruction_chronologique'));
1894 } else {
1895 // Alors on annule la suppression
1896 $this->correct = false;
1897 $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));
1898 }
1899 }
1900 }
1901
1902 /**
1903 * Vérification de la possibilité ou non de modifier des dates de suivi
1904 * @param string $champ champ date à vérifier
1905 */
1906 function updateDate($champ) {
1907
1908 //Si le retourformulaire est "dossier_instruction"
1909 if ($this->getParameter("retourformulaire") == "dossier"
1910 || $this->f->contexte_dossier_instruction()) {
1911
1912 // Vérification de la possibilité de modifier les dates si déjà éditées
1913 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
1914 // si l'utilisateur n'est pas un admin
1915 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
1916 $this->correct = false;
1917 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
1918 }
1919 }
1920 }
1921
1922 //
1923 return true;
1924 }
1925
1926 /**
1927 * SETTER_FORM - setValsousformulaire (setVal).
1928 *
1929 * @return void
1930 */
1931 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1932 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1933 //
1934 $this->retourformulaire = $retourformulaire;
1935 //
1936 if ($maj == 0) {
1937 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
1938 $form->setVal("dossier", $this->getParameter("idxformulaire"));
1939 }
1940
1941 // Si l'instruction a été envoyé au contrôle de légalité et que la
1942 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1943 // l'utilisateur que l'envoi au cl est en cours de traitement.
1944 if ($this->is_sent_to_cl() === true
1945 && empty($this->getVal('date_envoi_controle_legalite'))
1946 && $maj == 3) {
1947 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
1948 }
1949 //
1950 $this->set_form_default_values($form, $maj, $validation);
1951 }
1952
1953 /**
1954 * SETTER_FORM - set_form_default_values (setVal).
1955 *
1956 * @return void
1957 */
1958 function set_form_default_values(&$form, $maj, $validation) {
1959 //
1960 if ($maj == 0) {
1961 // si contexte DI
1962 if ($this->getParameter("retourformulaire") == "dossier"
1963 || $this->f->contexte_dossier_instruction()) {
1964 // on recupère les signataires de la multicollectivité et de celle du DI
1965 $di = $this->f->get_inst__om_dbform(array(
1966 "obj" => "dossier_instruction",
1967 "idx" => $this->getParameter("idxformulaire"),
1968 ));
1969 $sql = str_replace(
1970 "<collectivite_di>",
1971 $di->getVal("om_collectivite"),
1972 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
1973 );
1974 } else {
1975 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
1976 }
1977 $res = $this->f->db->query($sql);
1978 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
1979 $this->f->isDatabaseError($res);
1980 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
1981 if (isset($row["signataire_arrete"])
1982 && is_numeric($row["signataire_arrete"])) {
1983 //
1984 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
1985 }
1986 // Date du jour
1987 $form->setVal("date_evenement", date("Y-m-d"));
1988 }
1989 //
1990 if ($maj == 0 || $maj == 1 || $maj == 125) {
1991 $form->setVal("bible_auto", "bible_auto()");
1992 $form->setVal("bible", "bible(1)");
1993 $form->setVal("bible2", "bible(2)");
1994 $form->setVal("bible3", "bible(3)");
1995 $form->setVal("bible4", "bible(4)");
1996 }
1997 //
1998 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1999 if ($maj == 1
2000 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2001 && $this->has_an_edition() === true) {
2002 //
2003 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2004 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2005 $form->setVal("btn_preview", "show_instr_preview()");
2006 $form->setVal("btn_redaction", "show_instr_redaction()");
2007 }
2008
2009 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2010 // des communes
2011 if ($maj == 3) {
2012 if ($this->can_display_notification_demandeur()) {
2013 $typeNotification = array(
2014 'notification_recepisse',
2015 'notification_instruction',
2016 'notification_decision',
2017 );
2018 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2019 }
2020 if ($this->can_display_notification_service()) {
2021 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2022 }
2023 if ($this->can_display_notification_tiers()) {
2024 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2025 }
2026 if ($this->can_display_notification_commune()) {
2027 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2028 }
2029 }
2030 }
2031
2032 function setLayout(&$form, $maj){
2033 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2034 // citoyen, si la notification des demandeurs est activée sur l'évenement
2035 // d'instruction et que le paramétrage du demandeur principal n'est pas
2036 // correct alors un message a destination de l'instructeur est affiché.
2037 if ($maj == 3) {
2038 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2039 // la requête permettant de savoir le type de demande à échouée) et si
2040 // la notification se fait par mail vérifie si il y a des erreurs de
2041 // paramétrage et si c'est le cas on affiche un message d'information
2042 $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2043 $categorieNotif = $this->f->get_param_option_notification($collectivite);
2044 if (($this->dossier_depose_sur_portail() == null ||
2045 ! $this->dossier_depose_sur_portail()) &&
2046 (! empty($categorieNotif) ||
2047 $categorieNotif == 'mail')) {
2048 $erreurParam = $this->get_info_notification_fail();
2049 // Récupération de l'évenement d'instruction
2050 $instEV = $this->get_inst_evenement();
2051 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2052 $class = 'text-info ui-state-highlight ui-state-info';
2053 $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2054 $this->f->display_panel_information(
2055 $class,
2056 $message,
2057 $erreurParam,
2058 __('Veuillez corriger les informations suivantes.'),
2059 'erreur_param_notif'
2060 );
2061 }
2062 }
2063 }
2064 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2065
2066 $form->setFieldset('evenement','D',_('Evenement'));
2067 $form->setFieldset('om_final_instruction_utilisateur','F','');
2068
2069 $form->setBloc('om_final_instruction_utilisateur','F');
2070
2071 $form->setBloc('date_finalisation_courrier','D',"","");
2072
2073 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2074 $form->setBloc('date_finalisation_courrier','D',"","col_6");
2075 $form->setBloc('date_envoi_controle_legalite','F');
2076
2077 $form->setBloc('date_retour_signature','D',"","col_6");
2078 $form->setBloc('date_retour_controle_legalite','F');
2079 $form->setFieldset('date_retour_controle_legalite','F','');
2080
2081 $form->setBloc('date_retour_controle_legalite','F');
2082
2083 $form->setBloc('statut_signature','D');
2084 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2085 $form->setBloc('commentaire_signature','F');
2086 $form->setBloc('historique_signature','D');
2087 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2088 $form->setBloc('historique_signature','F');
2089 $form->setFieldset('historique_signature','F');
2090
2091 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2092 $form->setFieldset('suivi_notification','F');
2093 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2094 $form->setFieldset('suivi_notification_service','F');
2095 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2096 $form->setFieldset('suivi_notification_tiers','F');
2097 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2098 $form->setFieldset('suivi_notification_commune','F');
2099
2100 if ($maj == 1) {
2101 // Récupère la collectivité du dossier d'instruction
2102 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2103
2104 //
2105 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2106 && $this->has_an_edition() === true) {
2107 //
2108 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2109 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2110 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2111 $form->setFieldset('complement_om_html','D',_('Complement'));
2112 $form->setFieldset('bible','F','');
2113 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2114 $form->setFieldset('bible2','F','');
2115 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2116 $form->setFieldset('bible3','F','');
2117 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2118 $form->setFieldset('bible4','F','');
2119 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2120 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2121 $form->setBloc('corps_om_htmletatex','F');
2122 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2123 $form->setBloc('btn_preview','F');
2124 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2125 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2126 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2127 $form->setFieldset('live_preview','F');
2128 $form->setBloc('live_preview','F');
2129 $form->setBloc('live_preview','F');
2130 } else {
2131 $form->setBloc('complement_om_html','D',"","hidelabel");
2132 $form->setFieldset('complement_om_html','D',_('Complement'));
2133 $form->setFieldset('bible','F','');
2134 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2135 $form->setFieldset('bible2','F','');
2136 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2137 $form->setFieldset('bible3','F','');
2138 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2139 $form->setFieldset('bible4','F','');
2140 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2141 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2142 $form->setBloc('corps_om_htmletatex','F');
2143 }
2144 } else {
2145 $form->setBloc('complement_om_html','D',"","hidelabel");
2146 $form->setFieldset('complement_om_html','D',_('Complement'));
2147 $form->setFieldset('bible','F','');
2148 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2149 $form->setFieldset('bible2','F','');
2150 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2151 $form->setFieldset('bible3','F','');
2152 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2153 $form->setFieldset('bible4','F','');
2154 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2155 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2156 $form->setBloc('corps_om_htmletatex','F');
2157 }
2158 }
2159
2160 function setLib(&$form, $maj) {
2161 //
2162 parent::setLib($form, $maj);
2163 //
2164 $form->setLib('bible_auto', "");
2165 $form->setLib('bible', "");
2166 $form->setLib('bible2', "");
2167 $form->setLib('bible3', "");
2168 $form->setLib('bible4', "");
2169 $form->setLib('btn_refresh', "");
2170 $form->setLib('btn_preview', "");
2171 $form->setLib('btn_redaction', "");
2172 $form->setLib('live_preview', "");
2173 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2174 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2175 $form->setLib('date_retour_rar', __("date_notification"));
2176 $form->setLib('statut_signature', __("statut"));
2177 $form->setLib('commentaire_signature', __("commentaire"));
2178 $form->setLib('historique_signature', '');
2179 $form->setLib('suivi_notification', '');
2180 $form->setLib('suivi_notification_service', '');
2181 $form->setLib('suivi_notification_tiers', '');
2182 $form->setLib('suivi_notification_commune', '');
2183 $form->setLib('preview_edition', "");
2184
2185 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2186 // ajout et que l'option de rédaction libre est activée sur la
2187 // collectivité du dossier
2188 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2189 //
2190 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2191 $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.");
2192 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2193 }
2194 else {
2195 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2196 }
2197
2198 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2199 // modification et que l'option de prévisualisation de l'édition est
2200 // activée sur la collectivité du dossier
2201 if ($maj === '1'
2202 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2203 //
2204 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2205 $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.");
2206 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2207 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2208 }
2209 }
2210
2211 /**
2212 * TRIGGER - triggerajouter.
2213 *
2214 * @return boolean
2215 */
2216 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2217 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2218 /**
2219 * Le code suivant permet de récupérer des valeurs des tables evenement
2220 * et dossier pour les stocker dans l'instruction :
2221 * DEPUIS L'EVENEMENT
2222 * - action
2223 * - delai
2224 * - accord_tacite
2225 * - etat
2226 * - avis_decision
2227 * - delai_notification
2228 * - lettretype
2229 * - autorite_competente
2230 * - pec_metier
2231 * - complement_om_html
2232 * - complement2_om_html
2233 * - complement3_om_html
2234 * - complement4_om_html
2235 * - complement5_om_html
2236 * DEPUIS LE DOSSIER D'INSTRUCTION
2237 * - archive_delai
2238 * - archive_accord_tacite
2239 * - archive_etat
2240 * - archive_avis
2241 * - date_complet
2242 * - date_rejet
2243 * - date_limite
2244 * - date_notification_delai
2245 * - date_decision
2246 * - date_validite
2247 * - date_achevement
2248 * - date_chantier
2249 * - date_conformite
2250 * - avis_decision
2251 */
2252 // Récupération de tous les paramètres de l'événement sélectionné
2253 $sql = "SELECT * FROM ".DB_PREFIXE."evenement
2254 WHERE evenement=".$this->valF['evenement'];
2255 $res = $this->f->db->query($sql);
2256 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2257 $this->f->isDatabaseError($res);
2258 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2259 // Récupération de l'identifiant de l'action
2260 // si une action est paramétrée dans l'événement
2261 $this->valF['action'] = NULL;
2262 if (isset($row['action']) and !empty($row['action'])) {
2263 $this->valF['action']=$row['action'];
2264 }
2265 // Récupération de la valeur du délai
2266 $this->valF['delai'] = $row['delai'];
2267 // Récupération de l'identifiant de l'état
2268 // si un état est paramétré dans l'événement
2269 $this->valF['etat']=NULL;
2270 if (isset($row['etat']) and !empty($row['etat'])) {
2271 $this->valF['etat']=$row['etat'];
2272 }
2273 // Récupération de la valeur d'accord tacite
2274 $this->valF['accord_tacite']=$row['accord_tacite'];
2275 // Récupération de la valeur du délai de notification
2276 $this->valF['delai_notification']=$row['delai_notification'];
2277 // Récupération de l'identifiant de l'avis
2278 // si un avis est paramétré dans l'événement
2279 $this->valF['avis_decision'] = NULL;
2280 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2281 $this->valF['avis_decision']=$row['avis_decision'];
2282 }
2283 // Récupération de la valeur de l'autorité compétente
2284 // si l'autorité compétente est paramétré dans l'événement
2285 $this->valF['autorite_competente'] = NULL;
2286 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2287 $this->valF['autorite_competente']=$row['autorite_competente'];
2288 }
2289 // Récupération de la valeur de la lettre type
2290 $this->valF['lettretype']=$row['lettretype'];
2291 // Récupération de la valeur de la prise en compte métier
2292 // si la prise en compte métier est paramétrée dans l'événement
2293 $this->valF['pec_metier'] = NULL;
2294 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2295 $this->valF['pec_metier'] = $row['pec_metier'];
2296 }
2297 }
2298 // Récupération de toutes les valeurs du dossier d'instruction en cours
2299 $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2300 WHERE dossier='".$this->valF['dossier']."'";
2301 $res = $this->f->db->query($sql);
2302 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2303 $this->f->isDatabaseError($res);
2304 $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
2305 $this->updateArchiveData($row);
2306
2307 // Récupération de la duree de validite du dossier d'autorisation
2308 $sql = "SELECT duree_validite_parametrage
2309 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
2310 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2311 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2312 LEFT JOIN ".DB_PREFIXE."dossier
2313 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2314 WHERE dossier.dossier='".$this->valF['dossier']."'";
2315 $duree_validite_parametrage = $this->f->db->getone($sql);
2316 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
2317 $this->f->isDatabaseError($duree_validite_parametrage);
2318 if ($duree_validite_parametrage != '') {
2319 $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;
2320 }
2321
2322 // Identifiant du type de courrier
2323 $idTypeCourrier = '11';
2324 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2325 // Code barres
2326 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2327 }
2328
2329 /**
2330 * Test si une restriction est valide.
2331 *
2332 * @return boolean
2333 */
2334 function restrictionIsValid($restriction){
2335 if($this->restriction_valid != null) {
2336 return $this->restriction_valid;
2337 }
2338 if(empty($restriction)) {
2339 $this->restriction_valid = true;
2340 return $this->restriction_valid;
2341 }
2342 // Liste des opérateurs possibles sans espace
2343 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2344 // Liste identique mais avec le marqueur §
2345 $mark = "§";
2346 $operateurs_marked = array();
2347 foreach ($operateurs as $operateur) {
2348 $operateurs_marked[] = $mark.$operateur.$mark;
2349 }
2350
2351 // Supprime tous les espaces de la chaîne de caractère
2352 $restriction = preg_replace('/\s+/', '', $restriction);
2353
2354 // Met un marqueur avant et après les opérateurs
2355 // puis transforme la chaine en un tableau
2356 $restriction = str_replace($operateurs, $operateurs_marked,
2357 $restriction);
2358
2359 // Pour chaque opérateur logique
2360 foreach (array('&&', '||') as $operator) {
2361
2362 // S'il est absent on ne fait aucun traitement
2363 if (strpos($restriction, $mark.$operator.$mark) === false) {
2364 continue;
2365 }
2366 // Sinon on vérifie les deux conditions avec le OU/ET logique
2367 $restrictions = explode($mark.$operator.$mark, $restriction);
2368 $restrictions[0] = explode($mark, $restrictions[0]);
2369 $restrictions[1] = explode($mark, $restrictions[1]);
2370 $res_bool = false;
2371 if ($operator == '&&') {
2372 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2373 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2374 $res_bool = true;
2375 }
2376 }
2377 if ($operator == '||') {
2378 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2379 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2380 $res_bool = true;
2381 }
2382 }
2383 return $res_bool;
2384 }
2385 $tabRestriction = explode($mark, $restriction);
2386 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2387
2388 }
2389
2390 function is_restriction_satisfied($restriction, $operateurs) {
2391 // Tableau comprenant les résultat
2392 $res = array();
2393 // Compteur pour les résultat
2394 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2395 $j = 1;
2396 // Comparateur du calcul
2397 $comparateur = '';
2398 // Booléen retourné
2399 $res_bool = true;
2400
2401 // S'il y a un comparateur
2402 if (in_array(">=", $restriction)
2403 || in_array("<=", $restriction)
2404 || in_array("==", $restriction)
2405 || in_array("!=", $restriction)) {
2406
2407 // Si le tableau n'est pas vide
2408 if (count($restriction) > 0) {
2409
2410 // Boucle dans le tableau pour récupérer seulement les valeurs
2411 foreach ($restriction as $key => $value) {
2412 //
2413 if (!in_array($value, $operateurs)) {
2414 if ($this->getRestrictionValue($value) != false) {
2415 $res[] = $this->getRestrictionValue($value);
2416 } else {
2417 // Message d'erreur
2418 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2419 $this->addToMessage($error_message);
2420 // Arrête le traitement
2421 return false;
2422 }
2423 }
2424 }
2425
2426 // Boucle dans le tableau
2427 // commence à 1 car le 0 doit rester inchangé tout au long du
2428 // traitement
2429 for ($i = 1; $i<count($restriction); $i++) {
2430
2431 // Récupère le comparateur
2432 if ($restriction[$i] === ">="
2433 || $restriction[$i] === "<="
2434 || $restriction[$i] === "=="
2435 || $restriction[$i] === "!=") {
2436 $comparateur = $restriction[$i];
2437 }
2438
2439 // Si l'opérateur qui suit est un "+"
2440 if ($restriction[$i] === "+") {
2441 $dateDep = $res[$j];
2442 unset($res[$j]);$j++;
2443 $duree = $res[$j];
2444 unset($res[$j]);
2445 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2446 }
2447
2448 // Si l'opérateur qui suit est un "-"
2449 if ($restriction[$i] === "-") {
2450 $dateDep = $res[$j];
2451 unset($res[$j]);$j++;
2452 $duree = $res[$j];
2453 unset($res[$j]);
2454 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2455 }
2456 }
2457
2458 }
2459
2460 // Si les tableau des résultats n'est pas vide
2461 if (count($res) > 0) {
2462 //
2463 $res_bool = false;
2464 // Effectue le test
2465 if ($comparateur === ">=") {
2466 //
2467 if (strtotime($res[0]) >= strtotime($res[$j])) {
2468 $res_bool = true;
2469 }
2470 }
2471 if ($comparateur === "<=") {
2472 //
2473 if (strtotime($res[0]) <= strtotime($res[$j])) {
2474 $res_bool = true;
2475 }
2476 }
2477 if ($comparateur === "==") {
2478 //
2479 if (strtotime($res[0]) == strtotime($res[$j])) {
2480 $res_bool = true;
2481 }
2482 }
2483 if ($comparateur === "!=") {
2484 //
2485 if (strtotime($res[0]) != strtotime($res[$j])) {
2486 $res_bool = true;
2487 }
2488 }
2489 }
2490 // Sinon une erreur s'affiche
2491 } else {
2492
2493 // Message d'erreur
2494 $error_message = _("Mauvais parametrage de la restriction.")." ".
2495 _("Contactez votre administrateur");
2496 $this->addToMessage($error_message);
2497 // Arrête le traitement
2498 return false;
2499 }
2500
2501 return $res_bool;
2502
2503 }
2504
2505 /**
2506 * Permet de définir si l'événement passé en paramètre est un événement retour.
2507 * @param integer $evenement événement à tester
2508 *
2509 * @return boolean retourne true si événement retour sinon false
2510 */
2511 function is_evenement_retour($evenement) {
2512 if(empty($evenement) || !is_numeric($evenement)) {
2513 return "";
2514 }
2515 $sql = "SELECT retour
2516 FROM ".DB_PREFIXE."evenement
2517 WHERE evenement = ".$evenement;
2518 $retour = $this->f->db->getone($sql);
2519 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
2520 $this->f->isDatabaseError($retour);
2521 if ($retour == 't') {
2522 return true;
2523 } else {
2524 return false;
2525 }
2526 }
2527
2528 /**
2529 * Retourne le champ restriction de l'événement passé en paramètre.
2530 *
2531 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2532 *
2533 * @return string contenu du champ restriction
2534 */
2535 function get_restriction($evenement) {
2536 if(empty($evenement) || !is_numeric($evenement)) {
2537 return "";
2538 }
2539 //Récupère la restriction
2540 $sql= "SELECT
2541 restriction
2542 FROM
2543 ".DB_PREFIXE."evenement
2544 WHERE
2545 evenement =".$evenement;
2546
2547 $restriction = $this->f->db->getone($sql);
2548 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
2549 $this->f->isDatabaseError($restriction);
2550 return $restriction;
2551 }
2552
2553 /**
2554 * Récupère la valeur du champ dans la restriction
2555 * @param string $restrictionValue Nom du champ
2556 * @return mixed Valeur du champ
2557 */
2558 function getRestrictionValue($restrictionValue){
2559
2560 // Initialisation de la valeur de retour
2561 $return = false;
2562
2563 // Récupére les valeurs du dossier
2564 $value_dossier = $this->get_dossier_actual();
2565
2566 //
2567 if (is_numeric($restrictionValue)) {
2568 $return = $restrictionValue;
2569 }elseif (isset($value_dossier[$restrictionValue])) {
2570 $return = $value_dossier[$restrictionValue];
2571 }elseif (isset($this->valF[$restrictionValue])) {
2572 $return = $this->valF[$restrictionValue];
2573 }
2574
2575 // Retourne la valeur du champ
2576 return $return;
2577 }
2578
2579
2580 /**
2581 * Calcul des règle d'action selon leur type.
2582 *
2583 * Types de règle :
2584 * - date
2585 * - numeric
2586 * - text
2587 * - bool
2588 * - specific
2589 * - technical_data
2590 *
2591 * @param string $rule Règle d'action.
2592 * @param string $rule_name Nom de la règle.
2593 * @param string $type Type de la règle.
2594 *
2595 * @return mixed Résultat de la règle
2596 */
2597 public function regle($rule, $rule_name, $type = null) {
2598
2599 // Supprime tous les espaces de la chaîne de caractère
2600 $rule = str_replace(' ', '', $rule);
2601 // Coupe la chaîne au niveau de l'opérateur
2602 $operands = explode ("+", $rule);
2603 // Nombre d'opérande
2604 $nb_operands = count($operands);
2605
2606 // Règle à null
2607 if ($rule == "null") {
2608 return null;
2609 }
2610
2611 // Tableau des champs de type date
2612 $rule_type_date = array(
2613 "regle_date_limite",
2614 "regle_date_notification_delai",
2615 "regle_date_complet",
2616 "regle_date_validite",
2617 "regle_date_decision",
2618 "regle_date_chantier",
2619 "regle_date_achevement",
2620 "regle_date_conformite",
2621 "regle_date_rejet",
2622 "regle_date_dernier_depot",
2623 "regle_date_limite_incompletude",
2624 "regle_date_cloture_instruction",
2625 "regle_date_premiere_visite",
2626 "regle_date_derniere_visite",
2627 "regle_date_contradictoire",
2628 "regle_date_retour_contradictoire",
2629 "regle_date_ait",
2630 "regle_date_transmission_parquet",
2631 "regle_date_affichage",
2632 );
2633 // Tableau des champs de type numérique
2634 $rule_type_numeric = array(
2635 "regle_delai",
2636 "regle_delai_incompletude",
2637 );
2638 // Tableau des champs de type text
2639 $rule_type_text = array(
2640 );
2641 // Tableau des champs de type booléen
2642 $rule_type_bool = array(
2643 "regle_a_qualifier",
2644 "regle_incompletude",
2645 "regle_incomplet_notifie",
2646 "regle_evenement_suivant_tacite_incompletude",
2647 );
2648 // Tableau des champs spécifiques
2649 $rule_type_specific = array(
2650 "regle_autorite_competente",
2651 "regle_etat",
2652 "regle_accord_tacite",
2653 "regle_avis",
2654 "regle_pec_metier",
2655 "regle_etat_pendant_incompletude",
2656 );
2657 // Tableau des champs de données techniques
2658 $rule_type_technical_data = array(
2659 'regle_donnees_techniques1',
2660 'regle_donnees_techniques2',
2661 'regle_donnees_techniques3',
2662 'regle_donnees_techniques4',
2663 'regle_donnees_techniques5',
2664 );
2665 // Tableau des champs simple
2666 $rule_type_simple = array(
2667 "regle_dossier_instruction_type",
2668 );
2669
2670 // Définit le type du champ
2671 if (in_array($rule_name, $rule_type_date) == true) {
2672 $type = "date";
2673 }
2674 if (in_array($rule_name, $rule_type_numeric) == true) {
2675 $type = "numeric";
2676 }
2677 if (in_array($rule_name, $rule_type_text) === true) {
2678 $type = "text";
2679 }
2680 if (in_array($rule_name, $rule_type_bool) === true) {
2681 $type = "bool";
2682 }
2683 if (in_array($rule_name, $rule_type_specific) === true) {
2684 $type = "specific";
2685 }
2686 if (in_array($rule_name, $rule_type_technical_data) === true) {
2687 $type = 'text';
2688 }
2689 if (in_array($rule_name, $rule_type_simple) === true) {
2690 $type = 'simple';
2691 }
2692
2693 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2694 // Récupère directement la valeur de l'opérande
2695 if ($type === 'specific') {
2696 //
2697 return $this->get_value_for_rule($rule);
2698 }
2699
2700 // Initialisation des variables
2701 $key_date = 0;
2702 $total_numeric = 0;
2703 $res_text = '';
2704
2705 // Pour chaque opérande
2706 foreach ($operands as $key => $operand) {
2707
2708 // Si c'est une règle de type date
2709 if ($type == 'date') {
2710 // Vérifie si au moins une des opérandes est une date
2711 if (is_numeric($operand) === false
2712 && $this->get_value_for_rule($operand) !== null
2713 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2714 // Récupère la position de la date
2715 $key_date = $key;
2716 }
2717 // Les autres opérandes doivent être que des numériques
2718 if (is_numeric($operand) == true) {
2719 // Ajoute l'opérande au total
2720 $total_numeric += $operand;
2721 }
2722 if (is_numeric($operand) === false
2723 && $this->get_value_for_rule($operand) !== null
2724 && is_numeric($this->get_value_for_rule($operand)) == true) {
2725 // Ajoute l'opérande au total
2726 $total_numeric += $this->get_value_for_rule($operand);
2727 }
2728 }
2729
2730 // Si c'est une règle de type numérique
2731 if ($type == 'numeric') {
2732 // Les opérandes doivent être que des numériques
2733 if (is_numeric($operand) == true) {
2734 // Ajoute l'opérande au total
2735 $total_numeric += $operand;
2736 }
2737 if (is_numeric($operand) === false
2738 && $this->get_value_for_rule($operand) !== null
2739 && is_numeric($this->get_value_for_rule($operand)) == true) {
2740 // Ajoute l'opérande au total
2741 $total_numeric += $this->get_value_for_rule($operand);
2742 }
2743 }
2744
2745 // Si c'est une règle de type text
2746 if ($type === 'text') {
2747 // Concatène toutes les chaînes de caractère
2748 $res_text .= $this->get_value_for_rule($operand);
2749 }
2750 }
2751
2752 // Résultat pour une règle de type date
2753 if ($type == 'date') {
2754 // Retourne le calcul de la date
2755 return $this->f->mois_date($this->valF[$operands[$key_date]],
2756 $total_numeric, "+");
2757 }
2758
2759 // Résultat pour une règle de type numérique
2760 if ($type == 'numeric') {
2761 // Retourne le calcul
2762 return $total_numeric;
2763 }
2764
2765 // Résultat pour une règle de type text
2766 if ($type === 'text') {
2767 // Retourne la chaîne de caractère
2768 return $res_text;
2769 }
2770 if ($type === 'simple' || $type === 'bool') {
2771 // Retourne la valeur du champs rule
2772 return $rule;
2773 }
2774 }
2775
2776
2777 /**
2778 * Récupère la valeur du champs dans l'instruction ou dans les données
2779 * techniques.
2780 * Spécifique au calcul des règles.
2781 *
2782 * @param string $field Champ
2783 *
2784 * @return mixed Valeur du champ
2785 */
2786 private function get_value_for_rule($field) {
2787 // Si le champ n'existe pas dans la table instruction
2788 if (array_key_exists($field, $this->valF) === false) {
2789 // Récupère l'instance de la classe donnees_techniques
2790 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2791 // Retourne la valeur de la donnée technique
2792 return $inst_donnees_techniques->getVal($field);
2793 }
2794
2795 //
2796 return $this->valF[$field];
2797 }
2798
2799
2800 /**
2801 * [get_inst_donnees_techniques description]
2802 *
2803 * @param [type] $donnees_techniques [description]
2804 *
2805 * @return [type] [description]
2806 */
2807 function get_inst_donnees_techniques($donnees_techniques = null) {
2808 //
2809 if (isset($this->inst_donnees_techniques) === false or
2810 $this->inst_donnees_techniques === null) {
2811 //
2812 if (is_null($donnees_techniques)) {
2813 $donnees_techniques = $this->getDonneesTechniques();
2814 }
2815 //
2816 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2817 "obj" => "donnees_techniques",
2818 "idx" => $donnees_techniques,
2819 ));
2820 }
2821 //
2822 return $this->inst_donnees_techniques;
2823 }
2824
2825
2826 /**
2827 * Retourne l'identifiant des données techniques liées du dossier
2828 * @return string L'identifiant des données techniques liées du dossier
2829 */
2830 function getDonneesTechniques() {
2831
2832 $donnees_techniques = '';
2833
2834 $sql = "SELECT donnees_techniques
2835 FROM ".DB_PREFIXE."donnees_techniques
2836 WHERE dossier_instruction ='".$this->valF["dossier"]."'";
2837 $donnees_techniques = $this->f->db->getone($sql);
2838 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
2839 $this->f->isDatabaseError($donnees_techniques);
2840 return $donnees_techniques;
2841 }
2842
2843 /**
2844 * TRIGGER - triggerajouterapres.
2845 *
2846 * - Mise à jour des informations liées au workflow sur le dossier
2847 * - Interface avec le référentiel ERP [105][111]
2848 * - Mise à jour du DA
2849 * - Historisation de la vie du DI
2850 *
2851 * @return boolean
2852 */
2853 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2854 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2855
2856 // On a besoin de l'instance du dossier lié à l'événement d'instruction
2857 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2858 // Instance de la classe evenement
2859 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
2860 // Instance de l'état courant du dossier d'instruction
2861 $inst_current_etat = $this->f->get_inst__om_dbform(array(
2862 "obj" => "etat",
2863 "idx" => $inst_di->get_id_etat(),
2864 ));
2865
2866 /**
2867 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
2868 * par l'action
2869 */
2870 // état de complétude actuel du dossier
2871 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
2872 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
2873 $ev_suiv_tacite_incompletude = false;
2874 // Initialisation
2875 $valF = array();
2876 $valF_dt = array();
2877 //
2878 // Récupération des paramètres de l'action
2879 $sql = "SELECT * FROM ".DB_PREFIXE."action
2880 WHERE action='".$this->valF['action']."'";
2881 $res = $this->f->db->query($sql);
2882 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2883 $this->f->isDatabaseError($res);
2884 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2885
2886 // pour chacune des regles, on applique la regle
2887 if ($row['regle_delai'] != '') {
2888 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
2889 }
2890 if ($row['regle_accord_tacite'] != '') {
2891 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
2892 }
2893 if ($row['regle_avis'] != '') {
2894 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
2895 }
2896 if ($row['regle_date_limite'] != '') {
2897 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
2898 }
2899 if ($row['regle_date_complet'] != '') {
2900 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
2901 }
2902 if ($row['regle_date_dernier_depot'] != '') {
2903 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
2904 }
2905 if ($row['regle_date_notification_delai'] != '') {
2906 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
2907 }
2908 if ($row['regle_date_decision'] != '') {
2909 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
2910 }
2911 if ($row['regle_date_rejet'] != '') {
2912 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
2913 }
2914 if ($row['regle_date_validite'] != '') {
2915 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
2916 }
2917 if ($row['regle_date_chantier'] != '') {
2918 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
2919 }
2920 if ($row['regle_date_achevement'] != '') {
2921 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
2922 }
2923 if ($row['regle_date_conformite'] != '') {
2924 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
2925 }
2926 if ($row['regle_date_limite_incompletude'] != '') {
2927 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
2928 }
2929 if ($row['regle_delai_incompletude'] != '') {
2930 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
2931 }
2932 if ($row['regle_autorite_competente'] != '') {
2933 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
2934 }
2935 if ($row['regle_etat'] != '') {
2936 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
2937 }
2938 if ($row['regle_date_cloture_instruction'] !== '') {
2939 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
2940 }
2941 if ($row['regle_date_premiere_visite'] !== '') {
2942 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
2943 }
2944 if ($row['regle_date_derniere_visite'] !== '') {
2945 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
2946 }
2947 if ($row['regle_date_contradictoire'] !== '') {
2948 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
2949 }
2950 if ($row['regle_date_retour_contradictoire'] !== '') {
2951 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
2952 }
2953 if ($row['regle_date_ait'] !== '') {
2954 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
2955 }
2956 if ($row['regle_donnees_techniques1'] !== '') {
2957 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
2958 }
2959 if ($row['regle_donnees_techniques2'] !== '') {
2960 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
2961 }
2962 if ($row['regle_donnees_techniques3'] !== '') {
2963 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
2964 }
2965 if ($row['regle_donnees_techniques4'] !== '') {
2966 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
2967 }
2968 if ($row['regle_donnees_techniques5'] !== '') {
2969 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
2970 }
2971 if ($row['regle_date_transmission_parquet'] !== '') {
2972 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
2973 }
2974 if ($row['regle_dossier_instruction_type'] !== '') {
2975 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
2976 }
2977 // La date d'affichage est modifiée seulement si le champ n'est pas
2978 // renseigné
2979 if ($row['regle_date_affichage'] !== ''
2980 && ($inst_di->getVal('date_affichage') === ''
2981 || $inst_di->getVal('date_affichage') === null)) {
2982 //
2983 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
2984 }
2985 //
2986 if ($row['regle_pec_metier'] != '') {
2987 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
2988 }
2989 if ($row['regle_a_qualifier'] != '') {
2990 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
2991 }
2992 //
2993 if ($row['regle_incompletude'] != '') {
2994 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
2995 }
2996 if ($row['regle_incomplet_notifie'] != '') {
2997 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
2998 }
2999 if ($row['regle_etat_pendant_incompletude'] != '') {
3000 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3001 }
3002 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3003 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3004 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3005 $ev_suiv_tacite_incompletude = true;
3006 }
3007 }
3008 }
3009
3010 // Si l'événement a un événement suivant tacite
3011 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3012 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3013 // pas associé de le même façon au dossier d'instruction
3014 if ($ev_suiv_tacite_incompletude === false) {
3015 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3016 }
3017 if ($ev_suiv_tacite_incompletude === true) {
3018 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3019 }
3020 }
3021 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3022 if (count($valF_dt) > 0) {
3023 $dt_id = $this->getDonneesTechniques();
3024 // On met à jour le dossier
3025 $cle = " donnees_techniques='".$dt_id."'";
3026 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3027 $this->addToLog(
3028 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3029 VERBOSE_MODE
3030 );
3031 $this->f->isDatabaseError($res1);
3032 // Affichage d'informations à l'utilisateur
3033 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3034 }
3035 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3036 if (count($valF) > 0) {
3037 //
3038 $inst_dossier = $this->f->get_inst__om_dbform(array(
3039 "obj" => "dossier",
3040 "idx" => $this->valF['dossier'],
3041 ));
3042 $valF['instruction'] = $id;
3043 $valF['crud'] = 'create';
3044 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3045 if ($update_by_instruction === false) {
3046 $this->cleanMessage();
3047 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3048 return false;
3049 }
3050 // Affichage d'informations à l'utilisateur
3051 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3052 }
3053
3054 /**
3055 * Interface avec le référentiel ERP.
3056 *
3057 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3058 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3059 * Déclencheur :
3060 * - L'option ERP est activée
3061 * - Le dossier est marqué comme "connecté au référentiel ERP"
3062 * - Le dossier est de type PC
3063 * - Le formulaire d'ajout d'un événement d'instruction est validé
3064 * avec un événement pour lequel les services ERP doivent être
3065 * informé
3066 */
3067 //
3068 if ($this->f->is_option_referentiel_erp_enabled() === true
3069 && $inst_di->is_connected_to_referentiel_erp() === true
3070 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3071 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3072 //
3073 $infos = array(
3074 "dossier_instruction" => $this->valF['dossier'],
3075 "decision" => $inst_evenement->getVal("libelle"),
3076 );
3077 //
3078 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3079 if ($ret !== true) {
3080 $this->cleanMessage();
3081 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3082 return false;
3083 }
3084 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3085 }
3086
3087 // Si le mode en rédaction intégrale est activé
3088 if (isset($this->valF['flag_edition_integrale']) === true
3089 && $this->valF['flag_edition_integrale'] === true) {
3090 $redactionIntegraleValF = array();
3091
3092 // Récupère la collectivite du dossier d'instruction
3093 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3094 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3095 // Récupère le corps de la lettre type
3096 $params = array(
3097 "specific" => array(
3098 "corps" => array(
3099 "mode" => "get",
3100 )
3101 ),
3102 );
3103 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3104 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3105 // Récupère le titre de la lettre type
3106 $params = array(
3107 "specific" => array(
3108 "titre" => array(
3109 "mode" => "get",
3110 )
3111 ),
3112 );
3113 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3114 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3115
3116 // mise à jour en base de données
3117 $res = $this->f->db->autoExecute(
3118 DB_PREFIXE.$this->table,
3119 $redactionIntegraleValF,
3120 DB_AUTOQUERY_UPDATE,
3121 $this->clePrimaire."=".$id
3122 );
3123 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3124 if ($this->f->isDatabaseError($res, true) === true) {
3125 return false;
3126 }
3127 }
3128
3129 /**
3130 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3131 */
3132 // Si la finalisation automatique de l'événement est activée
3133 // ET si l'instruction n'a pas déjà été finalisée
3134 // ET s'il existe une lettre type associée
3135 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3136 && $inst_evenement->getVal('om_final_instruction') !== 't'
3137 && $inst_evenement->getVal('lettretype') !== ''
3138 && $inst_evenement->getVal('lettretype') !== null) {
3139
3140 // On instancie l'instruction
3141 $inst_instruction = $this->f->get_inst__om_dbform(array(
3142 "obj" => "instruction",
3143 "idx" => $this->valF[$this->clePrimaire],
3144 ));
3145
3146 // On finalise l'instruction dans le contexte de finalisation : action 100
3147 $inst_instruction->setParameter('maj', 100);
3148 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3149
3150 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3151 // et dans le message d'erreur
3152 if ($finalize === false) {
3153 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3154 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3155 return false;
3156 }
3157 }
3158
3159 /**
3160 * Finalisation automatique des instructions tacites ou retours.
3161 */
3162 // Si l'option de finalisation automatique des instructions tacites ou
3163 // retours est activée et l'événement d'instruction a une lettre type
3164 // associée
3165 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3166 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3167 && $inst_evenement->getVal('lettretype') !== ''
3168 && $inst_evenement->getVal('lettretype') !== null) {
3169
3170 // Rècupère l'identifiant de l'événement
3171 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3172
3173 // Si l'événement d'instruction est identifié comme un événement
3174 // retour
3175 // OU l'événement d'instruction est l'événement suivant tacite du
3176 // dossier d'instruction (incomplétude prise en compte)
3177 // ET l'événement d'instruction n'a pas déjà été finalisé
3178 if (($inst_evenement->getVal("retour") === 't'
3179 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3180 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3181 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3182
3183 // Finalise l'instruction
3184 $inst_instruction = $this->f->get_inst__om_dbform(array(
3185 "obj" => "instruction",
3186 "idx" => $this->valF[$this->clePrimaire],
3187 ));
3188 $inst_instruction->setParameter('maj', 100);
3189 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3190 if ($finalize === false) {
3191 //
3192 return false;
3193 }
3194 }
3195 }
3196
3197 /**
3198 * Mise à jour de la version de clôture *version_clos* du dossier si et
3199 * seulement si l'instruction met à jour l'état du dossier.
3200 */
3201 if (isset($valF['etat']) === true
3202 && $valF['etat'] !== null
3203 && $valF['etat'] !== '') {
3204 // Instanciation de l'état appliqué sur le dossier par l'instruction
3205 $inst_etat = $this->f->get_inst__om_dbform(array(
3206 "obj" => "etat",
3207 "idx" => $valF['etat'],
3208 ));
3209 //
3210 $update_version_clos = null;
3211 // En cas d'instruction qui clôture le dossier
3212 if ($inst_etat->getVal('statut') === 'cloture') {
3213 $update_version_clos = $inst_di->update_version_clos('up');
3214 }
3215 // En cas d'instruction qui rouvre le dossier
3216 if ($inst_current_etat->getVal('statut') === 'cloture'
3217 && $inst_etat->getVal('statut') !== 'cloture') {
3218 //
3219 $update_version_clos = $inst_di->update_version_clos('down');
3220 //
3221 $params = array(
3222 'di_reopened' => true,
3223 );
3224 }
3225 //
3226 if ($update_version_clos === false) {
3227 $this->f->addToLog(sprintf(
3228 "%s() : ERREUR - %s %s",
3229 __METHOD__,
3230 sprintf(
3231 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3232 $inst_di->getVal($inst_di->clePrimaire)
3233 ),
3234 sprintf(
3235 __("L'instruction tente d'appliquer l'état %s."),
3236 $inst_etat->getVal($inst_etat->clePrimaire)
3237 )
3238 ));
3239 $this->addToMessage(sprintf(
3240 "%s %s",
3241 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3242 __("Veuillez contacter votre administrateur.")
3243 ));
3244 return false;
3245 }
3246 }
3247
3248 /**
3249 * Notification automatique
3250 */
3251 // Notification automatique à l'ajout de l'instruction si la notification
3252 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3253 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3254 ($inst_evenement->getVal('lettretype') === null ||
3255 $inst_evenement->getVal('lettretype') === '')) {
3256 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3257 $msgLog = __('Erreur lors de la notification automatique du(des) pétitionnaire(s).').
3258 ' '.
3259 __('Instruction notifiée : ').
3260 $id;
3261
3262 // Récupération de la liste des demandeurs à notifier et de la catégorie
3263 $categorie = $this->f->get_param_option_notification($collectivite_di);
3264 $isPortal = $categorie == null || $categorie == '' || $categorie == PORTAL ? true : false;
3265 $demandeursANotifie = $this->get_demandeurs_notifiable(
3266 $this->valF['dossier'],
3267 $isPortal
3268 );
3269
3270 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3271 $demandeurPrincipalNotifie = false;
3272 foreach ($demandeursANotifie as $demandeur) {
3273 // Identifie si le demandeur principal a été notifié ou pas
3274 // et récupère ses informations
3275 if ($demandeur['petitionnaire_principal'] == 't') {
3276 $demandeurPrincipalNotifie = true;
3277 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3278 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3279 // suivante. On le considère également comme non notifié pour gérer l'envoie
3280 // des messages d'erreurs
3281 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3282 // d'impact sur la notification
3283 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3284 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3285 $demandeurPrincipalNotifie = false;
3286 continue;
3287 }
3288 }
3289 // Ajout de la notif et récupération de son id
3290 $idNotif = $this->ajouter_notification(
3291 $this->valF[$this->clePrimaire],
3292 $this->f->get_connected_user_login_name(),
3293 $demandeur,
3294 $collectivite_di,
3295 array(),
3296 true
3297 );
3298 if ($idNotif === false) {
3299 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3300 return false;
3301 }
3302 // Création de la tache en lui donnant l'id de la notification
3303 $notification_by_task = $this->notification_by_task(
3304 $idNotif,
3305 $this->valF['dossier'],
3306 $categorie
3307 );
3308 if ($notification_by_task === false) {
3309 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3310 $this->addToMessage(
3311 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3312 );
3313 return false;
3314 }
3315 }
3316 // Pour la notification par mail ou la notification via portal si le dossier a
3317 // été déposés via portal, si le demandeur principal n'est pas notifiable,
3318 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3319 // laquelle le demandeur principal n'a pas pu être notifié
3320 $depotPortal = $this->dossier_depose_sur_portail();
3321 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3322 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3323 // ' ' permet de mettre un espace entre les 2 msg de log.
3324 $msgLog .= ' '.__('Le pétitionnaire principale n\'est pas notifiable.');
3325 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3326 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3327 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3328 // Ajout de la notif et récupération de son id
3329 $idNotif = $this->ajouter_notification(
3330 $this->valF[$this->clePrimaire],
3331 $this->f->get_connected_user_login_name(),
3332 $demandeurPrincipal,
3333 $collectivite_di,
3334 array(),
3335 true,
3336 'Echec',
3337 implode(' ', $erreursParam)
3338 );
3339 if ($idNotif === false) {
3340 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3341 $this->addToMessage(
3342 __('Erreur : la création de la notification a échouée.').
3343 __("Veuillez contacter votre administrateur.")
3344 );
3345 return false;
3346 }
3347 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3348 // de l'échec de la notification
3349 $dossier_message = $this->get_inst_dossier_message(0);
3350 $dossier_message_val = array(
3351 'dossier' => $val['dossier'],
3352 'type' => _('erreur expedition'),
3353 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3354 'login' => $_SESSION['login'],
3355 'date_emission' => date('Y-m-d H:i:s'),
3356 'contenu' => _('Échec lors de la notification de l\'instruction ').
3357 $inst_evenement->getVal('libelle').
3358 '.<br>'.
3359 implode("\n", $erreursParam).
3360 '<br>'.
3361 _('Veuillez corriger ces informations avant de renvoyer la notification.')
3362 );
3363 $add = $dossier_message->add_notification_message($dossier_message_val, true);
3364 // Si une erreur se produit pendant l'ajout
3365 if ($add !== true) {
3366 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3367 return false;
3368 }
3369 }
3370 $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.")));
3371 }
3372
3373 // Notification automatique en cas de dépôt de dossier dématérialisé
3374 // Vérifie si l'option de notification est active et si il s'agit bien d'une
3375 // instruction de récépissé
3376 if (
3377 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3378 && $this->is_instruction_recepisse()
3379 ) {
3380 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3381 $msgLog = __('Erreur lors de la notification de dépôt du dossier dématérialisé : ').
3382 $val['dossier'];
3383 // Récupère l'instance de la demande
3384 $demande = $inst_di->get_inst_demande();
3385 // Vérifie que le dossier a été déposé via platau ou portal
3386 if (
3387 ($demande->getVal('source_depot') == PLATAU ||
3388 $demande->getVal('source_depot') == PORTAL)
3389 ) {
3390 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3391 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3392 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3393 if (empty($listeEmails)) {
3394 $this->addToLog(
3395 __METHOD__."(): ".$msgLog.'. '.__('Aucun courriel paramétré.'),
3396 DEBUG_MODE
3397 );
3398 } else {
3399 foreach ($listeEmails as $email) {
3400 // Ajout de la notif et récupération de son id
3401 $destinataire = array(
3402 'destinataire' => $email,
3403 'courriel' => $email
3404 );
3405 $idNotif = $this->ajouter_notification(
3406 $this->valF[$this->clePrimaire],
3407 $this->f->get_connected_user_login_name(),
3408 $destinataire,
3409 $collectivite_di,
3410 array(),
3411 true
3412 );
3413 if ($idNotif === false) {
3414 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3415 return false;
3416 }
3417 // Création de la tache en lui donnant l'id de la notification
3418 $notification_by_task = $this->notification_by_task(
3419 $idNotif,
3420 $this->valF['dossier'],
3421 'mail',
3422 'notification_depot_demat'
3423 );
3424 if ($notification_by_task === false) {
3425 $this->addToMessage(
3426 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3427 );
3428 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
3429 return false;
3430 }
3431 }
3432 }
3433 }
3434 }
3435
3436 /**
3437 * Mise à jour de la date de dernière modification du dossier
3438 */
3439 $inst_di->update_last_modification_date();
3440
3441 /**
3442 * Mise à jour des données du DA.
3443 */
3444 $inst_da = $inst_di->get_inst_dossier_autorisation();
3445 $params['di_id'] = $this->valF['dossier'];
3446 if ($inst_da->majDossierAutorisation($params) === false) {
3447 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3448 $this->correct = false;
3449 return false;
3450 }
3451
3452 /**
3453 * Historisation de la vie du DI.
3454 */
3455 //
3456 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3457 }
3458
3459 /**
3460 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3461 * sont remplies.
3462 * Les conditions vérifiées sont les suivantes :
3463 * - Le petitionnaire principal doit accepter les notifications
3464 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3465 * - Le pétitionnaire principal doit avoir une adresse mail correcte
3466 * Pour chaque vérification effectué un message d'erreur est ajouté si la
3467 * condition n'est pas remplie.
3468 * Renvoie le message d'erreur en sortie.
3469 *
3470 * @param string identifiant du dossier sur lequel les notifications ont échouée
3471 * @return string
3472 */
3473 protected function get_info_notification_fail($dossier = null) {
3474 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3475 // utilise celui associé à l'instruction
3476 if ($dossier == null) {
3477 $dossier = $this->getVal('dossier');
3478 }
3479 // Tableau contenant la liste des messages d'erreur
3480 $errorMessage = array();
3481 // Récupère les informations du demandeurs principal
3482 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3483 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3484 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3485 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3486 }
3487 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3488 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3489 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3490 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3491 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3492 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3493 $infoPetitionnaire['courriel'].
3494 '.';
3495 }
3496 } else {
3497 // Si le courriel du pétitionnaire principal
3498 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3499 }
3500
3501 return $errorMessage;
3502 }
3503
3504 /**
3505 * Méthode servant à vérifier si un dossier a été déposé sur
3506 * le portail citoyen ou pas.
3507 * La verification se fait via une requête sql dans laquelle
3508 * on va chercher un dossier ayant pour id l'identifiant de
3509 * dossier associé à l'instruction et pour lequel la demande
3510 * associée la plus ancienne est une demande de création de
3511 * dossier via portail
3512 *
3513 * @param string identifiant du dossier. Si non renseigné c'est le dossier
3514 * associé à l'instruction qui est utilisé
3515 * @return boolean|void true : dossier déposé via portail, false : dossier
3516 * non déposé via portail et null : erreur de base de données.
3517 */
3518 protected function dossier_depose_sur_portail($dossier = null) {
3519 if (empty($dossier)) {
3520 $dossier = $this->getVal('dossier');
3521 }
3522 $qres = $this->f->get_one_result_from_db_query(
3523 sprintf(
3524 'SELECT
3525 dossier
3526 FROM
3527 %1$sdossier
3528 -- Récuperation de la première demande associée au dossier
3529 LEFT JOIN (
3530 SELECT
3531 demande,
3532 dossier_instruction,
3533 source_depot
3534 FROM
3535 %1$sdemande
3536 WHERE
3537 dossier_instruction = \'%2$s\'
3538 ORDER BY
3539 demande ASC
3540 LIMIT 1
3541 ) as demande ON dossier.dossier = demande.dossier_instruction
3542 WHERE
3543 dossier.dossier = \'%2$s\'
3544 AND demande.source_depot = \'portal\'',
3545 DB_PREFIXE,
3546 $this->f->db->escapeSimple($dossier)
3547 ),
3548 array(
3549 "origin" => __METHOD__,
3550 "force_return" => true,
3551 )
3552 );
3553 if ($qres["code"] !== "OK") {
3554 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3555 return;
3556 }
3557 // Si on a un résultat c'est que le dossier a été déposé via le portail
3558 return ! empty($qres["result"]);
3559 }
3560
3561 public function is_service_notifiable() {
3562 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3563
3564 // Si l'instruction a une édition non finalisé quel que soit
3565 // le type de notification, il n'est pas notifiable
3566 if ($this->has_an_edition() === true) {
3567 if ($this->is_unfinalizable_without_bypass() === false) {
3568 return false;
3569 }
3570 }
3571 // Vérifie si la notification des tiers est active pour l'évènement
3572 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3573 }
3574
3575 public function is_tiers_notifiable() {
3576 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3577
3578 // Si l'instruction a une édition non finalisé quel que soit
3579 // le type de notification, il n'est pas notifiable
3580 if ($this->has_an_edition() === true) {
3581 if ($this->is_unfinalizable_without_bypass() === false) {
3582 return false;
3583 }
3584 }
3585 // Vérifie si la notification des tiers est active pour l'évènement
3586 return ! empty($evenement->getVal('notification_tiers'));
3587 }
3588
3589 /**
3590 * Méthode permettant de savoir si une instruction peut
3591 * être notifiée manuellement selon les différents types
3592 * de notification.
3593 *
3594 * Si l'instruction a une édition non finalisée alors elle n'est pas
3595 * manuellement notifiable.
3596 * Si l'instruction est associé à un événement de notification pour
3597 * lequel un retour signature est recquis, elle n'est notifiable que
3598 * si la date de retour de signature est remplie.
3599 * Par défaut si le type de notification n'est pas connu alors l'instruction
3600 * n'est pas notifiable.
3601 * Pour tous les autres cas l'instruction est manuellement notifiable.
3602 *
3603 * @return boolean true : notifiable | false : non notifiable
3604 */
3605 public function is_notifiable_by_task_manual() {
3606 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3607
3608 // Si l'instruction a une édition non finalisé quel que soit
3609 // le type de notification, il n'est pas notifiable
3610 if ($this->has_an_edition() === true) {
3611 if ($this->is_unfinalizable_without_bypass() === false) {
3612 return false;
3613 }
3614 }
3615
3616 // Gestion des différents cas selon la valeur du champs notification
3617 if ($ev->getVal('notification') == 'notification_manuelle' ||
3618 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3619 $ev->getVal('notification') == 'notification_automatique'
3620 ) {
3621 return true;
3622 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3623 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3624 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3625 $this->getVal('date_retour_signature') != null &&
3626 $this->getVal('date_retour_signature') != ''
3627 ) {
3628 return true ;
3629 }
3630 return false;
3631 }
3632
3633 /**
3634 * Crée une instance et une tache de notification pour le demandeur
3635 * principal.
3636 *
3637 * @return boolean true si le traitement à réussi
3638 */
3639 protected function notifier_demandeur_principal() {
3640 $this->begin_treatment(__METHOD__);
3641 $message = '';
3642 // Récupération des informations concernant le demandeur
3643 $dossier = $this->getVal('dossier');
3644 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3645 $demandeur = $this->get_demandeurs_notifiable(
3646 $dossier,
3647 true
3648 );
3649 if ($demandeur !== array()) {
3650 $destinataire = array_values($demandeur);
3651 // Ajout de la notif et récupération de son id
3652 $idNotification = $this->ajouter_notification(
3653 $this->getVal($this->clePrimaire),
3654 $this->f->get_connected_user_login_name(),
3655 $destinataire[0],
3656 $collectivite_di,
3657 array(),
3658 true
3659 );
3660 if ($idNotification === false) {
3661 return $this->end_treatment(__METHOD__, false);
3662 }
3663 // Création de la tâche en lui donnant l'id de la notification
3664 $notification_by_task = $this->notification_by_task($idNotification, $dossier);
3665 if ($notification_by_task === false) {
3666 $this->addToMessage(
3667 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3668 );
3669 return $this->end_treatment(__METHOD__, false);
3670 }
3671 $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.")));
3672 return $this->end_treatment(__METHOD__, true);
3673 }
3674 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3675 return $this->end_treatment(__METHOD__, false);
3676 }
3677
3678 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3679 // Par défaut le type est portal
3680 if ($category === null) {
3681 $category = PORTAL;
3682 }
3683 // Si le type n'est pas correctement spécifié, alors il est calculé
3684 if ($type !== 'notification_recepisse'
3685 && $type !== 'notification_instruction'
3686 && $type !== 'notification_decision'
3687 && $type !== 'notification_service_consulte'
3688 && $type !== 'notification_tiers_consulte'
3689 && $type !== 'notification_depot_demat'
3690 && $type !== 'notification_commune') {
3691 //
3692 $type = 'notification_instruction';
3693 // Vérifie si l'instruction est un récépissé
3694 if ($this->is_instruction_recepisse()) {
3695 $type = 'notification_recepisse';
3696
3697 }
3698 // Vérifie si l'instruction est une décision
3699 if ($type !== 'notification_recepisse') {
3700 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3701 if ($avis_decision !== null && $avis_decision !== '') {
3702 $type = 'notification_decision';
3703 }
3704 }
3705 }
3706 // Préparation de la tache de notification
3707 $inst_task = $this->f->get_inst__om_dbform(array(
3708 "obj" => "task",
3709 "idx" => 0,
3710 ));
3711 $task_val = array(
3712 'type' => $type,
3713 'object_id' => $object_id,
3714 'dossier' => $dossier,
3715 'category' => $category,
3716 );
3717
3718 $add_task = $inst_task->add_task(array('val' => $task_val));
3719 if ($add_task === false) {
3720 $msgErreur = __('Echec de l\'ajout de la tâche de notification.').
3721 ' '.
3722 __('Paramétrage de la tâche : ').
3723 var_export($task_val, true);
3724 $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3725 return false;
3726 }
3727
3728 return true;
3729 }
3730
3731 /**
3732 * Cette méthode permet de savoir si l'instruction est une instruction
3733 * de recepisse (instruction lié à l'ajout du dossier).
3734 *
3735 * Pour cela, on récupère la liste des actions qui ont menées à la création
3736 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3737 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3738 * l'instruction et donc qu'il s'agit d'un recepisse.
3739 *
3740 * @return boolean
3741 */
3742 protected function is_instruction_recepisse() {
3743 // Récupère la liste des actions qui ont mené à la création de
3744 // l'instruction
3745 $trace = debug_backtrace();
3746 // Parcours la liste des actions et si une de ces actions est lié
3747 // à la classe demande on cosidère que l'instruction est un recepisse
3748 foreach ($trace as $key => $value) {
3749 if (isset($trace[$key]['class']) === true
3750 && empty($trace[$key]['class']) === false) {
3751 if (strtolower($trace[$key]['class']) === 'demande') {
3752 return true;
3753 }
3754 }
3755 }
3756 return false;
3757 }
3758
3759 /**
3760 * A partir des informations passée en argument ajoute un nouvel élément
3761 * dans la table instruction_notification.
3762 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3763 * paramètre si le paramétrage attendus est ok.
3764 * Ajoute également un nouvel élement dans instruction_notification_document
3765 * si l'instruction possède une lettretype.
3766 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3767 * élement dans la table instruction_notification_document qui correspondra
3768 * à l'annexe de la notification.
3769 *
3770 * @param integer identifiant de l'instruction notifiée
3771 * @param string information concernant l'emetteur
3772 * @param array tableau contenant 2 entrées
3773 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3774 * - courriel : adresse mail de la personne à notifier
3775 * @param integer identifiant de la collectivité permettant de récupèrer les
3776 * paramètres à valider
3777 * @param boolean indique si la notification est automatique ou manuelle
3778 * @param integer identifiant d'une instruction dont l'édition sera annexé
3779 * à la notification
3780 *
3781 * @return integer|boolean identifiant de la notification créée si le traitement
3782 * a réussie, false sinon.
3783 */
3784 protected function ajouter_notification(
3785 $idInstruction,
3786 $emetteur,
3787 $destinataire,
3788 $collectiviteId,
3789 $annexes = array(),
3790 $demandeAuto = false,
3791 $statut = 'en cours d\'envoi',
3792 $commentaire = 'Notification en cours de traitement'
3793 ) {
3794 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
3795 // de créer la notification
3796 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
3797 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
3798 $this->addToMessage($msgErreur);
3799 $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3800 return false;
3801 }
3802 // Préparation de la notification
3803 $inst_notif = $this->f->get_inst__om_dbform(array(
3804 "obj" => "instruction_notification",
3805 "idx" => "]",
3806 ));
3807 $notif_val = array(
3808 'instruction_notification' => null,
3809 'instruction' => $idInstruction,
3810 'automatique' => $demandeAuto,
3811 'emetteur' => $emetteur,
3812 'date_envoi' => null,
3813 'destinataire' => $destinataire['destinataire'],
3814 'courriel' => $destinataire['courriel'],
3815 'date_premier_acces' => null,
3816 'statut' => $statut,
3817 'commentaire' => $commentaire
3818 );
3819
3820 // Création de la notification
3821 $add_notif = $inst_notif->ajouter($notif_val);
3822 if ($add_notif === false) {
3823 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
3824 $msgErreur = __("Echec de l'ajout de la notification en base de données.").
3825 ' '.
3826 __('Paramétrage de la notification : ').
3827 var_export($notif_val, true);
3828 $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3829 return false;
3830 }
3831
3832 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
3833 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
3834 $add_notif_doc = $this->ajouter_notification_document(
3835 $inst_notif->getVal($inst_notif->clePrimaire),
3836 $this->getVal($this->clePrimaire),
3837 'instruction'
3838 );
3839 if ($add_notif_doc === false) {
3840 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
3841 return false;
3842 }
3843 }
3844 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
3845 if (! empty($annexes) && is_array($annexes)) {
3846 $add_notif_annexe = $this->ajouter_notification_document_multiple(
3847 $inst_notif->getVal($inst_notif->clePrimaire),
3848 $annexes
3849 );
3850 if ($add_notif_annexe === false) {
3851 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
3852 return false;
3853 }
3854 }
3855
3856 // Renvoie l'id de la nouvelle instance de instruction_notification
3857 return $inst_notif->getVal($inst_notif->clePrimaire);
3858 }
3859
3860 /**
3861 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
3862 * instance dans la table instruction_notification_document lié a la
3863 * notification dont l'id est passé en paramètre.
3864 *
3865 * @param array tableau contenant les informations nécessaires pour créer les annexes
3866 *
3867 * @return integer|boolean identifiant de la notification créée si le traitement
3868 * a réussie, false sinon.
3869 */
3870 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
3871 foreach ($listeDocument as $paramDoc) {
3872 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
3873 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
3874 return false;
3875 }
3876 }
3877 return true;
3878 }
3879
3880 /**
3881 * Ajoute un élément dans la table instruction_notification_document en utilisant
3882 * les éléments fourni en paramètre
3883 *
3884 * @param integer $idNotification : id de la notification à laquelle on associe le document
3885 * @param integer $idDocument : id de l'objet auquel est rattaché le document
3886 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
3887 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
3888 *
3889 * @return boolean indique si le traitement a réussi
3890 */
3891 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
3892 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
3893 "obj" => "instruction_notification_document",
3894 "idx" => "]",
3895 ));
3896 // l'attribut instruction doit obligatoirement être renseigné
3897 // pour éviter toutes confusion avec d'autres instruction l'id
3898 // 0 est donné au document n'appartenant pas aux instructions
3899 $notif_doc_val = array(
3900 'instruction_notification_document' => null,
3901 'instruction_notification' => $idNotification,
3902 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
3903 'document_type' => $tableDocument,
3904 'document_id' => $idDocument,
3905 'cle' => $this->getCleAccesDocument(),
3906 'annexe' => $isAnnexe
3907 );
3908
3909 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
3910 if ($add_notif_doc === false) {
3911 $msgErreur = __('Echec de l\'ajout du paramétrage du document notifié en base de données.').
3912 ' '.
3913 __('Paramétrage du document : ').
3914 var_export($notif_doc_val, true);
3915 $this->addToLog(__METHOD__."(): ".$msgErreur, DEBUG_MODE);
3916 return false;
3917 }
3918 return true;
3919 }
3920
3921 /**
3922 * Vérifie si le paramétrage de la notification des demandeurs est correct.
3923 *
3924 * @param integer identifiant de la collectivité
3925 * @return boolean
3926 */
3927 protected function is_parametrage_notification_correct($collectiviteId) {
3928 $categorie = $this->f->get_param_option_notification($collectiviteId);
3929 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
3930 if ($categorie == 'mail' && $urlAccesNotif == null) {
3931 return false;
3932 }
3933 return true;
3934 }
3935
3936 /**
3937 * TRIGGER - triggermodifierapres.
3938 *
3939 * @return boolean
3940 */
3941 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3942 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3943 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3944 $message = '';
3945
3946 // Définit si le dossier d'instruction doit être mis à jour
3947 $update_dossier = true;
3948 // Les actions de mise à jour des dates ne doivent pas appliquer
3949 // l'action de l'événement et donc ne pas mettre à jour le dossier
3950 if ($this->getParameter("maj") == 125
3951 || $this->getParameter("maj") == 170
3952 || $this->getParameter("maj") == 175) {
3953 //
3954 $update_dossier = false;
3955 }
3956
3957 // Traitement en cas de mise à jour du dossier
3958 if ($update_dossier === true) {
3959 /**
3960 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
3961 * si la date de l'evenement est modifiee
3962 */
3963 // Initialisation
3964 $valF = array();
3965 $valF_dt = array();
3966 // Initialisation du type d'événement
3967 $type_evmt = "";
3968 // Récupération de l'action correspondante à l'événement
3969 $sql = "SELECT action
3970 FROM ".DB_PREFIXE."evenement
3971 WHERE evenement=".$this->valF['evenement'];
3972 $action = $this->f->db->getone($sql);
3973 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
3974 $this->f->isDatabaseError($action);
3975
3976 // Récupération des paramètres de l'action
3977 $sql = "SELECT * FROM ".DB_PREFIXE."action
3978 WHERE action='".$action."'";
3979 $res = $this->f->db->query($sql);
3980 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3981 $this->f->isDatabaseError($res);
3982 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3983 // application des regles sur le courrier + delai
3984 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
3985 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
3986 }
3987 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
3988 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
3989 }
3990 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
3991 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3992 }
3993 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
3994 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3995 }
3996 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
3997 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
3998 }
3999 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4000 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4001 }
4002 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4003 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4004 }
4005 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4006 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4007 }
4008 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4009 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4010 }
4011 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4012 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4013 }
4014 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4015 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4016 }
4017 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4018 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4019 }
4020 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4021 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4022 }
4023 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4024 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4025 }
4026 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4027 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4028 }
4029 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4030 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4031 }
4032 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4033 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4034 }
4035 if ($row['regle_donnees_techniques1'] !== '') {
4036 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4037 }
4038 if ($row['regle_donnees_techniques2'] !== '') {
4039 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4040 }
4041 if ($row['regle_donnees_techniques3'] !== '') {
4042 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4043 }
4044 if ($row['regle_donnees_techniques4'] !== '') {
4045 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4046 }
4047 if ($row['regle_donnees_techniques5'] !== '') {
4048 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4049 }
4050 if ($row['regle_dossier_instruction_type'] !== '') {
4051 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4052 }
4053 }
4054 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4055 if (count($valF_dt) > 0) {
4056 $dt_id = $this->getDonneesTechniques();
4057 // On met à jour le dossier
4058 $cle = " donnees_techniques='".$dt_id."'";
4059 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4060 $this->addToLog(
4061 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4062 VERBOSE_MODE
4063 );
4064 $this->f->isDatabaseError($res1);
4065 // Affichage d'informations à l'utilisateur
4066 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4067 }
4068 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4069 if (count($valF) > 0) {
4070 //
4071 $inst_dossier = $this->f->get_inst__om_dbform(array(
4072 "obj" => "dossier",
4073 "idx" => $this->valF['dossier'],
4074 ));
4075 $valF['instruction'] = $id;
4076 $valF['crud'] = 'update';
4077 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4078 if ($update_by_instruction === false) {
4079 $this->cleanMessage();
4080 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4081 return false;
4082 }
4083 // Affichage d'informations à l'utilisateur
4084 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4085 }
4086 }
4087
4088 $restriction = $this->get_restriction($val['evenement']);
4089 $this->restriction_valid = $this->restrictionIsValid($restriction);
4090
4091 if($restriction == "" || $this->restriction_valid ){
4092 // Récupération de tous les paramètres de l'événement sélectionné
4093 $sql = "SELECT * FROM ".DB_PREFIXE."evenement
4094 WHERE evenement=".$this->valF['evenement'];
4095 $res = $this->f->db->query($sql);
4096 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
4097 $this->f->isDatabaseError($res);
4098 $current_id = $this->getVal($this->clePrimaire);
4099 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
4100 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4101 if ($this->getVal('date_retour_signature') == "" AND
4102 $this->valF['date_retour_signature'] != "" AND
4103 $row['evenement_retour_signature'] != "") {
4104 $new_instruction = $this->f->get_inst__om_dbform(array(
4105 "obj" => "instruction",
4106 "idx" => "]",
4107 ));
4108 // Création d'un tableau avec la liste des champs de l'instruction
4109 foreach($new_instruction->champs as $champ) {
4110 $valNewInstr[$champ] = "";
4111 }
4112 // Définition des valeurs de la nouvelle instruction
4113 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4114 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4115 $valNewInstr["dossier"] = $this->valF['dossier'];
4116 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4117 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4118 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4119 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4120 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4121 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4122 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4123 $new_instruction->setParameter("maj", 0);
4124 $new_instruction->class_actions[0]["identifier"] =
4125 sprintf(__("Ajout suite au retour signature de l'instruction %s"), $current_id);
4126 $retour = $new_instruction->ajouter($valNewInstr);
4127
4128 //Si une erreur s'est produite et qu'il s'agit d'un problème
4129 //de restriction
4130 if ($retour == false && !$new_instruction->restriction_valid){
4131 $error_message = $this->get_restriction_error_message($restriction);
4132 $this->f->displayMessage("error", $error_message);
4133 $this->addToLog(__METHOD__."(): evenement retour ".
4134 "instruction ".$this->valF[$this->clePrimaire]." : ".
4135 $new_instruction->msg);
4136 }
4137 //Si une erreur s'est produite après le test de la restriction
4138 elseif ($retour == false && $new_instruction->restriction_valid){
4139 $this->correct = false ;
4140 $this->msg .= $new_instruction->msg;
4141 return false;
4142 }
4143 }
4144 // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4145 if ($this->getVal('date_retour_rar') == "" AND
4146 $this->valF['date_retour_rar'] != "") {
4147
4148 if($row['evenement_retour_ar'] != "") {
4149 $new_instruction = $this->f->get_inst__om_dbform(array(
4150 "obj" => "instruction",
4151 "idx" => "]",
4152 ));
4153 // Création d'un tableau avec la liste des champs de l'instruction
4154 foreach($new_instruction->champs as $champ) {
4155 $valNewInstr[$champ] = "";
4156 }
4157 // Définition des valeurs de la nouvelle instruction
4158 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4159 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4160 $valNewInstr["dossier"] = $this->valF['dossier'];
4161 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4162 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4163 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4164 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4165 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4166 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4167 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4168 $new_instruction->setParameter("maj", 0);
4169 $new_instruction->class_actions[0]["identifier"] =
4170 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4171 $retour = $new_instruction->ajouter($valNewInstr);
4172
4173 //Si une erreur s'est produite et qu'il s'agit d'un problème
4174 //de restriction
4175 if ($retour == false && !$new_instruction->restriction_valid) {
4176 $error_message = $this->get_restriction_error_message($restriction);
4177 $this->f->displayMessage("error", $error_message);
4178 $this->addToLog(
4179 __METHOD__."(): evenement retour instruction ".
4180 $this->valF[$this->clePrimaire]." : ".
4181 $new_instruction->msg
4182 );
4183 }
4184 //Si une erreur s'est produite après le test de la restriction
4185 elseif ($retour == false && $new_instruction->restriction_valid){
4186 $this->correct = false ;
4187 $this->msg .= $new_instruction->msg;
4188 return false;
4189 }
4190 }
4191 }
4192 }
4193 }
4194
4195 // Traitement en cas de mise à jour du dossier
4196 if ($update_dossier === true) {
4197 /**
4198 * Mise à jour de la date de dernière modification du dossier
4199 * d'instruction
4200 */
4201 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4202 $inst_di->update_last_modification_date();
4203
4204 // Mise à jour des données du dossier d'autorisation
4205 $da = $this->f->get_inst__om_dbform(array(
4206 "obj" => "dossier_autorisation",
4207 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4208 ));
4209 $params = array(
4210 'di_id' => $this->getVal('dossier'),
4211 );
4212 if($da->majDossierAutorisation($params) === false) {
4213 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4214 $this->correct = false;
4215 return false;
4216 }
4217 }
4218
4219 // mise à jour des métadonnées issues des dates de suivi
4220 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4221 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4222 if ($dateRetourSignatureModified || $dateRetourRARModified) {
4223
4224 // Calculs des nouvelles métadonnées
4225 $metadata = $this->getMetadata("om_fichier_instruction");
4226
4227 // On vérifie si l'instruction à finaliser a un événement de type arrete
4228 $sql = "SELECT type FROM ".DB_PREFIXE."evenement WHERE evenement = ".$this->getVal("evenement");
4229 $typeEvenement = $this->f->db->getOne($sql);
4230 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4231 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4232 $this->correct = false;
4233 $this->addToMessage(__("Erreur de traitement de fichier."));
4234 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($typeEvenement->getMessage(), true), DEBUG_MODE);
4235 return false;
4236 }
4237
4238 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4239 if ($typeEvenement == 'arrete'){
4240 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4241 }
4242
4243 // Filtre pour conserver uniquement les métadonnées liées aux dates
4244 $metadataToKeep = array(
4245 "statutAutorisation",
4246 "dateEvenementDocument",
4247 'date_cloture_metier',
4248 "NotificationArrete",
4249 "dateNotificationArrete",
4250 "controleLegalite",
4251 "dateSignature",
4252 "nomSignataire",
4253 "qualiteSignataire",
4254 "dateControleLegalite",
4255 );
4256 $metadata = array_filter(
4257 $metadata,
4258 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4259 ARRAY_FILTER_USE_KEY
4260 );
4261
4262 // Mise à jour des métadonnées du document en GED
4263 $docUid = $this->getVal("om_fichier_instruction");
4264 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4265 if ($operationOrUID == 'OP_FAILURE') {
4266 $this->correct = false;
4267 $this->addToMessage(__("Erreur de traitement de fichier."));
4268 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4269 return false;
4270 }
4271
4272 // mise à jour de l'UID du document en BDD
4273 else {
4274 $valF = array('om_fichier_instruction' => $operationOrUID);
4275 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4276 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4277 if ($this->f->isDatabaseError($res, true) === true) {
4278 $this->correct = false;
4279 $this->addToMessage(__("Erreur de traitement de fichier."));
4280 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4281 return false;
4282 }
4283 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4284 }
4285 }
4286
4287 // Déclenchement des notifications automatique après finalisation et
4288 // retour de signature
4289 if ($dateRetourSignatureModified === true
4290 && $this->valF['date_retour_signature'] !== ''
4291 && $this->valF['date_retour_signature'] !== null) {
4292
4293 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4294 $msgLog = __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.').
4295 ' '.
4296 __('Instruction notifiée : ').
4297 $id;
4298
4299 // Récupération de l'instance de l'événement pour accéder au paramètrage
4300 // des notifications
4301 $ev = $this->get_inst_evenement($this->valF['evenement']);
4302 // Si la notification automatique des tiers consulté est active
4303 // déclenche le traitement de notification.
4304 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4305 $typeNotifTiers = $ev->getVal('notification_tiers');
4306 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4307 if ($typeNotifTiers === 'notification_automatique') {
4308 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4309 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4310 $this->correct = false;
4311 }
4312 }
4313
4314 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4315 // Récupération de la liste des demandeurs à notifier et de la catégorie
4316 $categorie = $this->f->get_param_option_notification($collectivite_di);
4317 $isPortal = $categorie == null || $categorie == '' || $categorie == PORTAL ? true : false;
4318 $demandeursANotifie = $this->get_demandeurs_notifiable(
4319 $this->valF['dossier'],
4320 $isPortal
4321 );
4322
4323 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4324 $demandeurPrincipalNotifie = false;
4325 foreach ($demandeursANotifie as $demandeur) {
4326 // Identifie si le demandeur principal a été notifié ou pas
4327 // et récupère ses informations
4328 if ($demandeur['petitionnaire_principal'] == 't') {
4329 $demandeurPrincipalNotifie = true;
4330 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4331 // son paramétrage, on effectue pas le traitement et on passe à l'itération
4332 // suivante. On le considère également comme non notifié pour gérer l'envoie
4333 // des messages d'erreurs
4334 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4335 // d'impact sur la notification
4336 $erreursParam = $this->get_info_notification_fail();
4337 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4338 $demandeurPrincipalNotifie = false;
4339 continue;
4340 }
4341 }
4342 // Ajout de la notif et récupération de son id
4343 $idNotif = $this->ajouter_notification(
4344 $this->valF[$this->clePrimaire],
4345 $this->f->get_connected_user_login_name(),
4346 $demandeur,
4347 $collectivite_di,
4348 array(),
4349 true
4350 );
4351 if ($idNotif === false) {
4352 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
4353 return false;
4354 }
4355 // Création de la tache en lui donnant l'id de la notification
4356 $notification_by_task = $this->notification_by_task(
4357 $idNotif,
4358 $this->valF['dossier'],
4359 $categorie
4360 );
4361 if ($notification_by_task === false) {
4362 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
4363 $this->addToMessage(
4364 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4365 );
4366 return false;
4367 }
4368 }
4369 // Pour la notification par mail ou la notification via portal si le dossier a
4370 // été déposés via portal, si le demandeur principal n'est pas notifiable,
4371 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4372 // laquelle le demandeur principal n'a pas pu être notifié
4373 $depotPortal = $this->dossier_depose_sur_portail();
4374 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4375 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4376 $msgLog .= ' '.__('Le pétitionnaire principale n\'est pas notifiable.');
4377 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4378 $erreursParam = $this->get_info_notification_fail();
4379 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4380 // Ajout de la notif et récupération de son id
4381 $idNotif = $this->ajouter_notification(
4382 $this->valF[$this->clePrimaire],
4383 $this->f->get_connected_user_login_name(),
4384 $demandeurPrincipal,
4385 $collectivite_di,
4386 array(),
4387 true,
4388 'Echec',
4389 implode(' ', $erreursParam)
4390 );
4391 if ($idNotif === false) {
4392 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
4393 $this->addToMessage(
4394 __('Erreur : la création de la notification a échouée.').
4395 __("Veuillez contacter votre administrateur.")
4396 );
4397 return false;
4398 }
4399 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4400 // de l'échec de la notification
4401 $dossier_message = $this->get_inst_dossier_message(0);
4402 $dossier_message_val = array(
4403 'dossier' => $this->getVal('dossier'),
4404 'type' => _('erreur expedition'),
4405 'emetteur' => $this->f->get_connected_user_login_name(),
4406 'login' => $_SESSION['login'],
4407 'date_emission' => date('Y-m-d H:i:s'),
4408 'contenu' => _('Échec lors de la notification de l\'instruction ').
4409 $ev->getVal('libelle').
4410 '.<br>'.
4411 implode("\n", $erreursParam).
4412 '<br>'.
4413 _('Veuillez corriger ces informations avant de renvoyer la notification.')
4414 );
4415 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4416 // Si une erreur se produit pendant l'ajout
4417 if ($add !== true) {
4418 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4419 return false;
4420 }
4421 }
4422 $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.")));
4423 }
4424 }
4425
4426 return $this->add_log_to_dossier($id, $val);
4427 }
4428
4429 /**
4430 * TRIGGER - triggersupprimer.
4431 *
4432 * @return boolean
4433 */
4434 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4435 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4436 /**
4437 * L'objectif ici est de repositionner les valeurs récupérées en
4438 * archive dans le dossier d'instruction avant de supprimer l'événement
4439 * d'instruction si les valeurs du dossier sont différentes
4440 */
4441 $valF = array();
4442 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4443 foreach ($inst_di->champs as $key => $champ) {
4444 // Si le champ du DI à une archive dans l'instruction
4445 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4446 // Si la valeur entre le champ du DI et son archive dans instruction
4447 // est différente
4448 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4449 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4450 }
4451 }
4452 }
4453 // Spécificité du champ avis_decision dont le champ archive est nommé
4454 // différemment
4455 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4456 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4457 }
4458 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4459 // par l'archive
4460 unset($valF['date_affichage']);
4461
4462 /**
4463 * Mise à jour de la version de clôture *version_clos* du dossier si et
4464 * seulement si l'instruction met à jour l'état du dossier.
4465 */
4466 if (isset($valF['etat']) === true
4467 && $valF['etat'] !== null
4468 && $valF['etat'] !== '') {
4469 // Récupère l'état actuel du dossier d'instruction
4470 $inst_current_etat = $this->f->get_inst__om_dbform(array(
4471 "obj" => "etat",
4472 "idx" => $inst_di->get_id_etat(),
4473 ));
4474 // Instanciation de l'état archivé appliqué sur le dossier
4475 $inst_etat = $this->f->get_inst__om_dbform(array(
4476 "obj" => "etat",
4477 "idx" => $valF['etat'],
4478 ));
4479 //
4480 $update_version_clos = null;
4481 // En cas de clôture du dossier par l'état archivé
4482 if ($inst_etat->getVal('statut') === 'cloture') {
4483 $update_version_clos = $inst_di->update_version_clos('up');
4484 }
4485 // En cas de réouverture du dossier par l'état archivé
4486 if ($inst_current_etat->getVal('statut') === 'cloture'
4487 && $inst_etat->getVal('statut') !== 'cloture') {
4488 //
4489 $update_version_clos = $inst_di->update_version_clos('down');
4490 //
4491 $this->set_att_di_reopened(true);
4492 }
4493 //
4494 if ($update_version_clos === false) {
4495 $this->f->addToLog(sprintf(
4496 "%s() : ERREUR - %s %s",
4497 __METHOD__,
4498 sprintf(
4499 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4500 $inst_di->getVal($inst_di->clePrimaire)
4501 ),
4502 sprintf(
4503 __("L'instruction tente d'appliquer l'état %s."),
4504 $inst_etat->getVal($inst_etat->clePrimaire)
4505 )
4506 ));
4507 $this->addToMessage(sprintf(
4508 "%s %s",
4509 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4510 __("Veuillez contacter votre administrateur.")
4511 ));
4512 return false;
4513 }
4514 }
4515 // On supprime toutes les notications liées à l'instruction
4516 $notifASupprimer = $this->get_instruction_notification(
4517 $this->getVal($this->clePrimaire),
4518 array(
4519 'notification_recepisse',
4520 'notification_instruction',
4521 'notification_decision',
4522 'notification_service_consulte',
4523 'notification_tiers_consulte',
4524 'notification_depot_demat',
4525 'notification_commune'
4526 ),
4527 true
4528 );
4529
4530 foreach ($notifASupprimer as $idNotif) {
4531 $inst_notif = $this->f->get_inst__om_dbform(array(
4532 "obj" => "instruction_notification",
4533 "idx" => $idNotif,
4534 ));
4535 $val_notif = array();
4536 foreach ($inst_notif->champs as $champ) {
4537 $val_notif[$champ] = $inst_notif->getVal($champ);
4538 }
4539 // La suppression des notifications entrainera la suppression des tâches qui y sont
4540 // liées
4541 $supprNotif = $inst_notif->supprimer($val_notif);
4542 if ($supprNotif == false) {
4543 $this->addToMessage(sprintf(
4544 "%s %s",
4545 __("Erreur lors de la suppression des notifications de l'instruction."),
4546 __("Veuillez contacter votre administrateur.")
4547 ));
4548 return false;
4549 }
4550 }
4551
4552 // On met à jour le dossier
4553 $valF['instruction'] = $id;
4554 $valF['crud'] = 'delete';
4555 $update_by_instruction = $inst_di->update_by_instruction($valF);
4556 if ($update_by_instruction === false) {
4557 $this->cleanMessage();
4558 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4559 return false;
4560 }
4561
4562 // Affichage d'informations à l'utilisateur
4563 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4564
4565 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4566 }
4567
4568 /**
4569 * TRIGGER - triggersupprimerapres.
4570 *
4571 * @return boolean
4572 */
4573 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4574 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4575 /**
4576 * Mise à jour de la date de dernière modification du dossier
4577 * d'instruction
4578 */
4579 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4580 $inst_di->update_last_modification_date();
4581
4582 /**
4583 * Mise à jour des données du dossier d'autorisation
4584 */
4585 $da = $this->f->get_inst__om_dbform(array(
4586 "obj" => "dossier_autorisation",
4587 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4588 ));
4589 $params = array(
4590 'di_id' => $this->getVal('dossier'),
4591 'di_reopened' => $this->get_att_di_reopened(),
4592 );
4593 if($da->majDossierAutorisation($params) === false) {
4594 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4595 $this->correct = false;
4596 return false;
4597 }
4598
4599 /**
4600 * Gestion des tâches pour la dématérialisation
4601 */
4602 $inst_task_empty = $this->f->get_inst__om_dbform(array(
4603 "obj" => "task",
4604 "idx" => 0,
4605 ));
4606 foreach ($inst_di->task_types as $task_type) {
4607 $task_exists = $inst_task_empty->task_exists($task_type, $id);
4608 if ($task_exists !== false) {
4609 $inst_task = $this->f->get_inst__om_dbform(array(
4610 "obj" => "task",
4611 "idx" => $task_exists,
4612 ));
4613 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4614 $task_val = array(
4615 'state' => $inst_task::STATUS_CANCELED,
4616 );
4617 $update_task = $inst_task->update_task(array('val' => $task_val));
4618 if ($update_task === false) {
4619 $this->addToMessage(sprintf('%s %s',
4620 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4621 __("Veuillez contacter votre administrateur.")
4622 ));
4623 $this->correct = false;
4624 return false;
4625 }
4626 }
4627 }
4628 }
4629
4630 //
4631 $val['evenement'] = $this->getVal('evenement');
4632 return $this->add_log_to_dossier($id, $val);
4633 }
4634
4635 /**
4636 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4637 * "di_reopened".
4638 *
4639 * @param boolean $val
4640 */
4641 function set_att_di_reopened($val) {
4642 $this->di_reopened = $val;
4643 }
4644
4645 /**
4646 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4647 *
4648 * @return boolean
4649 */
4650 function get_att_di_reopened() {
4651 return $this->di_reopened;
4652 }
4653
4654 /**
4655 * Permet de composer un message d'erreur sur restriction non valide en
4656 * fonction du contexte.
4657 *
4658 * @param string $restriction formule de la restriction
4659 *
4660 * @return string message d'erreur
4661 */
4662 function get_restriction_error_message($restriction) {
4663 // Affichage du message si la restriction s'applique
4664 // Contexte du suivi des dates (message simple)
4665 $message_restrict = _("Probleme de dates :");
4666 // Split restriction
4667 $champs_restrict = preg_split(
4668 '/(\W+)/',
4669 $restriction,
4670 null,
4671 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4672 );
4673 $formated_restrict = "";
4674 // Ajout des chaînes à traduire
4675 foreach ($champs_restrict as $value) {
4676 $formated_restrict .= _($value)." ";
4677 }
4678 $formated_restrict = substr($formated_restrict, 0, -1);
4679 // Message d'erreur dans le contexte du suivi des dates
4680 if($this->getParameter("maj") == 170) {
4681 $message_restrict .= " "._("contactez l'instructeur du dossier");
4682 $message_restrict .= "<br/>(".$formated_restrict.")";
4683 } else {
4684 // Affichage du message si la restriction s'applique
4685 // Contexte instruction
4686 $message_restrict .= "<br/>".$formated_restrict;
4687 }
4688
4689 return $message_restrict;
4690 }
4691
4692 /**
4693 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4694 * les vérifications suivantes :
4695 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4696 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
4697 * le message d'erreur associé à la restriction
4698 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
4699 * et / ou la modification et affiche un message d'erreur
4700 * -
4701 * -
4702 * -
4703 * -
4704 * -
4705 * -
4706 *
4707 * @param array val : tableau contenant les valeurs issues du formulaire.
4708 * @param - dnu1 : Paramètre déprécié et non utilisé.
4709 * @param - dnu2 : Paramètre déprécié et non utilisé.
4710 *
4711 * @return void
4712 */
4713 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
4714 parent::verifier($val);
4715 //
4716 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
4717 $restriction = $this->get_restriction($val['evenement']);
4718
4719 //Test qu'une restriction est présente
4720 if ($restriction != "" ){
4721
4722 //Test si la restriction est valide
4723 $this->restriction_valid = $this->restrictionIsValid($restriction);
4724 if ( !$this->restriction_valid ){
4725
4726 // Affichage du message si la restriction s'applique
4727 $this->addToMessage(
4728 $this->get_restriction_error_message($restriction)
4729 );
4730 $this->correct=false;
4731 return false;
4732 }
4733
4734 // Liste des opérateurs possible
4735 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
4736 // Supprime tous les espaces de la chaîne de caractère
4737 $restriction = str_replace(' ', '', $restriction);
4738
4739 // Met des espace avant et après les opérateurs puis transforme la
4740 // chaine en un tableau
4741 $tabRestriction = str_replace($operateurs, " ", $restriction);
4742 // Tableau des champ
4743 $tabRestriction = explode(" ", $tabRestriction);
4744 // Supprime les numériques du tableau
4745 foreach ($tabRestriction as $key => $value) {
4746 if (is_numeric($value)) {
4747 unset($tabRestriction[$key]);
4748 }
4749 }
4750
4751 // Vérifie les champs utilisés pour la restriction
4752 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
4753 if ($check_field_exist !== true) {
4754
4755 // Liste des champs en erreur
4756 $string_error_fields = implode(", ", $check_field_exist);
4757
4758 // Message d'erreur
4759 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
4760 if (count($check_field_exist) > 1) {
4761 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
4762 }
4763
4764 // Affiche l'erreur
4765 $this->correct=false;
4766 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
4767 $this->addToMessage(_("Veuillez contacter votre administrateur."));
4768 }
4769 }
4770
4771 }
4772 if(!$this->updateDate("date_envoi_signature")) {
4773 return false;
4774 }
4775 if(!$this->updateDate("date_retour_signature")) {
4776 return false;
4777 }
4778 if(!$this->updateDate("date_envoi_rar")) {
4779 return false;
4780 }
4781 if(!$this->updateDate("date_retour_rar")) {
4782 return false;
4783 }
4784 if(!$this->updateDate("date_envoi_controle_legalite")) {
4785 return false;
4786 }
4787 if(!$this->updateDate("date_retour_controle_legalite")) {
4788 return false;
4789 }
4790
4791 }
4792
4793 /**
4794 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
4795 * principal du dossier auquel appartiens l'instruction.
4796 * Renvoie un tableau contenant les informations du pétitionnaire principal.
4797 *
4798 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
4799 * et affiche un message dans les logs.
4800 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
4801 *
4802 * @param string identifiant du dossier
4803 * @return array|boolean
4804 */
4805 protected function get_info_petitionnaire_principal_dossier($dossier = null) {
4806 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
4807 // l'objet courant
4808 if (empty($dossier)) {
4809 $dossier = $this->getVal('dossier');
4810 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
4811 // false et on affiche un message d'erreur dans les logs
4812 if (empty($dossier)) {
4813 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
4814 return false;
4815 }
4816 }
4817
4818 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
4819 // principal
4820 $qres = $this->f->get_all_results_from_db_query(
4821 sprintf(
4822 'SELECT
4823 -- Récupère toutes les informations du demandeur principal
4824 demandeur.*,
4825 CASE
4826 WHEN demandeur.qualite=\'particulier\'
4827 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
4828 ELSE
4829 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
4830 END AS destinataire
4831 FROM
4832 %1$sdossier
4833 LEFT JOIN %1$slien_dossier_demandeur
4834 ON lien_dossier_demandeur.dossier = dossier.dossier
4835 LEFT JOIN %1$sdemandeur
4836 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4837 WHERE
4838 dossier.dossier = \'%2$s\'
4839 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
4840 DB_PREFIXE,
4841 $this->f->db->escapeSimple($dossier)
4842 ),
4843 array(
4844 "origin" => __METHOD__,
4845 )
4846 );
4847 if (is_array($qres["result"]) === true
4848 && array_key_exists(0, $qres["result"]) === true) {
4849 //
4850 return $qres["result"][0];
4851 }
4852 return null;
4853 }
4854
4855
4856
4857 /**
4858 * Finalisation des documents.
4859 * @param string $champ champ du fichier à finaliser
4860 * @param booleen $status permet de définir si on finalise ou définalise
4861 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
4862 */
4863 function manage_finalizing($mode = null, $val = array()) {
4864 //
4865 $this->begin_treatment(__METHOD__);
4866
4867 //
4868 $id_inst = $this->getVal($this->clePrimaire);
4869
4870 //
4871 $admin_msg_error = _("Veuillez contacter votre administrateur.");
4872 $file_msg_error = _("Erreur de traitement de fichier.")
4873 ." ".$admin_msg_error;
4874 $bdd_msg_error = _("Erreur de base de données.")
4875 ." ".$admin_msg_error;
4876 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
4877
4878 // Si on finalise le document
4879 if ($mode == "finalize"){
4880 //
4881 $etat = _('finalisation');
4882
4883 // Récupère la collectivite du dossier d'instruction
4884 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
4885
4886 //
4887 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
4888
4889 //
4890 $params = array(
4891 "specific" => array(),
4892 );
4893 // Si la rédaction libre est activée sur l'instruction
4894 if ($this->getVal("flag_edition_integrale") == 't') {
4895 $params["specific"]["corps"] = array(
4896 "mode" => "set",
4897 "value" => $this->getVal("corps_om_htmletatex"),
4898 );
4899 $params["specific"]["titre"] = array(
4900 "mode" => "set",
4901 "value" => $this->getVal("titre_om_htmletat"),
4902 );
4903 }
4904 // Génération du PDF
4905 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
4906 $pdf_output = $result['pdf_output'];
4907
4908 //Métadonnées du document
4909 $metadata = array(
4910 'filename' => 'instruction_'.$id_inst.'.pdf',
4911 'mimetype' => 'application/pdf',
4912 'size' => strlen($pdf_output)
4913 );
4914
4915 // Récupération des métadonnées calculées après validation
4916 $spe_metadata = $this->getMetadata("om_fichier_instruction");
4917
4918 //On vérifie si l'instruction à finaliser a un événement de type arrete
4919 $sql = "SELECT type
4920 FROM ".DB_PREFIXE."evenement
4921 WHERE evenement = ".$this->getVal("evenement");
4922 $typeEvenement = $this->f->db->getOne($sql);
4923 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4924 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4925 $this->correct = false;
4926 $this->addToMessage($bdd_msg_error);
4927 return $this->end_treatment(__METHOD__, false);
4928 }
4929
4930 //Initialisation de la variable
4931 $arrete_metadata = array();
4932 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4933 if ( $typeEvenement === 'arrete' ){
4934 $arrete_metadata = $this->getMetadata("arrete");
4935 }
4936
4937 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
4938
4939 /*
4940 // transforme le tableau de métadonnées en objet
4941 $mdf = new MetadataFactory();
4942 $md = $mdf->build('Instruction', $metadata);
4943 */
4944
4945 // Si le document a déjà été finalisé on le met à jour
4946 // en conservant son UID
4947 if ($this->getVal("om_fichier_instruction") != ''){
4948 $uid = $this->f->storage->update(
4949 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
4950 }
4951 // Sinon on crée un nouveau document et dont on récupère l'UID
4952 else {
4953 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
4954 }
4955 }
4956
4957 // Si on définalise le document
4958 if ($mode == "unfinalize") {
4959 //
4960 $etat = _('définalisation');
4961 // Récupération de l'uid du document finalisé
4962 $uid = $this->getVal("om_fichier_instruction");
4963 }
4964
4965 // Si on définalise l'UID doit être défini
4966 // Si on finalise la création/modification du fichier doit avoir réussi
4967 if ($uid == '' || $uid == 'OP_FAILURE' ) {
4968 $this->correct = false;
4969 $this->addToMessage($file_msg_error);
4970 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4971 return $this->end_treatment(__METHOD__, false);
4972 }
4973
4974 //
4975 foreach ($this->champs as $key => $champ) {
4976 //
4977 $val[$champ] = $this->val[$key];
4978 }
4979
4980 //
4981 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
4982 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
4983 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
4984 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
4985 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
4986 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
4987 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
4988 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
4989 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
4990 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
4991 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
4992 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
4993 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
4994 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
4995 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
4996 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
4997 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
4998 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
4999 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5000 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5001 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5002 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5003 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5004 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5005 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5006 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5007 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5008 $this->setvalF($val);
5009
5010 // Verification de la validite des donnees
5011 $this->verifier($this->val);
5012 // Si les verifications precedentes sont correctes, on procede a
5013 // la modification, sinon on ne fait rien et on retourne une erreur
5014 if ($this->correct === true) {
5015 //
5016 $valF = array(
5017 "om_fichier_instruction" => $uid,
5018 "date_finalisation_courrier" => date('Y-m-d')
5019 );
5020 //
5021 if($mode=="finalize") {
5022 // état finalisé vrai
5023 $valF["om_final_instruction"] = true;
5024 // ajout log utilisateur
5025 $login = $_SESSION['login'];
5026 $nom = "";
5027 $this->f->getUserInfos();
5028 if (isset($this->f->om_utilisateur["nom"])
5029 && !empty($this->f->om_utilisateur["nom"])) {
5030 $nom = $this->f->om_utilisateur["nom"];
5031 }
5032 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5033 if ($nom != "") {
5034 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5035 }
5036 } else {
5037 // état finalisé faux
5038 $valF["om_final_instruction"] = false;
5039 // suppression log utilisateur
5040 $valF["om_final_instruction_utilisateur"] = '';
5041 }
5042
5043 // Execution de la requête de modification des donnees de l'attribut
5044 // valF de l'objet dans l'attribut table de l'objet
5045 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5046 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5047 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5048 //
5049 if ($this->f->isDatabaseError($res, true) === true) {
5050 $this->correct = false;
5051 $this->addToMessage($bdd_msg_error);
5052 return $this->end_treatment(__METHOD__, false);
5053 }
5054
5055 //
5056 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5057 //
5058 if ($this->add_log_to_dossier($id_inst, $val) === false) {
5059 return $this->end_treatment(__METHOD__, false);
5060 }
5061 //
5062 return $this->end_treatment(__METHOD__, true);
5063 }
5064 // L'appel de verifier() a déjà positionné correct à false
5065 // et défini un message d'erreur.
5066 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5067 return $this->end_treatment(__METHOD__, false);
5068 }
5069
5070 /**
5071 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5072 * @return string numéro de dossier d'instruction
5073 */
5074 protected function getDossier($champ = null) {
5075 if(empty($this->specificMetadata)) {
5076 $this->getSpecificMetadata();
5077 }
5078 return $this->specificMetadata->dossier;
5079 }
5080 /**
5081 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5082 * @return int Version
5083 */
5084 protected function getDossierVersion() {
5085 if(empty($this->specificMetadata)) {
5086 $this->getSpecificMetadata();
5087 }
5088 return $this->specificMetadata->version;
5089 }
5090 /**
5091 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5092 * @return string numéro de dossier d'autorisation
5093 */
5094 protected function getNumDemandeAutor() {
5095 if(empty($this->specificMetadata)) {
5096 $this->getSpecificMetadata();
5097 }
5098 return $this->specificMetadata->dossier_autorisation;
5099 }
5100 /**
5101 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5102 * @return date de la demande initiale
5103 */
5104 protected function getAnneemoisDemandeAutor() {
5105 if(empty($this->specificMetadata)) {
5106 $this->getSpecificMetadata();
5107 }
5108 return $this->specificMetadata->date_demande_initiale;
5109 }
5110 /**
5111 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5112 * @return string type du dossier d'instruction
5113 */
5114 protected function getTypeInstruction() {
5115 if(empty($this->specificMetadata)) {
5116 $this->getSpecificMetadata();
5117 }
5118 return $this->specificMetadata->dossier_instruction_type;
5119 }
5120 /**
5121 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5122 * @return string avis
5123 */
5124 protected function getStatutAutorisation() {
5125 if(empty($this->specificMetadata)) {
5126 $this->getSpecificMetadata();
5127 }
5128 return $this->specificMetadata->statut;
5129 }
5130 /**
5131 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5132 * @return string type du dossier d'autorisation
5133 */
5134 protected function getTypeAutorisation() {
5135 if(empty($this->specificMetadata)) {
5136 $this->getSpecificMetadata();
5137 }
5138 return $this->specificMetadata->dossier_autorisation_type;
5139 }
5140 /**
5141 * Récupération de la date d'ajout de document à ajouter aux métadonnées
5142 * @return date de l'évènement
5143 */
5144 protected function getDateEvenementDocument() {
5145 return date("Y-m-d");
5146 }
5147 /**
5148 * Récupération du groupe d'instruction à ajouter aux métadonnées
5149 * @return string Groupe d'instruction
5150 */
5151 protected function getGroupeInstruction() {
5152 if(empty($this->specificMetadata)) {
5153 $this->getSpecificMetadata();
5154 }
5155 return $this->specificMetadata->groupe_instruction;
5156 }
5157 /**
5158 * Récupération du libellé du type du document à ajouter aux métadonnées
5159 * @return string Groupe d'instruction
5160 */
5161 protected function getTitle() {
5162
5163 // Récupère le champ événement
5164 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5165 $evenement = $this->valF["evenement"];
5166 } else {
5167 $evenement = $this->getVal("evenement");
5168 }
5169
5170 // Requête sql
5171 $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
5172 WHERE evenement=".$evenement;
5173 $evenement_libelle = $this->f->db->getone($sql);
5174 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
5175 $this->f->isDatabaseError($evenement_libelle);
5176 // Retourne le libelle de l'événement
5177 return $evenement_libelle;
5178 }
5179
5180
5181 /**
5182 * Récupération du champ ERP du dossier d'instruction.
5183 *
5184 * @return boolean
5185 */
5186 public function get_concerne_erp() {
5187 //
5188 if(empty($this->specificMetadata)) {
5189 $this->getSpecificMetadata();
5190 }
5191 //
5192 return $this->specificMetadata->erp;
5193 }
5194
5195
5196 /**
5197 * Cette méthode permet de stocker en attribut toutes les métadonnées
5198 * nécessaire à l'ajout d'un document.
5199 */
5200 public function getSpecificMetadata() {
5201 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5202 $dossier = $this->valF["dossier"];
5203 } else {
5204 $dossier = $this->getVal("dossier");
5205 }
5206 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5207 $sql = "SELECT dossier.dossier as dossier,
5208 dossier_autorisation.dossier_autorisation as dossier_autorisation,
5209 to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
5210 dossier_instruction_type.code as dossier_instruction_type,
5211 etat_dossier_autorisation.libelle as statut,
5212 dossier_autorisation_type.code as dossier_autorisation_type,
5213 groupe.code as groupe_instruction,
5214 CASE WHEN dossier.erp IS TRUE
5215 THEN 'true'
5216 ELSE 'false'
5217 END as erp
5218 FROM ".DB_PREFIXE."dossier
5219 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
5220 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5221 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5222 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5223 LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
5224 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5225 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5226 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5227 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5228 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5229 LEFT JOIN ".DB_PREFIXE."groupe
5230 ON dossier_autorisation_type.groupe = groupe.groupe
5231 WHERE dossier.dossier = '".$dossier."'";
5232 $res = $this->f->db->query($sql);
5233 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
5234 $this->f->isDatabaseError($res);
5235 //Le résultat est récupéré dans un objet
5236 $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
5237
5238 //Si il y a un résultat
5239 if ($row !== null) {
5240
5241 // Instrance de la classe dossier
5242 $inst_dossier = $this->get_inst_dossier($dossier);
5243
5244 // Insère l'attribut version à l'objet
5245 $row->version = $inst_dossier->get_dossier_instruction_version();
5246
5247 //Alors on créé l'objet dossier_instruction
5248 $this->specificMetadata = $row;
5249
5250 }
5251 }
5252
5253 /**
5254 * Retourne le statut du dossier d'instruction
5255 * @param string $idx Identifiant du dossier d'instruction
5256 * @return string Le statut du dossier d'instruction
5257 */
5258 function getStatutAutorisationDossier($idx){
5259
5260 $statut = '';
5261
5262 //Si l'identifiant du dossier d'instruction fourni est correct
5263 if ( $idx != '' ){
5264
5265 //On récupère le statut de l'état du dossier à partir de l'identifiant du
5266 //dossier
5267 $sql = "SELECT etat.statut
5268 FROM ".DB_PREFIXE."dossier
5269 LEFT JOIN
5270 ".DB_PREFIXE."etat
5271 ON
5272 dossier.etat = etat.etat
5273 WHERE dossier ='".$idx."'";
5274 $statut = $this->f->db->getone($sql);
5275 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\")", VERBOSE_MODE);
5276 $this->f->isDatabaseError($statut);
5277 }
5278 return $statut;
5279 }
5280
5281 /**
5282 * Récupère les données du dossier
5283 * @return array
5284 */
5285 function get_dossier_actual() {
5286
5287 // Initialisation de la valeur de retour
5288 $return = array();
5289
5290 // Récupération de toutes les valeurs du dossier d'instruction en cours
5291 $sql = "SELECT * FROM ".DB_PREFIXE."dossier
5292 WHERE dossier='".$this->valF['dossier']."'";
5293 $res = $this->f->db->query($sql);
5294 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
5295 $this->f->isDatabaseError($res);
5296
5297 //
5298 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5299
5300 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5301 // de l'état et de l'avis du dossier d'instruction
5302 $return['archive_delai'] = $row['delai'];
5303 $return['archive_accord_tacite'] = $row['accord_tacite'];
5304 $return['archive_etat'] = $row['etat'];
5305 $return['archive_avis'] = $row['avis_decision'];
5306 // Récupération de la valeur actuelle des dates du dossier
5307 // d'instruction
5308 $return['archive_date_complet'] = $row['date_complet'];
5309 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5310 $return['archive_date_rejet'] = $row['date_rejet'];
5311 $return['archive_date_limite'] = $row['date_limite'];
5312 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5313 $return['archive_date_decision'] = $row['date_decision'];
5314 $return['archive_date_validite'] = $row['date_validite'];
5315 $return['archive_date_achevement'] = $row['date_achevement'];
5316 $return['archive_date_chantier'] = $row['date_chantier'];
5317 $return['archive_date_conformite'] = $row['date_conformite'];
5318 $return['archive_incompletude'] = $row['incompletude'];
5319 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5320 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5321 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5322 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5323 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5324 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5325 $return['archive_autorite_competente'] = $row['autorite_competente'];
5326 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5327 $return['duree_validite'] = $row['duree_validite'];
5328 $return['date_depot'] = $row['date_depot'];
5329 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5330 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5331 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5332 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5333 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5334 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5335 $return['archive_date_ait'] = $row['date_ait'];
5336 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5337 $return['archive_date_affichage'] = $row['date_affichage'];
5338 $return['archive_pec_metier'] = $row['pec_metier'];
5339 $return['archive_a_qualifier'] = $row['a_qualifier'];
5340 }
5341
5342 // Retour de la fonction
5343 return $return;
5344
5345 }
5346
5347 /**
5348 * Permet de vérifier qu'un événement est verrouillable
5349 * @param integer $idx Identifiant de l'instruction
5350 * @return boolean
5351 */
5352 function checkEvenementNonVerrouillable($idx) {
5353
5354 // Initialisation du résultat
5355 $non_verrouillable = false;
5356
5357 // Si la condition n'est pas vide
5358 if ($idx != "") {
5359
5360 // Requête SQL
5361 $sql = "SELECT evenement.non_verrouillable
5362 FROM ".DB_PREFIXE."evenement
5363 LEFT JOIN ".DB_PREFIXE."instruction
5364 ON instruction.evenement = evenement.evenement
5365 WHERE instruction.instruction = $idx";
5366 $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
5367 $res = $this->f->db->getOne($sql);
5368 $this->f->isDatabaseError($res);
5369
5370 // Si le retour de la requête est true
5371 if ($res == 't') {
5372 //
5373 $non_verrouillable = true;
5374 }
5375 }
5376
5377 // Retourne résultat
5378 return $non_verrouillable;
5379 }
5380
5381 /**
5382 * Mise à jour des champs archive_*
5383 * @param mixed $row La ligne de données
5384 */
5385 public function updateArchiveData($row){
5386
5387 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5388 // de l'état et de l'avis du dossier d'instruction
5389 $this->valF['archive_delai']=$row['delai'];
5390 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5391 $this->valF['archive_etat']=$row['etat'];
5392 $this->valF['archive_avis']=$row['avis_decision'];
5393 // Récupération de la valeur actuelle des 9 dates du dossier
5394 // d'instruction
5395 if ($row['date_complet'] != '') {
5396 $this->valF['archive_date_complet']=$row['date_complet'];
5397 }
5398 if ($row['date_dernier_depot'] != '') {
5399 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5400 }
5401 if ($row['date_rejet'] != '') {
5402 $this->valF['archive_date_rejet']= $row['date_rejet'];
5403 }
5404 if ($row['date_limite'] != '') {
5405 $this->valF['archive_date_limite']= $row['date_limite'];
5406 }
5407 if ($row['date_notification_delai'] != '') {
5408 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5409 }
5410 if ($row['date_decision'] != '') {
5411 $this->valF['archive_date_decision']= $row['date_decision'];
5412 }
5413 if ($row['date_validite'] != '') {
5414 $this->valF['archive_date_validite']= $row['date_validite'];
5415 }
5416 if ($row['date_achevement'] != '') {
5417 $this->valF['archive_date_achevement']= $row['date_achevement'];
5418 }
5419 if ($row['date_chantier'] != '') {
5420 $this->valF['archive_date_chantier']= $row['date_chantier'];
5421 }
5422 if ($row['date_conformite'] != '') {
5423 $this->valF['archive_date_conformite']= $row['date_conformite'];
5424 }
5425 if ($row['incompletude'] != '') {
5426 $this->valF['archive_incompletude']= $row['incompletude'];
5427 }
5428 if ($row['incomplet_notifie'] != '') {
5429 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5430 }
5431 if ($row['evenement_suivant_tacite'] != '') {
5432 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5433 }
5434 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5435 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5436 }
5437 if ($row['etat_pendant_incompletude'] != '') {
5438 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5439 }
5440 if ($row['date_limite_incompletude'] != '') {
5441 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5442 }
5443 if ($row['delai_incompletude'] != '') {
5444 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5445 }
5446 if ($row['autorite_competente'] != '') {
5447 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5448 }
5449 if ($row['duree_validite'] != '') {
5450 $this->valF['duree_validite']= $row['duree_validite'];
5451 }
5452 if ($row['date_depot'] != '') {
5453 $this->valF['date_depot']= $row['date_depot'];
5454 }
5455 if ($row['date_depot_mairie'] != '') {
5456 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5457 }
5458 // Dates concernant les dossiers contentieux
5459 if ($row['date_cloture_instruction'] != '') {
5460 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5461 }
5462 if ($row['date_premiere_visite'] != '') {
5463 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5464 }
5465 if ($row['date_derniere_visite'] != '') {
5466 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5467 }
5468 if ($row['date_contradictoire'] != '') {
5469 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5470 }
5471 if ($row['date_retour_contradictoire'] != '') {
5472 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5473 }
5474 if ($row['date_ait'] != '') {
5475 $this->valF['archive_date_ait']= $row['date_ait'];
5476 }
5477 if ($row['date_transmission_parquet'] != '') {
5478 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5479 }
5480 //
5481 if ($row['dossier_instruction_type'] != '') {
5482 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5483 }
5484 if ($row['date_affichage'] != '') {
5485 $this->valF['archive_date_affichage']= $row['date_affichage'];
5486 }
5487 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5488 $this->valF['archive_pec_metier']= $row['pec_metier'];
5489 }
5490 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5491 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5492 }
5493 }
5494
5495 // {{{
5496 // Méthodes de récupération des métadonnées arrêté
5497 /**
5498 * @return string Retourne le numéro d'arrêté
5499 */
5500 function getNumArrete() {
5501 return $this->getVal("numero_arrete");
5502 }
5503 /**
5504 * @return chaîne vide
5505 */
5506 function getReglementaireArrete() {
5507 return 'true';
5508 }
5509 /**
5510 * @return boolean de notification au pétitionnaire
5511 */
5512 function getNotificationArrete() {
5513 return 'true';
5514 }
5515 /**
5516 * @return date de notification au pétitionnaire
5517 */
5518 function getDateNotificationArrete() {
5519 if (empty($this->metadonneesArrete)) {
5520 $this->getArreteMetadata();
5521 }
5522 return $this->metadonneesArrete["datenotification"];
5523 }
5524 /**
5525 * @return boolean check si le document est passé au contrôle de légalité
5526 */
5527 function getControleLegalite() {
5528 return 'true';
5529 }
5530 /**
5531 * @return date de signature de l'arrêté
5532 */
5533 function getDateSignature() {
5534 if (empty($this->metadonneesArrete)) {
5535 $this->getArreteMetadata();
5536 }
5537 return $this->metadonneesArrete["datesignaturearrete"];
5538 }
5539 /**
5540 * @return string nom du signataire
5541 */
5542 function getNomSignataire() {
5543 if (empty($this->metadonneesArrete)) {
5544 $this->getArreteMetadata();
5545 }
5546 return $this->metadonneesArrete["nomsignataire"];
5547 }
5548 /**
5549 * @return string qualité du signataire
5550 */
5551 function getQualiteSignataire() {
5552 if (empty($this->metadonneesArrete)) {
5553 $this->getArreteMetadata();
5554 }
5555 return $this->metadonneesArrete["qualitesignataire"];
5556 }
5557 /**
5558 * @return string numéro du terrain
5559 */
5560 function getAp_numRue() {
5561 if (empty($this->metadonneesArrete)) {
5562 $this->getArreteMetadata();
5563 }
5564 return $this->metadonneesArrete["ap_numrue"];
5565 }
5566 /**
5567 * @return string nom de la rue du terrain
5568 */
5569 function getAp_nomDeLaVoie() {
5570 if (empty($this->metadonneesArrete)) {
5571 $this->getArreteMetadata();
5572 }
5573 return $this->metadonneesArrete["ap_nomdelavoie"];
5574 }
5575 /**
5576 * @return string code postal du terrain
5577 */
5578 function getAp_codePostal() {
5579 if (empty($this->metadonneesArrete)) {
5580 $this->getArreteMetadata();
5581 }
5582 return $this->metadonneesArrete["ap_codepostal"];
5583 }
5584 /**
5585 * @return string ville du terrain
5586 */
5587 function getAp_ville() {
5588 if (empty($this->metadonneesArrete)) {
5589 $this->getArreteMetadata();
5590 }
5591 return $this->metadonneesArrete["ap_ville"];
5592 }
5593 /**
5594 * @return string activité
5595 */
5596 function getActivite() {
5597 return "Droit du sol";
5598 }
5599 /**
5600 * @return string date du retour de controle légalité
5601 */
5602 function getDateControleLegalite() {
5603 if (empty($this->metadonneesArrete)) {
5604 $this->getArreteMetadata();
5605 }
5606 return $this->metadonneesArrete["datecontrolelegalite"];
5607 }
5608
5609 // Fin des méthodes de récupération des métadonnées
5610 // }}}
5611
5612 /**
5613 * Méthode de récupération des métadonnées arrêtés dans la base de données,
5614 * les données sont stockés dans l'attribut $this->metadonneesArrete
5615 */
5616 function getArreteMetadata() {
5617
5618 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5619 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5620 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5621 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5622 "ap_codepostal"=>"", "ap_ville"=>"");
5623
5624 $sqlArrete = "SELECT
5625 signataire_arrete.prenom || ' ' ||signataire_arrete.nom as \"nomsignataire\",
5626 signataire_arrete.qualite as \"qualitesignataire\",
5627 instruction.etat as \"decisionarrete\",
5628 instruction.date_retour_rar as \"datenotification\",
5629 instruction.date_retour_signature as \"datesignaturearrete\",
5630 instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
5631 dossier.terrain_adresse_voie_numero as \"ap_numrue\",
5632 dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
5633 dossier.terrain_adresse_code_postal as \"ap_codepostal\",
5634 dossier.terrain_adresse_localite as \"ap_ville\"
5635 FROM ".DB_PREFIXE."instruction
5636 LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
5637 instruction.signataire_arrete = signataire_arrete.signataire_arrete
5638 LEFT JOIN ".DB_PREFIXE."dossier ON
5639 instruction.dossier = dossier.dossier
5640 LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
5641 donnees_techniques.dossier_instruction = dossier.dossier
5642 WHERE instruction.instruction = ".$this->getVal("instruction");
5643 $resArrete = $this->f->db->query($sqlArrete);
5644 $this->addToLog(__METHOD__."(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
5645 $this->f->isDatabaseError($resArrete);
5646 $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
5647 }
5648
5649 /**
5650 * CONDITION - has_an_edition.
5651 *
5652 * Condition pour afficher le bouton de visualisation de l'édition.
5653 *
5654 * @return boolean
5655 */
5656 function has_an_edition() {
5657 // Récupère la valeur du champ lettretype
5658 $lettretype = $this->getVal("lettretype");
5659 // Si le champ est vide
5660 if ($lettretype !== '' && $lettretype !== null) {
5661 //
5662 return true;
5663 }
5664
5665 //
5666 return false;
5667 }
5668
5669 /**
5670 * CONDITION - is_modifiable.
5671 *
5672 * Controle si l'évenement est modifiable.
5673 *
5674 * @return boolean
5675 */
5676 function is_evenement_modifiable() {
5677 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5678 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
5679 }
5680
5681 /**
5682 * CONDITION - is_editable.
5683 *
5684 * Condition pour la modification.
5685 *
5686 * @return boolean
5687 */
5688 function is_editable() {
5689
5690 // XXX
5691 // 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é)
5692 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5693
5694 // Contrôle si l'utilisateur possède un bypass
5695 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
5696 //
5697 if ($bypass == true) {
5698 //
5699 return true;
5700 }
5701
5702 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5703 // que l'événement n'est pas identifié comme non verrouillable
5704 if ($this->f->isUserInstructeur()
5705 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5706 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5707 //
5708 return false;
5709 }
5710
5711 // Si l'utilisateur est un intructeur qui correspond à la division du
5712 // dossier
5713 if ($this->is_instructeur_from_division_dossier() === true) {
5714 //
5715 return true;
5716 }
5717
5718 // Si l'utilisateur est instructeur de la commune du dossier et que
5719 // l'instruction est créée par un instructeur de la commune
5720 if ($this->is_instructeur_from_collectivite_dossier() === true and
5721 $this->getVal('created_by_commune') === 't') {
5722 return true;
5723 }
5724
5725 //
5726 return false;
5727 }
5728
5729 /**
5730 * Vérifie si l'événement est supprimable ou pas.
5731 *
5732 * @return boolean
5733 */
5734 function is_evenement_supprimable() {
5735 // Controle si l'évenement est supprimable
5736 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5737 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
5738 }
5739
5740 /**
5741 * CONDITION - is_deletable.
5742 *
5743 * Condition pour la suppression.
5744 *
5745 * @return boolean
5746 */
5747 function is_deletable() {
5748
5749 // XXX
5750 // 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é)
5751 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5752
5753 // Contrôle si l'utilisateur possède un bypass intégral
5754 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
5755 //
5756 if ($bypass == true) {
5757
5758 //
5759 return true;
5760 }
5761
5762 // Si l'utilisateur est un intructeur qui ne correspond pas à la
5763 // division du dossier et si l'utilisateur n'a pas la permission bypass
5764 // de la division
5765 if ($this->is_instructeur_from_division_dossier() === false
5766 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
5767
5768 //
5769 return false;
5770 }
5771
5772 // l'événement est-il le dernier ?
5773 $dernier_evenement = false;
5774 // instanciation dossier
5775 $dossier = $this->f->get_inst__om_dbform(array(
5776 "obj" => "dossier",
5777 "idx" => $this->getVal('dossier'),
5778 ));
5779 // récupération dernier événement
5780 $id_dernier_evenement = $dossier->get_dernier_evenement();
5781 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
5782 $dernier_evenement = true;
5783 }
5784
5785 // Si dossier cloturé ou si pas dernier événement
5786 // ou de type retour ou si une date est renseignée
5787 // ET utilisateur non administrateur
5788 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
5789 || $dernier_evenement == false
5790 || $this->is_evenement_retour($this->getVal("evenement")) == true
5791 || $this->getVal('date_envoi_signature') != ''
5792 || $this->getVal('date_retour_signature') != ''
5793 || $this->getVal('date_envoi_rar') != ''
5794 || $this->getVal('date_retour_rar') != ''
5795 || $this->getVal('date_envoi_controle_legalite') != ''
5796 || $this->getVal('date_retour_controle_legalite') != '') {
5797 // pas le droit de supprimer
5798 return false;;
5799 }
5800
5801 //
5802 return true;
5803 }
5804
5805
5806 /**
5807 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
5808 * dossier.
5809 *
5810 * @return, boolean true/false
5811 */
5812 function is_instructeur_from_collectivite_dossier() {
5813 if ($this->f->isUserInstructeur() === true and
5814 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
5815 return true;
5816 }
5817 return false;
5818 }
5819
5820 /**
5821 * CONDITION - is_addable.
5822 *
5823 * Condition pour afficher les boutons modifier et supprimer.
5824 *
5825 * @return boolean
5826 */
5827 function is_addable() {
5828 // Contrôle si l'utilisateur possède un bypass
5829 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
5830 //
5831 if ($bypass == true) {
5832
5833 //
5834 return true;
5835 }
5836 // Si l'utilisateur est un intructeur qui correspond à la
5837 // division du dossier ou qu'il peut changer la décision
5838 if ($this->is_instructeur_from_division_dossier() === true or
5839 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
5840 //
5841 return true;
5842 }
5843
5844 //
5845 return false;
5846 }
5847
5848 /**
5849 * CONDITION - is_finalizable.
5850 *
5851 * Condition pour afficher le bouton.
5852 *
5853 * @return boolean
5854 */
5855 function is_finalizable() {
5856 // Contrôle si l'utilisateur possède un bypass
5857 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
5858 //
5859 if ($bypass == true) {
5860 //
5861 return true;
5862 }
5863
5864 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5865 // que l'événement n'est pas identifié comme non verrouillable
5866 if ($this->f->isUserInstructeur()
5867 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5868 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5869 //
5870 return false;
5871 }
5872
5873 // Si l'utilisateur est un intructeur qui correspond à la division du
5874 // dossier
5875 if ($this->is_instructeur_from_division_dossier() === true) {
5876 //
5877 return true;
5878 }
5879
5880 // Si l'utilisateur est instructeur de la commune du dossier et que
5881 // l'instruction est créée par un instructeur de la commune
5882 if ($this->is_instructeur_from_collectivite_dossier() === true and
5883 $this->getVal('created_by_commune') === 't') {
5884 return true;
5885 }
5886
5887 //
5888 return false;
5889 }
5890
5891 /**
5892 * CONDITION - is_finalize_without_bypass.
5893 *
5894 * Condition pour afficher le bouton sans le bypass.
5895 *
5896 * @return boolean [description]
5897 */
5898 function is_finalizable_without_bypass() {
5899 // Récupère la valeur du champ finalisé
5900 $om_final_instruction = $this->getVal('om_final_instruction');
5901
5902 // Si le rapport n'est pas finalisé
5903 if (empty($om_final_instruction)
5904 || $om_final_instruction == 'f') {
5905 //
5906 return true;
5907 }
5908
5909 //
5910 return false;
5911 }
5912
5913 /**
5914 * CONDITION - is_unfinalizable.
5915 *
5916 * Condition pour afficher le bouton.
5917 *
5918 * @return boolean
5919 */
5920 function is_unfinalizable(){
5921 // Contrôle si l'utilisateur possède un bypass
5922 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
5923 //
5924 if ($bypass == true) {
5925 //
5926 return true;
5927 }
5928
5929 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5930 // que l'événement n'est pas identifié comme non verrouillable
5931 if ($this->f->isUserInstructeur()
5932 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5933 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5934 //
5935 return false;
5936 }
5937
5938 // Si l'utilisateur est un intructeur qui correspond à la division du
5939 // dossier
5940 if ($this->is_instructeur_from_division_dossier() === true) {
5941 //
5942 return true;
5943 }
5944
5945 // Si l'utilisateur est instructeur de la commune du dossier et que
5946 // l'instruction est créée par un instructeur de la commune
5947 if ($this->is_instructeur_from_collectivite_dossier() === true and
5948 $this->getVal('created_by_commune') === 't') {
5949 return true;
5950 }
5951
5952 //
5953 return false;
5954 }
5955
5956 /**
5957 * CONDITION - is_unfinalizable_without_bypass.
5958 *
5959 * Condition pour afficher le bouton sans le bypass.
5960 *
5961 * @return boolean
5962 */
5963 function is_unfinalizable_without_bypass() {
5964 // Récupère la valeur du champ finalisé
5965 $om_final_instruction = $this->getVal('om_final_instruction');
5966
5967 // Si l'instruction est finalisée
5968 if ($om_final_instruction == 't') {
5969 //
5970 return true;
5971 }
5972
5973 //
5974 return false;
5975 }
5976
5977
5978 /**
5979 * Permet de définir si un instructeur commune peut editer une instruction
5980 *
5981 * @return boolean true si il peut
5982 */
5983 function isInstrCanChangeDecision($idx) {
5984
5985 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
5986 $this->f->isUserInstructeur() !== true) {
5987 return false;
5988 }
5989
5990
5991
5992 // Sinon on vérifie l'éligibilité du dossier au changement de décision
5993 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
5994 // de décision :
5995 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
5996 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
5997 $sql = sprintf(
5998 'SELECT
5999 dossier.dossier
6000 FROM
6001 %1$sdossier
6002 JOIN %1$setat
6003 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6004 JOIN %1$slien_dossier_demandeur
6005 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6006 JOIN %1$sdossier_instruction_type
6007 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6008 JOIN %1$sinstruction
6009 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6010 ON instruction.instruction = (
6011 SELECT instruction
6012 FROM %1$sinstruction
6013 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6014 AND evenement.retour IS FALSE
6015 WHERE instruction.dossier = dossier.dossier
6016 ORDER BY date_evenement DESC, instruction DESC
6017 LIMIT 1
6018 )
6019 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6020 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6021 -- non signée, non notifié, etc.
6022 AND (instruction.om_final_instruction IS TRUE
6023 OR instruction.created_by_commune IS TRUE)
6024 AND instruction.date_retour_signature IS NULL
6025 AND instruction.date_envoi_rar IS NULL
6026 AND instruction.date_retour_rar IS NULL
6027 AND instruction.date_envoi_controle_legalite IS NULL
6028 AND instruction.date_retour_controle_legalite IS NULL
6029 -- On vérifie que l instruction soit un arrêté ou un changement de décision
6030 JOIN %1$sevenement
6031 ON instruction.evenement=evenement.evenement
6032 AND (evenement.type = \'arrete\'
6033 OR evenement.type = \'changement_decision\')
6034 -- Recherche les informations du pétitionnaire principal pour l affichage
6035 JOIN %1$sdemandeur
6036 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6037 -- Recherche la collectivité rattachée à l instructeur
6038 JOIN %1$sinstructeur
6039 ON dossier.instructeur=instructeur.instructeur
6040 JOIN %1$sdivision
6041 ON instructeur.division=division.division
6042 JOIN %1$sdirection
6043 ON division.direction=direction.direction
6044 JOIN %1$som_collectivite
6045 ON direction.om_collectivite=om_collectivite.om_collectivite
6046 WHERE
6047 -- Vérification que la décision a été prise par l agglo
6048 om_collectivite.niveau = \'2\'
6049 AND dossier.dossier = \'%2$s\'
6050 ',
6051 DB_PREFIXE,
6052 $idx
6053 );
6054
6055
6056 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6057 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6058 $sql .= sprintf(
6059 ' AND dossier.om_collectivite=%1$s',
6060 $_SESSION['collectivite']
6061 );
6062 }
6063 $res = $this->f->db->getone($sql);
6064 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
6065 $this->f->isDatabaseError($res);
6066 // Si le dossier n'est pas sujet au changement de decision
6067 if($res == null) {
6068 return false;
6069 }
6070 return true;
6071 }
6072
6073
6074 /**
6075 * CONDITION - can_monitoring_dates.
6076 *
6077 * Condition pour afficher le bouton de suivi des dates.
6078 *
6079 * @return boolean
6080 */
6081 public function can_monitoring_dates() {
6082 // Récupère la valeur du champ finalisé
6083 $om_final_instruction = $this->getVal('om_final_instruction');
6084
6085 // Si l'instruction n'est pas finalisée
6086 if ($om_final_instruction !== 't') {
6087 //
6088 return false;
6089 }
6090
6091 // Contrôle si l'utilisateur possède un bypass
6092 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6093 if ($bypass === true) {
6094 return true;
6095 }
6096
6097 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6098 // un utilisateur lié à un instructeur
6099 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6100
6101 // On vérifie en premier lieu que le DI n'est pas clôturé et que
6102 // l'utilisateur ne possède pas la permission de modifier le suivi des
6103 // dates sur un dossier clôturé
6104 $inst_dossier = $this->get_inst_dossier();
6105 if ($inst_dossier->getStatut() === 'cloture'
6106 && $perm_moni_dates_d_closed === false) {
6107 //
6108 return false;
6109 }
6110 // On récupère ses infos
6111 $coll_di = $inst_dossier->getVal('om_collectivite');
6112 $div_di = $this->getDivisionFromDossier();
6113 // et celles de son éventuel instructeur
6114 $instr_di = $inst_dossier->getVal('instructeur');
6115
6116 // Il faut disposer d'une entrée instructeur
6117 if ($this->f->isUserInstructeur() === false) {
6118 return false;
6119 }
6120
6121 // Par défaut on prétend que l'instructeur n'est pas multi
6122 $instr_di_coll_multi = false;
6123 // Si un instructeur est affecté au dossier
6124 if ($instr_di !== '' && $instr_di !== null) {
6125 // Vérifie si l'instructeur est de la collectivité de niveau 2
6126 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6127 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6128 //
6129 $instr_di_coll_multi = true;
6130 }
6131 }
6132
6133 // Il faut qu'il instruise le dossier ou soit de la même division
6134 if ($this->f->om_utilisateur['instructeur'] === $instr_di
6135 || $this->f->om_utilisateur['division'] === $div_di) {
6136 //
6137 return true;
6138 }
6139
6140 // On donne également le droit s'il est de la même collectivité que
6141 // le dossier ET si l'instruction est déléguée à la communauté
6142 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6143 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6144 && $instr_di_coll_multi === true) {
6145 //
6146 return true;
6147 }
6148
6149 // Si l'instructeur ne rentre pas dans les deux cas précédents
6150 return false;
6151 }
6152
6153
6154 /**
6155 * CONDITION - is_finalized.
6156 *
6157 * Condition pour vérifier si une instruction est finalisée.
6158 *
6159 * @return boolean
6160 */
6161 public function is_finalized() {
6162
6163 return $this->getVal('om_final_instruction') === "t";
6164 }
6165
6166 /**
6167 * CONDITION - is_not_date_retour_signature_set.
6168 *
6169 * Condition pour vérifier si une date de retour signature n'est pas définie.
6170 *
6171 * @return boolean
6172 */
6173 public function is_not_date_retour_signature_set() {
6174
6175 return $this->getVal('date_retour_signature') == null;
6176
6177 }
6178
6179
6180 /**
6181 * TREATMENT - finalize.
6182 *
6183 * Permet de finaliser un enregistrement.
6184 *
6185 * @param array $val valeurs soumises par le formulaire
6186 *
6187 * @return boolean
6188 */
6189 function finalize($val = array()) {
6190
6191 // Cette méthode permet d'exécuter une routine en début des méthodes
6192 // dites de TREATMENT.
6193 $this->begin_treatment(__METHOD__);
6194 $message = '';
6195 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6196
6197 // Controle du signataire
6198 if (! $this->controle_signataire($ev)) {
6199 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6200 // Termine le traitement
6201 return $this->end_treatment(__METHOD__, false);
6202 }
6203
6204 // Traitement de la finalisation
6205 $ret = $this->manage_finalizing("finalize", $val);
6206
6207 // Si le traitement retourne une erreur
6208 if ($ret !== true) {
6209
6210 // Termine le traitement
6211 return $this->end_treatment(__METHOD__, false);
6212 }
6213
6214 // Envoi des notifications aux demandeurs si la notification est automatique
6215 // et que la signature n'est pas requise
6216 if ($ev->getVal('notification') === 'notification_automatique') {
6217 // Préparation du message de log en cas d'erreur de notification
6218 $msgLog = __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.').
6219 ' '.
6220 __('Instruction notifiée : ').
6221 $this->getVal($this->clePrimaire);
6222 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6223 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6224 // Récupération de la liste des demandeurs à notifier et de la catégorie
6225 $categorie = $this->f->get_param_option_notification($collectivite_di);
6226 $isPortal = $categorie == null || $categorie == '' || $categorie == PORTAL ? true : false;
6227 $demandeursANotifie = $this->get_demandeurs_notifiable(
6228 $this->getVal('dossier'),
6229 $isPortal
6230 );
6231
6232 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6233 $demandeurPrincipalNotifie = false;
6234 if (count($demandeursANotifie) > 0) {
6235 foreach ($demandeursANotifie as $demandeur) {
6236 // Identifie si le demandeur principal a été notifié ou pas
6237 // et récupère ses informations
6238 if ($demandeur['petitionnaire_principal'] == 't') {
6239 $demandeurPrincipalNotifie = true;
6240 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6241 // son paramétrage, on effectue pas le traitement et on passe à l'itération
6242 // suivante. On le considère également comme non notifié pour gérer l'envoie
6243 // des messages d'erreurs
6244 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6245 // d'impact sur la notification
6246 $erreursParam = $this->get_info_notification_fail();
6247 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6248 $demandeurPrincipalNotifie = false;
6249 continue;
6250 }
6251 }
6252 // Ajout de la notif et récupération de son id
6253 $idNotif = $this->ajouter_notification(
6254 $this->getVal($this->clePrimaire),
6255 $this->f->get_connected_user_login_name(),
6256 $demandeur,
6257 $collectivite_di,
6258 array(),
6259 true
6260 );
6261 if ($idNotif === false) {
6262 // Termine le traitement
6263 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
6264 return $this->end_treatment(__METHOD__, false);
6265 }
6266 $notification_by_task = $this->notification_by_task(
6267 $idNotif,
6268 $this->getVal('dossier'),
6269 $categorie
6270 );
6271 if ($notification_by_task === false) {
6272 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
6273 $this->addToMessage(
6274 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6275 );
6276 // Termine le traitement
6277 return $this->end_treatment(__METHOD__, false);
6278 }
6279 $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.")));
6280 }
6281 }
6282 // Pour la notification par mail ou la notification via portal si le dossier a
6283 // été déposés via portal, si le demandeur principal n'est pas notifiable,
6284 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6285 // laquelle le demandeur principal n'a pas pu être notifié
6286 $depotPortal = $this->dossier_depose_sur_portail();
6287 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6288 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6289 $msgLog .= ' '.__('Le pétitionnaire principale n\'est pas notifiable.');
6290 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6291 $erreursParam = $this->get_info_notification_fail();
6292 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6293 // Ajout de la notif et récupération de son id
6294 $idNotif = $this->ajouter_notification(
6295 $this->valF[$this->clePrimaire],
6296 $this->f->get_connected_user_login_name(),
6297 $demandeurPrincipal,
6298 $collectivite_di,
6299 array(),
6300 true,
6301 'Echec',
6302 implode(' ', $erreursParam)
6303 );
6304 if ($idNotif === false) {
6305 $this->addToMessage(
6306 __('Erreur : la création de la notification a échouée.').
6307 __("Veuillez contacter votre administrateur.")
6308 );
6309 $this->addToLog(__METHOD__."(): ".$msgLog, DEBUG_MODE);
6310 return false;
6311 }
6312 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6313 // de l'échec de la notification
6314 $dossier_message = $this->get_inst_dossier_message(0);
6315 $dossier_message_val = array(
6316 'dossier' => $this->getVal('dossier'),
6317 'type' => _('erreur expedition'),
6318 'emetteur' => $this->f->get_connected_user_login_name(),
6319 'login' => $_SESSION['login'],
6320 'date_emission' => date('Y-m-d H:i:s'),
6321 'contenu' => _('Échec lors de la notification de l\'instruction ').
6322 $ev->getVal('libelle').
6323 '.<br>'.
6324 implode("\n", $erreursParam).
6325 '<br>'.
6326 _('Veuillez corriger ces informations avant de renvoyer la notification.')
6327 );
6328 $add = $dossier_message->add_notification_message($dossier_message_val, true);
6329 // Si une erreur se produit pendant l'ajout
6330 if ($add !== true) {
6331 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6332 return false;
6333 }
6334 }
6335 }
6336
6337 // Termine le traitement
6338 return $this->end_treatment(__METHOD__, true);
6339 }
6340
6341 /**
6342 * Récupère l'instance de dossier message.
6343 *
6344 * @param string $dossier_message Identifiant du message.
6345 *
6346 * @return object
6347 */
6348 private function get_inst_dossier_message($dossier_message = null) {
6349 //
6350 return $this->get_inst_common("dossier_message", $dossier_message);
6351 }
6352
6353 /**
6354 * Vérifie si le signataire est obligatoire pour finaliser
6355 * le document apartir du paramétrage de l'événement.
6356 * Si c'est le cas, vérifie si il y a bien un signataire
6357 * renseigné.
6358 * Si c'est le cas renvoie true, sinon renvoie false.
6359 *
6360 * @param evenement évenement de l'instruction permettant de
6361 * récupérer le paramétrage
6362 * @return boolean
6363 */
6364 protected function controle_signataire($evenement) {
6365 // Vérifie si le signataire est obligatoire et si c'est le cas
6366 // vérifie si il y a bien un signataire pour le document
6367 if ($evenement->is_signataire_obligatoire() &&
6368 ($this->getVal('signataire_arrete') === null ||
6369 $this->getVal('signataire_arrete') === '')) {
6370 return false;
6371 }
6372 return true;
6373 }
6374
6375 /**
6376 * TREATMENT - unfinalize.
6377 *
6378 * Permet de définaliser un enregistrement.
6379 *
6380 * @param array $val valeurs soumises par le formulaire
6381 *
6382 * @return boolean
6383 */
6384 function unfinalize($val = array()) {
6385
6386 // Cette méthode permet d'exécuter une routine en début des méthodes
6387 // dites de TREATMENT.
6388 $this->begin_treatment(__METHOD__);
6389
6390 // Traitement de la finalisation
6391 $ret = $this->manage_finalizing("unfinalize", $val);
6392
6393 // Si le traitement retourne une erreur
6394 if ($ret !== true) {
6395
6396 // Termine le traitement
6397 return $this->end_treatment(__METHOD__, false);
6398 }
6399
6400 // Termine le traitement
6401 return $this->end_treatment(__METHOD__, true);
6402 }
6403
6404 /**
6405 * VIEW - view_edition
6406 *
6407 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6408 *
6409 * @return null Si l'action est incorrecte
6410 */
6411 function view_edition() {
6412
6413 // Si l'instruction est finalisée
6414 if($this->getVal("om_final_instruction") == 't'
6415 && $this->getVal("om_final_instruction") != null) {
6416
6417 // Ouvre le document
6418 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6419 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6420 //
6421 header("Location: ".$lien);
6422 } else {
6423
6424 // Récupère la collectivite du dossier d'instruction
6425 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6426
6427 //
6428 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6429
6430 // Paramètre du PDF
6431 $params = array(
6432 "watermark" => true,
6433 "specific" => array(
6434 "mode" => "previsualisation",
6435 ),
6436 );
6437 // Si la rédaction libre est activée sur l'instruction
6438 if ($this->getVal("flag_edition_integrale") == 't') {
6439 $params["specific"]["corps"] = array(
6440 "mode" => "set",
6441 "value" => $this->getVal("corps_om_htmletatex"),
6442 );
6443 $params["specific"]["titre"] = array(
6444 "mode" => "set",
6445 "value" => $this->getVal("titre_om_htmletat"),
6446 );
6447 }
6448
6449 // Génération du PDF
6450 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6451 // Affichage du PDF
6452 $this->expose_pdf_output(
6453 $result['pdf_output'],
6454 $result['filename']
6455 );
6456 }
6457 }
6458
6459 /**
6460 * Récupère la collectivité du dossier d'instruction.
6461 *
6462 * @param string $dossier_instruction_id Identifiant du DI.
6463 *
6464 * @return integer
6465 */
6466 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6467
6468 // Si l'identifiant n'est pas renseigné
6469 if ($dossier_instruction_id === null) {
6470 // Récupère la valeur
6471 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6472 $dossier_instruction_id = $this->getVal('dossier');
6473 } elseif ($this->getParameter('idxformulaire') !== null
6474 && $this->getParameter('idxformulaire') !== '') {
6475 //
6476 $dossier_instruction_id = $this->getParameter('idxformulaire');
6477 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6478 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6479 //
6480 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6481 }
6482 }
6483
6484 //
6485 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6486 "obj" => "dossier_instruction",
6487 "idx" => $dossier_instruction_id,
6488 ));
6489
6490 //
6491 return $dossier_instruction->getVal('om_collectivite');
6492 }
6493
6494 /**
6495 * VIEW - view_bible
6496 *
6497 * Affiche la bible manuelle.
6498 *
6499 * @return void
6500 */
6501 function view_bible() {
6502 // Vérification de l'accessibilité sur l'élément
6503 $this->checkAccessibility();
6504
6505 /**
6506 * Affichage de la structure HTML
6507 */
6508 //
6509 if ($this->f->isAjaxRequest()) {
6510 //
6511 header("Content-type: text/html; charset=".HTTPCHARSET."");
6512 } else {
6513 //
6514 $this->f->setFlag("htmlonly");
6515 $this->f->display();
6516 }
6517 //
6518 $this->f->displayStartContent();
6519 //
6520 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6521 $this->f->displayTitle();
6522
6523 /**
6524 *
6525 */
6526 //
6527 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6528 $evenement = intval($evenement);
6529 //
6530 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6531 // Récupération du code du type de DA
6532 $code_da_type = '';
6533 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6534 $code_da_type = $matches[0];
6535 }
6536 //
6537 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6538
6539 // Récupération de la collectivité du dossier
6540 $dossier = $this->f->get_inst__om_dbform(array(
6541 "obj" => "dossier",
6542 "idx" => $idx,
6543 ));
6544
6545 /**
6546 *
6547 */
6548 //
6549 $sql = "SELECT *, bible.libelle as bible_lib
6550 FROM ".DB_PREFIXE."bible
6551 LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6552 ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
6553 LEFT JOIN ".DB_PREFIXE."om_collectivite
6554 ON bible.om_collectivite = om_collectivite.om_collectivite
6555 WHERE (evenement=".$evenement." OR evenement IS NULL)
6556 AND (complement=".$complement." OR complement IS NULL)
6557 AND (bible.dossier_autorisation_type IS NULL
6558 OR dossier_autorisation_type.code ='".$code_da_type."')
6559 AND (om_collectivite.niveau = '2'
6560 OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
6561 ORDER BY bible_lib ASC";
6562 $res = $this->f->db->query($sql);
6563 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
6564 $this->f->isDatabaseError($res);
6565 //
6566 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6567 //
6568 if ($res->numrows() > 0) {
6569 //
6570 echo "\t<table id='tab-bible' width='100%'>\n";
6571 //
6572 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6573 echo "<th>"._("Choisir")."</th>";
6574 echo "<th>"._("Libelle")."</th>";
6575 echo "</tr>\n";
6576 //
6577 $i = 0;
6578 //
6579 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6580 //
6581 echo "\t\t<tr";
6582 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6583 echo ">";
6584 //
6585 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6586 // XXX utilisation de l'attribut titre pour afficher une infobulle
6587 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6588 //
6589 echo "</tr>\n";
6590 //
6591 $i++;
6592 }
6593 echo "\t</table>\n";
6594 //
6595 echo "<div class=\"formControls\">\n";
6596 $this->f->layout->display_form_button(array(
6597 "value" => _("Valider"),
6598 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6599 ));
6600 $this->f->displayLinkJsCloseWindow();
6601 echo "</div>\n";
6602
6603 } else {
6604 //
6605 $message_class = "error";
6606 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6607 $this->f->displayMessage($message_class, $message);
6608 //
6609 echo "<div class=\"formControls\">\n";
6610 $this->f->displayLinkJsCloseWindow();
6611 echo "</div>\n";
6612 }
6613 //
6614 echo "</form>\n";
6615
6616 /**
6617 * Affichage de la structure HTML
6618 */
6619 //
6620 $this->f->displayEndContent();
6621 }
6622
6623 /**
6624 * VIEW - view_bible_auto
6625 *
6626 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
6627 *
6628 * @return void
6629 */
6630 function view_bible_auto() {
6631 // Vérification de l'accessibilité sur l'élément
6632 $this->checkAccessibility();
6633 //
6634 $this->f->disableLog();
6635
6636 $formatDate="AAAA-MM-JJ";
6637
6638 // Récupération des paramètres
6639 $idx = $this->f->get_submitted_get_value('idx');
6640 $evenement = $this->f->get_submitted_get_value('ev');
6641
6642 // Initialisation de la variable de retour
6643 $retour['complement_om_html'] = '';
6644 $retour['complement2_om_html'] = '';
6645 $retour['complement3_om_html'] = '';
6646 $retour['complement4_om_html'] = '';
6647 // Vérification d'une consultation liée à l'événement
6648 $consultation = $this->f->db->getOne(
6649 "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
6650 );
6651 $this->f->isDatabaseError($consultation);
6652 // Si consultation liée, récupération du retour d'avis
6653 if($consultation=='Oui'){
6654 $sql = sprintf(
6655 '(SELECT
6656 date_retour,
6657 avis_consultation.libelle as avis_consultation,
6658 COALESCE(service.libelle, tiers_consulte.libelle) as service
6659 FROM
6660 %1$sconsultation
6661 LEFT JOIN %1$stiers_consulte ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
6662 LEFT JOIN %1$sservice ON consultation.service = service.service
6663 LEFT JOIN %1$savis_consultation ON consultation.avis_consultation = avis_consultation.avis_consultation
6664 WHERE
6665 dossier = \'%2$s\'
6666 AND consultation.visible)',
6667 DB_PREFIXE,
6668 $this->f->db->escapeSimple($idx)
6669 );
6670 $res = $this->f->db->query($sql);
6671 $this->f->isDatabaseError($res);
6672 // Récupération des consultations
6673 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6674 $correct=false;
6675 // date retour
6676 if ($row['date_retour']<>""){
6677 if ($formatDate=="AAAA-MM-JJ"){
6678 $date = explode("-", $row['date_retour']);
6679 // controle de date
6680 if (count($date) == 3 and
6681 checkdate($date[1], $date[2], $date[0])) {
6682 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
6683 $correct=true;
6684 }else{
6685 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
6686 $correct=false;
6687 }
6688 }
6689 }
6690 //
6691 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
6692 if($correct == true){
6693 $temp=$temp." du ".$date_retour_f;
6694 }
6695 // Concaténation des retours d'avis de consultation
6696 $retour['complement_om_html'] .= $temp . "<br/><br/>";
6697 } // while
6698
6699 } // consultation
6700 // Récupération des bibles automatiques pour le champ complement_om_html
6701 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
6702 // Récupération des bibles automatiques pour le champ complement2_om_html
6703 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
6704 // Récupération des bibles automatiques pour le champ complement3_om_html
6705 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
6706 // Récupération des bibles automatiques pour le champ complement4_om_html
6707 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
6708
6709
6710
6711 echo json_encode($retour);
6712 }
6713
6714 /**
6715 * VIEW - view_pdf_temp
6716 *
6717 * @return void
6718 */
6719 function view_pdf_temp() {
6720 $this->checkAccessibility();
6721 // Utilisation de $_POST pour ne pas que les textes soient altérés.
6722 $this->f->set_submitted_value();
6723 $merge_fields = array();
6724 //
6725 if (array_key_exists('c1', $_POST) === true) {
6726 $merge_fields['[complement_instruction]'] = $_POST['c1'];
6727 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
6728 }
6729 if (array_key_exists('c2', $_POST) === true) {
6730 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
6731 }
6732 if (array_key_exists('c3', $_POST) === true) {
6733 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
6734 }
6735 if (array_key_exists('c4', $_POST) === true) {
6736 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
6737 }
6738 $params = array(
6739 "watermark" => true,
6740 "specific" => array(
6741 "merge_fields" => $merge_fields,
6742 ),
6743 );
6744 //
6745 if (array_key_exists('corps', $_POST) === true) {
6746 $params["specific"]["corps"] = array(
6747 "mode" => "set",
6748 "value" => $_POST['corps'],
6749 );
6750 }
6751 if (array_key_exists('titre', $_POST) === true) {
6752 $params["specific"]["titre"] = array(
6753 "mode" => "set",
6754 "value" => $_POST['titre'],
6755 );
6756 }
6757 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6758 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6759 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6760 $retour = array(
6761 'base' => base64_encode($result['pdf_output']),
6762 );
6763 echo json_encode($retour);
6764 }
6765
6766 /**
6767 * Dans le contexte de prévisualisation des éditions, génère le rendu du
6768 * PDF sans prise en compte de la valeur des compléments et le retourne en
6769 * base 64.
6770 *
6771 * @return string Rendu PDF converti en base 64.
6772 */
6773 function init_pdf_temp() {
6774 $params = array(
6775 "watermark" => true,
6776 );
6777 // Si la rédaction libre est activée sur l'instruction
6778 if ($this->getVal("flag_edition_integrale") == 't') {
6779 $params["specific"]["corps"] = array(
6780 "mode" => "set",
6781 "value" => $this->getVal("corps_om_htmletatex"),
6782 );
6783 $params["specific"]["titre"] = array(
6784 "mode" => "set",
6785 "value" => $this->getVal("titre_om_htmletat"),
6786 );
6787 }
6788 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6789 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6790 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6791
6792 return base64_encode($result['pdf_output']);
6793 }
6794
6795 /**
6796 * Récupération des éléments de bible.
6797 *
6798 * @param integer $event id de l'événement
6799 * @param string $idx id du dossier
6800 * @param integer $compnb numéro du champ complement
6801 *
6802 * @return string Chaîne de texte à insérer dans le champ complement
6803 */
6804 function getBible($event, $idx, $compnb) {
6805 // Récupération de la collectivité du dossier
6806 $dossier = $this->f->get_inst__om_dbform(array(
6807 "obj" => "dossier",
6808 "idx" => $idx,
6809 ));
6810 // Récupération du code du type de DA
6811 $code_da_type = '';
6812 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6813 $code_da_type = $matches[0];
6814 }
6815 //
6816 $sql = "SELECT * FROM ".DB_PREFIXE."bible
6817 LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6818 ON bible.dossier_autorisation_type=
6819 dossier_autorisation_type.dossier_autorisation_type
6820 LEFT JOIN
6821 ".DB_PREFIXE."om_collectivite
6822 ON bible.om_collectivite = om_collectivite.om_collectivite
6823 WHERE (evenement =".$event." or evenement IS NULL) and
6824 (complement=".$compnb." OR complement IS NULL) and
6825 automatique='Oui' and
6826 (dossier_autorisation_type.code ='".$code_da_type."' or
6827 bible.dossier_autorisation_type IS NULL) and
6828 (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
6829
6830 $res = $this->f->db->query($sql);
6831 $this->f->isDatabaseError($res);
6832 $temp = "";
6833 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6834 // Remplacement des retours à la ligne par des br
6835 $temp .= preg_replace(
6836 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
6837 );
6838 // Ajout d'un saut de ligne entre chaque bible.
6839 $temp .= '<br/>';
6840 } // fin while
6841 return $temp;
6842 }
6843
6844 /**
6845 * VIEW - view_suivi_bordereaux.
6846 *
6847 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
6848 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
6849 * collectivité des dossiers affichés.
6850 *
6851 * @return void
6852 */
6853 function view_suivi_bordereaux() {
6854 // Vérification de l'accessibilité sur l'élément
6855 $this->checkAccessibility();
6856
6857 /**
6858 * Validation du formulaire
6859 */
6860 // Si le formulaire a été validé
6861 if ($this->f->get_submitted_post_value("validation") !== null) {
6862 // Si un bordereau à été sélectionné
6863 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
6864 // Si aucun bordereau n'a été sélectionné
6865 $message_class = "error";
6866 $message = _("Veuillez selectionner un bordereau.");
6867 }
6868 // Sinon si les dates ne sont pas valide
6869 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
6870 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
6871 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
6872 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
6873 // Si aucune date n'a été saisie
6874 $message_class = "error";
6875 $message = _("Veuillez saisir une date valide.");
6876 }
6877 // Sinon si les dates ne sont pas valides
6878 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
6879 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
6880 // Si aucune date n'a été saisie
6881 $message_class = "error";
6882 $message = _("Erreur de parametrage. Contactez votre administrateur.");
6883 }
6884 // Affiche le message de validation
6885 else {
6886 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
6887 $sql = "SELECT om_etat.libelle
6888 FROM ".DB_PREFIXE."om_etat
6889 WHERE om_etat.id = '".$this->f->get_submitted_post_value("bordereau")."'";
6890 $res = $this->f->db->getone($sql);
6891 $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6892 $this->f->isDatabaseError($res);
6893 //
6894 $message_class = "valid";
6895 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
6896 $message .= " : <br/><br/>";
6897 $message .= "<a class='om-prev-icon pdf-16'";
6898 $message .= " title=\""._("Bordereau")."\"";
6899 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
6900 $message .= "&action=220";
6901 $message .= "&idx=0";
6902 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
6903 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
6904 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
6905 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
6906 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
6907 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
6908 }
6909 $message .= "'"." target='_blank'>";
6910 $message .= $res." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
6911 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
6912 $message .= "</a>";
6913 }
6914 }
6915
6916 /**
6917 * Affichage des messages et du formulaire
6918 */
6919 // Affichage du message de validation ou d'erreur
6920 if (isset($message) && isset($message_class) && $message != "") {
6921 $this->f->displayMessage($message_class, $message);
6922 }
6923 // Ouverture du formulaire
6924 printf("\t<form");
6925 printf(" method=\"post\"");
6926 printf(" id=\"suivi_bordereaux_form\"");
6927 printf(" action=\"\"");
6928 printf(">\n");
6929 // Paramétrage des champs du formulaire
6930 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
6931 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
6932 // collectivité dans le formulaire
6933 if ($_SESSION["niveau"] == 2) {
6934 array_push($champs, "om_collectivite");
6935 }
6936 // Création d'un nouvel objet de type formulaire
6937 $form = $this->f->get_inst__om_formulaire(array(
6938 "validation" => 0,
6939 "maj" => 0,
6940 "champs" => $champs,
6941 ));
6942 // Paramétrage du champ date_bordereau_debut
6943 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
6944 $form->setType("date_bordereau_debut", "date");
6945 $form->setTaille("date_bordereau_debut", 12);
6946 $form->setMax("date_bordereau_debut", 12);
6947 $form->setRequired("date_bordereau_debut");
6948 $form->setOnchange("date_bordereau_debut", "fdate(this)");
6949 $form->setVal("date_bordereau_debut", date("d/m/Y"));
6950 // Paramétrage du champ date_bordereau_fin
6951 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
6952 $form->setType("date_bordereau_fin", "date");
6953 $form->setTaille("date_bordereau_fin", 12);
6954 $form->setMax("date_bordereau_fin", 12);
6955 $form->setRequired("date_bordereau_fin");
6956 $form->setOnchange("date_bordereau_fin", "fdate(this)");
6957 $form->setVal("date_bordereau_fin", date("d/m/Y"));
6958 // Paramétrage du champ bordereau
6959 $form->setLib("bordereau", _("bordereau"));
6960 $form->setType("bordereau", "select");
6961 $form->setRequired("bordereau");
6962 // Valeurs des champs
6963 if ($this->f->get_submitted_post_value("validation") !== null) {
6964 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
6965 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
6966 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
6967 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
6968 }
6969 // Données du select - On récupère ici la liste de tous les états disponibles
6970 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
6971 // 'bordereau_'
6972 $sql = "SELECT om_etat.id, om_etat.libelle
6973 FROM ".DB_PREFIXE."om_etat
6974 WHERE om_etat.id LIKE 'bordereau_%'
6975 ORDER BY om_etat.id";
6976 $res = $this->f->db->query($sql);
6977 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6978 $this->f->isDatabaseError($res);
6979 // Données du select
6980 $contenu = array(
6981 0 => array("", ),
6982 1 => array(_("choisir bordereau")),
6983 );
6984 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6985 $contenu[0][] = $row['id'];
6986 $contenu[1][] = $row['libelle'];
6987 }
6988 $form->setSelect("bordereau", $contenu);
6989 //
6990 if ($_SESSION["niveau"] == 2) {
6991 $form->setLib("om_collectivite", _("collectivite"));
6992 $form->setType("om_collectivite", "select");
6993
6994 // Données du select - On récupère ici la liste de tous toutes les collectivités
6995 // de niveau 1
6996 $sql = "SELECT om_collectivite, libelle
6997 FROM ".DB_PREFIXE."om_collectivite
6998 WHERE niveau = '1' ORDER BY libelle";
6999 $res = $this->f->db->query($sql);
7000 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7001 $this->f->isDatabaseError($res);
7002 // La valeur par défaut du select est Toutes
7003 $list_collectivites = array(
7004 0 => array("", ),
7005 1 => array(_("toutes"))
7006 );
7007
7008 $id_colls = "";
7009 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7010 // par des virgules, pour un traitement plus facile dans la requête de sous-état
7011 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
7012 if ($id_colls != "") {
7013 $id_colls .= ",";
7014 }
7015 $id_colls .= $row['om_collectivite'];
7016 $list_collectivites[0][] = $row['om_collectivite'];
7017 $list_collectivites[1][] = $row['libelle'];
7018 }
7019 // On affecte la liste d'identifiants à l'option Toutes
7020 $list_collectivites[0][0] = $id_colls ;
7021 $form->setSelect("om_collectivite", $list_collectivites);
7022 }
7023 // Affichage du formulaire
7024 $form->entete();
7025 $form->afficher($champs, 0, false, false);
7026 $form->enpied();
7027 // Affichage du bouton
7028 printf("\t<div class=\"formControls\">\n");
7029 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7030 printf("\t</div>\n");
7031 // Fermeture du formulaire
7032 printf("\t</form>\n");
7033 }
7034
7035
7036 /**
7037 * VIEW - view_generate_suivi_bordereaux.
7038 *
7039 * Génère et affiche les bordereaux de suivi.
7040 *
7041 * @return [void]
7042 */
7043 function view_generate_suivi_bordereaux() {
7044 // Vérification de l'accessibilité sur l'élément
7045 $this->checkAccessibility();
7046 // Récupération du type de bordereau
7047 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7048 // Génération du PDF
7049 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7050 // Affichage du PDF
7051 $this->expose_pdf_output(
7052 $result['pdf_output'],
7053 $result['filename']
7054 );
7055 }
7056
7057
7058 /**
7059 * VIEW - view_suivi_envoi_lettre_rar.
7060 *
7061 * Vue pour imprimer les AR.
7062 *
7063 * @return void
7064 */
7065 function view_suivi_envoi_lettre_rar() {
7066 // Vérification de l'accessibilité sur l'élément
7067 $this->checkAccessibility();
7068
7069 //
7070 if ($this->f->get_submitted_post_value("date") !== null) {
7071 $date = $this->f->get_submitted_post_value("date");
7072 } else {
7073 $date = "";
7074 }
7075 //
7076 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7077 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7078 } else {
7079 $liste_code_barres_instruction = "";
7080 }
7081
7082 // Compteur du nombre de page générées
7083 $nbLettres = 0;
7084 // Liste d'id des instructions
7085 $id4Gen = array();
7086 //
7087 $error = "";
7088
7089 // Initialisation du tableau qui va contenir les DI pour lister les liens
7090 $dossierTab = array();
7091 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7092 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7093 $hasHidden = true;
7094 // S'il ne peut pas les consulter il aura des dossiers caché
7095 if ($isAccredited === true) {
7096 $hasHidden = false;
7097 }
7098
7099 /**
7100 * Validation du formulaire
7101 */
7102 // Si le formulaire a été validé
7103 if ($this->f->get_submitted_post_value('validation') !== null) {
7104 //
7105 if (empty($date) || empty($liste_code_barres_instruction)) {
7106 //
7107 $message_class = "error";
7108 $message = _("Tous les champs doivent etre remplis.");
7109 } else {
7110 // Création d'un tableau d'instruction
7111 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7112 //
7113 foreach ($liste as $code_barres) {
7114 // On enlève les éventuels espaces saisis
7115 $code_barres = trim($code_barres);
7116 // Vérification de l'existence de l'instruction
7117 if ($code_barres != "") {
7118 // Si la valeur transmise est numérique
7119 if (is_numeric($code_barres)) {
7120 //
7121 $sql = "SELECT count(*)
7122 FROM ".DB_PREFIXE."instruction
7123 INNER JOIN ".DB_PREFIXE."dossier
7124 ON dossier.dossier=instruction.dossier
7125 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7126 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7127 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7128 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7129 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7130 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7131 INNER JOIN ".DB_PREFIXE."groupe
7132 ON dossier_autorisation_type.groupe = groupe.groupe
7133 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7134
7135 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7136 $group_clause = array();
7137 foreach ($_SESSION["groupe"] as $key => $value) {
7138 $group_clause[$key] = "(groupe.code = '".$key."'";
7139 if($value["confidentiel"] !== true) {
7140 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7141 }
7142 $group_clause[$key] .= ")";
7143 }
7144 $conditions = implode(" OR ", $group_clause);
7145 $sql .= " AND (" . $conditions . ")";
7146
7147 $nbInstr = $this->f->db->getone($sql);
7148 $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
7149 $this->f->isDatabaseError($nbInstr);
7150 //
7151 if ($nbInstr == "1") {
7152 // Récupération de la date d'envoi de l'instruction bippé
7153 $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
7154 $res = $this->f->db->query($sql);
7155 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7156 $this->f->isDatabaseError($res);
7157 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7158 // Si pas de date ou correspond à la date du formulaire on
7159 // effectue le traitement
7160 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7161 $instr = $this->f->get_inst__om_dbform(array(
7162 "obj" => "instruction",
7163 "idx" => $row['instruction'],
7164 ));
7165 $valF = array();
7166 foreach($instr->champs as $id => $champ) {
7167 $valF[$champ] = $instr->val[$id];
7168 }
7169
7170 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7171 if ($isAccredited === true
7172 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7173 $dossier = $this->f->get_inst__om_dbform(array(
7174 "obj" => "dossier",
7175 "idx" => $instr->getVal("dossier"),
7176 ));
7177 if ($dossier->is_user_from_allowed_collectivite()){
7178 $dossierTab[$instr->getVal("dossier")] = $dossier;
7179 } else {
7180 $hasHidden = true;
7181 }
7182 }
7183
7184 $valF['date_evenement']=
7185 $instr->dateDBToForm($valF['date_evenement']);
7186 $valF['archive_date_complet']=
7187 $instr->dateDBToForm($valF['archive_date_complet']);
7188 $valF['archive_date_rejet']=
7189 $instr->dateDBToForm($valF['archive_date_rejet']);
7190 $valF['archive_date_limite']=
7191 $instr->dateDBToForm($valF['archive_date_limite']);
7192 $valF['archive_date_notification_delai']=
7193 $instr->dateDBToForm($valF['archive_date_notification_delai']);
7194 $valF['archive_date_decision']=
7195 $instr->dateDBToForm($valF['archive_date_decision']);
7196 $valF['archive_date_validite']=
7197 $instr->dateDBToForm($valF['archive_date_validite']);
7198 $valF['archive_date_achevement']=
7199 $instr->dateDBToForm($valF['archive_date_achevement']);
7200 $valF['archive_date_chantier']=
7201 $instr->dateDBToForm($valF['archive_date_chantier']);
7202 $valF['archive_date_conformite']=
7203 $instr->dateDBToForm($valF['archive_date_conformite']);
7204 $valF['archive_date_dernier_depot']=
7205 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7206 $valF['archive_date_limite_incompletude']=
7207 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7208 $valF['date_finalisation_courrier']=
7209 $instr->dateDBToForm($valF['date_finalisation_courrier']);
7210 $valF['date_envoi_signature']=
7211 $instr->dateDBToForm($valF['date_envoi_signature']);
7212 $valF['date_retour_signature']=
7213 $instr->dateDBToForm($valF['date_retour_signature']);
7214 $valF['date_envoi_rar']=
7215 $instr->dateDBToForm($valF['date_envoi_rar']);
7216 $valF['date_retour_rar']=
7217 $instr->dateDBToForm($valF['date_retour_rar']);
7218 $valF['date_envoi_controle_legalite']=
7219 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7220 $valF['date_retour_controle_legalite']=
7221 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7222 $valF['date_envoi_rar'] = $date;
7223
7224 // Vérification de la finalisation du document
7225 // correspondant au code barres
7226 if($instr->getVal("om_final_instruction") === 't') {
7227 $instr->setParameter('maj', 1);
7228 $instr->class_actions[1]["identifier"] =
7229 "envoi lettre RAR (depuis le menu suivi des pièces)";
7230 if ($instr->modifier($valF) == true) {
7231 $id4Gen[] = $code_barres;
7232 $nbLettres ++;
7233 } else {
7234 //
7235 if ($error != "") {
7236 $error .= "<br/>";
7237 }
7238 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7239 $code_barres);
7240 $error .= " ";
7241 $error .= _("Veuillez contacter votre administrateur.");
7242 }
7243 } else {
7244 //
7245 if ($error != "") {
7246 $error .= "<br/>";
7247 }
7248 $error .= sprintf(_("Le document correspondant au
7249 code barres %s n'est pas finalise,
7250 le bordereau ne sera pas genere."),
7251 $code_barres);
7252 }
7253
7254 } else {
7255 //
7256 if ($error != "") {
7257 $error .= "<br/>";
7258 }
7259 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7260 }
7261 } else {
7262 //
7263 if ($error != "") {
7264 $error .= "<br/>";
7265 }
7266 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7267 }
7268 } else {
7269 //
7270 if ($error != "") {
7271 $error .= "<br/>";
7272 }
7273 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7274 }
7275 }
7276 }
7277 }
7278 }
7279
7280 /**
7281 * Affichage des messages et du formulaire
7282 */
7283 // Affichage du message de validation ou d'erreur
7284 if (isset($message) && isset($message_class) && $message != "") {
7285 $this->f->displayMessage($message_class, $message);
7286 }
7287 // Affichage du message d'erreur
7288 if(!empty($error)) {
7289 $this->f->displayMessage("error", $error);
7290 }
7291 // Affichage du message de validation de la saisie
7292 if ($nbLettres > 0) {
7293 //
7294 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7295 echo "\n<p>";
7296 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7297 echo "\n<span class=\"text\">";
7298 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7299 echo " : \n<br/><br/>";
7300 echo "\n<a class='om-prev-icon pdf-16'";
7301 echo "\n title=\""._("imprimer les AR")."\"";
7302 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7303 echo "\n target='_blank'>";
7304 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7305 echo "\n</a>";
7306 echo "\n</span>";
7307 echo "\n</p>";
7308 echo "\n<br/>\n";
7309 if ($isAccredited === true) {
7310 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7311 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7312 echo _('Dossiers concernés par ce traitement');
7313 echo "\n</legend>";
7314 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7315
7316 if ($hasHidden === true) {
7317 echo "\n<br/>";
7318 echo "\n<p>";
7319 echo "\n<span class='text'>";
7320 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.");
7321 echo "</span>";
7322 echo "\n</p>";
7323 echo "\n<br/>";
7324 }
7325 foreach ($dossierTab as $dossier) {
7326
7327 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7328 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7329 $code_datd = $inst_datd->getVal('code');
7330
7331 $obj = "dossier_instruction";
7332 if ($code_datd === 'REC' OR $code_datd === 'REG') {
7333 $obj = "dossier_contentieux_tous_recours";
7334 }
7335 if ($code_datd === 'IN') {
7336 $obj = "dossier_contentieux_toutes_infractions";
7337 }
7338
7339 echo "\n<div class=\"bloc group\">";
7340 echo "\n<div class=\"field field-type-text\">";
7341
7342 echo "\n<p>";
7343 echo "\n<span class='text'>";
7344 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7345 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7346 echo $dossier->getVal("dossier");
7347 echo "\">";
7348 echo "\n</a>";
7349
7350 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7351 echo " href=\"".OM_ROUTE_FORM."&obj=";
7352 echo $obj;
7353 echo "&action=3&idx=";
7354 echo $dossier->getVal("dossier");
7355 echo "\">";
7356 echo $dossier->getVal("dossier_libelle");
7357 echo "\n</a>";
7358 echo "\n</span>";
7359 echo "\n</p>";
7360
7361 echo "\n</div>";
7362 echo "\n</div>";
7363 }
7364 echo "\n</div>";
7365 echo "\n</fieldset>";
7366 }
7367 echo "\n</div>";
7368 echo "\n</div>";
7369 }
7370 // Ouverture du formulaire
7371 echo "\t<form";
7372 echo " method=\"post\"";
7373 echo " id=\"suivi_envoi_lettre_rar_form\"";
7374 echo " action=\"\"";
7375 echo ">\n";
7376 // Paramétrage des champs du formulaire
7377 $champs = array("date", "liste_code_barres_instruction");
7378 // Création d'un nouvel objet de type formulaire
7379 $form = $this->f->get_inst__om_formulaire(array(
7380 "validation" => 0,
7381 "maj" => 0,
7382 "champs" => $champs,
7383 ));
7384 // Paramétrage du champ date du formulaire
7385 $form->setLib("date", _("Date")."* :");
7386 $form->setType("date", "date");
7387 $form->setOnchange("date", "fdate(this)");
7388 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7389 $form->setTaille("date", 10);
7390 $form->setMax("date", 10);
7391 // Paramétrage du champ liste_code_barres_instruction du formulaire
7392 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7393 $form->setType("liste_code_barres_instruction", "textarea");
7394 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7395 $form->setTaille("liste_code_barres_instruction", 20);
7396 $form->setMax("liste_code_barres_instruction", 20);
7397 // Affichage du formulaire
7398 $form->entete();
7399 $form->afficher($champs, 0, false, false);
7400 $form->enpied();
7401 // Affichage du bouton
7402 echo "\t<div class=\"formControls\">\n";
7403 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7404 echo "\t</div>\n";
7405 // Fermeture du formulaire
7406 echo "\t</form>\n";
7407 }
7408
7409 /**
7410 * VIEW - view_suivi_mise_a_jour_des_dates.
7411 *
7412 * Vu pour mettre à jour les dates de suivi de l'instruction.
7413 *
7414 * @return void
7415 */
7416 function view_suivi_mise_a_jour_des_dates() {
7417 // Vérification de l'accessibilité sur l'élément
7418 $this->checkAccessibility();
7419
7420 // Récupération des valeur passées en POST ou GET
7421 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7422 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7423 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7424 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7425 } else {
7426 $type_mise_a_jour = "";
7427 }
7428 if($this->f->get_submitted_post_value('date') !== null) {
7429 $date = $this->f->get_submitted_post_value('date');
7430 } elseif($this->f->get_submitted_get_value('date') !== null) {
7431 $date = $this->f->get_submitted_get_value('date');
7432 } else {
7433 $date = "";
7434 }
7435 if($this->f->get_submitted_post_value('code_barres') !== null) {
7436 $code_barres = $this->f->get_submitted_post_value('code_barres');
7437 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7438 $code_barres = $this->f->get_submitted_get_value('code_barres');
7439 } else {
7440 $code_barres = "";
7441 }
7442 // Booléen permettant de définir si un enregistrement à eu lieu
7443 $correct = false;
7444 // Booléen permettant de définir si les dates peuvent êtres enregistrées
7445 $date_error = false;
7446 // Champs date à mettre à jour
7447 $liste_champs=array();
7448
7449 // Si le formulaire a été validé
7450 if ($this->f->get_submitted_post_value('validation') !== null) {
7451 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7452
7453 // Vérification de l'existence de l'instruction
7454 $sql = "SELECT instruction
7455 FROM ".DB_PREFIXE."instruction
7456 INNER JOIN ".DB_PREFIXE."dossier
7457 ON dossier.dossier=instruction.dossier
7458 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7459 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7460 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7461 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7462 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7463 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7464 INNER JOIN ".DB_PREFIXE."groupe
7465 ON dossier_autorisation_type.groupe = groupe.groupe
7466 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7467
7468 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7469 $group_clause = array();
7470 foreach ($_SESSION["groupe"] as $key => $value) {
7471 $group_clause[$key] = "(groupe.code = '".$key."'";
7472 if($value["confidentiel"] !== true) {
7473 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7474 }
7475 $group_clause[$key] .= ")";
7476 }
7477 $conditions = implode(" OR ", $group_clause);
7478 $sql .= " AND (" . $conditions . ")";
7479
7480
7481 $res = $this->f->db->query($sql);
7482 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7483 $this->f->isDatabaseError($res);
7484
7485 if($res->numrows() == 1) {
7486 $liste_champs = explode(";", $type_mise_a_jour);
7487 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7488 $instr = $this->f->get_inst__om_dbform(array(
7489 "obj" => "instruction",
7490 "idx" => $row['instruction'],
7491 ));
7492 // Mise à jour des dates après l'écran de verification
7493 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7494 $valF = array();
7495 foreach($instr->champs as $id => $champ) {
7496 $valF[$champ] = $instr->val[$id];
7497 }
7498 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7499 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7500 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7501 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7502 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7503 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7504 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7505 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7506 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7507 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7508 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7509 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7510 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7511 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7512 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7513 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7514 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7515 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7516 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7517 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7518 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7519 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7520 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7521 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7522 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7523 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7524
7525 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7526 $valF[$maj_date]=$date;
7527 }
7528
7529 // Vérification de la finalisation du document
7530 // correspondant au code barres
7531 if($valF["om_final_instruction"] === 't' or
7532 $valF["lettretype"] == '') {
7533 $code_barres = "";
7534
7535 //Désactivation de l'autocommit
7536 $this->f->db->autoCommit(false);
7537
7538 //On modifie les valeurs de l'instruction
7539 $instr->setParameter('maj', 170);
7540 $instr->class_actions[170]["identifier"] =
7541 "mise à jour des dates (depuis le menu suivi des pièces)";
7542 $retour = $instr->modifier($valF);
7543
7544 //Si une erreur s'est produite, on défait les modifications
7545 //qui ont été faites
7546 if (!$retour){
7547 $instr->undoValidation();
7548 }
7549 //Sinon, on valide en base de données les modifications
7550 else {
7551 $this->f->db->commit();
7552 }
7553
7554 // Variable correct retourné depuis la classe instruction
7555 $correct = $instr->correct;
7556
7557 // Si la modification sur l'instruction a échoué
7558 if ($correct === false) {
7559
7560 // Message d'erreur de la classe instruction
7561 $error = $instr->msg;
7562 }
7563
7564 } else {
7565 // Indique que le traitement est en erreur
7566 $correct = false;
7567 // Message d'erreur
7568 $error = sprintf(_("Le document n'est pas finalise."),
7569 "<span class='bold'>".$code_barres."</span>");
7570 }
7571 } else {
7572 // Récupération des infos du dossier
7573 $sqlInfo = "SELECT dossier.dossier_libelle,
7574 evenement.libelle as evenement,
7575 autorite_competente.code as autorite_competente_code,
7576 autorite_competente.libelle as autorite_competente,
7577 evenement.type as evenement_type,
7578 to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
7579 to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
7580 to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
7581 to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
7582 to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
7583 to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
7584 FROM ".DB_PREFIXE."instruction
7585 INNER JOIN ".DB_PREFIXE."dossier ON
7586 dossier.dossier=instruction.dossier
7587 LEFT JOIN ".DB_PREFIXE."autorite_competente ON
7588 dossier.autorite_competente=autorite_competente.autorite_competente
7589 INNER JOIN ".DB_PREFIXE."evenement ON
7590 instruction.evenement=evenement.evenement
7591 WHERE code_barres='".$code_barres."'";
7592 $resInfo = $this->f->db->query($sqlInfo);
7593 $this->f->isDatabaseError($resInfo);
7594 $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
7595
7596 // Vérification de la non modification des dates de suivi
7597 foreach(explode(";", $type_mise_a_jour) as $champ) {
7598 if ($champ === 'date_envoi_controle_legalite') {
7599 if ($instr->is_sent_to_cl() === true) {
7600 $error = __("Les dates de suivis ne peuvent etre modifiees");
7601 $date_error = true;
7602 break;
7603 }
7604 }
7605 if($infos[$champ] != "" AND $infos[$champ] != $date) {
7606 $error = _("Les dates de suivis ne peuvent etre modifiees");
7607 $date_error = true;
7608 break;
7609 }
7610 }
7611 }
7612 } else {
7613 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
7614 }
7615
7616 } else {
7617 $error = _("Tous les champs doivent etre remplis.");
7618 }
7619 }
7620
7621 /**
7622 * Affichage des messages et du formulaire
7623 */
7624 // Affichage du message de validation ou d'erreur
7625 if (isset($message) && isset($message_class) && $message != "") {
7626 $this->f->displayMessage($message_class, $message);
7627 }
7628 // Affichage du message d'erreur
7629 if(!empty($error)) {
7630 $this->f->displayMessage("error", $error);
7631 }
7632
7633 // Affichage du message de validation de la saisie
7634 if($correct === true) {
7635 $this->f->displayMessage("ok", _("Saisie enregistree"));
7636 }
7637 // Ouverture du formulaire
7638 echo "\t<form";
7639 echo " method=\"post\"";
7640 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
7641 echo " action=\"\"";
7642 echo ">\n";
7643 // Paramétrage des champs du formulaire
7644 if(isset($infos)) {
7645 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
7646 , "autorite_competente", "date_envoi_signature",
7647 "date_retour_signature", "date_envoi_controle_legalite",
7648 "date_retour_controle_legalite", "date_envoi_rar",
7649 "date_retour_rar", "is_valid");
7650 } else {
7651 $champs = array("type_mise_a_jour", "date", "code_barres");
7652 }
7653 // Création d'un nouvel objet de type formulaire
7654 $form = $this->f->get_inst__om_formulaire(array(
7655 "validation" => 0,
7656 "maj" => 0,
7657 "champs" => $champs,
7658 ));
7659 // Paramétrage des champs du formulaire
7660 // Parametrage du champ type_mise_a_jour
7661 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
7662 if(isset($infos)) {
7663 $form->setType("type_mise_a_jour", "selecthiddenstatic");
7664
7665 } else {
7666 $form->setType("type_mise_a_jour", "select");
7667
7668 }
7669 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
7670 $contenu = array();
7671
7672 $contenu[0][0] = "date_envoi_signature";
7673 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
7674
7675 $contenu[0][1] = "date_retour_signature";
7676 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
7677
7678 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
7679 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
7680
7681 $contenu[0][3] = "date_envoi_controle_legalite";
7682 $contenu[1][3] = _("date d'envoi au controle de legalite");
7683
7684 $contenu[0][4] = "date_retour_controle_legalite";
7685 $contenu[1][4] = _("date de retour de controle de legalite");
7686
7687 $contenu[0][5] = "date_retour_rar";
7688 $contenu[1][5] = __("date de notification du correspondant");
7689
7690 $form->setSelect("type_mise_a_jour", $contenu);
7691
7692 // Parametrage du champ date
7693 $form->setLib("date", _("Date")."* :");
7694 if(isset($infos)) {
7695 $form->setType("date", "hiddenstaticdate");
7696
7697 } else {
7698 $form->setType("date", "date");
7699 }
7700 $form->setVal("date", $date);
7701 $form->setTaille("date", 10);
7702 $form->setMax("date", 10);
7703
7704 // Parametrage du champ code_barres
7705 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
7706 if(isset($infos)) {
7707 $form->setType("code_barres", "hiddenstatic");
7708 } else {
7709 $form->setType("code_barres", "text");
7710 }
7711 $form->setVal("code_barres", $code_barres);
7712 $form->setTaille("code_barres", 20);
7713 $form->setMax("code_barres", 20);
7714
7715 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
7716 if(isset($infos)) {
7717
7718 // Tous les champs sont défini par defaut à static
7719 foreach ($infos as $key => $value) {
7720 $form->setType($key, "static");
7721 if(in_array($key, $liste_champs)) {
7722 $form->setVal($key, $date);
7723 } else {
7724 $form->setVal($key, $value);
7725 }
7726 }
7727
7728 // Les champs dont on viens de définir la valeur sont en gras
7729 foreach ($liste_champs as $value) {
7730 $form->setBloc($value,'DF',"",'bold');
7731 }
7732
7733 // Parametrage du champ dossier
7734 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
7735 $form->setType("dossier_libelle", "static");
7736 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
7737
7738 // Parametrage du champ evenement
7739 $form->setLib("evenement", _("evenement")." :");
7740 $form->setType("evenement", "static");
7741 $form->setVal("evenement", $infos['evenement']);
7742
7743 // Parametrage du champ autorite_competente
7744 $form->setLib("autorite_competente", _("Autorite competente")." :");
7745 $form->setType("autorite_competente", "static");
7746 $form->setVal("autorite_competente", $infos['autorite_competente']);
7747
7748 // Parametrage des libellés d'envoi avec AR
7749 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
7750 $form->setLib("date_retour_rar", __("date_notification")." :");
7751
7752 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
7753 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
7754 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
7755 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
7756 // Configuration des libellé en fonction de l'autorité compétente
7757 if($infos['autorite_competente_code'] == 'ETAT') {
7758 $form->setType("date_envoi_controle_legalite", "hiddendate");
7759 $form->setType("date_retour_controle_legalite", "hiddendate");
7760 }
7761
7762 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
7763 $form->setLib("is_valid", _("Valide")." :");
7764 $form->setType("is_valid", "hidden");
7765 $form->setVal("is_valid", 'true');
7766
7767 $form->setFieldset('dossier_libelle','D',_('Synthese'));
7768 $form->setFieldset('is_valid','F');
7769
7770 }
7771
7772
7773 // Création du fieldset regroupant les champs permettant la mise à jour des date
7774 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
7775 $form->setFieldset('code_barres','F');
7776 // Affichage du formulaire
7777 $form->entete();
7778 $form->afficher($champs, 0, false, false);
7779 $form->enpied();
7780 // Affichage du bouton
7781 echo "\t<div class=\"formControls\">\n";
7782 //
7783 if(!$date_error) {
7784 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7785 }
7786 // Si pas sur l'écran de validation
7787 if(isset($infos)) {
7788 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
7789 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
7790 echo "\">Retour</a>";
7791 }
7792 echo "\t</div>\n";
7793 // Fermeture du formulaire
7794 echo "\t</form>\n";
7795 }
7796
7797 /**
7798 * [view_pdf_lettre_rar description]
7799 *
7800 * @return [type] [description]
7801 */
7802 function view_pdf_lettre_rar() {
7803 // Vérification de l'accessibilité sur l'élément
7804 $this->checkAccessibility();
7805 //
7806 $this->f->disableLog();
7807
7808 if($this->f->get_submitted_get_value('liste') != null) {
7809 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
7810
7811 // Classe permettant la mise en page de l'édition pdf
7812 require_once "../obj/pdf_lettre_rar.class.php";
7813 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
7814 // Initialisation de la mise en page
7815 $pdf_lettre_rar->init($this->f);
7816
7817 foreach ($listeCodeBarres as $code_barres) {
7818
7819 // On récupère le dossier
7820 $sql = "SELECT dossier
7821 FROM " . DB_PREFIXE . "instruction
7822 WHERE code_barres = '" . $code_barres . "'";
7823 $dossier = $this->f->db->getOne($sql);
7824 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
7825 $this->f->isDatabaseError($dossier);
7826 $inst_dossier = $this->f->get_inst__om_dbform(array(
7827 "obj" => "dossier",
7828 "idx" => $dossier,
7829 ));
7830
7831 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
7832 $groupe = $inst_dossier->get_type_affichage_formulaire();
7833 switch ($groupe) {
7834 case 'CTX IN':
7835 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
7836 break;
7837 case 'CTX RE':
7838 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
7839 break;
7840 case 'ADS':
7841 case 'DPC':
7842 case 'CONSULTATION ENTRANTE':
7843 default:
7844 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
7845 break;
7846 }
7847
7848 // Test si l'evenement est de type arrete et si un délégataire a été nommé
7849 $sql = "SELECT
7850 dossier.dossier_libelle,
7851 evenement.type,
7852 count(lien_dossier_demandeur) as nbdemandeur,
7853 CASE
7854 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
7855 THEN CONCAT(phase.code, ' - ', division.libelle)
7856 ELSE
7857 phase.code
7858 END AS code_phase
7859 FROM ".DB_PREFIXE."instruction
7860 LEFT JOIN ".DB_PREFIXE."dossier
7861 ON instruction.dossier = dossier.dossier
7862 LEFT JOIN ".DB_PREFIXE."division
7863 ON dossier.division = division.division
7864 INNER JOIN ".DB_PREFIXE."evenement ON
7865 instruction.evenement=evenement.evenement
7866 LEFT JOIN ".DB_PREFIXE."phase
7867 ON evenement.phase = phase.phase
7868 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
7869 instruction.dossier=lien_dossier_demandeur.dossier
7870 inner join ".DB_PREFIXE."demandeur on
7871 demandeur.demandeur=lien_dossier_demandeur.demandeur
7872 WHERE code_barres='".$code_barres."'
7873 AND " . $sql_demandeur . "
7874 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
7875
7876 $res = $this->f->db->query($sql);
7877 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7878 $this->f->isDatabaseError($res);
7879 $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
7880
7881
7882 // Recuperation de l'adresse de destination
7883 $sqlAdresse = "SELECT
7884 CASE WHEN demandeur.qualite='particulier'
7885 THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
7886 ELSE TRIM(demandeur.personne_morale_denomination)
7887 END as ligne1,
7888 CASE WHEN demandeur.qualite='personne_morale'
7889 THEN TRIM(demandeur.personne_morale_raison_sociale)
7890 ELSE ''
7891 END as ligne1_1,
7892 CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
7893 THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
7894 ELSE ''
7895 END as ligne1_2,
7896 trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
7897 CASE demandeur.complement
7898 WHEN null THEN ''
7899 ELSE trim(demandeur.complement)
7900 END as ligne3,
7901 CASE demandeur.lieu_dit
7902 WHEN null THEN ''
7903 ELSE trim(demandeur.lieu_dit)
7904 END as ligne4,
7905 CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
7906 (CASE WHEN demandeur.bp IS NOT NULL
7907 THEN CONCAT_WS(' ', 'BP', demandeur.bp)
7908 ELSE ''
7909 END),
7910 (CASE WHEN demandeur.cedex IS NOT NULL
7911 THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
7912 ELSE ''
7913 END))
7914 as ligne5,
7915 code_barres as code_barres
7916 FROM ".DB_PREFIXE."instruction
7917 INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
7918 INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
7919 INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7920 LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
7921 WHERE instruction.code_barres ='".$code_barres."'";
7922
7923 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
7924 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
7925 $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
7926 } else {
7927 $sqlAdresse .= " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
7928 }
7929
7930 $resAdresse = $this->f->db->query($sqlAdresse);
7931 $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
7932 $this->f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
7933 $this->f->isDatabaseError($resAdresse);
7934
7935 // Création adresse destinataire sans ligne vide
7936 $adresse_destinataire = array();
7937 if (!empty($adresse_dest['ligne1'])) {
7938 $adresse_destinataire[] = $adresse_dest['ligne1'];
7939 }
7940 if (!empty($adresse_dest['ligne1_1'])) {
7941 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
7942 }
7943 if (!empty($adresse_dest['ligne1_2'])) {
7944 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
7945 }
7946 $adresse_destinataire[] = $adresse_dest['ligne2'];
7947 if (!empty($adresse_dest['ligne3'])) {
7948 $adresse_destinataire[] = $adresse_dest['ligne3'];
7949 }
7950 if (!empty($adresse_dest['ligne4'])) {
7951 $adresse_destinataire[] = $adresse_dest['ligne4'];
7952 }
7953 $adresse_destinataire[] = $adresse_dest['ligne5'];
7954
7955 // Création du champ specifique
7956 $specifique_content = array();
7957 $specifique_content[] = $adresse_dest['ligne1'];
7958 $specifique_content[] = $adresse_dest['ligne1_1'];
7959 $specifique_content[] = $adresse_dest['ligne1_2'];
7960 $specifique_content[] = $testDemandeur['dossier_libelle'];
7961 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
7962 unset($adresse_dest['code_barres']);
7963 // Ajout d'une page aux pdf
7964 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
7965
7966 }
7967 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
7968 $om_edition = $this->f->get_inst__om_edition();
7969 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
7970 }
7971 }
7972
7973 /**
7974 * VIEW - view_bordereau_envoi_maire.
7975 *
7976 * Formulaire demandant :
7977 * - le code-barres de l'événement d'instruction
7978 * - la date d'envoi du courrier pour signature par le maire
7979 *
7980 * Lors de la validation :
7981 * => met à jour cette date dans l'événement d'instruction
7982 * => crée un lien permettant de générer en PDF le bordereau
7983 *
7984 * @return void
7985 */
7986 function view_bordereau_envoi_maire() {
7987 // Vérification de l'accessibilité sur l'élément
7988 $this->checkAccessibility();
7989
7990 // Récupération des valeur passées en POST ou GET
7991 $code_barres = "";
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 }
7997 $date = "";
7998 if($this->f->get_submitted_post_value('date') !== null) {
7999 $date = $this->f->get_submitted_post_value('date');
8000 } elseif($this->f->get_submitted_get_value('date') !== null) {
8001 $date = $this->f->get_submitted_get_value('date');
8002 }
8003 $validation = 0;
8004 if($this->f->get_submitted_post_value('validation') !== null) {
8005 $validation = $this->f->get_submitted_post_value('validation');
8006 } elseif($this->f->get_submitted_get_value('validation') !== null) {
8007 $validation = $this->f->get_submitted_get_value('validation');
8008 }
8009
8010 // Si le formulaire a été validé
8011 if ($this->f->get_submitted_post_value('validation') !== null) {
8012 // Tous les champs doivent obligatoirement être remplis
8013 if (!empty($date) && !empty($code_barres)) {
8014 $date_en = $this->dateDB($date);
8015 // Si date valide
8016 if ($date_en != "") {
8017 $id_instruction = $this->get_instruction_by_barcode($code_barres);
8018 // Si un événement d'instruction a été trouvé pour ce code-barres
8019 if ($id_instruction !== null) {
8020 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8021 // Si mise à jour réussie de la date d'envoi du courrier
8022 // pour signature par l'autorité compétente
8023 if($ret === true) {
8024 // Message de validation avec lien PDF
8025 $message_class = "valid";
8026 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8027 $message .= " : <br/><br/>";
8028 $message .= "<a class='om-prev-icon pdf-16'";
8029 $message .= " id=\"generer_bordereau_envoi_maire\"";
8030 $message .= " title=\""._("Bordereau")."\"";
8031 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8032 $message .= "&action=200";
8033 $message .= "&idx=".$id_instruction."'";
8034 $message .= " target='_blank'>";
8035 $message .= _("Bordereau d'envoi au maire");
8036 $message .= "</a><br/><br/>";
8037 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8038 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8039 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8040
8041 } else {
8042 // Message d'erreur
8043 $message_class = "error";
8044 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8045 $code_barres);
8046 }
8047 }
8048 else {
8049 $message_class = "error";
8050 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8051 }
8052 }
8053 else {
8054 $message_class = "error";
8055 $message = _("La date est invalide.");
8056 }
8057 } else {
8058 $message_class = "error";
8059 $message = _("Tous les champs doivent etre remplis.");
8060 }
8061 }
8062
8063 /**
8064 * Affichage des messages et du formulaire
8065 */
8066
8067 // Affichage du message de validation ou d'erreur
8068 if (isset($message) && isset($message_class) && $message != "") {
8069 $this->f->displayMessage($message_class, $message);
8070 }
8071
8072 // Ouverture du formulaire
8073 $datasubmit = $this->getDataSubmit();
8074 echo "\n<!-- ########## START DBFORM ########## -->\n";
8075 echo "<form";
8076 echo " id=\"bordereau_envoi_maire\"";
8077 echo " method=\"post\"";
8078 echo " name=\"f1\"";
8079 echo " action=\"";
8080 echo $datasubmit;
8081 echo "\"";
8082 echo ">\n";
8083
8084 // Paramétrage des champs du formulaire
8085 $champs = array("code_barres","date");
8086
8087 // Création d'un nouvel objet de type formulaire
8088 $form = $this->f->get_inst__om_formulaire(array(
8089 "validation" => 0,
8090 "maj" => 0,
8091 "champs" => $champs,
8092 ));
8093
8094 $template_required_label = '%s *';
8095 // Parametrage du champ code_barres
8096 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8097 $form->setType("code_barres", "text");
8098 $form->setVal("code_barres", $code_barres);
8099 $form->setTaille("code_barres", 20);
8100 $form->setMax("code_barres", 20);
8101 // Parametrage du champ date
8102 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8103 $form->setType("date", "date") ;
8104 if (empty($date)) {
8105 $date = date('d/m/Y');
8106 }
8107 $form->setVal("date", $date);
8108 $form->setTaille("date", 10);
8109 $form->setMax("date", 10);
8110
8111 // Création du bloc regroupant les champs
8112 $form->setBloc('code_barres','D');
8113 $form->setBloc('date','F');
8114 // Affichage du formulaire
8115 $form->entete();
8116 $form->afficher($champs, 0, false, false);
8117 $form->enpied();
8118 // Affichage du bouton
8119 printf("\t<div class=\"formControls\">\n");
8120 //
8121 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8122 printf("\t</div>\n");
8123 // Fermeture du formulaire
8124 printf("\t</form>\n");
8125 }
8126
8127 /**
8128 * VIEW - view_bordereau_envoi_maire.
8129 *
8130 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8131 *
8132 * @return [void]
8133 */
8134 function view_generate_bordereau_envoi_maire() {
8135 // Vérification de l'accessibilité sur l'élément
8136 $this->checkAccessibility();
8137 // Récupération de la collectivité du dossier d'instruction
8138 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8139 // Récupération de ses paramètres
8140 $collectivite = $this->f->getCollectivite($collectivite_di);
8141 // Génération du PDF
8142 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8143 // Affichage du PDF
8144 $this->expose_pdf_output(
8145 $result['pdf_output'],
8146 $result['filename']
8147 );
8148 }
8149
8150 /**
8151 * VIEW - view_rapport_instruction.
8152 *
8153 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8154 * Cette action est bindée pour utiliser la fonction popUpIt.
8155 *
8156 * @return void
8157 */
8158 function view_overlay_notification_manuelle() {
8159
8160 // Vérification de l'accessibilité sur l'élément
8161 $this->checkAccessibility();
8162
8163 printf(
8164 '<script type="text/javascript" >
8165 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8166 </script>',
8167 'instruction_notification_manuelle',
8168 OM_ROUTE_SOUSFORM,
8169 $this->getVal($this->clePrimaire),
8170 $this->getVal('dossier')
8171 );
8172 }
8173
8174 /**
8175 * VIEW - view_overlay_notification_service_consulte.
8176 *
8177 * Ouvre le sous-formulaire de notification des services consulte
8178 * en ajaxIt dans un overlay.
8179 * Cette action est bindée pour utiliser la fonction popUpIt.
8180 *
8181 * @return void
8182 */
8183 function view_overlay_notification_service_consulte() {
8184
8185 // Vérification de l'accessibilité sur l'élément
8186 $this->checkAccessibility();
8187
8188 printf(
8189 '<script type="text/javascript" >
8190 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8191 </script>',
8192 'instruction_notification_manuelle',
8193 OM_ROUTE_SOUSFORM,
8194 $this->getVal($this->clePrimaire),
8195 $this->getVal('dossier')
8196 );
8197 }
8198
8199 /**
8200 * VIEW - overlay_notification_tiers_consulte.
8201 *
8202 * Ouvre le sous-formulaire de notification des tiers consulte
8203 * en ajaxIt dans un overlay.
8204 * Cette action est bindée pour utiliser la fonction popUpIt.
8205 *
8206 * @return void
8207 */
8208 function view_overlay_notification_tiers_consulte() {
8209
8210 // Vérification de l'accessibilité sur l'élément
8211 $this->checkAccessibility();
8212
8213 printf(
8214 '<script type="text/javascript" >
8215 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8216 </script>',
8217 'instruction_notification_manuelle',
8218 OM_ROUTE_SOUSFORM,
8219 $this->getVal($this->clePrimaire),
8220 $this->getVal('dossier')
8221 );
8222 }
8223
8224 /**
8225 * VIEW - view_modale_selection_document_signe
8226 *
8227 * Ouvre le sous-formulaire de notification des services consulte
8228 * en ajaxIt dans un overlay.
8229 * Cette action est bindée pour utiliser la fonction popUpIt.
8230 *
8231 * @return void
8232 */
8233 function view_modale_selection_document_signe() {
8234
8235 // Vérification de l'accessibilité sur l'élément
8236 $this->checkAccessibility();
8237
8238 printf(
8239 '<script type="text/javascript" >
8240 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8241 </script>',
8242 'instruction_modale',
8243 OM_ROUTE_SOUSFORM,
8244 $this->getVal($this->clePrimaire),
8245 $this->getVal('dossier')
8246 );
8247 }
8248
8249 /**
8250 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8251 * pour exclure les dossiers du groupe contentieux.
8252 *
8253 * @param [string] $barcode numéro du code-barres
8254 * @return [mixed] ID de son instruction ou null si aucun code
8255 */
8256 function get_instruction_by_barcode($barcode) {
8257 // Begin
8258 $this->begin_treatment(__METHOD__);
8259 // Vérification de l'existence de l'événement d'instruction
8260 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8261 $sql = "SELECT instruction
8262 FROM ".DB_PREFIXE."instruction
8263 INNER JOIN ".DB_PREFIXE."dossier
8264 ON dossier.dossier=instruction.dossier
8265 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8266 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8267 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8268 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8269 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8270 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8271 INNER JOIN ".DB_PREFIXE."groupe
8272 ON dossier_autorisation_type.groupe = groupe.groupe
8273 AND groupe.code != 'CTX'
8274 WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
8275 $res = $this->f->db->getOne($sql);
8276 $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
8277 $this->f->isDatabaseError($res);
8278 // Retourne résultat
8279 return $this->end_treatment(__METHOD__, $res);
8280 }
8281
8282 /**
8283 * Met à jour le champ date d'envoi signature
8284 * avec la date fournie et pour l'instruction donnée
8285 *
8286 * @param [string] $id ID de l'événement d'instruction
8287 * @param [string] $date date au format EN
8288 * @return [boolean] true si mise à jour avec succès
8289 */
8290 function update_date_envoi_signature($id, $date) {
8291 // Préparation du tableau
8292 $valF = array();
8293 $valF['date_envoi_signature'] = $date;
8294 // Begin
8295 $this->begin_treatment(__METHOD__);
8296 // Requête
8297 $res = $this->f->db->autoexecute(
8298 DB_PREFIXE.$this->table,
8299 $valF,
8300 DB_AUTOQUERY_UPDATE,
8301 $this->getCle($id)
8302 );
8303 $this->addToLog(
8304 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8305 VERBOSE_MODE
8306 );
8307 if ($this->f->isDatabaseError($res, true) !== false) {
8308 $this->end_treatment(__METHOD__, false);
8309 }
8310 //
8311 return $this->end_treatment(__METHOD__, true);
8312 }
8313
8314 /**
8315 * Méthode permettant de définir des valeurs à envoyer en base après
8316 * validation du formulaire d'ajout.
8317 * @param array $val tableau des valeurs retournées par le formulaire
8318 */
8319 function setValFAjout($val = array()) {
8320 // Mise à jour du flag created_by_commune lors d'un changement de décision
8321 // par un utilisateur de commune sur un dossier instruit par la comcom
8322 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8323 $this->valF['created_by_commune'] = true;
8324 }
8325
8326 //
8327 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8328 if (isset($this->valF['flag_edition_integrale']) === true) {
8329 unset($this->valF['flag_edition_integrale']);
8330 }
8331 if (isset($this->valF['signataire_arrete']) === true) {
8332 unset($this->valF['signataire_arrete']);
8333 }
8334 }
8335 }
8336
8337
8338 /**
8339 * Récupère l'instance d'un événement de workflow.
8340 *
8341 * @param mixed $evenement Identifiant de l'événement.
8342 *
8343 * @return object
8344 */
8345 function get_inst_evenement($evenement = null) {
8346 //
8347 return $this->get_inst_common("evenement", $evenement);
8348 }
8349
8350 /**
8351 * Logue l'action de l'instruction dans son DI.
8352 *
8353 * @param string $id Clé primaire de l'instruction.
8354 * @param array $val Valeurs de l'instruction.
8355 *
8356 * @return bool Vrai si traitement effectué avec succès
8357 */
8358 private function add_log_to_dossier($id, array $val) {
8359 $maj = $this->getParameter("maj");
8360 // Action = Trace par défaut
8361 $action = $this->get_backtrace();
8362 // Action = Identifant de l'action si contexte connu
8363 if (empty($maj) === false
8364 || (empty($maj) === true && $maj === 0)) {
8365 $action = $this->get_action_param($maj, 'identifier');
8366 if ($action === 'modifier_suivi') {
8367 $action = "modifier (via l'action suivi des dates)";
8368 }
8369 if ($action === 'notifier_commune'
8370 && isset($val['mails_destinataires']) === true) {
8371 $action = "notification de la commune (courriels : ";
8372 $action .= $val['mails_destinataires'].")";
8373 }
8374 }
8375 // Création du log
8376 $log = array(
8377 'date' => date('Y-m-d H:i:s'),
8378 'user' => $_SESSION['login'],
8379 'action' => $action,
8380 'values' => array(
8381 'date_evenement' => $this->dateDB($val['date_evenement']),
8382 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8383 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8384 'evenement' => $val['evenement'],
8385 'action' => $val['action'],
8386 'instruction' => $id,
8387 'etat' => $val['etat'],
8388 ),
8389 );
8390 // Ajout du log
8391 $di = $this->get_inst_dossier($val['dossier']);
8392 $ret = $di->add_log_instructions($log);
8393 if ($ret === false) {
8394 $this->correct = false;
8395 $this->msg = '';
8396 $this->addToMessage($di->msg);
8397 }
8398 return $ret;
8399 }
8400
8401
8402 /**
8403 * Retourne le contexte de déboguage formaté en HTML.
8404 *
8405 * @return string Une ligne par trace
8406 */
8407 private function get_backtrace() {
8408 $trace = debug_backtrace();
8409 $backtrace = '';
8410 $i = 1;
8411 foreach ($trace as $key => $value) {
8412 $func = $trace[$key]['function'];
8413 // On ne s'autolog pas
8414 if ($func === 'get_backtrace'
8415 || $func === 'add_log_to_dossier') {
8416 continue;
8417 }
8418 $backtrace .= $i.') ';
8419 // Si dans une classe
8420 if (isset($trace[$key]['class']) === true
8421 && empty($trace[$key]['class']) === false) {
8422 $backtrace .= $trace[$key]['class'].'->'.$func;
8423 }
8424 // Si procédural
8425 else {
8426 $file = $trace[$key]['file'];
8427 $line = $trace[$key]['line'];
8428 $truncated_file = $this->f->get_relative_path($file);
8429 if ($truncated_file !== false) {
8430 $file = $truncated_file;
8431 }
8432 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8433 }
8434 $backtrace .= '<br/>';
8435 $i++;
8436 }
8437 return $backtrace;
8438 }
8439
8440 /**
8441 * CONDITION - is_notifiable.
8442 *
8443 * Condition pour afficher l'action notifier_commune.
8444 *
8445 * @return boolean
8446 */
8447 public function is_notifiable() {
8448 // L'instruction doit être finalisée, ce qui revient à dire
8449 // définalisable sans bypass
8450 if ($this->is_unfinalizable_without_bypass() === false) {
8451 return false;
8452 }
8453 // La collectivité de l'utilisateur doit être de niveau multi
8454 if ($this->f->has_collectivite_multi() === false) {
8455 return false;
8456 }
8457 // Le paramètre multi de l'objet du courriel doit exister
8458 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8459 return false;
8460 }
8461 // Le paramètre multi du modèle du courriel doit exister
8462 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8463 return false;
8464 }
8465 // A ce stade toutes les conditions sont satisfaites
8466 return true;
8467 }
8468
8469 /**
8470 * TREATMENT - notifier_commune.
8471 *
8472 * Notifie aux communes et par courriel la finalisation d'une instruction.
8473 *
8474 * @return boolean
8475 */
8476 public function notifier_commune() {
8477 // Cette méthode permet d'exécuter une routine en début des méthodes
8478 // dites de TREATMENT.
8479 $this->begin_treatment(__METHOD__);
8480 $message = __('Erreur de paramétrage :');
8481 $erreurParametrage = false;
8482 // Récupération du paramétrage de la collectivité du dossier
8483 $id_di = $this->getVal('dossier');
8484 $di = $this->get_inst_dossier($id_di);
8485 $collectivite_di = $di->getVal('om_collectivite');
8486 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
8487 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
8488 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
8489 $erreurParametrage = true;
8490 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
8491 }
8492
8493 // Récupération de la liste des mails
8494 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
8495 if (empty($adresses)) {
8496 $erreurParametrage = true;
8497 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
8498 }
8499
8500 // Vérification du paramétrage des mails
8501 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
8502 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
8503 $erreurParametrage = true;
8504 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
8505 }
8506 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
8507 $erreurParametrage = true;
8508 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
8509 }
8510
8511 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
8512 // un message a destination de l'utilisateur est affiché
8513 if ($erreurParametrage) {
8514 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
8515 $this->addToMessage($message);
8516 return $this->end_treatment(__METHOD__, false);
8517 }
8518
8519 // Création d'un notification et de sa tâche associé pour chaque mail
8520 foreach ($adresses as $adresse) {
8521 // Ajout de la notif et récupération de son id
8522 $destinataire = array(
8523 'destinataire' => $adresse,
8524 'courriel' => $adresse
8525 );
8526 $idNotif = $this->ajouter_notification(
8527 $this->getVal($this->clePrimaire),
8528 $this->f->get_connected_user_login_name(),
8529 $destinataire,
8530 $collectivite_di
8531 );
8532 if ($idNotif === false) {
8533 $this->addToMessage(__("Veuillez contacter votre administrateur."));
8534 return $this->end_treatment(__METHOD__, false);
8535 }
8536 // Création de la tache en lui donnant l'id de la notification
8537 $notification_by_task = $this->notification_by_task(
8538 $idNotif,
8539 $this->getVal('dossier'),
8540 'mail',
8541 'notification_commune'
8542 );
8543 if ($notification_by_task === false) {
8544 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
8545 $this->addToMessage(__("Veuillez contacter votre administrateur."));
8546 return $this->end_treatment(__METHOD__, false);
8547 }
8548 }
8549 $this->addToMessage(__('La commune a été notifiée.'));
8550 return $this->end_treatment(__METHOD__, true);
8551 }
8552
8553 /**
8554 * Récupère l'instance de l'instructeur
8555 *
8556 * @param integer $instructeur Identifiant de l'instructeur.
8557 *
8558 * @return object
8559 */
8560 protected function get_inst_instructeur($instructeur) {
8561 //
8562 return $this->get_inst_common("instructeur", $instructeur);
8563 }
8564
8565
8566 /**
8567 * Récupère l'instance de l'utilisateur
8568 *
8569 * @param integer $om_utilisateur Identifiant de l'utilisateur.
8570 *
8571 * @return object
8572 */
8573 protected function get_inst_om_utilisateur($om_utilisateur) {
8574 //
8575 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
8576 }
8577
8578
8579 /**
8580 * Récupère l'instance de la division.
8581 *
8582 * @param integer $division Identifiant de la division.
8583 *
8584 * @return object
8585 */
8586 protected function get_inst_division($division) {
8587 //
8588 return $this->get_inst_common("division", $division);
8589 }
8590
8591
8592 /**
8593 * Récupère l'instance de la direction.
8594 *
8595 * @param integer $direction Identifiant de la direction.
8596 *
8597 * @return object
8598 */
8599 protected function get_inst_direction($direction) {
8600 //
8601 return $this->get_inst_common("direction", $direction);
8602 }
8603
8604
8605 /**
8606 * Récupère la collectivité d'un instructeur en passant par sa division puis
8607 * par sa direction.
8608 *
8609 * @param integer $instructeur Identifiant de l'instructeur.
8610 *
8611 * @return integer
8612 */
8613 protected function get_instructeur_om_collectivite($instructeur) {
8614 // Chemin vers la collectivité d'un instructeur
8615 $inst_instr = $this->get_inst_instructeur($instructeur);
8616 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
8617 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
8618
8619 // Collectivité
8620 $om_collectivite = $inst_direction->getVal('om_collectivite');
8621
8622 //
8623 return $om_collectivite;
8624 }
8625
8626 /*
8627 * CONDITION - can_user_access_dossier_contexte_ajout
8628 *
8629 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
8630 * formulaire d'ajout.
8631 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8632 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8633 *
8634 */
8635 function can_user_access_dossier_contexte_ajout() {
8636
8637 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
8638 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
8639 //
8640 if ($id_dossier !== "") {
8641 $dossier = $this->f->get_inst__om_dbform(array(
8642 "obj" => "dossier_instruction",
8643 "idx" => $id_dossier,
8644 ));
8645 //
8646 return $dossier->can_user_access_dossier();
8647 }
8648 return false;
8649 }
8650
8651 /*
8652 * CONDITION - can_user_access_dossier
8653 *
8654 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
8655 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8656 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8657 *
8658 */
8659 function can_user_access_dossier_contexte_modification() {
8660
8661 $id_dossier = $this->getVal('dossier');
8662 //
8663 if ($id_dossier !== "" && $id_dossier !== null) {
8664 $dossier = $this->f->get_inst__om_dbform(array(
8665 "obj" => "dossier_instruction",
8666 "idx" => $id_dossier,
8667 ));
8668 //
8669 return $dossier->can_user_access_dossier();
8670 }
8671 return false;
8672 }
8673
8674 /**
8675 * TREATMENT - envoyer_a_signature_sans_relecture
8676 *
8677 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
8678 *
8679 * @return boolean true si l'envoi a été effectué avec succès false sinon
8680 */
8681 function envoyer_a_signature_sans_relecture() {
8682 return $this->envoyer_a_signature();
8683 }
8684
8685 /**
8686 * TREATMENT - envoyer_a_signature_avec_relecture
8687 *
8688 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
8689 *
8690 * @return boolean true si l'envoi a été effectué avec succès false sinon
8691 */
8692 function envoyer_a_signature_avec_relecture() {
8693 $is_forced_view_files = true;
8694 return $this->envoyer_a_signature($is_forced_view_files);
8695 }
8696
8697 /**
8698 * TREATMENT - envoyer_a_signature
8699 *
8700 * Permet d'envoyer le document de l'instruction au parapheur pour signature
8701 *
8702 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
8703 *
8704 * @return boolean true si l'envoi a été effectué avec succès false sinon
8705 */
8706 function envoyer_a_signature($is_forced_view_files = false) {
8707 $this->begin_treatment(__METHOD__);
8708 $this->correct = true;
8709
8710 // Instanciation de l'objet signataire_arrete
8711 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
8712 'obj' => 'signataire_arrete',
8713 'idx' => $this->getVal('signataire_arrete'),
8714 ));
8715
8716 // Instanciation de l'objet dossier
8717 $inst_dossier = $this->f->get_inst__om_dbform(array(
8718 'obj' => 'dossier',
8719 'idx' => $this->getVal('dossier'),
8720 ));
8721
8722 // Récupération du document à signer
8723 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
8724 if ($file === OP_FAILURE) {
8725 $this->correct = false;
8726 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
8727 // Termine le traitement
8728 return $this->end_treatment(__METHOD__, false);
8729 }
8730
8731 // Initialisation des paramètre à passer pour l'envoi en signature
8732 $data = array(
8733 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
8734 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
8735 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
8736 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
8737 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
8738 // Permet d'envoyer en signature l'instruction le jour de la date limite
8739 "date_limite_instruction" => $this->compute_date_limite(1),
8740 "dossier" => $this->getVal('dossier'),
8741 "is_forced_view_files" => $is_forced_view_files,
8742 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
8743 );
8744
8745 // Initialisation des métadonnées
8746 $metadonnee_dossier = $file['metadata'];
8747 // récupération de l'extension du fichier
8748 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
8749 // Modification du libellé du document transmis au parapheur
8750 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
8751 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
8752 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
8753
8754 $metadonnee_dossier['url_di'] = sprintf(
8755 '%sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx=%s',
8756 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
8757 $this->getVal($this->clePrimaire)
8758 );
8759
8760 $optional_data = null;
8761 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
8762 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
8763 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
8764 if (json_last_error() !== JSON_ERROR_NONE) {
8765 $this->correct = false;
8766 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
8767 $this->addToLog(__METHOD__."(): ".
8768 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
8769 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
8770 );
8771 // Termine le traitement
8772 return $this->end_treatment(__METHOD__, false);
8773 }
8774 }
8775
8776 //Instanciation de la classe electronicsignature
8777 $inst_es = $this->get_electronicsignature_instance();
8778 if ($inst_es === false) {
8779 $this->correct = false;
8780 return $this->end_treatment(__METHOD__, false);
8781 }
8782
8783 // Appel de la méthode de l'abstracteur send_for_signature()
8784 // Cette méthode doit retourner un tableau de valeur
8785 try {
8786 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
8787 } catch (electronicsignature_exception $e) {
8788 $this->handle_electronicsignature_exception($e);
8789 return $this->end_treatment(__METHOD__, false);
8790 }
8791
8792 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8793 $valF = array();
8794
8795 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8796 foreach($this->champs as $identifiant => $champ) {
8797 $valF[$champ] = $this->val[$identifiant];
8798 }
8799 // On fait ensuite nos modifications spécifiques
8800 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
8801 $valF['statut_signature'] = $result['statut'];
8802 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8803 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
8804 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
8805
8806 $ret = $this->modifier($valF);
8807
8808 if ($ret === false) {
8809 $this->correct = false;
8810 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
8811 // Termine le traitement
8812 return $this->end_treatment(__METHOD__, false);
8813 }
8814
8815 // Message
8816 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
8817 if (array_key_exists('signature_page_url', $result) === true) {
8818 $this->addToMessage(sprintf(
8819 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
8820 $result['signature_page_url'],
8821 __("Signez directement le document")
8822 ));
8823 }
8824
8825 // Tout s'est bien passé, on termine le traitement
8826 return $this->end_treatment(__METHOD__, true);
8827 }
8828
8829 /**
8830 * Permet de récupérer la bonne date limite en fonction de si l'instruction
8831 * est en incomplet notifié ou non.
8832 * On peut ajouter des jours à cette date grâce au paramètre "delay".
8833 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
8834 * l'instruction en signature le jour de la date limite.
8835 *
8836 * @param int $delay Le nombre de jour à ajouter à la date limite.
8837 *
8838 * @return string $date_limite la date limite calculé ou false
8839 */
8840 private function compute_date_limite($delay) {
8841 // Instanciation de l'objet dossier
8842 $inst_dossier = $this->f->get_inst__om_dbform(array(
8843 'obj' => 'dossier',
8844 'idx' => $this->getVal('dossier'),
8845 ));
8846
8847 $date_to_compute = null;
8848 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
8849 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
8850 } else {
8851 $date_to_compute = $inst_dossier->getVal('date_limite');
8852 }
8853
8854 $date_limite = date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
8855
8856 return $date_limite;
8857 }
8858
8859 /**
8860 * Permet de récupérer la traduction de la valeur de statut_signature
8861 *
8862 * @return string la valeur de statut_signature traduite | false
8863 */
8864 function get_trad_for_statut($value_to_trad){
8865 $statut_signature_tab = array(
8866 'waiting' => __('en préparation'),
8867 'in_progress' => __('en cours de signature'),
8868 'canceled' => __('signature annulée'),
8869 'expired' => __('délai de signature expiré'),
8870 'finished' => __('signé')
8871 );
8872 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
8873 return $statut_signature_tab[$value_to_trad];
8874 }
8875
8876 return false;
8877 }
8878
8879 /**
8880 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
8881 *
8882 * @return string (json) la valeur de historique_signature mis à jour | false
8883 */
8884 function get_updated_historique_signature($historique_signature_values) {
8885
8886 $historique_signature_value_tab = $this->get_historique_signature_decoded();
8887
8888 if ($historique_signature_value_tab === false) {
8889 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
8890 return false;
8891 }
8892
8893 $last_val_historique_signature = array();
8894
8895 // Si la tableau récupéré n'est pas vide alors
8896 // on récupère la dernière ligne du tableau
8897 if (empty($historique_signature_value_tab) === false) {
8898 $last_val_historique_signature = end($historique_signature_value_tab);
8899 }
8900
8901 $format_date = '';
8902 $format_date_hour = '';
8903 $date_converted=array();
8904
8905 $date_to_convert = array(
8906 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
8907 'date_limite_instruction' => $this->compute_date_limite(0),
8908 'date_retour_signature' => $historique_signature_values['date_retour_signature']
8909 );
8910
8911 // Conversion des dates en fonction de leur format
8912 foreach ($date_to_convert as $key => $value) {
8913 $date_converted[$key] = null;
8914 if ($value != null) {
8915 $format_date = 'd/m/Y';
8916 $format_date_hour = 'd/m/Y H:i:s';
8917 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
8918 }
8919 }
8920
8921 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
8922 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
8923 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
8924 $tab_for_columns_trad = array(
8925 __('entry_date'),
8926 __('id_parapheur_signature'),
8927 __('emetteur'),
8928 __('signataire'),
8929 __('date_envoi'),
8930 __('date_limite'),
8931 __('date_retour'),
8932 __('statut_signature'),
8933 __('commentaire_signature')
8934 );
8935
8936 array_push($historique_signature_value_tab, array(
8937 'entry_date' => date('d/m/Y H:i:s'),
8938 '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'],
8939 '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'],
8940 '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'],
8941 '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'],
8942 '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'],
8943 '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'],
8944 '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']),
8945 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
8946 ));
8947
8948 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
8949 }
8950
8951 /**
8952 * TREATMENT - annuler_envoi_en_signature
8953 *
8954 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
8955 *
8956 * @return boolean true si l'annulation a été effectué avec succès false sinon
8957 */
8958 function annuler_envoi_en_signature() {
8959 $this->begin_treatment(__METHOD__);
8960 $this->correct = true;
8961
8962 //Instanciation de la classe electronicsignature
8963 $inst_es = $this->get_electronicsignature_instance();
8964 if ($inst_es === false) {
8965 $this->correct = false;
8966 return $this->end_treatment(__METHOD__, false);
8967 }
8968
8969 $data = array();
8970 if (! empty($this->getVal('id_parapheur_signature'))) {
8971 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
8972 } else {
8973 $this->correct = false;
8974 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
8975 return $this->end_treatment(__METHOD__, false);
8976 }
8977
8978 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
8979 // Cette méthode doit retourner un tableau de valeur
8980 try {
8981 $result = $inst_es->cancel_send_for_signature($data);
8982 } catch (electronicsignature_exception $e) {
8983 $this->handle_electronicsignature_exception($e);
8984 return $this->end_treatment(__METHOD__, false);
8985 }
8986
8987 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8988 $valF = array();
8989
8990 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8991 foreach($this->champs as $identifiant => $champ) {
8992 $valF[$champ] = $this->val[$identifiant];
8993 }
8994 // On fait ensuite nos modifications spécifiques
8995 $valF['id_parapheur_signature'] = null;
8996 $valF['statut_signature'] = $result['statut'];
8997 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8998 $valF['date_envoi_signature'] = null;
8999 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9000
9001 $ret = $this->modifier($valF);
9002
9003 if ($ret === false) {
9004 $this->correct = false;
9005 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9006 // Termine le traitement
9007 return $this->end_treatment(__METHOD__, false);
9008 }
9009
9010 // Message
9011 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9012
9013 // Tout s'est bien passé, on termine le traitement
9014 return $this->end_treatment(__METHOD__, true);
9015 }
9016
9017
9018 /**
9019 * Récupère le contenu du champ historique_signature et le converti en tableau
9020 *
9021 * @return array sinon false en cas d'erreur
9022 */
9023 protected function get_historique_signature_decoded() {
9024 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9025 if ($val === '' || $val == 'false') {
9026 $val = json_encode(array());
9027 }
9028 if($this->isJson($val) === false) {
9029 return false;
9030 }
9031 return json_decode($val, true);
9032 }
9033
9034 /**
9035 * Récupère les informations à afficher dans le tableau de suivi à l'aide
9036 * d'une requête sql. Stocke ces informations dans un tableau.
9037 * Converti le tableau au format json et renvoi le json obtenu.
9038 *
9039 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9040 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9041 * La clause where de la requête est construite à partir du tableau contenant les types
9042 * de tâches fourni en paramètre.
9043 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9044 *
9045 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9046 * la date de premier accès ne sera pas affichée.
9047 *
9048 * @param array liste des tâches permettant d'identifier quelles notification afficher
9049 * @param boolean permet d'afficher les notifications non liées à des tâches
9050 * @return json
9051 */
9052 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9053 $whereTypeTache = '';
9054 $sqlTaskNull = '';
9055
9056 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9057 $listeChampsTrad = array(
9058 __('emetteur'),
9059 __('date_envoi'),
9060 __('destinataire'),
9061 __('date_premier_acces'),
9062 __('instruction'),
9063 __('annexes'),
9064 __('statut'),
9065 __('commentaire')
9066 );
9067 $listeChamps = array(
9068 'emetteur',
9069 'date_envoi',
9070 'destinataire',
9071 'date_premier_acces',
9072 'instruction',
9073 'annexes',
9074 'statut',
9075 'commentaire'
9076 );
9077
9078 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9079 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9080 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9081 // paramétrage
9082 if(is_bool($nonLieTache) && $nonLieTache === true) {
9083 $sqlTaskNull = 'OR task.type is null';
9084 }
9085 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9086 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9087 // tiers consulté
9088 if (is_array($typeTache) && $typeTache != array()) {
9089 if (is_array($typeTache)) {
9090 $whereTypeTache = sprintf(
9091 'AND (task.type IN (%1$s) %2$s)',
9092 "'".implode("', '", $typeTache)."'",
9093 $sqlTaskNull
9094 );
9095 }
9096 // La date de premier accès n'a pas besoin d'être renseigné pour
9097 // les notifications des demandeurs via le portail citoyen.
9098 // Les notifications des demandeurs sont liés à 3 types de tâches
9099 // notification_recepisse, notification_instruction, notification_decision
9100 // Si le suivi de la notification concerne un de ces types de tâches on
9101 // considère que c'est une notification de demandeurs.
9102 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9103 // via le portail. Par défaut si rien n'est paramétré on considère que la
9104 // notification est faite via le portail
9105 if ((in_array('notification_recepisse', $typeTache) ||
9106 in_array('notification_instruction', $typeTache) ||
9107 in_array('notification_decision', $typeTache))) {
9108 $dossier = $this->getVal('dossier');
9109 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9110 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9111 if (empty($modeNotification) || $modeNotification == PORTAL) {
9112 $listeChamps = array(
9113 'emetteur',
9114 'date_envoi',
9115 'destinataire',
9116 'instruction',
9117 'annexes',
9118 'statut',
9119 'commentaire'
9120 );
9121 }
9122 }
9123 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9124 // de les afficher dans le suivi
9125 if (in_array('notification_depot_demat', $typeTache)) {
9126 $listeChamps = array(
9127 'emetteur',
9128 'date_envoi',
9129 'destinataire',
9130 'instruction',
9131 'statut',
9132 'commentaire'
9133 );
9134 }
9135 }
9136
9137 $valSuivi = array();
9138 // Récupération des infos nécessaires à l'affichage du tableau
9139 $sql = sprintf(
9140 'SELECT DISTINCT
9141 instruction_notification.instruction_notification,
9142 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9143 CASE WHEN instruction_notification.automatique = TRUE
9144 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9145 ELSE instruction_notification.emetteur
9146 END as emetteur,
9147 date_envoi,
9148 instruction_notification.destinataire,
9149 instruction_notification.date_premier_acces,
9150 evenement.libelle as instruction,
9151 instruction_notification.statut,
9152 instruction_notification.commentaire,
9153 annexes.instruction_annexe as annexes
9154 FROM
9155 %1$sinstruction_notification
9156 LEFT JOIN %1$sinstruction
9157 ON instruction.instruction = instruction_notification.instruction
9158 LEFT JOIN %1$sevenement
9159 ON instruction.evenement = evenement.evenement
9160 LEFT JOIN %1$sinstruction_notification_document
9161 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9162 AND instruction_notification_document.annexe = true
9163 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9164 LEFT JOIN %1$stask
9165 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9166 -- Récupération de la liste des annexes sous la forme d une liste
9167 LEFT JOIN (
9168 SELECT
9169 instruction_notification,
9170 -- Récupère la liste des annexes de la notification
9171 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9172 -- à l affichage du lien vers les annexes
9173 CONCAT(
9174 \'[\',
9175 STRING_AGG(
9176 -- Affiche le nom du fichier selon le type de document/pièce
9177 CASE
9178 WHEN instruction_notification_document.document_type = \'instruction\'
9179 THEN CONCAT(
9180 \'{
9181 "obj" : "instruction",
9182 "champs" : "om_fichier_instruction",
9183 "label" : "\', evenement.libelle, \'",
9184 "id" : "\', instruction.instruction,\'"
9185 }\'
9186 )
9187 WHEN instruction_notification_document.document_type = \'consultation\'
9188 THEN CONCAT(
9189 \'{
9190 "obj" : "consultation",
9191 "champs" : "fichier",
9192 "label" : "Avis - \', service.libelle, \'",
9193 "id" : "\', consultation.consultation,\'"
9194 }\'
9195 )
9196 ELSE
9197 CONCAT(
9198 \'{
9199 "obj" : "document_numerise",
9200 "champs" : "uid",
9201 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9202 "id" : "\', document_numerise.document_numerise,\'"
9203 }\'
9204 )
9205 END,
9206 \', \'),
9207 \']\'
9208 ) AS instruction_annexe
9209 FROM
9210 %1$sinstruction_notification_document
9211 LEFT JOIN %1$sinstruction
9212 ON instruction_notification_document.instruction = instruction.instruction
9213 LEFT JOIN %1$sevenement
9214 ON instruction.evenement = evenement.evenement
9215 LEFT JOIN %1$sconsultation
9216 ON instruction_notification_document.document_id = consultation.consultation
9217 LEFT JOIN %1$sservice
9218 ON consultation.service = service.service
9219 LEFT JOIN %1$sdocument_numerise
9220 ON instruction_notification_document.document_id = document_numerise.document_numerise
9221 LEFT JOIN %1$sdocument_numerise_type
9222 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9223 WHERE
9224 instruction_notification_document.annexe = \'t\'
9225 GROUP BY
9226 instruction_notification
9227 ) AS annexes
9228 ON
9229 annexes.instruction_notification = instruction_notification.instruction_notification
9230 WHERE
9231 instruction.instruction = %2$s
9232 %3$s
9233 ORDER BY
9234 date_envoi ASC, instruction_notification.destinataire ASC',
9235 DB_PREFIXE,
9236 $this->getVal('instruction'),
9237 $whereTypeTache
9238 );
9239 $res = $this->f->db->query($sql);
9240 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9241 $this->f->isDatabaseError($res);
9242 // Préparation du lien de téléchargement des annexes
9243 $htmlList =
9244 '<style>
9245 #content .gridjs-td a.lien_annexe {
9246 text-decoration : underline dotted 1px;
9247 }
9248 #content a.lien_annexe:hover {
9249 text-decoration : underline solid 1px;
9250 color : #46aede;
9251 }
9252 ol {padding-left : 10px;}
9253 </style>
9254 <ol>%1$s</ol>';
9255 $lienTelechargement =
9256 '<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">
9257 Annexe
9258 </a>';
9259 // Stockage des infos de chaque notification dans un tableau
9260 while( $row =& $res->fetchrow(DB_FETCHMODE_ASSOC) ) {
9261 $valNotif = array();
9262 foreach($listeChamps as $champ) {
9263 $valNotif[$champ] = $row[$champ];
9264 if (($champ === 'date_envoi'
9265 || $champ === 'date_premier_acces')
9266 && $row[$champ] !== null
9267 && $row[$champ] !== '') {
9268 //
9269 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9270 } else if ($champ === 'annexes') {
9271 $listeAnnexe = '';
9272 $infoAnnexes = json_decode($row[$champ], true);
9273 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9274 // A partir des infos récupérées prépare le code html du lien vers chacune
9275 // des annexes et ajoute un élément de liste par annexe
9276 foreach($infoAnnexes as $annexe) {
9277 $listeAnnexe .= sprintf(
9278 '<li>%s</li>',
9279 sprintf($lienTelechargement,
9280 $annexe['obj'],
9281 $annexe['champs'],
9282 $annexe['id'],
9283 $annexe['label']
9284 )
9285 );
9286 }
9287 // Construction de la liste des annexes
9288 $valNotif[$champ] = sprintf(
9289 $htmlList,
9290 $listeAnnexe
9291 );
9292 }
9293 }
9294 }
9295 array_push($valSuivi, $valNotif);
9296 }
9297
9298 // Passage du tableau au format json
9299 return json_encode($valSuivi, JSON_HEX_APOS);
9300 }
9301
9302 /**
9303 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9304 *
9305 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9306 *
9307 * @return void
9308 */
9309 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9310 $this->f->displayMessage('error', $exception->getMessage());
9311 }
9312
9313
9314 /**
9315 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9316 *
9317 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9318 * @return electronicsignature Instance de l'abstracteur.
9319 */
9320 public function get_electronicsignature_instance($with_handle_error = true) {
9321 if(isset($this->electronicsignature_instance)) {
9322 return $this->electronicsignature_instance;
9323 }
9324 // Instanciation du connecteur electronicsignature
9325 try {
9326 require_once "electronicsignature.class.php";
9327 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9328 $this->electronicsignature_instance = new electronicsignature($collectivites);
9329 } catch (electronicsignature_exception $e) {
9330 if ($with_handle_error === true) {
9331 $this->handle_electronicsignature_exception($e);
9332 }
9333 return false;
9334 }
9335 return $this->electronicsignature_instance;
9336 }
9337
9338 /**
9339 * TREATMENT - envoyer_au_controle_de_legalite
9340 *
9341 * Ajoute la tâche envoi_CL.
9342 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9343 *
9344 * @return [type] [description]
9345 */
9346 function envoyer_au_controle_de_legalite() {
9347 $this->begin_treatment(__METHOD__);
9348 $this->correct = true;
9349
9350 //
9351 if ($this->can_be_sended_to_cl() === true) {
9352 // Création de la task 'envoi_CL'
9353 $inst_task = $this->f->get_inst__om_dbform(array(
9354 "obj" => "task",
9355 "idx" => 0,
9356 ));
9357 $task_val = array(
9358 'type' => 'envoi_CL',
9359 'object_id' => $this->getVal('instruction'),
9360 'dossier' => $this->getVal('dossier'),
9361 );
9362 // Change l'état de la tâche de notification en fonction de l'état de
9363 // transmission du dossier d'instruction
9364 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9365 if ($this->f->is_option_mode_service_consulte_enabled() === false
9366 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9367 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9368 //
9369 $task_val['state'] = $inst_task::STATUS_DRAFT;
9370 }
9371 $add_task = $inst_task->add_task(array('val' => $task_val));
9372 if ($add_task === false) {
9373 $this->addToMessage(sprintf('%s %s',
9374 __("Une erreur s'est produite lors de la création tâche."),
9375 __("Veuillez contacter votre administrateur.")
9376 ));
9377 $this->correct = false;
9378 return $this->end_treatment(__METHOD__, false);
9379 }
9380 // Mise à jour du champs 'envoye_cl_platau'
9381 $instr_val = array(
9382 'envoye_cl_platau' => 't',
9383 );
9384 $res = $this->f->db->autoExecute(
9385 DB_PREFIXE.$this->table,
9386 $instr_val,
9387 DB_AUTOQUERY_UPDATE,
9388 $this->getCle($this->getVal($this->clePrimaire))
9389 );
9390 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
9391 if ($this->f->isDatabaseError($res, true) === true) {
9392 $this->addToMessage(sprintf('%s %s',
9393 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9394 __("Veuillez contacter votre administrateur.")
9395 ));
9396 $this->correct = false;
9397 return $this->end_treatment(__METHOD__, false);
9398 }
9399 // Message de validation à l'utilisateur
9400 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9401 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9402 }
9403 //
9404 return $this->end_treatment(__METHOD__, true);
9405 }
9406
9407
9408 /**
9409 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9410 *
9411 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9412 * la vue 'sousformulaire'.
9413 *
9414 * @return string
9415 */
9416 function get_back_link($view = "formulaire") {
9417 //
9418 $href = parent::get_back_link($view);
9419 //
9420 $crud = $this->get_action_crud();
9421
9422 // Redirection vers le formulaire de modification à la validation du
9423 // formulaire d'ajout si l'événement associé possède une lettre type
9424 if (($crud === 'create'
9425 || ($crud === null
9426 && $this->getParameter('maj') == 0))
9427 && $this->correct == true
9428 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9429
9430 // On instancie l'instruction
9431 $inst_instruction = $this->f->get_inst__om_dbform(array(
9432 "obj" => "instruction",
9433 "idx" => $this->valF[$this->clePrimaire],
9434 ));
9435
9436 // Si l'instruction n'est pas finalisée automatiquement
9437 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9438 $href = str_replace("&action=3", "&action=1", $href);
9439 //
9440 if (strpos($href, "&retour=tab") !== false) {
9441 $href = str_replace("&retour=tab", "&retour= form", $href);
9442 } else {
9443 $href .= "&retour=form";
9444 }
9445 }
9446 }
9447
9448 //
9449 return $href;
9450 }
9451
9452 public function view_json_data() {
9453 $this->checkAccessibility();
9454 $this->f->disableLog();
9455 $view = $this->get_json_data();
9456 printf(json_encode($view));
9457 }
9458
9459 public function get_json_data() {
9460 $val = array_combine($this->champs, $this->val);
9461 foreach ($val as $key => $value) {
9462 $val[$key] = strip_tags($value);
9463 }
9464 $val['tacite'] = 'f';
9465 $inst_ad = $this->f->get_inst__om_dbform(array(
9466 "obj" => "avis_decision",
9467 "idx" => $val['avis_decision'],
9468 ));
9469 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9470 $val['tacite'] = 't';
9471 }
9472 return $val;
9473 }
9474
9475 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
9476 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
9477 return false;
9478 }
9479 $result = array();
9480 $evenements = array();
9481 if ($instruction === null) {
9482 $instruction = $this->getVal($this->clePrimaire);
9483 $evenement = $this->getVal('evenement');
9484 $dossier = $this->getVal('dossier');
9485 } else {
9486 $inst = $this->f->get_inst__om_dbform(array(
9487 "obj" => "instruction",
9488 "idx" => $instruction,
9489 ));
9490 $evenement = $inst->getVal('evenement');
9491 $dossier = $inst->getVal('dossier');
9492 }
9493 //
9494 $qres = $this->f->get_one_result_from_db_query(
9495 sprintf(
9496 'SELECT
9497 evenement_%3$s
9498 FROM
9499 %1$sevenement
9500 WHERE
9501 evenement = %2$s',
9502 DB_PREFIXE,
9503 intval($evenement),
9504 $next_type
9505 ),
9506 array(
9507 "origin" => __METHOD__,
9508 "force_return" => true,
9509 )
9510 );
9511 if ($qres["code"] !== "OK") {
9512 return false;
9513 }
9514 $ev_next = $qres["result"];
9515 //
9516 $res = $this->f->get_one_result_from_db_query(
9517 sprintf(
9518 'SELECT
9519 MAX(instruction.instruction) as instruction
9520 FROM
9521 %1$sinstruction
9522 WHERE
9523 dossier = \'%3$s\'
9524 AND evenement = %2$s',
9525 DB_PREFIXE,
9526 intval($ev_next),
9527 $dossier
9528 ),
9529 array(
9530 "origin" => __METHOD__,
9531 "force_return" => true,
9532 )
9533 );
9534 if ($qres["code"] !== "OK") {
9535 return false;
9536 }
9537 return $qres["result"];
9538 }
9539
9540 public function get_related_instructions($instruction = null) {
9541 $result = array();
9542 $evenements = array();
9543 if ($instruction === null) {
9544 $instruction = $this->getVal($this->clePrimaire);
9545 $evenement = $this->getVal('evenement');
9546 $dossier = $this->getVal('dossier');
9547 } else {
9548 $inst = $this->f->get_inst__om_dbform(array(
9549 "obj" => "instruction",
9550 "idx" => $instruction,
9551 ));
9552 $evenement = $inst->getVal('evenement');
9553 $dossier = $inst->getVal('dossier');
9554 }
9555 //
9556 $qres = $this->f->get_one_result_from_db_query(
9557 sprintf(
9558 'SELECT
9559 evenement
9560 FROM
9561 %1$sevenement
9562 WHERE
9563 evenement_retour_ar = %2$s
9564 OR evenement_retour_signature = %2$s',
9565 DB_PREFIXE,
9566 intval($evenement)
9567 ),
9568 array(
9569 "origin" => __METHOD__,
9570 "force_return" => true,
9571 )
9572 );
9573 if ($qres["code"] !== "OK") {
9574 return false;
9575 }
9576 $ev_parent = $qres["result"];
9577 //
9578 $qres = $this->f->get_one_result_from_db_query(
9579 sprintf(
9580 'SELECT
9581 MAX(instruction.instruction) as instruction
9582 FROM
9583 %1$sinstruction
9584 WHERE
9585 dossier = \'%3$s\'
9586 AND evenement = %2$s',
9587 DB_PREFIXE,
9588 intval($ev_parent),
9589 $this->f->db->escapeSimple($dossier)
9590 ),
9591 array(
9592 "origin" => __METHOD__,
9593 "force_return" => true,
9594 )
9595 );
9596 if ($qres["code"] !== "OK") {
9597 return false;
9598 }
9599 $result[] = $qres["result"];
9600 //
9601 $qres = $this->f->get_one_result_from_db_query(
9602 sprintf(
9603 'SELECT
9604 evenement_retour_ar
9605 FROM
9606 %1$sevenement
9607 WHERE
9608 evenement = %2$s
9609 AND evenement_retour_ar != %3$s',
9610 DB_PREFIXE,
9611 intval($ev_parent),
9612 intval($evenement)
9613 ),
9614 array(
9615 "origin" => __METHOD__,
9616 "force_return" => true,
9617 )
9618 );
9619 if ($qres["code"] !== "OK") {
9620 return false;
9621 }
9622 $evenements[] = $qres["result"];
9623 //
9624 $qres = $this->f->get_one_result_from_db_query(
9625 sprintf(
9626 'SELECT
9627 evenement_retour_signature
9628 FROM
9629 %1$sevenement
9630 WHERE
9631 evenement = %2$s
9632 AND evenement_retour_signature != %3$s
9633 ',
9634 DB_PREFIXE,
9635 intval($ev_parent),
9636 intval($evenement)
9637 ),
9638 array(
9639 "origin" => __METHOD__,
9640 "force_return" => true,
9641 )
9642 );
9643 if ($qres["code"] !== "OK") {
9644 return false;
9645 }
9646 $evenements[] = $qres["result"];
9647 foreach ($evenements as $value) {
9648 if ($value !== null) {
9649 $qres = $this->f->get_one_result_from_db_query(
9650 sprintf(
9651 'SELECT
9652 MAX(instruction.instruction) as instruction
9653 FROM
9654 %1$sinstruction
9655 WHERE
9656 dossier = \'%3$s\'
9657 AND evenement = %2$s',
9658 DB_PREFIXE,
9659 intval($value),
9660 $this->f->db->escapeSimple($dossier)
9661 ),
9662 array(
9663 "origin" => __METHOD__,
9664 "force_return" => true,
9665 )
9666 );
9667 if ($qres["code"] !== "OK") {
9668 return false;
9669 }
9670 $result[] = $qres["result"];
9671 }
9672 }
9673 return $result;
9674 }
9675
9676 protected function getDocumentType($champ = null) {
9677 $evenementId = $this->getVal('evenement');
9678 if (! empty($evenementId)) {
9679 $evenement = $this->f->findObjectById('evenement', $evenementId);
9680 if (! empty($evenement)) {
9681 return __("Instruction").':'.$evenement->getVal('libelle');
9682 }
9683 }
9684 return parent::getDocumentType();
9685 }
9686
9687 /**
9688 * Récupère à l'aide d'une requête sql la liste des demandeurs
9689 * pouvant être notifié. C'est à dire les demandeurs acceptant
9690 * les notifications et pour lesquels une adresse mail existe.
9691 *
9692 * Dans le cas, d'une notification pour le portail citoyen, seul
9693 * le pétitionnaire principal doit être notifier et uniquement si
9694 * il a une adress mail et qu'il accepte les notifications.
9695 *
9696 * @param string identifiant du dossier
9697 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
9698 * pour une notification de categorie portail
9699 * @return array liste des demandeurs pouvant être notifié
9700 */
9701 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
9702 if ($idDossier === null) {
9703 $idDossier = $this->getVal('dossier');
9704 }
9705 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
9706 // pour une notification depuis le portail citoyen
9707 $sqlPetitionnairePrincipal = '';
9708 // Gestion des champs nécessaires pour la notification d'un demandeur
9709 $condition_demandeur = "AND demandeur.notification = 't'
9710 AND demandeur.courriel IS NOT NULL";
9711 if ($portail === true) {
9712 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
9713 $condition_demandeur = "AND (
9714 (notification = 't' AND courriel IS NOT NULL)
9715 OR demande.source_depot = 'portal'
9716 )";
9717 }
9718
9719 $listeDemandeursNotifiable = array();
9720
9721 // Requête de récupération des demandeurs
9722 $sql = sprintf(
9723 'SELECT
9724 demandeur.demandeur,
9725 CASE
9726 WHEN demandeur.qualite=\'particulier\'
9727 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
9728 ELSE
9729 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
9730 END AS destinataire,
9731 demandeur.courriel,
9732 petitionnaire_principal
9733 FROM
9734 %1$sdossier
9735 INNER JOIN %1$slien_dossier_demandeur
9736 ON dossier.dossier = lien_dossier_demandeur.dossier
9737 INNER JOIN %1$sdemandeur
9738 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9739 -- Récupération de la plus ancienne demande associée au dossier (la demande
9740 -- de création du dossier)
9741 INNER JOIN (
9742 SELECT
9743 demande,
9744 dossier_instruction,
9745 source_depot
9746 FROM
9747 %1$sdemande
9748 WHERE
9749 dossier_instruction = \'%2$s\'
9750 ORDER BY
9751 demande ASC
9752 LIMIT 1
9753 ) as demande
9754 ON dossier.dossier = demande.dossier_instruction
9755 WHERE
9756 dossier.dossier = \'%2$s\'
9757 %3$s
9758 %4$s',
9759 DB_PREFIXE,
9760 $idDossier,
9761 $condition_demandeur,
9762 $sqlPetitionnairePrincipal
9763 );
9764 $res = $this->f->db->query($sql);
9765 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9766 $this->f->isDatabaseError($res);
9767 // Récupération des infos des demandeurs et stockage dans un tableau
9768 // ayant pour clé les id des demandeurs
9769 while($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9770 $listeDemandeursNotifiable[$row['demandeur']] = $row;
9771 }
9772
9773 return $listeDemandeursNotifiable;
9774 }
9775
9776 /**
9777 * Renvoie la liste des notifications liées à l'instruction
9778 *
9779 * @param integer id de l'instruction dont on cherche les notifications
9780 * @return array liste des instruction_notification liés à l'instruction
9781 */
9782 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
9783 $whereTypeTache = '';
9784 $sqlTaskNull = '';
9785 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9786 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9787 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9788 // paramétrage
9789 if(is_bool($nonLieTache) && $nonLieTache === true) {
9790 $sqlTaskNull = 'OR task.type is null';
9791 }
9792 if ($typeNotification != null) {
9793 if (is_array($typeNotification)) {
9794 $whereTypeTache = sprintf(
9795 'AND (task.type IN (%1$s) %2$s)',
9796 "'".implode("', '", $typeNotification)."'",
9797 $sqlTaskNull
9798 );
9799 } else {
9800 $whereTypeTache = sprintf(
9801 'AND (task.type = \'%1$s\' %2$s)',
9802 $typeNotification,
9803 $sqlTaskNull
9804 );
9805 }
9806 }
9807 $listeInstrNotif = array();
9808 $sql = sprintf('
9809 SELECT
9810 instruction_notification.instruction_notification
9811 FROM
9812 %1$sinstruction_notification
9813 LEFT JOIN %1$stask
9814 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9815 WHERE
9816 instruction = %2$s
9817 %3$s',
9818 DB_PREFIXE,
9819 $id_instruction,
9820 $whereTypeTache
9821 );
9822 $res = $this->f->db->query($sql);
9823 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9824 $this->f->isDatabaseError($res);
9825 while ($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9826 $listeInstrNotif[] = $row['instruction_notification'];
9827 }
9828 return $listeInstrNotif;
9829 }
9830
9831 /**
9832 * Crée une clé d'accès unique permettant à un utilisateur
9833 * anonyme de récupérer le document.
9834 *
9835 * @return string clé d'accès du document
9836 */
9837 protected function getCleAccesDocument() {
9838 // Initialisation d'un tableau
9839 $number_list = array();
9840
9841 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
9842 for ($i = 0; $i < 4; $i++) {
9843 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
9844 }
9845
9846 // Transformation en chaîne tout en séparant les nombres par un "-"
9847 $result = implode('-', $number_list);
9848
9849 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
9850 if ($this->getUidDocumentInstructionWithKey($result) != null) {
9851 return $this->getCleAccesDocument();
9852 }
9853
9854 //
9855 return $result;
9856 }
9857
9858 /**
9859 * Récupère une clé et renvoie l'uid du document liée à cette
9860 * clé. Si la clé n'existe pas renvoie null.
9861 *
9862 * @param string $cleGen clé dont on cherche l'instruction
9863 * @return integer|null
9864 */
9865 protected function getUidDocumentInstructionWithKey($cleGen) {
9866 $query = sprintf(
9867 'SELECT
9868 instruction.om_fichier_instruction
9869 FROM
9870 %1$sinstruction_notification_document
9871 LEFT JOIN %1$sinstruction ON instruction_notification_document.instruction = instruction.instruction
9872 WHERE
9873 instruction_notification_document.cle = \'%2$s\'',
9874 DB_PREFIXE,
9875 $this->f->db->escapeSimple($cleGen)
9876 );
9877
9878 $res = $this->f->db->getOne($query);
9879 $this->addToLog(__METHOD__.": db->getOne(\"".$query."\");", VERBOSE_MODE);
9880 $this->f->isDatabaseError($res);
9881 return $res;
9882 }
9883
9884 /**
9885 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
9886 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
9887 *
9888 * @param string $cleGen
9889 * @return instruction_notification
9890 */
9891 protected function getInstanceNotificationWithKey($key) {
9892 $sql = sprintf(
9893 "SELECT
9894 instruction_notification
9895 FROM
9896 %1\$sinstruction_notification_document
9897 WHERE
9898 cle = '%2\$s'",
9899 DB_PREFIXE,
9900 $this->f->db->escapeSimple($key)
9901 );
9902 $res = $this->f->db->getOne($sql);
9903 $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
9904 $this->f->isDatabaseError($res);
9905
9906 // Récupération de l'instance de notification
9907 $instNotif = $this->f->get_inst__om_dbform(array(
9908 "obj" => "instruction_notification",
9909 "idx" => $res,
9910 ));
9911 return $instNotif;
9912 }
9913
9914
9915 /**
9916 * Affiche la page de téléchargement du document de la notification.
9917 *
9918 * @param boolean $content_only Affiche le contenu seulement.
9919 *
9920 * @return void
9921 */
9922 public function view_telecharger_document_anonym() {
9923 // Par défaut on considère qu'on va afficher le formulaire
9924 $idx = 0;
9925 // Flag d'erreur
9926 $error = false;
9927 // Message d'erreur
9928 $message = '';
9929
9930 // Paramètres GET : récupération de la clé d'accès
9931 $cle_acces_document = $this->f->get_submitted_get_value('key');
9932 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
9933 // Vérification de l'existence de la clé et récupération de l'uid du fichier
9934 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
9935 if ($uidFichier != null) {
9936 // Récupération du document
9937 $file = $this->f->storage->get($uidFichier);
9938
9939 // Headers
9940 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
9941 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
9942 header("Content-Type: ".$file['metadata']['mimetype']);
9943 header("Accept-Ranges: bytes");
9944 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
9945 // Affichage du document
9946 echo $file['file_content'];
9947
9948 // Récupération de la date de premier accès et maj du suivi uniquement
9949 // si la date de 1er accès n'a pas encore été remplis
9950 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
9951 if ($inst_notif->getVal('date_premier_acces') == null ||
9952 $inst_notif->getVal('date_premier_acces') == '') {
9953 $notif_val = array();
9954 foreach ($inst_notif->champs as $champ) {
9955 $notif_val[$champ] = $inst_notif->getVal($champ);
9956 }
9957 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
9958 $notif_val['statut'] = 'vu';
9959 $notif_val['commentaire'] = 'Le document a été vu';
9960 $suivi_notif = $inst_notif->modifier($notif_val);
9961 }
9962
9963 } else {
9964 // Page vide 404
9965 printf('Ressource inexistante');
9966 header('HTTP/1.0 404 Not Found');
9967 }
9968 }
9969
9970 /**
9971 * Récupère le titre du document envoyé au parapheur
9972 */
9973 protected function getDocumentTitre($champ = null) {
9974 $title = $this->getTitle();
9975 $dossier = $this->getDossier();
9976 return $dossier.' '.$title;
9977 }
9978
9979 /**
9980 * Compose le nom du document à transmettre au parapheur.
9981 * Le nom ets composé de cette manière :
9982 * instruction_xxx_libelle_de_la_lettre_type_associee
9983 * ou xxx correspond au numéro de l'instruction
9984 */
9985 protected function getDocumentLibelle() {
9986 // Récupère le champ instruction
9987 $instruction = $this->getVal("instruction");
9988
9989 // Requête sql servant à récupérer le titre du document
9990 // TO_CHAR() introduit un espace avant l'affichage du nombre
9991 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
9992 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
9993 $sql = sprintf(
9994 'SELECT
9995 CONCAT(
9996 \'instruction\',
9997 TO_CHAR(instruction.instruction, \'000\'),
9998 \'_\',
9999 LOWER(om_lettretype.libelle)
10000 ) as nom_fichier
10001 FROM
10002 %1$sinstruction
10003 LEFT JOIN %1$som_lettretype ON om_lettretype.id = instruction.lettretype
10004 WHERE
10005 instruction = %2$s',
10006 DB_PREFIXE,
10007 $instruction
10008 );
10009 $documentLibelle = $this->f->db->getone($sql);
10010 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
10011 $this->f->isDatabaseError($documentLibelle);
10012
10013 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10014 // caractères spéciaux en '_'
10015 // La méthode normalize_string est utilisé pour gérer les accents
10016 $documentLibelle = $this->f->normalize_string($documentLibelle);
10017 // TODO : comparer cette liste et celle de la méthode normalize_string
10018 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10019 // liste
10020 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10021 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10022 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10023 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10024 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10025 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10026 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10027 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10028 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10029 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10030 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10031 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10032 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10033 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10034 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10035 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10036 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10037 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10038 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10039 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10040 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10041 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10042 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10043 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10044 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10045 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10046 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10047 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10048 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10049 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10050 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10051 );
10052
10053 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10054 }
10055
10056 /**
10057 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10058 * l'overlay de notification des demandeurs.
10059 */
10060 function getSubFormTitle($ent) {
10061 $actionSansPath = array('411', '420', '430');
10062 if (in_array($this->getParameter('maj'), $actionSansPath)) {
10063 return '';
10064 }
10065 return parent::getSubFormTitle($ent);
10066 }
10067
10068 /**
10069 * Traitement de la notification automatique des tiers consulté.
10070 *
10071 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10072 * récupérées ajoute une notification et une tâche de notification par mail.
10073 * La création de la tâche de notification par mail déclenchera l'envoi du mail
10074 * et la mise à jour du suivi.
10075 *
10076 * Les tiers notifiables sont ceux :
10077 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10078 * - ayant une habilitation dont le type est listé dans les paramètres de
10079 * notification de l’événement,
10080 * - intervenant sur la commune ou le département du dossier
10081 * - ayant au moins une adresse mail valide
10082 *
10083 * @param evenement instance de l'événement associée à l'instruction
10084 * @param dossier instance du dossier de l'instruction
10085 * @return boolean indique si le traitement à réussi
10086 */
10087 protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10088 // Récupération de l'identifiant plat'au du service consultant
10089 $consultationEntrante = $dossier->get_inst_consultation_entrante();
10090 // Récupération de la liste des types d'habilitations autorisées pour
10091 // cette notification
10092 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10093 // Récupération du département et de la commune du dossier
10094 $commune = $dossier->getVal('commune');
10095 // Le département est récupéré à partir de la commune du dossier donc si la
10096 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10097 $idDepartement = null;
10098 if (! empty($commune)) {
10099 $departement = $dossier->get_inst_departement_dossier();
10100 $idDepartement = $departement->getVal($departement->clePrimaire);
10101 }
10102 // Récupération des courriels des tiers notifiables
10103 $tiersANotifier = $this->get_courriels_tiers_notifiable(
10104 $typesHabilitationsNotifiable,
10105 $consultationEntrante->getVal('service_consultant_id'),
10106 $commune,
10107 $idDepartement
10108 );
10109 // Traitement de chacune des listes de diffusion pour extraire les
10110 // courriels, vérifier la validité des courriels et envoyer la
10111 // notification
10112 $notificationSend = false;
10113 if (empty($tiersANotifier)) {
10114 $this->addToLog(
10115 sprintf(
10116 '%s() : %s %s : ',
10117 __METHOD__,
10118 __("La récupération des tiers à échoué."),
10119 __('Paramétrage'),
10120 var_export(
10121 array(
10122 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10123 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10124 'id_commune' => $commune,
10125 'id_departement' => $idDepartement
10126 ),
10127 true
10128 )
10129 ),
10130 DEBUG_MODE
10131 );
10132 return false;
10133 }
10134 foreach($tiersANotifier as $tierANotifier) {
10135 // Découpe la liste de diffusion pour stocker les adresses mails
10136 // des tiers dans un tableau
10137 $courriels =
10138 array_filter(
10139 array_map(
10140 'trim',
10141 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10142
10143 foreach ($courriels as $courriel) {
10144 // Pour chaque adresse mail vérifie si l'adresse est valide
10145 if (! $this->f->checkValidEmailAddress($courriel)) {
10146 continue;
10147 }
10148 $destinataire = array(
10149 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10150 'courriel' => $courriel
10151 );
10152 // Si l'adresse est valide ajoute une nouvelle notification
10153 // et une tâche d'envoi de mails
10154 $idNotif = $this->ajouter_notification(
10155 $this->getVal($this->clePrimaire),
10156 $this->f->get_connected_user_login_name(),
10157 $destinataire,
10158 $this->get_dossier_instruction_om_collectivite(),
10159 array(),
10160 true
10161 );
10162 if ($idNotif === false) {
10163 $this->addToLog(
10164 __METHOD__.
10165 __("L'ajout de la notification a échoué."),
10166 DEBUG_MODE
10167 );
10168 return false;
10169 }
10170 // Création de la tache en lui donnant l'id de la notification
10171 $notification_by_task = $this->notification_by_task(
10172 $idNotif,
10173 $dossier->getVal('dossier'),
10174 'mail',
10175 'notification_tiers_consulte'
10176 );
10177 if ($notification_by_task === false) {
10178 $this->addToLog(
10179 __METHOD__.
10180 __("L'ajout de la tâche de notification a échoué."),
10181 DEBUG_MODE
10182 );
10183 $this->addToMessage(
10184 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10185 );
10186 return false;
10187 }
10188 $notificationSend = true;
10189 }
10190 }
10191 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10192 // valide, affiche un message dans les logs pour avoir un suivi.
10193 if (! $notificationSend) {
10194 $this->addToLog(
10195 sprintf(
10196 '%s %s : %s %s : %s',
10197 __METHOD__,
10198 __("Il n'y a pas de tiers notifiable pour l'instruction"),
10199 $evenement->getVal('libelle'),
10200 __("du dossier"),
10201 $this->getVal('dossier')
10202 ),
10203 DEBUG_MODE
10204 );
10205 }
10206 return true;
10207 }
10208
10209 /**
10210 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10211 * respectant les conditions suvantes :
10212 * - le tiers consulté dois accepté les notifications
10213 * - la liste de diffusion ne dois pas être vide
10214 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10215 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10216 * du tiers
10217 * - le type d'habilitation des tiers dois appartenir à la liste
10218 * fournie en paramètre
10219 * - le tiers dois être associé à la commune ou au département passé
10220 * en paramètre
10221 *
10222 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10223 * pouvant être notifiée
10224 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10225 * @param integer $commune identifiant de la commune du dossier
10226 * @param integer $departement identifiant du département du dossier
10227 *
10228 * @return array listes de diffusion des tiers notifiable
10229 */
10230 protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10231 // Si paramètre non renseigné alors ne renvoie rien
10232 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10233 return false;
10234 }
10235 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10236 $filtreServiceConsulteDI = '';
10237 if (! empty($idPlatau)) {
10238 $filtreServiceConsulteDI = sprintf(
10239 'AND tiers_consulte.uid_platau_acteur != \'%s\'',
10240 $this->f->db->escapeSimple($idPlatau)
10241 );
10242 }
10243 $rst = $this->f->get_all_results_from_db_query(
10244 sprintf(
10245 'SELECT
10246 tiers_consulte.liste_diffusion,
10247 tiers_consulte.libelle
10248 FROM
10249 %1$shabilitation_tiers_consulte
10250 LEFT JOIN %1$stiers_consulte
10251 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10252 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
10253 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
10254 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
10255 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
10256 WHERE
10257 tiers_consulte.accepte_notification_email IS TRUE
10258 AND tiers_consulte.liste_diffusion IS NOT NULL
10259 %3$s
10260 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10261 AND (
10262 lien_habilitation_tiers_consulte_commune.commune = %4$d
10263 OR lien_habilitation_tiers_consulte_departement.departement = %5$d
10264 )
10265 ORDER BY
10266 tiers_consulte.libelle
10267 ',
10268 DB_PREFIXE,
10269 implode(', ', $typesHabilitations),
10270 $filtreServiceConsulteDI,
10271 intval($commune),
10272 intval($departement)
10273 ),
10274 array(
10275 "origin" => __METHOD__
10276 )
10277 );
10278 return $rst['result'];
10279 }
10280 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26