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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 15218 - (show annotations)
Thu Jul 13 10:31:27 2023 UTC (16 months, 3 weeks ago) by softime
File size: 485560 byte(s)
chore(branch): fusion de la branche d'intégration 5.19.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 - edit_by_notification_task
282 // Action à utiliser lors de la mise à jour des instructions par notification
283 $this->class_actions[175] = array(
284 "identifier" => "edit_by_notification_task",
285 "view" => "formulaire",
286 "permission_suffix" => "modifier",
287 "crud" => "update",
288 );
289
290 // ACTION - 176 - add_by_evenement_retour_after_notification_task
291 // Action à utiliser lors de l'ajout des instructions par événement suivant
292 // suite à une notification par tâche (donc notification dématerialisée)
293 $this->class_actions[176] = array(
294 "identifier" => "add_by_evenement_retour_after_notification_task",
295 "view" => "formulaire",
296 "permission_suffix" => "ajouter",
297 "crud" => "create",
298 );
299
300 // ACTION - 180 - pdf_lettre_rar
301 // Génère PDF sur bordereaux de lettres AR
302 $this->class_actions[180] = array(
303 "identifier" => "pdf_lettre_rar",
304 "view" => "view_pdf_lettre_rar",
305 "permission_suffix" => "consulter",
306 );
307
308 // ACTION - 190 - bordereau_envoi_maire
309 // Formulaire pour générer le bordereau d'envoi au maire
310 // Met à jour la date d'envoi à signature du maire
311 $this->class_actions[190] = array(
312 "identifier" => "bordereau_envoi_maire",
313 "view" => "view_bordereau_envoi_maire",
314 "permission_suffix" => "bordereau_envoi_maire",
315 );
316
317 // ACTION - 200 - generate_bordereau_envoi_maire
318 // Génère PDF bordereau d'envoi au maire
319 $this->class_actions[200] = array(
320 "identifier" => "generate_bordereau_envoi_maire",
321 "view" => "view_generate_bordereau_envoi_maire",
322 "permission_suffix" => "bordereau_envoi_maire",
323 );
324
325 // ACTION - 210 - notifier_commune
326 // Notifie la commune par mail d'un évément d'instruction finalisé
327 $this->class_actions[210] = array(
328 "identifier" => "notifier_commune",
329 "portlet" => array(
330 "type" => "action-direct-with-confirmation",
331 "libelle" => _("Notifier la commune par courriel"),
332 "order" => 210,
333 "class" => "notifier_commune-16",
334 ),
335 "view" => "formulaire",
336 "method" => "notifier_commune",
337 "permission_suffix" => "notifier_commune",
338 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
339 );
340
341 // ACTION - 220 - generate_suivi_bordereaux
342 // GénÚre PDF bordereaux
343 $this->class_actions[220] = array(
344 "identifier" => "generate_suivi_bordereaux",
345 "view" => "view_generate_suivi_bordereaux",
346 "permission_suffix" => "consulter",
347 );
348
349 // ACTION - 777 - pdf_temp
350 // Crée un PDF temporaire et affiche son contenu en base64
351 $this->class_actions[777] = array(
352 "identifier" => "pdf_temp",
353 "view" => "view_pdf_temp",
354 "permission_suffix" => "modifier",
355 "condition" => array("can_user_access_dossier_contexte_modification"),
356 );
357
358 // ACTION - 701
359 $this->class_actions[701] = array(
360 "identifier" => "enable-edition-integrale",
361 "portlet" => array(
362 "type" => "action-direct-with-confirmation",
363 "libelle" => _("Rédaction libre"),
364 "order" => 50,
365 "class" => "redac-libre-16",
366 ),
367 "view" => "formulaire",
368 "method" => "enable_edition_integrale",
369 "permission_suffix" => "modifier",
370 "condition" => array(
371 "is_editable",
372 "is_finalizable_without_bypass",
373 "can_user_access_dossier_contexte_modification",
374 "is_edition_integrale_not_enabled",
375 "is_option_redaction_libre_enabled",
376 "has_an_edition",
377 ),
378 );
379 // ACTION - 702
380 $this->class_actions[702] = array(
381 "identifier" => "disable-edition-integrale",
382 "portlet" => array(
383 "type" => "action-direct-with-confirmation",
384 "libelle" => _("Rédaction par compléments"),
385 "order" => 50,
386 "class" => "redac-complement-16",
387 ),
388 "view" => "formulaire",
389 "method" => "disable_edition_integrale",
390 "permission_suffix" => "modifier",
391 "condition" => array(
392 "is_editable",
393 "is_finalizable_without_bypass",
394 "can_user_access_dossier_contexte_modification",
395 "is_edition_integrale_enabled",
396 "is_option_redaction_libre_enabled",
397 "has_an_edition",
398 ),
399 );
400 // ACTION - 300 - evenement_has_an_edition_json
401 //
402 $this->class_actions[300] = array(
403 "identifier" => "evenement_has_an_edition_json",
404 "view" => "view_evenement_has_an_edition_json",
405 "permission_suffix" => "consulter",
406 );
407
408 // ACTION - 301 - evenement_has_a_commentaire
409 //
410 $this->class_actions[301] = array(
411 "identifier" => "evenement_has_a_commentaire_json",
412 "view" => "view_evenement_has_a_commentaire_json",
413 "permission_suffix" => "consulter",
414 );
415
416 // ACTION - 400 - Envoyer en signature
417 // Cet évenement permet d'envoyer le document au parapheur pour signature
418 $this->class_actions[400] = array(
419 "identifier" => "envoyer_a_signature",
420 "portlet" => array(
421 "libelle" => _("Envoyer à signature"),
422 "type" => "action-direct-with-confirmation",
423 "class" => "envoyer_a_signature-16",
424 ),
425 "view" => "formulaire",
426 "method" => "envoyer_a_signature_sans_relecture",
427 "condition" => array(
428 "can_be_signed",
429 ),
430 "permission_suffix" => "envoyer_a_signature",
431 );
432
433 // ACTION - 402 - Envoyer en signature avec relecture
434 // Cet évenement permet d'envoyer le document au parapheur pour signature
435 $this->class_actions[402] = array(
436 "identifier" => "envoyer_a_signature_relecture",
437 "portlet" => array(
438 "libelle" => __("Envoyer à signature avec relecture"),
439 "type" => "action-direct-with-confirmation",
440 "class" => "envoyer_a_signature-16",
441 ),
442 "view" => "formulaire",
443 "method" => "envoyer_a_signature_avec_relecture",
444 "condition" => array(
445 "can_be_signed",
446 "is_parapheur_relecture_parameter_enabled"
447 ),
448 "permission_suffix" => "envoyer_a_signature",
449 );
450
451 // ACTION - 404 - Annuler l'envoi en signature
452 // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
453 $this->class_actions[404] = array(
454 "identifier" => "annuler_envoi_signature",
455 "portlet" => array(
456 "libelle" => __("Annuler l'envoi en signature"),
457 "type" => "action-direct-with-confirmation",
458 "class" => "annuler_envoi_signature-16",
459 ),
460 "view" => "formulaire",
461 "method" => "annuler_envoi_en_signature",
462 "condition" => array(
463 "is_sent_for_signature",
464 "is_parapheur_annulation_parameter_enabled"
465 ),
466 "permission_suffix" => "envoyer_a_signature",
467 );
468
469 //
470 $this->class_actions[401] = array(
471 "identifier" => "preview_edition",
472 "view" => "formulaire",
473 "permission_suffix" => "tab",
474 );
475
476 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
477 $this->class_actions[410] = array(
478 "identifier" => "overlay_notification_manuelle",
479 "portlet" => array(
480 "libelle" => __("Notifier les pétitionnaires"),
481 "type" => "action-self",
482 "class" => "notifier_commune-16",
483 ),
484 "condition" => array(
485 "is_notifiable_by_task_manual",
486 "is_not_portail_notification_sans_annexe"
487 ),
488 "view" => "view_overlay_notification_manuelle",
489 "permission_suffix" => "modifier",
490 );
491
492 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
493 $this->class_actions[411] = array(
494 "identifier" => "notification_manuelle_portal",
495 "portlet" => array(
496 "libelle" => __("Notifier les pétitionnaires"),
497 "type" => "action-direct-with-confirmation",
498 "class" => "notifier_commune-16",
499 ),
500 "condition" => array(
501 "is_notifiable_by_task_manual",
502 "is_portail_notification_sans_annexe"
503 ),
504 "method" => "notifier_demandeur_principal_via_portal",
505 "permission_suffix" => "modifier",
506 );
507
508 // ACTION - 420 - Notifier les services consultés (mail)
509 $this->class_actions[420] = array(
510 "identifier" => "overlay_notification_service_consulte",
511 "portlet" => array(
512 "libelle" => __("Notifier les services consultés"),
513 "type" => "action-self",
514 "class" => "notifier_commune-16",
515 ),
516 "condition" => array(
517 "is_service_notifiable"
518 ),
519 "view" => "view_overlay_notification_service_consulte",
520 "permission_suffix" => "tab",
521 );
522
523 // ACTION - 430 - Notifier les tiers consultés (mail)
524 $this->class_actions[430] = array(
525 "identifier" => "overlay_notification_tiers_consulte",
526 "portlet" => array(
527 "libelle" => __("Notifier les tiers consultés"),
528 "type" => "action-self",
529 "class" => "notifier_commune-16",
530 ),
531 "condition" => array(
532 "is_tiers_notifiable"
533 ),
534 "view" => "view_overlay_notification_tiers_consulte",
535 "permission_suffix" => "tab",
536 );
537
538 //
539 $this->class_actions[403] = array(
540 "identifier" => "envoyer_au_controle_de_legalite",
541 "portlet" => array(
542 "libelle" => __("Envoyer au contrôle de légalité"),
543 "type" => "action-direct-with-confirmation",
544 "class" => "envoyer_au_controle_de_legalite-16",
545 ),
546 "view" => "formulaire",
547 "method" => "envoyer_au_controle_de_legalite",
548 "condition" => array(
549 "can_be_sended_to_cl"
550 ),
551 "permission_suffix" => "envoyer_au_controle_de_legalite",
552 );
553
554 //
555 $this->class_actions[998] = array(
556 "identifier" => "json_data",
557 "view" => "view_json_data",
558 "permission_suffix" => "consulter",
559 );
560 }
561
562 /**
563 * Clause select pour la requête de sélection des données de l'enregistrement.
564 *
565 * @return array
566 */
567 function get_var_sql_forminc__champs() {
568 return array(
569 "instruction",
570 "destinataire",
571 "instruction.evenement",
572 "instruction.commentaire",
573 "date_evenement",
574 "instruction.lettretype",
575 "signataire_arrete",
576 "flag_edition_integrale",
577 "om_final_instruction_utilisateur",
578 "date_finalisation_courrier",
579 "date_envoi_signature",
580 "date_envoi_rar",
581 "date_envoi_controle_legalite",
582
583 "date_retour_signature",
584 "date_retour_rar",
585 "date_retour_controle_legalite",
586
587 "numero_arrete",
588
589 "complement_om_html",
590 "'' as bible_auto",
591 "'' as bible",
592 "complement2_om_html",
593 "'' as bible2",
594 "complement3_om_html",
595 "'' as bible3",
596 "complement4_om_html",
597 "'' as bible4",
598
599 "titre_om_htmletat",
600 "corps_om_htmletatex",
601
602 "'' as btn_preview",
603 "'' as btn_redaction",
604
605 "'' as btn_refresh",
606 "'' as live_preview",
607
608 "dossier",
609 "instruction.action",
610 "instruction.delai",
611 "instruction.etat",
612 "instruction.autorite_competente",
613 "instruction.accord_tacite",
614 "instruction.delai_notification",
615 "instruction.avis_decision",
616 "archive_delai",
617 "archive_accord_tacite",
618 "archive_etat",
619 "archive_avis",
620 "archive_date_complet",
621 "archive_date_rejet",
622 "archive_date_limite",
623 "archive_date_notification_delai",
624 "archive_date_decision",
625 "archive_date_validite",
626 "archive_date_achevement",
627 "archive_date_conformite",
628 "archive_date_chantier",
629 "archive_date_dernier_depot",
630 "date_depot",
631 "date_depot_mairie",
632 "complement5_om_html",
633 "'' as bible5",
634 "complement6_om_html",
635 "'' as bible6",
636 "complement7_om_html",
637 "'' as bible7",
638 "complement8_om_html",
639 "'' as bible8",
640 "complement9_om_html",
641 "'' as bible9",
642 "complement10_om_html",
643 "'' as bible10",
644 "complement11_om_html",
645 "'' as bible11",
646 "complement12_om_html",
647 "complement13_om_html",
648 "complement14_om_html",
649 "complement15_om_html",
650 "archive_incompletude",
651 "archive_incomplet_notifie",
652 "archive_evenement_suivant_tacite",
653 "archive_evenement_suivant_tacite_incompletude",
654 "archive_etat_pendant_incompletude",
655 "archive_date_limite_incompletude",
656 "archive_delai_incompletude",
657 "archive_autorite_competente",
658 "code_barres",
659 "om_fichier_instruction",
660 "om_final_instruction",
661 "om_fichier_instruction_dossier_final",
662 "document_numerise",
663 "duree_validite_parametrage",
664 "duree_validite",
665 "created_by_commune",
666 "archive_date_cloture_instruction",
667 "archive_date_premiere_visite",
668 "archive_date_derniere_visite",
669 "archive_date_contradictoire",
670 "archive_date_retour_contradictoire",
671 "archive_date_ait",
672 "archive_date_transmission_parquet",
673 "archive_dossier_instruction_type",
674 "archive_date_affichage",
675 "pec_metier",
676 "archive_pec_metier",
677 "archive_a_qualifier",
678 "id_parapheur_signature",
679 "statut_signature",
680 "commentaire_signature",
681 "historique_signature",
682 "'' as suivi_notification",
683 "'' as suivi_notification_service",
684 "'' as suivi_notification_tiers",
685 "'' as suivi_notification_commune",
686
687 "'' as preview_edition",
688 "envoye_cl_platau",
689 "'' as log_instruction",
690 "parapheur_lien_page_signature"
691 );
692 }
693
694 /**
695 * CONDITION - is_edition_integrale_enabled
696 *
697 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
698 *
699 * @return boolean
700 */
701 function is_edition_integrale_enabled() {
702 if ($this->getVal("flag_edition_integrale") == 't') {
703 return true;
704 }
705 return false;
706 }
707
708 /**
709 * CONDITION - is_edition_integrale_not_enabled
710 *
711 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
712 *
713 * @return boolean
714 */
715 function is_edition_integrale_not_enabled() {
716 return !$this->is_edition_integrale_enabled();
717 }
718
719 /**
720 * CONDITION - is_option_redaction_libre_enabled
721 *
722 * Vérifie que l'option de rédaction libre est activée.
723 *
724 * @return boolean
725 */
726 function is_option_redaction_libre_enabled() {
727 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
728 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
729 }
730
731 /**
732 * CONDITION - is_option_parapheur_relecture_enabled
733 *
734 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
735 *
736 * @return boolean
737 */
738 function is_parapheur_relecture_parameter_enabled() {
739 //Instanciation de la classe electronicsignature
740 $inst_es = $this->get_electronicsignature_instance();
741 if ($inst_es === false) {
742 return false;
743 }
744
745 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
746 return false;
747 }
748
749 return true;
750 }
751
752 /**
753 * CONDITION - is_parapheur_annulation_parameter_enabled
754 *
755 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
756 *
757 * @return boolean
758 */
759 function is_parapheur_annulation_parameter_enabled() {
760 //Instanciation de la classe electronicsignature
761 $inst_es = $this->get_electronicsignature_instance();
762 if ($inst_es === false) {
763 return false;
764 }
765
766 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
767 return false;
768 }
769
770 return true;
771 }
772
773
774 /**
775 * CONDITION - is_sent_for_signature
776 *
777 * Vérifie que l'instruction a été envoyé à signature
778 *
779 * @return boolean
780 */
781 function is_sent_for_signature() {
782 // Si un parapheur a été configuré
783 // et que le champ id_parapheur_signature n'est pas vide
784 // que le status est différent de "canceled" ou "expired"
785 // alors l'évènement a été envoyé en signature
786 if ($this->has_connector_electronicsignature() === true
787 && empty($this->getVal("id_parapheur_signature")) === false
788 && ($this->getVal("statut_signature") != "canceled"
789 && $this->getVal("statut_signature") != "expired"
790 && $this->getVal("statut_signature") != "finished")) {
791 //
792 return true;
793 }
794
795 return false;
796 }
797
798 /**
799 * CONDITION - is_not_sent_for_signature
800 *
801 * Vérifie que l'instruction n'a pas été envoyé à signature
802 *
803 * @return boolean
804 */
805 function is_not_sent_for_signature() {
806 // Contrôle si l'utilisateur possède un bypass
807 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
808 if ($bypass == true) {
809 return true;
810 }
811
812 return !$this->is_sent_for_signature();
813 }
814
815
816 /**
817 * CONDITION - is_signed
818 *
819 * Vérifie que l'instruction a été signé
820 *
821 * @return boolean
822 */
823 function is_signed() {
824 // Si un parapheur a été configuré
825 // et que le champ id_parapheur_signature n'est pas vide
826 // et que le statut est égal à "finished"
827 // alors le document de l'instruciton à été signé
828 if ($this->has_connector_electronicsignature() === true
829 && empty($this->getVal("id_parapheur_signature")) === false
830 && $this->getVal("statut_signature") == "finished") {
831 //
832 return true;
833 }
834
835 return false;
836 }
837
838
839 /**
840 * is_sent_to_cl
841 *
842 * Vérifie que l'instruction a été envoyé au contrôle de légalité
843 *
844 * @return boolean
845 */
846 function is_sent_to_cl() {
847 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
848 if ($this->getVal('envoye_cl_platau') === 't') {
849 //
850 return true;
851 }
852 //
853 return false;
854 }
855
856 /**
857 * CONDITION - is_portail_notification
858 *
859 * Vérifie si la notification est une notification de catégorie portail
860 *
861 * @return boolean
862 */
863 function is_portail_notification_sans_annexe() {
864 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
865 $ev = $this->get_inst_evenement($this->getVal('evenement'));
866 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
867 && $ev->getVal('notification') != 'notification_manuelle_annexe'
868 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
869 ) {
870 return true;
871 }
872 return false;
873 }
874
875 /**
876 * CONDITION - is_not_portail_notification
877 *
878 * Vérifie si la notification n'est pas une notification de catégorie portail
879 *
880 * @return boolean
881 */
882 function is_not_portail_notification_sans_annexe() {
883 return (! $this->is_portail_notification_sans_annexe());
884 }
885
886 /**
887 * CONDITION - can_be_signed
888 *
889 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
890 *
891 * @return boolean
892 */
893 function can_be_signed() {
894 // Instanciation de l'objet signataire_arrete
895 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
896 "obj" => "signataire_arrete",
897 "idx" => $this->getVal("signataire_arrete"),
898 ));
899 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
900 // possède une adresse email, on vérifie le champ id_parapheur_signature
901 // S'il est vide l'évènement peut être envoyé en signature
902 // S'il ne l'est pas, alors on vérifie le champ statut_signature
903 // Si la valeur de ce champ est égal à "canceled" ou "expired"
904 // alors l'évènement peut être envoyé en signature
905 if ($this->has_connector_electronicsignature() === true
906 && $this->getVal("om_final_instruction") == 't'
907 && empty($inst_signataire_arrete->getVal('email')) === false) {
908 //
909 if (empty($this->getVal("id_parapheur_signature")) === true
910 || $this->getVal("statut_signature") == "canceled"
911 || $this->getVal("statut_signature") == "expired") {
912 //
913 return true;
914 }
915 }
916
917 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
918 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
919 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
920 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
921 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
922
923 return false;
924 }
925
926 /**
927 * CONDITION - has_connector_electronicsignature
928 *
929 * Vérifie qu'un parapheur est paramétré
930 *
931 * @return boolean
932 */
933 function has_connector_electronicsignature() {
934 $inst_es = $this->get_electronicsignature_instance(false);
935 if ($inst_es === false) {
936 return false;
937 }
938 return true;
939 }
940
941 /**
942 * CONDITION - can_display_parapheur
943 *
944 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
945 *
946 * @return boolean
947 */
948 function can_display_parapheur() {
949 $evenement_id = $this->getVal("evenement");
950 $inst_evenement = $this->get_inst_evenement($evenement_id);
951 if ($this->has_connector_electronicsignature() === true
952 && $inst_evenement->getVal('lettretype') !== ''
953 && $inst_evenement->getVal('lettretype') !== null
954 && (empty($this->getVal("id_parapheur_signature")) === false
955 || empty($this->getVal("historique_signature")) === false)) {
956 //
957 return true;
958 }
959
960 return false;
961 }
962
963 /**
964 * CONDITION - can_display_notification
965 *
966 * Vérifie que le champs "Suivi notification" est affichable
967 *
968 * @return boolean
969 */
970 function can_display_notification_demandeur() {
971 // Le suivi des notification est affiché si l'événement est notifiable
972 // et si des notifications ont été envoyées
973 $evenement_id = $this->getVal("evenement");
974 $inst_evenement = $this->get_inst_evenement($evenement_id);
975 if ($inst_evenement->getVal('notification') != null &&
976 $inst_evenement->getVal('notification') != '') {
977 // Des notifications ont été envoyé si il existe au moins une notification
978 // liées à l'instruction
979 $idsNotifs = $this->get_instruction_notification(
980 $this->getVal($this->clePrimaire),
981 array(
982 'notification_recepisse',
983 'notification_instruction',
984 'notification_decision',
985 ),
986 true
987 );
988 if (isset($idsNotifs) && $idsNotifs !== array()) {
989 return true;
990 }
991 }
992 return false;
993 }
994
995 /**
996 * CONDITION - can_display_notification
997 *
998 * Vérifie que le champs "suivi_notification_service" est affichable
999 *
1000 * @return boolean
1001 */
1002 function can_display_notification_service() {
1003 // Le suivi des notification est affiché si l'événement est notifiable
1004 // et si des notifications ont été envoyées
1005 $evenement_id = $this->getVal("evenement");
1006 $inst_evenement = $this->get_inst_evenement($evenement_id);
1007 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1008 // Des notifications ont été envoyé si il existe au moins une notification
1009 // de type notification_service_consulte liées à l'instruction
1010 $idsNotifs = $this->get_instruction_notification(
1011 $this->getVal($this->clePrimaire),
1012 'notification_service_consulte'
1013 );
1014 if (isset($idsNotifs) && $idsNotifs !== array()) {
1015 return true;
1016 }
1017 }
1018 return false;
1019 }
1020
1021
1022 /**
1023 * CONDITION - can_display_notification_tiers
1024 *
1025 * Vérifie que le champs "suivi_notification_tiers" est affichable
1026 *
1027 * @return boolean
1028 */
1029 function can_display_notification_tiers() {
1030 // Le suivi des notification est affiché si l'événement est notifiable
1031 // et si des notifications ont été envoyées
1032 $evenement_id = $this->getVal("evenement");
1033 $inst_evenement = $this->get_inst_evenement($evenement_id);
1034 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1035 // Des notifications ont été envoyé si il existe au moins une notification
1036 // de type notification_tiers_consulte liées à l'instruction
1037 $idsNotifs = $this->get_instruction_notification(
1038 $this->getVal($this->clePrimaire),
1039 'notification_tiers_consulte'
1040 );
1041 if (isset($idsNotifs) && $idsNotifs !== array()) {
1042 return true;
1043 }
1044 }
1045 return false;
1046 }
1047
1048 /**
1049 * CONDITION - can_display_notification_commune
1050 *
1051 * Vérifie que le champs "suivi_notification_commune" est affichable
1052 *
1053 * @return boolean
1054 */
1055 function can_display_notification_commune() {
1056 // Le suivi des notification si il existe au moins une notification
1057 // de type notification_depot_demat liées à l'instruction
1058 $idsNotifs = $this->get_instruction_notification(
1059 $this->getVal($this->clePrimaire),
1060 array('notification_depot_demat', 'notification_commune')
1061 );
1062 if (isset($idsNotifs) && $idsNotifs !== array()) {
1063 return true;
1064 }
1065 return false;
1066 }
1067
1068 /**
1069 * TREATMENT - disable_edition_integrale.
1070 *
1071 * Cette methode permet de passer la consultation en "lu"
1072 *
1073 * @return boolean true si maj effectué false sinon
1074 */
1075 function disable_edition_integrale() {
1076 // Cette méthode permet d'exécuter une routine en début des méthodes
1077 // dites de TREATMENT.
1078 $this->begin_treatment(__METHOD__);
1079 $this->correct = true;
1080 $valF = array(
1081 "flag_edition_integrale" => false,
1082 "titre_om_htmletat" => null,
1083 "corps_om_htmletatex" => null,
1084 );
1085 $res = $this->f->db->autoExecute(
1086 DB_PREFIXE.$this->table,
1087 $valF,
1088 DB_AUTOQUERY_UPDATE,
1089 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1090 );
1091 if ($this->f->isDatabaseError($res, true)) {
1092 // Appel de la methode de recuperation des erreurs
1093 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1094 $this->correct = false;
1095 // Termine le traitement
1096 return $this->end_treatment(__METHOD__, false);
1097 } else {
1098 $this->addToMessage(_("Rédaction par compléments activé."));
1099 return $this->end_treatment(__METHOD__, true);
1100 }
1101
1102 // Termine le traitement
1103 return $this->end_treatment(__METHOD__, false);
1104 }
1105
1106 /**
1107 * TREATMENT - enable_edition_integrale.
1108 *
1109 * Cette methode permet de passer la consultation en "lu"
1110 *
1111 * @return boolean true si maj effectué false sinon
1112 */
1113 function enable_edition_integrale() {
1114 // Cette méthode permet d'exécuter une routine en début des méthodes
1115 // dites de TREATMENT.
1116 $this->begin_treatment(__METHOD__);
1117 $this->correct = true;
1118
1119 // Récupère la collectivite du dossier d'instruction
1120 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1121 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1122 //
1123 $params = array(
1124 "specific" => array(
1125 "corps" => array(
1126 "mode" => "get",
1127 )
1128 ),
1129 );
1130 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1131 $corps = $result['pdf_output'];
1132 //
1133 $params = array(
1134 "specific" => array(
1135 "titre" => array(
1136 "mode" => "get",
1137 )
1138 ),
1139 );
1140 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1141 $titre = $result['pdf_output'];
1142 //
1143 $valF = array(
1144 "flag_edition_integrale" => true,
1145 "titre_om_htmletat" => $titre,
1146 "corps_om_htmletatex" => $corps,
1147 );
1148 $res = $this->f->db->autoExecute(
1149 DB_PREFIXE.$this->table,
1150 $valF,
1151 DB_AUTOQUERY_UPDATE,
1152 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1153 );
1154 if ($this->f->isDatabaseError($res, true)) {
1155 // Appel de la methode de recuperation des erreurs
1156 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1157 $this->correct = false;
1158 // Termine le traitement
1159 return $this->end_treatment(__METHOD__, false);
1160 } else {
1161 $this->addToMessage(_("Rédaction libre activé."));
1162 return $this->end_treatment(__METHOD__, true);
1163 }
1164
1165 // Termine le traitement
1166 return $this->end_treatment(__METHOD__, false);
1167 }
1168
1169 /**
1170 * Cette méthode instancie le dossier à partir de l'identifiant passé
1171 * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1172 * associé au dossier.
1173 * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1174 * renverra NULL
1175 *
1176 * @param string identifiant du dossier
1177 * @return null|string null ou identifiant du DA
1178 */
1179 function getNumDemandeAutorFromDossier($id) {
1180 if (!isset($id)) {
1181 return NULL;
1182 }
1183
1184 $dossier = $this->f->get_inst__om_dbform(array(
1185 'obj' => 'dossier',
1186 'idx' => $id,
1187 ));
1188
1189 return $dossier->getVal('dossier_autorisation');
1190 }
1191
1192
1193 function setType(&$form, $maj) {
1194 // Récupération du mode de l'action
1195 $crud = $this->get_action_crud($maj);
1196 // Récupère la collectivité du dossier d'instruction
1197 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1198
1199 // Cache tous les champs
1200 foreach ($this->champs as $value) {
1201 $form->setType($value, 'hidden');
1202 }
1203
1204 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1205 if ($this->can_display_parapheur() === true && $maj == 3) {
1206 $form->setType('statut_signature', 'selectstatic');
1207 $form->setType('historique_signature', 'jsontotab');
1208 if ($this->getVal('commentaire_signature') == null) {
1209 $form->setType('commentaire_signature', 'hidden');
1210 } else {
1211 $form->setType('commentaire_signature', 'hiddenstatic');
1212 }
1213 }
1214
1215 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1216 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1217 $form->setType('suivi_notification', 'jsontotab');
1218 }
1219 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1220 if ($maj == 3 && $this->can_display_notification_service() === true) {
1221 $form->setType('suivi_notification_service', 'jsontotab');
1222 }
1223 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1224 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1225 $form->setType('suivi_notification_tiers', 'jsontotab');
1226 }
1227 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1228 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1229 $form->setType('suivi_notification_commune', 'jsontotab');
1230 }
1231
1232 // MODE AJOUTER
1233 if ($this->getParameter('maj') == 0) {
1234 $form->setType('commentaire', 'textareahidden');
1235 // Si l'option est active passage du champ date en lecture seule
1236 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1237 $form->setType("date_evenement", "hiddenstaticdate");
1238 } else {
1239 $form->setType("date_evenement", "date");
1240 }
1241 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1242 $form->setType("evenement", "selecthiddenstatic");
1243 } else {
1244 $form->setType("evenement", "select");
1245 }
1246 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1247 $form->setType("signataire_arrete", "selecthiddenstatic");
1248 } else {
1249 $form->setType("signataire_arrete", "select");
1250 }
1251 if ($this->is_option_redaction_libre_enabled() === true) {
1252 $form->setType("flag_edition_integrale", "select");
1253 }
1254 }
1255
1256 // MODE MODIFIER
1257 if ($this->getParameter('maj') == 1) {
1258 // Si l'option est active passage du champ date en lecture seule
1259 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1260 $form->setType("date_evenement", "hiddenstaticdate");
1261 } else {
1262 $form->setType("date_evenement", "date");
1263 }
1264 $form->setType("evenement", "selecthiddenstatic");
1265 if ($this->has_an_edition() === true) {
1266 $form->setType('lettretype', 'hiddenstatic');
1267 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1268 $form->setType("signataire_arrete", "selecthiddenstatic");
1269 } else {
1270 $form->setType("signataire_arrete", "select");
1271 }
1272 if ($this->getVal("flag_edition_integrale") == "t") {
1273 $form->setType("titre_om_htmletat", "htmlEtat");
1274 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1275 } else {
1276 $form->setType("complement_om_html", "html");
1277 $form->setType("complement2_om_html", "html");
1278 $form->setType("complement3_om_html", "html");
1279 $form->setType("complement4_om_html", "html");
1280 $form->setType('bible_auto', 'httpclick');
1281 $form->setType('bible', 'httpclick');
1282 $form->setType('bible2', 'httpclick');
1283 $form->setType('bible3', 'httpclick');
1284 $form->setType('bible4', 'httpclick');
1285 }
1286 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1287 //
1288 $form->setType('btn_refresh', 'httpclickbutton');
1289 $form->setType('btn_preview', 'httpclickbutton');
1290 $form->setType('btn_redaction', 'httpclickbutton');
1291 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1292 // pour identifiant le champ de prévisualisation et régler sa taille à
1293 // l'affichage du champ. En cas de modification, le selecteur doit également
1294 // être mis à jour
1295 $form->setType('live_preview', 'previsualiser_pdf');
1296 }
1297
1298 // necessaire pour calcul de date en modification
1299 //$form->setType('delai', 'hiddenstatic');
1300 // les administrateurs technique et fonctionnel peuvent
1301 // modifier tous les champs de date
1302 // si l'instruction a déjà été finalisée au moins une fois
1303 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1304 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1305 && $this->getVal("date_finalisation_courrier") != '') {
1306 //
1307 $form->setType('date_envoi_signature', 'date');
1308 $form->setType('date_retour_signature', 'date');
1309 if ($this->is_sent_for_signature() === true
1310 && $this->is_signed() === true) {
1311 //
1312 $form->setType("date_envoi_signature", "datereadonly");
1313 $form->setType("date_retour_signature", "datereadonly");
1314 }
1315 $form->setType('date_envoi_rar', 'date');
1316 $form->setType('date_retour_rar', 'date');
1317 $form->setType('date_envoi_controle_legalite', 'date');
1318 if ($this->is_sent_to_cl() === true) {
1319 $form->setType("date_envoi_controle_legalite", "datedisabled");
1320 }
1321 $form->setType('date_retour_controle_legalite', 'date');
1322 $form->setType('date_finalisation_courrier', 'date');
1323 }
1324 }
1325 }
1326
1327 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1328 if ($this->getParameter('maj') == 3
1329 || $this->getParameter('maj') == 2
1330 || $this->getParameter('maj') == 125
1331 || $this->getParameter('maj') == 410) {
1332 //
1333 $form->setType("date_evenement", "datestatic");
1334 $form->setType("evenement", "selecthiddenstatic");
1335 if ($this->has_an_edition() === true) {
1336 $form->setType('lettretype', 'hiddenstatic');
1337 $form->setType("signataire_arrete", "selecthiddenstatic");
1338 if ($this->getVal("om_final_instruction") == 't') {
1339 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1340 } else {
1341 $form->setType('om_final_instruction_utilisateur', 'hidden');
1342 }
1343 }
1344 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1345 $form->setType('commentaire', 'textareastatic');
1346 }
1347 }
1348
1349 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1350 if ($this->getParameter('maj') == 3
1351 || $this->getParameter('maj') == 2
1352 || $this->getParameter('maj') == 410) {
1353 // Si il n'y a pas de lettre type (edition) associé à l'événement
1354 // les dates de suivi ne sont pas affichée
1355 if ($this->has_an_edition() === true) {
1356 $form->setType('date_envoi_signature', 'datestatic');
1357 $form->setType('date_retour_signature', 'datestatic');
1358 $form->setType('date_envoi_rar', 'datestatic');
1359 $form->setType('date_retour_rar', 'datestatic');
1360 $form->setType('date_envoi_controle_legalite', 'datestatic');
1361 $form->setType('date_retour_controle_legalite', 'datestatic');
1362 $form->setType('date_finalisation_courrier', 'datestatic');
1363 if ($this->getVal("flag_edition_integrale") == "t") {
1364 $form->setType("titre_om_htmletat", "htmlstatic");
1365 $form->setType("corps_om_htmletatex", "htmlstatic");
1366 } else {
1367 $form->setType("complement_om_html", "htmlstatic");
1368 $form->setType("complement2_om_html", "htmlstatic");
1369 $form->setType("complement3_om_html", "htmlstatic");
1370 $form->setType("complement4_om_html", "htmlstatic");
1371 }
1372 }
1373 }
1374
1375 // MODE SUIVI DES DATES 125
1376 if ($this->getParameter('maj') == 125) {
1377 $form->setType("date_evenement", "hiddenstaticdate");
1378 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1379 $form->setType('date_envoi_signature', 'date');
1380 $form->setType('date_retour_signature', 'date');
1381 if ($this->is_sent_for_signature() === true
1382 || $this->is_signed() === true) {
1383 //
1384 $form->setType("date_envoi_signature", "datereadonly");
1385 $form->setType("date_retour_signature", "datereadonly");
1386 }
1387 $form->setType('date_envoi_rar', 'date');
1388 $form->setType('date_retour_rar', 'date');
1389 $form->setType('date_envoi_controle_legalite', 'date');
1390 if ($this->is_sent_to_cl() === true) {
1391 $form->setType("date_envoi_controle_legalite", "datedisabled");
1392 }
1393 $form->setType('date_retour_controle_legalite', 'date');
1394 $form->setType('date_finalisation_courrier', 'date');
1395 }
1396
1397 if ($maj == 401) {
1398 foreach ($this->champs as $champ) {
1399 $form->setType($champ, 'hidden');
1400 }
1401 $form->setType('preview_edition', 'previsualiser');
1402 }
1403
1404 // Si l'instruction a été envoyé au contrôle de légalité et que la
1405 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1406 // l'utilisateur que l'envoi au cl est en cours de traitement.
1407 if ($this->is_sent_to_cl() === true
1408 && empty($this->getVal('date_envoi_controle_legalite'))
1409 && $maj == 3) {
1410 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1411 }
1412 }
1413
1414 function setOnchange(&$form,$maj){
1415 parent::setOnchange($form,$maj);
1416
1417 // MODE AJOUTER
1418 if ($this->getParameter('maj') == 0) {
1419 $form->setOnchange(
1420 "evenement",
1421 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1422 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1423 );
1424 }
1425 }
1426
1427 function evenement_has_an_edition($evenement_id) {
1428 $evenement = $this->get_inst_evenement($evenement_id);
1429 $lettretype = $evenement->getVal('lettretype');
1430 if ($lettretype !== '' && $lettretype !== null) {
1431 return true;
1432 }
1433 return false;
1434 }
1435
1436 function view_evenement_has_an_edition_json() {
1437 $json_return = array(
1438 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1439 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1440 );
1441 echo json_encode($json_return);
1442 }
1443
1444 function evenement_has_a_commentaire($evenement_id) {
1445 $evenement = $this->get_inst_evenement($evenement_id);
1446 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1447 }
1448
1449 function view_evenement_has_a_commentaire_json() {
1450 $json_return = array(
1451 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1452 );
1453 echo json_encode($json_return);
1454 }
1455
1456
1457 /**
1458 * CONDITION - can_be_sended_to_cl
1459 *
1460 * Vérifie que le contrôle de légalité est disponible
1461 *
1462 * @return boolean
1463 */
1464 function can_be_sended_to_cl() {
1465 // Si l'instruction a une édition
1466 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1467 // par Plat'AU
1468 // et que la date de retour signature est renseignée
1469 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1470 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1471 if ($this->has_an_edition() === true) {
1472 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1473 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1474 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1475 && empty($this->getVal('date_retour_signature')) === false
1476 && empty($this->getVal('date_envoi_controle_legalite')) === true
1477 && $this->getVal('envoye_cl_platau') === 'f'
1478 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1479 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1480 //
1481 return true;
1482 }
1483 }
1484 //
1485 return false;
1486 }
1487
1488 /**
1489 *
1490 * @return string
1491 */
1492 function get_var_sql_forminc__sql_signataire_arrete() {
1493 return sprintf(
1494 "SELECT
1495 signataire_arrete.signataire_arrete,
1496 CONCAT_WS(
1497 ' - ',
1498 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1499 signataire_habilitation.libelle,
1500 signataire_arrete.description
1501 )
1502 FROM
1503 %1\$ssignataire_arrete
1504 LEFT JOIN %1\$ssignataire_habilitation
1505 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1506 WHERE
1507 ((signataire_arrete.om_validite_debut IS NULL
1508 AND (signataire_arrete.om_validite_fin IS NULL
1509 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1510 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1511 AND (signataire_arrete.om_validite_fin IS NULL
1512 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1513 ORDER BY
1514 signataire_arrete.prenom,
1515 signataire_arrete.nom",
1516 DB_PREFIXE
1517 );
1518 }
1519
1520 /**
1521 *
1522 * @return string
1523 */
1524 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1525 return sprintf(
1526 "SELECT
1527 signataire_arrete.signataire_arrete,
1528 CONCAT_WS(
1529 ' - ',
1530 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1531 signataire_habilitation.libelle,
1532 signataire_arrete.description
1533 )
1534 FROM
1535 %1\$ssignataire_arrete
1536 LEFT JOIN %1\$ssignataire_habilitation
1537 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1538 WHERE
1539 signataire_arrete.signataire_arrete = <idx>",
1540 DB_PREFIXE
1541 );
1542 }
1543
1544 /**
1545 *
1546 * @return string
1547 */
1548 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1549 return sprintf(
1550 "SELECT
1551 signataire_arrete.signataire_arrete,
1552 CONCAT_WS(
1553 ' - ',
1554 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1555 signataire_habilitation.libelle,
1556 signataire_arrete.description
1557 )
1558 FROM
1559 %1\$ssignataire_arrete
1560 LEFT JOIN %1\$som_collectivite
1561 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1562 LEFT JOIN %1\$ssignataire_habilitation
1563 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1564 WHERE
1565 ((signataire_arrete.om_validite_debut IS NULL
1566 AND (signataire_arrete.om_validite_fin IS NULL
1567 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1568 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1569 AND (signataire_arrete.om_validite_fin IS NULL
1570 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1571 AND (om_collectivite.niveau = '2'
1572 OR signataire_arrete.om_collectivite = <collectivite_di>)
1573 ORDER BY
1574 signataire_arrete.prenom, signataire_arrete.nom",
1575 DB_PREFIXE
1576 );
1577 }
1578
1579 /**
1580 *
1581 * @return string
1582 */
1583 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1584 return sprintf(
1585 "SELECT
1586 signataire_arrete.signataire_arrete,
1587 CONCAT_WS(
1588 ' - ',
1589 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1590 signataire_habilitation.libelle,
1591 signataire_arrete.description
1592 )
1593 FROM
1594 %1\$ssignataire_arrete
1595 LEFT JOIN %1\$ssignataire_habilitation
1596 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1597 WHERE
1598 ((signataire_arrete.om_validite_debut IS NULL
1599 AND (signataire_arrete.om_validite_fin IS NULL
1600 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1601 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1602 AND (signataire_arrete.om_validite_fin IS NULL
1603 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1604 AND signataire_arrete.defaut IS TRUE
1605 ORDER BY
1606 signataire_arrete.prenom, signataire_arrete.nom",
1607 DB_PREFIXE
1608 );
1609 }
1610
1611 /**
1612 *
1613 * @return string
1614 */
1615 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1616 return sprintf(
1617 "SELECT
1618 signataire_arrete.signataire_arrete,
1619 CONCAT_WS(
1620 ' - ',
1621 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1622 signataire_habilitation.libelle,
1623 signataire_arrete.description
1624 )
1625 FROM
1626 %1\$ssignataire_arrete
1627 LEFT JOIN %1\$ssignataire_habilitation
1628 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1629 LEFT JOIN %1\$som_collectivite
1630 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1631 WHERE
1632 ((signataire_arrete.om_validite_debut IS NULL
1633 AND (signataire_arrete.om_validite_fin IS NULL
1634 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1635 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1636 AND (signataire_arrete.om_validite_fin IS NULL
1637 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1638 AND signataire_arrete.defaut IS TRUE
1639 AND (om_collectivite.niveau = '2'
1640 OR signataire_arrete.om_collectivite = <collectivite_di>)
1641 ORDER BY
1642 signataire_arrete.prenom,
1643 signataire_arrete.nom",
1644 DB_PREFIXE
1645 );
1646 }
1647
1648 /**
1649 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1650 * dont l'identifiant a été passé en paramètre dans l'url.
1651 *
1652 * @return array
1653 */
1654 function get_var_sql_forminc__sql_evenement() {
1655 // Récupération du numéro de dossier
1656 $dossier = $this->getParameter("idxformulaire");
1657 // Si changement de décision par instructeur commune
1658 $filter = '';
1659 if ($this->f->isUserInstructeur() === true
1660 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1661 && $this->isInstrCanChangeDecision($dossier) === true) {
1662 $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1663 }
1664 // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1665 // de déterminer si il s'agit d'évènements suggérés.
1666 $qres = $this->f->get_all_results_from_db_query(
1667 sprintf(
1668 'SELECT
1669 DISTINCT(evenement.evenement),
1670 evenement.libelle,
1671 -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1672 CASE WHEN evenement_suggere_dossier.evenement IS NULL
1673 THEN FALSE
1674 ELSE TRUE
1675 END AS is_suggested
1676 FROM
1677 -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1678 -- selon le type de dossier et l état du dossier.
1679 %1$sevenement
1680 JOIN %1$slien_dossier_instruction_type_evenement
1681 ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1682 JOIN %1$stransition
1683 ON evenement.evenement = transition.evenement
1684 JOIN %1$sdossier
1685 ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1686 AND transition.etat = dossier.etat
1687 -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1688 LEFT JOIN (
1689 SELECT
1690 lien_sig_contrainte_evenement.evenement,
1691 dossier.dossier
1692 FROM
1693 %1$slien_sig_contrainte_evenement
1694 JOIN %1$ssig_contrainte
1695 ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1696 JOIN %1$slien_sig_contrainte_dossier_instruction_type
1697 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1698 JOIN %1$slien_sig_contrainte_om_collectivite
1699 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1700 JOIN %1$scontrainte
1701 ON sig_contrainte.libelle = contrainte.libelle
1702 JOIN %1$sdossier_contrainte
1703 ON contrainte.contrainte = dossier_contrainte.contrainte
1704 JOIN %1$sdossier
1705 ON dossier_contrainte.dossier = dossier.dossier
1706 AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1707 JOIN %1$som_collectivite
1708 ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1709 AND (dossier.om_collectivite = om_collectivite.om_collectivite
1710 OR om_collectivite.niveau = \'2\')
1711 ) AS evenement_suggere_dossier
1712 ON evenement.evenement = evenement_suggere_dossier.evenement
1713 AND dossier.dossier = evenement_suggere_dossier.dossier
1714 WHERE
1715 dossier.dossier = \'%2$s\'
1716 %3$s
1717 ORDER BY
1718 is_suggested DESC,
1719 evenement.libelle',
1720 DB_PREFIXE,
1721 $this->f->db->escapeSimple($dossier),
1722 $filter
1723 ),
1724 array(
1725 "origin" => __METHOD__
1726 )
1727 );
1728 return $qres['result'];
1729 }
1730
1731 /**
1732 * Récupère un tableau contenant des évènements de la forme :
1733 * $events = array(
1734 * 1 => array(
1735 * 'libelle' => 'evenement_libelle',
1736 * 'evenement' => 'identifiant_evenement',
1737 * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1738 * ))
1739 * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1740 *
1741 * Le format de sorti est le suivant :
1742 * $select = array(
1743 * 0 => array( -> liste des id des événements
1744 * '0' => '',
1745 * '1' => array(
1746 * '0' => array(), -> liste des id des événements suggérés
1747 * '1' => array(), -> liste des libelles des événements suggérés
1748 * ),
1749 * ...,
1750 * n => 'id_evenement_n'
1751 * ),
1752 * 1 => array(
1753 * '0' => '__('choisir')." ".__('evenement')',
1754 * '1' => '💡 Suggestions',
1755 * ...,
1756 * 'n' => 'libelle_evenement_n',
1757 * )
1758 * )
1759 *
1760 * @param array tableau des événements
1761 * @return array
1762 */
1763 protected function convert_events_array_to_select_format($events) {
1764 // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1765 $contenu = array(
1766 0 => array("",),
1767 1 => array(__('choisir')." ".__('evenement'),)
1768 );
1769
1770 if (! empty($events)) {
1771 // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1772 $suggested_event_group = array_filter($events, function($a) {
1773 return $a['is_suggested'] === 't';
1774 });
1775 if (! empty($suggested_event_group)) {
1776 // Prépare les données qui permettront d'afficher le groupe des événements
1777 // suggérés.
1778 $values = array();
1779 $labels = array();
1780 foreach ($suggested_event_group as $index => $suggested_event) {
1781 $values[] = $suggested_event['evenement'];
1782 $labels[] = $suggested_event['libelle'];
1783 // Supprime les évènements suggérés de la liste des évènements
1784 unset($events[$index]);
1785 }
1786 // Remplissage du select pour le groupe
1787 $contenu[0][] = array($values, $labels);
1788 $contenu[1][] = __('💡 Suggestions');
1789 }
1790
1791 // Remplissage du select
1792 foreach ($events as $event) {
1793 $contenu[0][] = $event['evenement'];
1794 $contenu[1][] = $event['libelle'];
1795 }
1796 }
1797 return $contenu;
1798 }
1799
1800 /**
1801 * SETTER_FORM - setSelect.
1802 *
1803 * @return void
1804 */
1805 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1806 //parent::setSelect($form, $maj);
1807 /**
1808 * On ne surcharge pas la méthode parent car une requête sur la table
1809 * dossier est mauvaise pour les performances, car la requête qui
1810 * concerne evenement est plus complexe que celle générée et car les
1811 * champs action, avis_decision et etat ne sont pas utilisés comme des
1812 * select
1813 */
1814 //// action
1815 //$this->init_select($form, $this->f->db, $maj, null, "action",
1816 // $sql_action, $sql_action_by_id, false);
1817
1818 //// avis_decision
1819 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1820 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1821
1822 //// dossier
1823 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1824 // $sql_dossier, $sql_dossier_by_id, false);
1825
1826 //// etat
1827 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1828 // $sql_etat, $sql_etat_by_id, false);
1829
1830 //// evenement
1831 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1832 // $sql_evenement, $sql_evenement_by_id, false);
1833
1834 // signataire_arrete
1835 // si contexte DI
1836 if ($this->getParameter("retourformulaire") == "dossier"
1837 || $this->f->contexte_dossier_instruction()) {
1838 // on recupère les signataires de la multicollectivité et de celle du DI
1839 $di = $this->f->get_inst__om_dbform(array(
1840 "obj" => "dossier_instruction",
1841 "idx" => $this->getParameter('idxformulaire'),
1842 ));
1843 $sql_signataire_arrete_by_di = str_replace(
1844 '<collectivite_di>',
1845 $di->getVal("om_collectivite"),
1846 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1847 );
1848 $this->init_select(
1849 $form,
1850 $this->f->db,
1851 $maj,
1852 null,
1853 "signataire_arrete",
1854 $sql_signataire_arrete_by_di,
1855 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1856 true
1857 );
1858 } else {
1859 $this->init_select(
1860 $form,
1861 $this->f->db,
1862 $maj,
1863 null,
1864 "signataire_arrete",
1865 $this->get_var_sql_forminc__sql("signataire_arrete"),
1866 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1867 true
1868 );
1869 }
1870
1871 /**
1872 * Gestion du filtre sur les événements de workflow disponibles
1873 * On récupère ici en fonction de l'état du dossier d'instruction en
1874 * cours et du type du dossier d'instruction en cours la liste
1875 * événements disponibles.
1876 */
1877 if ($maj == 0) {
1878 $evenements = $this->get_var_sql_forminc__sql_evenement();
1879 $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1880 } else {
1881 // Instanciation de l'événement pour récupérer son libellé
1882 $evenement = $this->f->get_inst__om_dbform(array(
1883 "obj" => "evenement",
1884 "idx" => $this->getVal("evenement"),
1885 ));
1886
1887 $contenu = array(
1888 0 => array($this->getVal("evenement"),),
1889 1 => array($evenement->getVal('libelle'),)
1890 );
1891 $form->setSelect("evenement", $contenu);
1892 }
1893
1894 /**
1895 * Gesion des liens vers la bible
1896 */
1897 // lien bible_auto
1898 $contenu = array(_("automatique"));
1899 $form->setSelect("bible_auto",$contenu);
1900 // lien bible1
1901 $contenu = array(_("bible"));
1902 $form->setSelect("bible",$contenu);
1903 // lien bible2
1904 $contenu = array(_("bible"));
1905 $form->setSelect("bible2",$contenu);
1906 // lien bible3
1907 $contenu = array(_("bible"));
1908 $form->setSelect("bible3",$contenu);
1909 // lien bible4
1910 $contenu = array(_("bible"));
1911 $form->setSelect("bible4",$contenu);
1912
1913 if ($maj == 1) {
1914 $base64 = $this->init_pdf_temp();
1915 $form->setSelect('live_preview', array('base64'=>$base64));
1916 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1917 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1918 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1919 }
1920
1921 // Selection du type de rédaction à l'ajout
1922 $content = array(
1923 0 => array('f', 't', ),
1924 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1925 );
1926 $form->setSelect('flag_edition_integrale', $content);
1927
1928 $contenu = array();
1929 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1930 $contenu[0][] = $value;
1931 $contenu[1][] = $this->get_trad_for_statut($value);
1932 }
1933 $form->setSelect('statut_signature', $contenu);
1934
1935
1936 if ($maj == 401) {
1937 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1938 $form->setSelect('preview_edition', array(
1939 'base64' => base64_encode($file['file_content']),
1940 'mimetype' => $file['metadata']['mimetype'],
1941 'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1942 'href' => sprintf(
1943 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1944 $this->getVal($this->clePrimaire)
1945 )
1946 ));
1947 }
1948 }
1949
1950 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1951 //
1952 // Vérifie uniquementla cle secondaire : demande
1953 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1954
1955 $id = $this->getVal($this->clePrimaire);
1956
1957 //Requête de vérification que cet événement d'instruction n'est pas lié
1958 //à la création d'un dossier d'instruction
1959 $qres = $this->f->get_one_result_from_db_query(
1960 sprintf(
1961 'SELECT
1962 demande_type.dossier_instruction_type
1963 FROM
1964 %1$sdemande_type
1965 LEFT JOIN %1$sdemande
1966 ON demande.demande_type = demande_type.demande_type
1967 WHERE
1968 demande.instruction_recepisse = \'%2$d\'',
1969 DB_PREFIXE,
1970 intval($id)
1971 ),
1972 array(
1973 "origin" => __METHOD__,
1974 )
1975 );
1976
1977 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1978 //création de dossier d'instruction, l'événement d'instruction peut être
1979 //supprimé
1980 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1981 // Requête de vérification que cet événement d'instruction est lié
1982 // à une demande
1983 $qres = $this->f->get_one_result_from_db_query(
1984 sprintf(
1985 'SELECT
1986 demande
1987 FROM
1988 %1$sdemande
1989 WHERE
1990 instruction_recepisse = \'%2$d\'',
1991 DB_PREFIXE,
1992 intval($id)
1993 ),
1994 array(
1995 "origin" => __METHOD__,
1996 )
1997 );
1998
1999 //Si c'est un événement d'instruction lié à une demande
2000 if ($qres['result'] != null || $qres['result'] != ""){
2001 $demande = $this->f->get_inst__om_dbform(array(
2002 "obj" => "demande",
2003 "idx" => $qres['result'],
2004 ));
2005
2006 //On met à jour la demande en supprimant la liaison vers
2007 //l'événement d'instruction
2008 $demande->setParameter("maj", 1);
2009 $valF = array();
2010 foreach($demande->champs as $identifiant => $champ) {
2011 $valF[$champ] = $demande->val[$identifiant];
2012 }
2013 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2014 $valF['instruction_recepisse']=NULL;
2015 $ret = $demande->modifier($valF);
2016 }
2017
2018 /**
2019 * Vérification que l'élément supprimé est le dernier pour pouvoir
2020 * remodifier les données de manière itérative.
2021 */
2022 $qres = $this->f->get_one_result_from_db_query(
2023 sprintf(
2024 'SELECT
2025 max(instruction)
2026 FROM
2027 %1$sinstruction
2028 WHERE
2029 dossier = \'%2$s\'',
2030 DB_PREFIXE,
2031 $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2032 ),
2033 array(
2034 "origin" => __METHOD__,
2035 )
2036 );
2037
2038 // Si on se trouve effectivement sur le dernier evenement d'instruction
2039 // alors on valide la suppression sinon on l'annule
2040 $this->correct = false;
2041 $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2042 if ($qres['result'] == $id) {
2043 // Alors on valide la suppression
2044 $this->correct = true;
2045 $message = __('Destruction_chronologique');
2046 }
2047 $this->addToMessage($message);
2048 }
2049 }
2050
2051 /**
2052 * Vérification de la possibilité ou non de modifier des dates de suivi
2053 * @param string $champ champ date à vérifier
2054 */
2055 function updateDate($champ) {
2056
2057 //Si le retourformulaire est "dossier_instruction"
2058 if ($this->getParameter("retourformulaire") == "dossier"
2059 || $this->f->contexte_dossier_instruction()) {
2060
2061 // Vérification de la possibilité de modifier les dates si déjà éditées
2062 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2063 // si l'utilisateur n'est pas un admin
2064 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2065 $this->correct = false;
2066 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2067 }
2068 }
2069 }
2070
2071 //
2072 return true;
2073 }
2074
2075 /**
2076 * SETTER_FORM - setValsousformulaire (setVal).
2077 *
2078 * @return void
2079 */
2080 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2081 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2082 //
2083 $this->retourformulaire = $retourformulaire;
2084 //
2085 if ($maj == 0) {
2086 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2087 $form->setVal("dossier", $this->getParameter("idxformulaire"));
2088 }
2089
2090 // Si l'instruction a été envoyé au contrôle de légalité et que la
2091 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2092 // l'utilisateur que l'envoi au cl est en cours de traitement.
2093 if ($this->is_sent_to_cl() === true
2094 && empty($this->getVal('date_envoi_controle_legalite'))
2095 && $maj == 3) {
2096 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2097 }
2098 //
2099 $this->set_form_default_values($form, $maj, $validation);
2100 }
2101
2102 /**
2103 * SETTER_FORM - set_form_default_values (setVal).
2104 *
2105 * @return void
2106 */
2107 function set_form_default_values(&$form, $maj, $validation) {
2108 //
2109 if ($maj == 0) {
2110 // si contexte DI
2111 if ($this->getParameter("retourformulaire") == "dossier"
2112 || $this->f->contexte_dossier_instruction()) {
2113 // on recupère les signataires de la multicollectivité et de celle du DI
2114 $di = $this->f->get_inst__om_dbform(array(
2115 "obj" => "dossier_instruction",
2116 "idx" => $this->getParameter("idxformulaire"),
2117 ));
2118 $sql = str_replace(
2119 "<collectivite_di>",
2120 $di->getVal("om_collectivite"),
2121 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2122 );
2123 } else {
2124 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2125 }
2126
2127 $qres = $this->f->get_all_results_from_db_query($sql, array(
2128 "origin" => __METHOD__));
2129 $row = array_shift($qres['result']);
2130 if (isset($row["signataire_arrete"])
2131 && is_numeric($row["signataire_arrete"])) {
2132 //
2133 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2134 }
2135 // Date du jour
2136 $form->setVal("date_evenement", date("Y-m-d"));
2137 }
2138 //
2139 if ($maj == 0 || $maj == 1 || $maj == 125) {
2140 $form->setVal("bible_auto", "bible_auto()");
2141 $form->setVal("bible", "bible(1)");
2142 $form->setVal("bible2", "bible(2)");
2143 $form->setVal("bible3", "bible(3)");
2144 $form->setVal("bible4", "bible(4)");
2145 }
2146 //
2147 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2148 if ($maj == 1
2149 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2150 && $this->has_an_edition() === true) {
2151 //
2152 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2153 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2154 $form->setVal("btn_preview", "show_instr_preview()");
2155 $form->setVal("btn_redaction", "show_instr_redaction()");
2156 }
2157
2158 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2159 // des communes
2160 if ($maj == 3) {
2161 if ($this->can_display_notification_demandeur()) {
2162 $typeNotification = array(
2163 'notification_recepisse',
2164 'notification_instruction',
2165 'notification_decision',
2166 );
2167 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2168 }
2169 if ($this->can_display_notification_service()) {
2170 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2171 }
2172 if ($this->can_display_notification_tiers()) {
2173 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2174 }
2175 if ($this->can_display_notification_commune()) {
2176 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2177 }
2178 }
2179 }
2180
2181 function setLayout(&$form, $maj){
2182 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2183 // citoyen, si la notification des demandeurs est activée sur l'évenement
2184 // d'instruction et que le paramétrage du demandeur principal n'est pas
2185 // correct alors un message a destination de l'instructeur est affiché.
2186 if ($maj == 3) {
2187 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2188 // la requête permettant de savoir le type de demande à échouée) et si
2189 // la notification se fait par mail vérifie si il y a des erreurs de
2190 // paramétrage et si c'est le cas on affiche un message d'information
2191 $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2192 $categorieNotif = $this->f->get_param_option_notification($collectivite);
2193 if ($this->dossier_depose_sur_portail() == null || ! $this->dossier_depose_sur_portail()) {
2194 $erreurParam = $this->get_info_notification_fail();
2195 // Récupération de l'évenement d'instruction
2196 $instEV = $this->get_inst_evenement();
2197 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2198 $class = 'text-info ui-state-highlight ui-state-info';
2199 $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2200 $this->f->display_panel_information(
2201 $class,
2202 $message,
2203 $erreurParam,
2204 __('Veuillez corriger les informations suivantes.'),
2205 'erreur_param_notif'
2206 );
2207 }
2208 }
2209 }
2210 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2211
2212 $form->setFieldset('evenement','D',_('Evenement'));
2213 $form->setFieldset('om_final_instruction_utilisateur','F','');
2214
2215 $form->setBloc('om_final_instruction_utilisateur','F');
2216
2217 $form->setBloc('date_finalisation_courrier','D',"","");
2218
2219 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2220 $form->setBloc('date_finalisation_courrier','D',"","col_6");
2221 $form->setBloc('date_envoi_controle_legalite','F');
2222
2223 $form->setBloc('date_retour_signature','D',"","col_6");
2224 $form->setBloc('date_retour_controle_legalite','F');
2225 $form->setFieldset('date_retour_controle_legalite','F','');
2226
2227 $form->setBloc('date_retour_controle_legalite','F');
2228
2229 $form->setBloc('statut_signature','D');
2230 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2231 $form->setBloc('commentaire_signature','F');
2232 $form->setBloc('historique_signature','D');
2233 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2234 $form->setBloc('historique_signature','F');
2235 $form->setFieldset('historique_signature','F');
2236
2237 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2238 $form->setFieldset('suivi_notification','F');
2239 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2240 $form->setFieldset('suivi_notification_service','F');
2241 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2242 $form->setFieldset('suivi_notification_tiers','F');
2243 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2244 $form->setFieldset('suivi_notification_commune','F');
2245
2246 if ($maj == 1) {
2247 // Récupère la collectivité du dossier d'instruction
2248 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2249
2250 //
2251 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2252 && $this->has_an_edition() === true) {
2253 //
2254 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2255 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2256 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2257 $form->setFieldset('complement_om_html','D',_('Complement'));
2258 $form->setFieldset('bible','F','');
2259 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2260 $form->setFieldset('bible2','F','');
2261 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2262 $form->setFieldset('bible3','F','');
2263 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2264 $form->setFieldset('bible4','F','');
2265 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2266 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2267 $form->setBloc('corps_om_htmletatex','F');
2268 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2269 $form->setBloc('btn_preview','F');
2270 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2271 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2272 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2273 $form->setFieldset('live_preview','F');
2274 $form->setBloc('live_preview','F');
2275 $form->setBloc('live_preview','F');
2276 } else {
2277 $form->setBloc('complement_om_html','D',"","hidelabel");
2278 $form->setFieldset('complement_om_html','D',_('Complement'));
2279 $form->setFieldset('bible','F','');
2280 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2281 $form->setFieldset('bible2','F','');
2282 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2283 $form->setFieldset('bible3','F','');
2284 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2285 $form->setFieldset('bible4','F','');
2286 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2287 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2288 $form->setBloc('corps_om_htmletatex','F');
2289 }
2290 } else {
2291 $form->setBloc('complement_om_html','D',"","hidelabel");
2292 $form->setFieldset('complement_om_html','D',_('Complement'));
2293 $form->setFieldset('bible','F','');
2294 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2295 $form->setFieldset('bible2','F','');
2296 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2297 $form->setFieldset('bible3','F','');
2298 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2299 $form->setFieldset('bible4','F','');
2300 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2301 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2302 $form->setBloc('corps_om_htmletatex','F');
2303 }
2304 }
2305
2306 function setLib(&$form, $maj) {
2307 //
2308 parent::setLib($form, $maj);
2309 //
2310 $form->setLib('bible_auto', "");
2311 $form->setLib('bible', "");
2312 $form->setLib('bible2', "");
2313 $form->setLib('bible3', "");
2314 $form->setLib('bible4', "");
2315 $form->setLib('btn_refresh', "");
2316 $form->setLib('btn_preview', "");
2317 $form->setLib('btn_redaction', "");
2318 $form->setLib('live_preview', "");
2319 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2320 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2321 $form->setLib('date_retour_rar', __("date_notification"));
2322 $form->setLib('statut_signature', __("statut"));
2323 $form->setLib('commentaire_signature', __("commentaire"));
2324 $form->setLib('historique_signature', '');
2325 $form->setLib('suivi_notification', '');
2326 $form->setLib('suivi_notification_service', '');
2327 $form->setLib('suivi_notification_tiers', '');
2328 $form->setLib('suivi_notification_commune', '');
2329 $form->setLib('preview_edition', "");
2330
2331 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2332 // ajout et que l'option de rédaction libre est activée sur la
2333 // collectivité du dossier
2334 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2335 //
2336 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2337 $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.");
2338 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2339 }
2340 else {
2341 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2342 }
2343
2344 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2345 // modification et que l'option de prévisualisation de l'édition est
2346 // activée sur la collectivité du dossier
2347 if ($maj === '1'
2348 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2349 //
2350 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2351 $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.");
2352 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2353 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2354 }
2355 }
2356
2357 /**
2358 * TRIGGER - triggerajouter.
2359 *
2360 * @return boolean
2361 */
2362 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2363 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2364 /**
2365 * Le code suivant permet de récupérer des valeurs des tables evenement
2366 * et dossier pour les stocker dans l'instruction :
2367 * DEPUIS L'EVENEMENT
2368 * - action
2369 * - delai
2370 * - accord_tacite
2371 * - etat
2372 * - avis_decision
2373 * - delai_notification
2374 * - lettretype
2375 * - autorite_competente
2376 * - pec_metier
2377 * - complement_om_html
2378 * - complement2_om_html
2379 * - complement3_om_html
2380 * - complement4_om_html
2381 * - complement5_om_html
2382 * DEPUIS LE DOSSIER D'INSTRUCTION
2383 * - archive_delai
2384 * - archive_accord_tacite
2385 * - archive_etat
2386 * - archive_avis
2387 * - date_complet
2388 * - date_rejet
2389 * - date_limite
2390 * - date_notification_delai
2391 * - date_decision
2392 * - date_validite
2393 * - date_achevement
2394 * - date_chantier
2395 * - date_conformite
2396 * - avis_decision
2397 */
2398 // Récupération de tous les paramètres de l'événement sélectionné
2399 // TODO : remplacer cette requête par l'instanciation de l'événement
2400 $qres = $this->f->get_all_results_from_db_query(
2401 sprintf(
2402 'SELECT
2403 *
2404 FROM
2405 %1$sevenement
2406 WHERE
2407 evenement = %2$d',
2408 DB_PREFIXE,
2409 intval($this->valF['evenement'])
2410 ),
2411 array(
2412 "origin" => __METHOD__,
2413 )
2414 );
2415 foreach ($qres['result'] as $row) {
2416 // Récupération de l'identifiant de l'action
2417 // si une action est paramétrée dans l'événement
2418 $this->valF['action'] = NULL;
2419 if (isset($row['action']) and !empty($row['action'])) {
2420 $this->valF['action']=$row['action'];
2421 }
2422 // Récupération de la valeur du délai
2423 $this->valF['delai'] = $row['delai'];
2424 // Récupération de l'identifiant de l'état
2425 // si un état est paramétré dans l'événement
2426 $this->valF['etat']=NULL;
2427 if (isset($row['etat']) and !empty($row['etat'])) {
2428 $this->valF['etat']=$row['etat'];
2429 }
2430 // Récupération de la valeur d'accord tacite
2431 $this->valF['accord_tacite']=$row['accord_tacite'];
2432 // Récupération de la valeur du délai de notification
2433 $this->valF['delai_notification']=$row['delai_notification'];
2434 // Récupération de l'identifiant de l'avis
2435 // si un avis est paramétré dans l'événement
2436 $this->valF['avis_decision'] = NULL;
2437 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2438 $this->valF['avis_decision']=$row['avis_decision'];
2439 }
2440 // Récupération de la valeur de l'autorité compétente
2441 // si l'autorité compétente est paramétré dans l'événement
2442 $this->valF['autorite_competente'] = NULL;
2443 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2444 $this->valF['autorite_competente']=$row['autorite_competente'];
2445 }
2446 // Récupération de la valeur de la lettre type
2447 $this->valF['lettretype']=$row['lettretype'];
2448 // Récupération de la valeur de la prise en compte métier
2449 // si la prise en compte métier est paramétrée dans l'événement
2450 $this->valF['pec_metier'] = NULL;
2451 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2452 $this->valF['pec_metier'] = $row['pec_metier'];
2453 }
2454 }
2455 // Récupération de toutes les valeurs du dossier d'instruction en cours
2456 // TODO : remplacer cette requête par l'instanciation de l'objet
2457 $qres = $this->f->get_all_results_from_db_query(
2458 sprintf(
2459 'SELECT
2460 *
2461 FROM
2462 %1$sdossier
2463 WHERE
2464 dossier = \'%2$s\'',
2465 DB_PREFIXE,
2466 $this->f->db->escapeSimple($this->valF['dossier'])
2467 ),
2468 array(
2469 "origin" => __METHOD__,
2470 )
2471 );
2472 $row = array_shift($qres['result']);
2473 $this->updateArchiveData($row);
2474
2475 // Récupération de la duree de validite du dossier d'autorisation
2476 $qres = $this->f->get_one_result_from_db_query(
2477 sprintf(
2478 'SELECT
2479 duree_validite_parametrage
2480 FROM
2481 %1$sdossier_autorisation_type_detaille
2482 LEFT JOIN %1$sdossier_autorisation
2483 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2484 LEFT JOIN %1$sdossier
2485 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2486 WHERE
2487 dossier.dossier = \'%2$s\'',
2488 DB_PREFIXE,
2489 $this->f->db->escapeSimple($this->valF['dossier'])
2490 ),
2491 array(
2492 "origin" => __METHOD__,
2493 )
2494 );
2495
2496 if ($qres['result'] != '') {
2497 $this->valF['duree_validite_parametrage'] = $qres['result'];
2498 }
2499
2500 // Identifiant du type de courrier
2501 $idTypeCourrier = '11';
2502 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2503 // Code barres
2504 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2505 }
2506
2507 /**
2508 * Test si une restriction est valide.
2509 *
2510 * @return boolean
2511 */
2512 function restrictionIsValid($restriction){
2513 if($this->restriction_valid != null) {
2514 return $this->restriction_valid;
2515 }
2516 if(empty($restriction)) {
2517 $this->restriction_valid = true;
2518 return $this->restriction_valid;
2519 }
2520 // Liste des opérateurs possibles sans espace
2521 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2522 // Liste identique mais avec le marqueur §
2523 $mark = "§";
2524 $operateurs_marked = array();
2525 foreach ($operateurs as $operateur) {
2526 $operateurs_marked[] = $mark.$operateur.$mark;
2527 }
2528
2529 // Supprime tous les espaces de la chaîne de caractère
2530 $restriction = preg_replace('/\s+/', '', $restriction);
2531
2532 // Met un marqueur avant et après les opérateurs
2533 // puis transforme la chaine en un tableau
2534 $restriction = str_replace($operateurs, $operateurs_marked,
2535 $restriction);
2536
2537 // Pour chaque opérateur logique
2538 foreach (array('&&', '||') as $operator) {
2539
2540 // S'il est absent on ne fait aucun traitement
2541 if (strpos($restriction, $mark.$operator.$mark) === false) {
2542 continue;
2543 }
2544 // Sinon on vérifie les deux conditions avec le OU/ET logique
2545 $restrictions = explode($mark.$operator.$mark, $restriction);
2546 $restrictions[0] = explode($mark, $restrictions[0]);
2547 $restrictions[1] = explode($mark, $restrictions[1]);
2548 $res_bool = false;
2549 if ($operator == '&&') {
2550 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2551 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2552 $res_bool = true;
2553 }
2554 }
2555 if ($operator == '||') {
2556 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2557 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2558 $res_bool = true;
2559 }
2560 }
2561 return $res_bool;
2562 }
2563 $tabRestriction = explode($mark, $restriction);
2564 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2565
2566 }
2567
2568 function is_restriction_satisfied($restriction, $operateurs) {
2569 // Tableau comprenant les résultat
2570 $res = array();
2571 // Compteur pour les résultat
2572 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2573 $j = 1;
2574 // Comparateur du calcul
2575 $comparateur = '';
2576 // Booléen retourné
2577 $res_bool = true;
2578
2579 // S'il y a un comparateur
2580 if (in_array(">=", $restriction)
2581 || in_array("<=", $restriction)
2582 || in_array("==", $restriction)
2583 || in_array("!=", $restriction)) {
2584
2585 // Si le tableau n'est pas vide
2586 if (count($restriction) > 0) {
2587
2588 // Boucle dans le tableau pour récupérer seulement les valeurs
2589 foreach ($restriction as $key => $value) {
2590 //
2591 if (!in_array($value, $operateurs)) {
2592 if ($this->getRestrictionValue($value) != false) {
2593 $res[] = $this->getRestrictionValue($value);
2594 } else {
2595 // Message d'erreur
2596 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2597 $this->addToMessage($error_message);
2598 // Arrête le traitement
2599 return false;
2600 }
2601 }
2602 }
2603
2604 // Boucle dans le tableau
2605 // commence à 1 car le 0 doit rester inchangé tout au long du
2606 // traitement
2607 for ($i = 1; $i<count($restriction); $i++) {
2608
2609 // Récupère le comparateur
2610 if ($restriction[$i] === ">="
2611 || $restriction[$i] === "<="
2612 || $restriction[$i] === "=="
2613 || $restriction[$i] === "!=") {
2614 $comparateur = $restriction[$i];
2615 }
2616
2617 // Si l'opérateur qui suit est un "+"
2618 if ($restriction[$i] === "+") {
2619 $dateDep = $res[$j];
2620 unset($res[$j]);$j++;
2621 $duree = $res[$j];
2622 unset($res[$j]);
2623 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2624 }
2625
2626 // Si l'opérateur qui suit est un "-"
2627 if ($restriction[$i] === "-") {
2628 $dateDep = $res[$j];
2629 unset($res[$j]);$j++;
2630 $duree = $res[$j];
2631 unset($res[$j]);
2632 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2633 }
2634 }
2635
2636 }
2637
2638 // Si les tableau des résultats n'est pas vide
2639 if (count($res) > 0) {
2640 //
2641 $res_bool = false;
2642 // Effectue le test
2643 if ($comparateur === ">=") {
2644 //
2645 if (strtotime($res[0]) >= strtotime($res[$j])) {
2646 $res_bool = true;
2647 }
2648 }
2649 if ($comparateur === "<=") {
2650 //
2651 if (strtotime($res[0]) <= strtotime($res[$j])) {
2652 $res_bool = true;
2653 }
2654 }
2655 if ($comparateur === "==") {
2656 //
2657 if (strtotime($res[0]) == strtotime($res[$j])) {
2658 $res_bool = true;
2659 }
2660 }
2661 if ($comparateur === "!=") {
2662 //
2663 if (strtotime($res[0]) != strtotime($res[$j])) {
2664 $res_bool = true;
2665 }
2666 }
2667 }
2668 // Sinon une erreur s'affiche
2669 } else {
2670
2671 // Message d'erreur
2672 $error_message = _("Mauvais parametrage de la restriction.")." ".
2673 _("Contactez votre administrateur");
2674 $this->addToMessage($error_message);
2675 // Arrête le traitement
2676 return false;
2677 }
2678
2679 return $res_bool;
2680
2681 }
2682
2683 /**
2684 * Permet de définir si l'événement passé en paramètre est un événement retour.
2685 * @param integer $evenement événement à tester
2686 *
2687 * @return boolean retourne true si événement retour sinon false
2688 */
2689 function is_evenement_retour($evenement) {
2690 if(empty($evenement) || !is_numeric($evenement)) {
2691 return "";
2692 }
2693
2694 $evenement = $this->f->get_inst__om_dbform(array(
2695 "obj" => "evenement",
2696 "idx" => $evenement,
2697 ));
2698
2699 return $evenement->getVal('retour') == 't';
2700 }
2701
2702 /**
2703 * Retourne le champ restriction de l'événement passé en paramètre.
2704 *
2705 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2706 *
2707 * @return string contenu du champ restriction
2708 */
2709 function get_restriction($evenement) {
2710 if(empty($evenement) || !is_numeric($evenement)) {
2711 return "";
2712 }
2713 //Récupère la restriction
2714 $evenement = $this->f->get_inst__om_dbform(array(
2715 "obj" => "evenement",
2716 "idx" => $evenement,
2717 ));
2718
2719 return $evenement->getVal('restriction');
2720 }
2721
2722 /**
2723 * Récupère la valeur du champ dans la restriction
2724 * @param string $restrictionValue Nom du champ
2725 * @return mixed Valeur du champ
2726 */
2727 function getRestrictionValue($restrictionValue){
2728
2729 // Initialisation de la valeur de retour
2730 $return = false;
2731
2732 // Récupére les valeurs du dossier
2733 $value_dossier = $this->get_dossier_actual();
2734
2735 //
2736 if (is_numeric($restrictionValue)) {
2737 $return = $restrictionValue;
2738 }elseif (isset($value_dossier[$restrictionValue])) {
2739 $return = $value_dossier[$restrictionValue];
2740 }elseif (isset($this->valF[$restrictionValue])) {
2741 $return = $this->valF[$restrictionValue];
2742 }
2743
2744 // Retourne la valeur du champ
2745 return $return;
2746 }
2747
2748
2749 /**
2750 * Calcul des règle d'action selon leur type.
2751 *
2752 * Types de règle :
2753 * - date
2754 * - numeric
2755 * - text
2756 * - bool
2757 * - specific
2758 * - technical_data
2759 *
2760 * @param string $rule Règle d'action.
2761 * @param string $rule_name Nom de la règle.
2762 * @param string $type Type de la règle.
2763 *
2764 * @return mixed Résultat de la règle
2765 */
2766 public function regle($rule, $rule_name, $type = null) {
2767
2768 // Supprime tous les espaces de la chaîne de caractère
2769 $rule = str_replace(' ', '', $rule);
2770 // Coupe la chaîne au niveau de l'opérateur
2771 $operands = explode ("+", $rule);
2772 // Nombre d'opérande
2773 $nb_operands = count($operands);
2774
2775 // Règle à null
2776 if ($rule == "null") {
2777 return null;
2778 }
2779
2780 // Tableau des champs de type date
2781 $rule_type_date = array(
2782 "regle_date_limite",
2783 "regle_date_notification_delai",
2784 "regle_date_complet",
2785 "regle_date_validite",
2786 "regle_date_decision",
2787 "regle_date_chantier",
2788 "regle_date_achevement",
2789 "regle_date_conformite",
2790 "regle_date_rejet",
2791 "regle_date_dernier_depot",
2792 "regle_date_limite_incompletude",
2793 "regle_date_cloture_instruction",
2794 "regle_date_premiere_visite",
2795 "regle_date_derniere_visite",
2796 "regle_date_contradictoire",
2797 "regle_date_retour_contradictoire",
2798 "regle_date_ait",
2799 "regle_date_transmission_parquet",
2800 "regle_date_affichage",
2801 );
2802 // Tableau des champs de type numérique
2803 $rule_type_numeric = array(
2804 "regle_delai",
2805 "regle_delai_incompletude",
2806 );
2807 // Tableau des champs de type text
2808 $rule_type_text = array(
2809 );
2810 // Tableau des champs de type booléen
2811 $rule_type_bool = array(
2812 "regle_a_qualifier",
2813 "regle_incompletude",
2814 "regle_incomplet_notifie",
2815 "regle_evenement_suivant_tacite_incompletude",
2816 );
2817 // Tableau des champs spécifiques
2818 $rule_type_specific = array(
2819 "regle_autorite_competente",
2820 "regle_etat",
2821 "regle_accord_tacite",
2822 "regle_avis",
2823 "regle_pec_metier",
2824 "regle_etat_pendant_incompletude",
2825 );
2826 // Tableau des champs de données techniques
2827 $rule_type_technical_data = array(
2828 'regle_donnees_techniques1',
2829 'regle_donnees_techniques2',
2830 'regle_donnees_techniques3',
2831 'regle_donnees_techniques4',
2832 'regle_donnees_techniques5',
2833 );
2834 // Tableau des champs simple
2835 $rule_type_simple = array(
2836 "regle_dossier_instruction_type",
2837 );
2838
2839 // Définit le type du champ
2840 if (in_array($rule_name, $rule_type_date) == true) {
2841 $type = "date";
2842 }
2843 if (in_array($rule_name, $rule_type_numeric) == true) {
2844 $type = "numeric";
2845 }
2846 if (in_array($rule_name, $rule_type_text) === true) {
2847 $type = "text";
2848 }
2849 if (in_array($rule_name, $rule_type_bool) === true) {
2850 $type = "bool";
2851 }
2852 if (in_array($rule_name, $rule_type_specific) === true) {
2853 $type = "specific";
2854 }
2855 if (in_array($rule_name, $rule_type_technical_data) === true) {
2856 $type = 'text';
2857 }
2858 if (in_array($rule_name, $rule_type_simple) === true) {
2859 $type = 'simple';
2860 }
2861
2862 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2863 // Récupère directement la valeur de l'opérande
2864 if ($type === 'specific') {
2865 //
2866 return $this->get_value_for_rule($rule);
2867 }
2868
2869 // Initialisation des variables
2870 $key_date = 0;
2871 $total_numeric = 0;
2872 $res_text = '';
2873
2874 // Pour chaque opérande
2875 foreach ($operands as $key => $operand) {
2876
2877 // Si c'est une règle de type date
2878 if ($type == 'date') {
2879 // Vérifie si au moins une des opérandes est une date
2880 if (is_numeric($operand) === false
2881 && $this->get_value_for_rule($operand) !== null
2882 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2883 // Récupère la position de la date
2884 $key_date = $key;
2885 }
2886 // Les autres opérandes doivent être que des numériques
2887 if (is_numeric($operand) == true) {
2888 // Ajoute l'opérande au total
2889 $total_numeric += $operand;
2890 }
2891 if (is_numeric($operand) === false
2892 && $this->get_value_for_rule($operand) !== null
2893 && is_numeric($this->get_value_for_rule($operand)) == true) {
2894 // Ajoute l'opérande au total
2895 $total_numeric += $this->get_value_for_rule($operand);
2896 }
2897 }
2898
2899 // Si c'est une règle de type numérique
2900 if ($type == 'numeric') {
2901 // Les opérandes doivent être que des numériques
2902 if (is_numeric($operand) == true) {
2903 // Ajoute l'opérande au total
2904 $total_numeric += $operand;
2905 }
2906 if (is_numeric($operand) === false
2907 && $this->get_value_for_rule($operand) !== null
2908 && is_numeric($this->get_value_for_rule($operand)) == true) {
2909 // Ajoute l'opérande au total
2910 $total_numeric += $this->get_value_for_rule($operand);
2911 }
2912 }
2913
2914 // Si c'est une règle de type text
2915 if ($type === 'text') {
2916 // Concatène toutes les chaînes de caractère
2917 $res_text .= $this->get_value_for_rule($operand);
2918 }
2919 }
2920
2921 // Résultat pour une règle de type date
2922 if ($type == 'date') {
2923 // Retourne le calcul de la date
2924 return $this->f->mois_date($this->valF[$operands[$key_date]],
2925 $total_numeric, "+");
2926 }
2927
2928 // Résultat pour une règle de type numérique
2929 if ($type == 'numeric') {
2930 // Retourne le calcul
2931 return $total_numeric;
2932 }
2933
2934 // Résultat pour une règle de type text
2935 if ($type === 'text') {
2936 // Retourne la chaîne de caractère
2937 return $res_text;
2938 }
2939 if ($type === 'simple' || $type === 'bool') {
2940 // Retourne la valeur du champs rule
2941 return $rule;
2942 }
2943 }
2944
2945
2946 /**
2947 * Récupère la valeur du champs dans l'instruction ou dans les données
2948 * techniques.
2949 * Spécifique au calcul des règles.
2950 *
2951 * @param string $field Champ
2952 *
2953 * @return mixed Valeur du champ
2954 */
2955 private function get_value_for_rule($field) {
2956 // Si le champ n'existe pas dans la table instruction
2957 if (array_key_exists($field, $this->valF) === false) {
2958 // Récupère l'instance de la classe donnees_techniques
2959 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2960 // Retourne la valeur de la donnée technique
2961 return $inst_donnees_techniques->getVal($field);
2962 }
2963
2964 //
2965 return $this->valF[$field];
2966 }
2967
2968
2969 /**
2970 * [get_inst_donnees_techniques description]
2971 *
2972 * @param [type] $donnees_techniques [description]
2973 *
2974 * @return [type] [description]
2975 */
2976 function get_inst_donnees_techniques($donnees_techniques = null) {
2977 //
2978 if (isset($this->inst_donnees_techniques) === false or
2979 $this->inst_donnees_techniques === null) {
2980 //
2981 if (is_null($donnees_techniques)) {
2982 $donnees_techniques = $this->getDonneesTechniques();
2983 }
2984 //
2985 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2986 "obj" => "donnees_techniques",
2987 "idx" => $donnees_techniques,
2988 ));
2989 }
2990 //
2991 return $this->inst_donnees_techniques;
2992 }
2993
2994
2995 /**
2996 * Retourne l'identifiant des données techniques liées du dossier
2997 * @return string L'identifiant des données techniques liées du dossier
2998 */
2999 function getDonneesTechniques() {
3000
3001 $qres = $this->f->get_one_result_from_db_query(
3002 sprintf(
3003 'SELECT
3004 donnees_techniques
3005 FROM
3006 %1$sdonnees_techniques
3007 WHERE
3008 dossier_instruction = \'%2$s\'',
3009 DB_PREFIXE,
3010 $this->f->db->escapeSimple($this->valF["dossier"])
3011 ),
3012 array(
3013 "origin" => __METHOD__,
3014 )
3015 );
3016
3017 return $qres['result'];
3018 }
3019
3020 /**
3021 * TRIGGER - triggerajouterapres.
3022 *
3023 * - Mise à jour des informations liées au workflow sur le dossier
3024 * - Interface avec le référentiel ERP [105][111]
3025 * - Mise à jour du DA
3026 * - Historisation de la vie du DI
3027 *
3028 * @return boolean
3029 */
3030 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3031 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3032
3033 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3034 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3035 // Instance de la classe evenement
3036 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3037 // Instance de l'état courant du dossier d'instruction
3038 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3039 "obj" => "etat",
3040 "idx" => $inst_di->get_id_etat(),
3041 ));
3042
3043 /**
3044 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3045 * par l'action
3046 */
3047 // état de complétude actuel du dossier
3048 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3049 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3050 $ev_suiv_tacite_incompletude = false;
3051 // Initialisation
3052 $valF = array();
3053 $valF_dt = array();
3054 //
3055 // Récupération des paramètres de l'action
3056 // TODO : remplacer cette requête par l'instanciation de l'action
3057 $qres = $this->f->get_all_results_from_db_query(
3058 sprintf(
3059 'SELECT
3060 *
3061 FROM
3062 %1$saction
3063 WHERE
3064 action = \'%2$s\'',
3065 DB_PREFIXE,
3066 $this->f->db->escapeSimple($this->valF['action'])
3067 ),
3068 array(
3069 "origin" => __METHOD__
3070 )
3071 );
3072 foreach ($qres['result'] as $row) {
3073
3074 // pour chacune des regles, on applique la regle
3075 if ($row['regle_delai'] != '') {
3076 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3077 }
3078 if ($row['regle_accord_tacite'] != '') {
3079 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3080 }
3081 if ($row['regle_avis'] != '') {
3082 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3083 }
3084 if ($row['regle_date_limite'] != '') {
3085 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3086 }
3087 if ($row['regle_date_complet'] != '') {
3088 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3089 }
3090 if ($row['regle_date_dernier_depot'] != '') {
3091 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3092 }
3093 if ($row['regle_date_notification_delai'] != '') {
3094 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3095 }
3096 if ($row['regle_date_decision'] != '') {
3097 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3098 }
3099 if ($row['regle_date_rejet'] != '') {
3100 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3101 }
3102 if ($row['regle_date_validite'] != '') {
3103 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3104 }
3105 if ($row['regle_date_chantier'] != '') {
3106 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3107 }
3108 if ($row['regle_date_achevement'] != '') {
3109 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3110 }
3111 if ($row['regle_date_conformite'] != '') {
3112 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3113 }
3114 if ($row['regle_date_limite_incompletude'] != '') {
3115 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3116 }
3117 if ($row['regle_delai_incompletude'] != '') {
3118 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3119 }
3120 if ($row['regle_autorite_competente'] != '') {
3121 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3122 }
3123 if ($row['regle_etat'] != '') {
3124 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3125 }
3126 if ($row['regle_date_cloture_instruction'] !== '') {
3127 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3128 }
3129 if ($row['regle_date_premiere_visite'] !== '') {
3130 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3131 }
3132 if ($row['regle_date_derniere_visite'] !== '') {
3133 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3134 }
3135 if ($row['regle_date_contradictoire'] !== '') {
3136 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3137 }
3138 if ($row['regle_date_retour_contradictoire'] !== '') {
3139 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3140 }
3141 if ($row['regle_date_ait'] !== '') {
3142 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3143 }
3144 if ($row['regle_donnees_techniques1'] !== '') {
3145 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3146 }
3147 if ($row['regle_donnees_techniques2'] !== '') {
3148 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3149 }
3150 if ($row['regle_donnees_techniques3'] !== '') {
3151 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3152 }
3153 if ($row['regle_donnees_techniques4'] !== '') {
3154 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3155 }
3156 if ($row['regle_donnees_techniques5'] !== '') {
3157 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3158 }
3159 if ($row['regle_date_transmission_parquet'] !== '') {
3160 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3161 }
3162 if ($row['regle_dossier_instruction_type'] !== '') {
3163 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3164 }
3165 // La date d'affichage est modifiée seulement si le champ n'est pas
3166 // renseigné
3167 if ($row['regle_date_affichage'] !== ''
3168 && ($inst_di->getVal('date_affichage') === ''
3169 || $inst_di->getVal('date_affichage') === null)) {
3170 //
3171 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3172 }
3173 //
3174 if ($row['regle_pec_metier'] != '') {
3175 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3176 }
3177 if ($row['regle_a_qualifier'] != '') {
3178 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3179 }
3180 //
3181 if ($row['regle_incompletude'] != '') {
3182 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3183 }
3184 if ($row['regle_incomplet_notifie'] != '') {
3185 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3186 }
3187 if ($row['regle_etat_pendant_incompletude'] != '') {
3188 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3189 }
3190 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3191 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3192 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3193 $ev_suiv_tacite_incompletude = true;
3194 }
3195 }
3196 }
3197
3198 // Si l'événement a un événement suivant tacite
3199 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3200 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3201 // pas associé de le même façon au dossier d'instruction
3202 if ($ev_suiv_tacite_incompletude === false) {
3203 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3204 }
3205 if ($ev_suiv_tacite_incompletude === true) {
3206 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3207 }
3208 }
3209 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3210 if (count($valF_dt) > 0) {
3211 $dt_id = $this->getDonneesTechniques();
3212 // On met à jour le dossier
3213 $cle = " donnees_techniques='".$dt_id."'";
3214 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3215 $this->addToLog(
3216 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3217 VERBOSE_MODE
3218 );
3219 $this->f->isDatabaseError($res1);
3220 // Affichage d'informations à l'utilisateur
3221 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3222 }
3223 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3224 if (count($valF) > 0) {
3225 //
3226 $inst_dossier = $this->f->get_inst__om_dbform(array(
3227 "obj" => "dossier",
3228 "idx" => $this->valF['dossier'],
3229 ));
3230 $valF['instruction'] = $id;
3231 $valF['crud'] = 'create';
3232 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3233 if ($update_by_instruction === false) {
3234 $this->cleanMessage();
3235 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3236 return false;
3237 }
3238 // Affichage d'informations à l'utilisateur
3239 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3240 }
3241
3242 /**
3243 * Interface avec le référentiel ERP.
3244 *
3245 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3246 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3247 * Déclencheur :
3248 * - L'option ERP est activée
3249 * - Le dossier est marqué comme "connecté au référentiel ERP"
3250 * - Le dossier est de type PC
3251 * - Le formulaire d'ajout d'un événement d'instruction est validé
3252 * avec un événement pour lequel les services ERP doivent être
3253 * informé
3254 */
3255 //
3256 if ($this->f->is_option_referentiel_erp_enabled() === true
3257 && $inst_di->is_connected_to_referentiel_erp() === true
3258 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3259 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3260 //
3261 $infos = array(
3262 "dossier_instruction" => $this->valF['dossier'],
3263 "decision" => $inst_evenement->getVal("libelle"),
3264 );
3265 //
3266 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3267 if ($ret !== true) {
3268 $this->cleanMessage();
3269 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3270 return false;
3271 }
3272 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3273 }
3274
3275 // Si le mode en rédaction intégrale est activé
3276 if (isset($this->valF['flag_edition_integrale']) === true
3277 && $this->valF['flag_edition_integrale'] === true) {
3278 $redactionIntegraleValF = array();
3279
3280 // Récupère la collectivite du dossier d'instruction
3281 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3282 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3283 // Récupère le corps de la lettre type
3284 $params = array(
3285 "specific" => array(
3286 "corps" => array(
3287 "mode" => "get",
3288 )
3289 ),
3290 );
3291 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3292 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3293 // Récupère le titre de la lettre type
3294 $params = array(
3295 "specific" => array(
3296 "titre" => array(
3297 "mode" => "get",
3298 )
3299 ),
3300 );
3301 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3302 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3303
3304 // mise à jour en base de données
3305 $res = $this->f->db->autoExecute(
3306 DB_PREFIXE.$this->table,
3307 $redactionIntegraleValF,
3308 DB_AUTOQUERY_UPDATE,
3309 $this->clePrimaire."=".$id
3310 );
3311 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3312 if ($this->f->isDatabaseError($res, true) === true) {
3313 return false;
3314 }
3315 }
3316
3317 /**
3318 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3319 */
3320 // Si la finalisation automatique de l'événement est activée
3321 // ET si l'instruction n'a pas déjà été finalisée
3322 // ET s'il existe une lettre type associée
3323 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3324 && $inst_evenement->getVal('om_final_instruction') !== 't'
3325 && $inst_evenement->getVal('lettretype') !== ''
3326 && $inst_evenement->getVal('lettretype') !== null) {
3327
3328 // On instancie l'instruction
3329 $inst_instruction = $this->f->get_inst__om_dbform(array(
3330 "obj" => "instruction",
3331 "idx" => $this->valF[$this->clePrimaire],
3332 ));
3333
3334 // On finalise l'instruction dans le contexte de finalisation : action 100
3335 $inst_instruction->setParameter('maj', 100);
3336 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3337
3338 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3339 // et dans le message d'erreur
3340 if ($finalize === false) {
3341 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3342 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3343 return false;
3344 }
3345 }
3346
3347 /**
3348 * Finalisation automatique des instructions tacites ou retours.
3349 */
3350 // Si l'option de finalisation automatique des instructions tacites ou
3351 // retours est activée et l'événement d'instruction a une lettre type
3352 // associée
3353 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3354 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3355 && $inst_evenement->getVal('lettretype') !== ''
3356 && $inst_evenement->getVal('lettretype') !== null) {
3357
3358 // Rècupère l'identifiant de l'événement
3359 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3360
3361 // Si l'événement d'instruction est identifié comme un événement
3362 // retour
3363 // OU l'événement d'instruction est l'événement suivant tacite du
3364 // dossier d'instruction (incomplétude prise en compte)
3365 // ET l'événement d'instruction n'a pas déjà été finalisé
3366 if (($inst_evenement->getVal("retour") === 't'
3367 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3368 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3369 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3370
3371 // Finalise l'instruction
3372 $inst_instruction = $this->f->get_inst__om_dbform(array(
3373 "obj" => "instruction",
3374 "idx" => $this->valF[$this->clePrimaire],
3375 ));
3376 $inst_instruction->setParameter('maj', 100);
3377 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3378 if ($finalize === false) {
3379 //
3380 return false;
3381 }
3382 }
3383 }
3384
3385 /**
3386 * Mise à jour de la version de clôture *version_clos* du dossier si et
3387 * seulement si l'instruction met à jour l'état du dossier.
3388 */
3389 if (isset($valF['etat']) === true
3390 && $valF['etat'] !== null
3391 && $valF['etat'] !== '') {
3392 // Instanciation de l'état appliqué sur le dossier par l'instruction
3393 $inst_etat = $this->f->get_inst__om_dbform(array(
3394 "obj" => "etat",
3395 "idx" => $valF['etat'],
3396 ));
3397 //
3398 $update_version_clos = null;
3399 // En cas d'instruction qui clôture le dossier
3400 if ($inst_etat->getVal('statut') === 'cloture') {
3401 $update_version_clos = $inst_di->update_version_clos('up');
3402 }
3403 // En cas d'instruction qui rouvre le dossier
3404 if ($inst_current_etat->getVal('statut') === 'cloture'
3405 && $inst_etat->getVal('statut') !== 'cloture') {
3406 //
3407 $update_version_clos = $inst_di->update_version_clos('down');
3408 //
3409 $params = array(
3410 'di_reopened' => true,
3411 );
3412 }
3413 //
3414 if ($update_version_clos === false) {
3415 $this->f->addToLog(sprintf(
3416 "%s() : ERREUR - %s %s",
3417 __METHOD__,
3418 sprintf(
3419 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3420 $inst_di->getVal($inst_di->clePrimaire)
3421 ),
3422 sprintf(
3423 __("L'instruction tente d'appliquer l'état %s."),
3424 $inst_etat->getVal($inst_etat->clePrimaire)
3425 )
3426 ));
3427 $this->addToMessage(sprintf(
3428 "%s %s",
3429 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3430 __("Veuillez contacter votre administrateur.")
3431 ));
3432 return false;
3433 }
3434 }
3435
3436 /**
3437 * Notification automatique
3438 */
3439 // Notification automatique à l'ajout de l'instruction si la notification
3440 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3441 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3442 ($inst_evenement->getVal('lettretype') === null ||
3443 $inst_evenement->getVal('lettretype') === '')) {
3444 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3445 $msgLog = sprintf(
3446 '%s %s : %d',
3447 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3448 __('Instruction notifiée'),
3449 $id
3450 );
3451
3452 // Récupération de la liste des demandeurs à notifier et de la catégorie
3453 $categorie = $this->f->get_param_option_notification($collectivite_di);
3454 $isPortal = $categorie === PORTAL;
3455 $demandeursANotifie = $this->get_demandeurs_notifiable(
3456 $this->valF['dossier'],
3457 $isPortal
3458 );
3459
3460 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3461 $demandeurPrincipalNotifie = false;
3462 foreach ($demandeursANotifie as $demandeur) {
3463 // Identifie si le demandeur principal a été notifié ou pas
3464 // et récupère ses informations
3465 if ($demandeur['petitionnaire_principal'] == 't') {
3466 $demandeurPrincipalNotifie = true;
3467 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3468 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3469 // suivante. On le considère également comme non notifié pour gérer l'envoie
3470 // des messages d'erreurs
3471 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3472 // d'impact sur la notification
3473 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3474 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3475 $demandeurPrincipalNotifie = false;
3476 continue;
3477 }
3478 }
3479 // Ajout de la notif et récupération de son id
3480 $idNotif = $this->ajouter_notification(
3481 $this->valF[$this->clePrimaire],
3482 $this->f->get_connected_user_login_name(),
3483 $demandeur,
3484 $collectivite_di,
3485 array(),
3486 true
3487 );
3488 if ($idNotif === false) {
3489 $this->addToLog(
3490 sprintf('%s() : %s', __METHOD__, $msgLog),
3491 DEBUG_MODE
3492 );
3493 return false;
3494 }
3495 // Création de la tache en lui donnant l'id de la notification
3496 $notification_by_task = $this->notification_by_task(
3497 $idNotif,
3498 $this->valF['dossier'],
3499 $categorie
3500 );
3501 if ($notification_by_task === false) {
3502 $this->addToLog(
3503 sprintf('%s() : %s', __METHOD__, $msgLog),
3504 DEBUG_MODE
3505 );
3506 $this->addToMessage(
3507 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3508 );
3509 return false;
3510 }
3511 }
3512 // Pour la notification par mail ou la notification via portal si le dossier a
3513 // été déposés via portal, si le demandeur principal n'est pas notifiable,
3514 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3515 // laquelle le demandeur principal n'a pas pu être notifié
3516 $depotPortal = $this->dossier_depose_sur_portail();
3517 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3518 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3519 // ' ' permet de mettre un espace entre les 2 msg de log.
3520 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3521 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3522 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3523 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3524 // Ajout de la notif et récupération de son id
3525 $idNotif = $this->ajouter_notification(
3526 $this->valF[$this->clePrimaire],
3527 $this->f->get_connected_user_login_name(),
3528 $demandeurPrincipal,
3529 $collectivite_di,
3530 array(),
3531 true,
3532 'Echec',
3533 implode(' ', $erreursParam)
3534 );
3535 if ($idNotif === false) {
3536 $this->addToLog(
3537 sprintf('%s() : %s', __METHOD__, $msgLog),
3538 DEBUG_MODE
3539 );
3540 $this->addToMessage(
3541 __('Erreur : la création de la notification a échouée.').
3542 __("Veuillez contacter votre administrateur.")
3543 );
3544 return false;
3545 }
3546 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3547 // de l'échec de la notification
3548 $dossier_message = $this->get_inst_dossier_message(0);
3549 $dossier_message_val = array(
3550 'dossier' => $val['dossier'],
3551 'type' => _('erreur expedition'),
3552 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3553 'login' => $_SESSION['login'],
3554 'date_emission' => date('Y-m-d H:i:s'),
3555 'contenu' => _('Échec lors de la notification de l\'instruction ').
3556 $inst_evenement->getVal('libelle').
3557 '.<br>'.
3558 implode("\n", $erreursParam).
3559 '<br>'.
3560 _('Veuillez corriger ces informations avant de renvoyer la notification.')
3561 );
3562 $add = $dossier_message->add_notification_message($dossier_message_val, true);
3563 // Si une erreur se produit pendant l'ajout
3564 if ($add !== true) {
3565 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3566 return false;
3567 }
3568 }
3569 $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.")));
3570 }
3571
3572 // Notification automatique en cas de dépôt de dossier dématérialisé
3573 // Vérifie si l'option de notification est active et si il s'agit bien d'une
3574 // instruction de récépissé
3575 if (
3576 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3577 && $this->is_instruction_recepisse()
3578 ) {
3579 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3580 $msgLog = sprintf(
3581 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3582 $val['dossier']
3583 );
3584 // Récupère l'instance de la demande
3585 $demande = $inst_di->get_inst_demande();
3586 // Vérifie que le dossier a été déposé via platau ou portal
3587 if (
3588 ($demande->getVal('source_depot') == PLATAU ||
3589 $demande->getVal('source_depot') == PORTAL)
3590 ) {
3591 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3592 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3593 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3594 if (empty($listeEmails)) {
3595 $this->addToLog(
3596 sprintf(
3597 '%s(): %s %s',
3598 __METHOD__,
3599 $msgLog,
3600 __('Aucun courriel paramétré.')
3601 ),
3602 DEBUG_MODE
3603 );
3604 } else {
3605 foreach ($listeEmails as $email) {
3606 // Ajout de la notif et récupération de son id
3607 $destinataire = array(
3608 'destinataire' => $email,
3609 'courriel' => $email
3610 );
3611 $idNotif = $this->ajouter_notification(
3612 $this->valF[$this->clePrimaire],
3613 $this->f->get_connected_user_login_name(),
3614 $destinataire,
3615 $collectivite_di,
3616 array(),
3617 true
3618 );
3619 if ($idNotif === false) {
3620 $this->addToLog(
3621 sprintf('%s(): %s', __METHOD__, $msgLog),
3622 DEBUG_MODE
3623 );
3624 return false;
3625 }
3626 // Création de la tache en lui donnant l'id de la notification
3627 $notification_by_task = $this->notification_by_task(
3628 $idNotif,
3629 $this->valF['dossier'],
3630 'mail',
3631 'notification_depot_demat'
3632 );
3633 if ($notification_by_task === false) {
3634 $this->addToMessage(
3635 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3636 );
3637 $this->addToLog(
3638 sprintf('%s(): %s', __METHOD__, $msgLog),
3639 DEBUG_MODE
3640 );
3641 return false;
3642 }
3643 }
3644 }
3645 }
3646 }
3647
3648 /**
3649 * Mise à jour de la date de dernière modification du dossier
3650 */
3651 $inst_di->update_last_modification_date();
3652
3653 /**
3654 * Mise à jour des données du DA.
3655 */
3656 $inst_da = $inst_di->get_inst_dossier_autorisation();
3657 $params['di_id'] = $this->valF['dossier'];
3658 if ($inst_da->majDossierAutorisation($params) === false) {
3659 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3660 $this->correct = false;
3661 return false;
3662 }
3663
3664 /**
3665 * Historisation de la vie du DI.
3666 */
3667 //
3668 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3669 }
3670
3671 /**
3672 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3673 * sont remplies.
3674 * Les conditions vérifiées sont les suivantes :
3675 * - L'option de notification *option_notification* doit être définie
3676 * - Le petitionnaire principal doit accepter les notifications
3677 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3678 * - Le pétitionnaire principal doit avoir une adresse mail correcte
3679 * Pour chaque vérification effectué un message d'erreur est ajouté si la
3680 * condition n'est pas remplie.
3681 * Renvoie le message d'erreur en sortie.
3682 *
3683 * @param string identifiant du dossier sur lequel les notifications ont échouée
3684 * @return string
3685 */
3686 protected function get_info_notification_fail($dossier = null) {
3687 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3688 // utilise celui associé à l'instruction
3689 if ($dossier == null) {
3690 $dossier = $this->getVal('dossier');
3691 }
3692 // Tableau contenant la liste des messages d'erreur
3693 $errorMessage = array();
3694 // Récupère l'option de notification
3695 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3696 $option_notification = $this->f->get_param_option_notification($collectivite_di);
3697 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3698 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3699 }
3700 // Récupère les informations du demandeurs principal
3701 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3702 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3703 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3704 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3705 }
3706 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3707 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3708 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3709 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3710 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3711 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3712 $infoPetitionnaire['courriel'].
3713 '.';
3714 }
3715 } else {
3716 // Si le courriel du pétitionnaire principal
3717 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3718 }
3719
3720 return $errorMessage;
3721 }
3722
3723 /**
3724 * Méthode servant à vérifier si un dossier a été déposé sur
3725 * le portail citoyen ou pas.
3726 * La verification se fait via une requête sql dans laquelle
3727 * on va chercher un dossier ayant pour id l'identifiant de
3728 * dossier associé à l'instruction et pour lequel la demande
3729 * associée la plus ancienne est une demande de création de
3730 * dossier via portail
3731 *
3732 * @param string identifiant du dossier. Si non renseigné c'est le dossier
3733 * associé à l'instruction qui est utilisé
3734 * @return boolean|void true : dossier déposé via portail, false : dossier
3735 * non déposé via portail et null : erreur de base de données.
3736 */
3737 protected function dossier_depose_sur_portail($dossier = null) {
3738 if (empty($dossier)) {
3739 $dossier = $this->getVal('dossier');
3740 }
3741 $qres = $this->f->get_one_result_from_db_query(
3742 sprintf(
3743 'SELECT
3744 dossier
3745 FROM
3746 %1$sdossier
3747 -- Récuperation de la première demande associée au dossier
3748 LEFT JOIN (
3749 SELECT
3750 demande,
3751 dossier_instruction,
3752 source_depot
3753 FROM
3754 %1$sdemande
3755 WHERE
3756 dossier_instruction = \'%2$s\'
3757 ORDER BY
3758 demande ASC
3759 LIMIT 1
3760 ) AS demande
3761 ON dossier.dossier = demande.dossier_instruction
3762 WHERE
3763 dossier.dossier = \'%2$s\'
3764 AND demande.source_depot = \'portal\'',
3765 DB_PREFIXE,
3766 $this->f->db->escapeSimple($dossier)
3767 ),
3768 array(
3769 "origin" => __METHOD__,
3770 "force_return" => true,
3771 )
3772 );
3773 if ($qres["code"] !== "OK") {
3774 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3775 return;
3776 }
3777 // Si on a un résultat c'est que le dossier a été déposé via le portail
3778 return ! empty($qres["result"]);
3779 }
3780
3781 public function is_service_notifiable() {
3782 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3783
3784 // Si l'instruction a une édition non finalisé quel que soit
3785 // le type de notification, il n'est pas notifiable
3786 if ($this->has_an_edition() === true) {
3787 if ($this->is_unfinalizable_without_bypass() === false) {
3788 return false;
3789 }
3790 }
3791 // Vérifie si la notification des tiers est active pour l'évènement
3792 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3793 }
3794
3795 public function is_tiers_notifiable() {
3796 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3797
3798 // Si l'instruction a une édition non finalisé quel que soit
3799 // le type de notification, il n'est pas notifiable
3800 if ($this->has_an_edition() === true) {
3801 if ($this->is_unfinalizable_without_bypass() === false) {
3802 return false;
3803 }
3804 }
3805 // Vérifie si la notification des tiers est active pour l'évènement
3806 return ! empty($evenement->getVal('notification_tiers'));
3807 }
3808
3809 /**
3810 * Méthode permettant de savoir si une instruction peut
3811 * être notifiée manuellement selon les différents types
3812 * de notification.
3813 *
3814 * Si l'instruction a une édition non finalisée alors elle n'est pas
3815 * manuellement notifiable.
3816 * Si l'instruction est associé à un événement de notification pour
3817 * lequel un retour signature est recquis, elle n'est notifiable que
3818 * si la date de retour de signature est remplie.
3819 * Par défaut si le type de notification n'est pas connu alors l'instruction
3820 * n'est pas notifiable.
3821 * Pour tous les autres cas l'instruction est manuellement notifiable.
3822 *
3823 * @return boolean true : notifiable | false : non notifiable
3824 */
3825 public function is_notifiable_by_task_manual() {
3826 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3827
3828 // Si l'instruction a une édition non finalisé quel que soit
3829 // le type de notification, il n'est pas notifiable
3830 if ($this->has_an_edition() === true) {
3831 if ($this->is_unfinalizable_without_bypass() === false) {
3832 return false;
3833 }
3834 }
3835
3836 // Gestion des différents cas selon la valeur du champs notification
3837 if ($ev->getVal('notification') == 'notification_manuelle' ||
3838 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3839 $ev->getVal('notification') == 'notification_automatique'
3840 ) {
3841 return true;
3842 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3843 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3844 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3845 $this->getVal('date_retour_signature') != null &&
3846 $this->getVal('date_retour_signature') != ''
3847 ) {
3848 return true ;
3849 }
3850 return false;
3851 }
3852
3853 /**
3854 * Crée une instance de notification et une tache notification_instruction de catégorie portal
3855 * pour le demandeur principal.
3856 *
3857 * @return boolean true si le traitement à réussi
3858 */
3859 protected function notifier_demandeur_principal_via_portal() {
3860 $this->begin_treatment(__METHOD__);
3861 $message = '';
3862 // Récupération des informations concernant le demandeur
3863 $dossier = $this->getVal('dossier');
3864 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3865 $demandeur = $this->get_demandeurs_notifiable(
3866 $dossier,
3867 true
3868 );
3869 if ($demandeur !== array()) {
3870 $destinataire = array_values($demandeur);
3871 // Ajout de la notif et récupération de son id
3872 $idNotification = $this->ajouter_notification(
3873 $this->getVal($this->clePrimaire),
3874 $this->f->get_connected_user_login_name(),
3875 $destinataire[0],
3876 $collectivite_di,
3877 array(),
3878 true
3879 );
3880 if ($idNotification === false) {
3881 return $this->end_treatment(__METHOD__, false);
3882 }
3883 // Création de la tâche en lui donnant l'id de la notification
3884 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3885 if ($notification_by_task === false) {
3886 $this->addToMessage(
3887 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3888 );
3889 return $this->end_treatment(__METHOD__, false);
3890 }
3891 $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.")));
3892 return $this->end_treatment(__METHOD__, true);
3893 }
3894 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3895 return $this->end_treatment(__METHOD__, false);
3896 }
3897
3898 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3899 // Si le type n'est pas correctement spécifié, alors il est calculé
3900 if ($type !== 'notification_recepisse'
3901 && $type !== 'notification_instruction'
3902 && $type !== 'notification_decision'
3903 && $type !== 'notification_service_consulte'
3904 && $type !== 'notification_tiers_consulte'
3905 && $type !== 'notification_depot_demat'
3906 && $type !== 'notification_commune'
3907 && $type !== 'notification_signataire') {
3908 //
3909 $type = 'notification_instruction';
3910 // Vérifie si l'instruction est un récépissé
3911 if ($this->is_instruction_recepisse()) {
3912 $type = 'notification_recepisse';
3913
3914 }
3915 // Vérifie si l'instruction est une décision
3916 if ($type !== 'notification_recepisse') {
3917 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3918 if ($avis_decision !== null && $avis_decision !== '') {
3919 $type = 'notification_decision';
3920 }
3921 }
3922 }
3923 // Préparation des valeurs de la tâche
3924 $task_val = array(
3925 'type' => $type,
3926 'object_id' => $object_id,
3927 'dossier' => $dossier,
3928 'category' => $category,
3929 );
3930 // Préparation de la tache de notification
3931 $inst_task = $this->f->get_inst__om_dbform(array(
3932 "obj" => "task",
3933 "idx" => 0,
3934 ));
3935
3936 $add_task = $inst_task->add_task(array('val' => $task_val));
3937 if ($add_task === false) {
3938 $this->addToLog(
3939 sprintf(
3940 '%s(): %s %s : %s',
3941 __METHOD__,
3942 __('Echec de l\'ajout de la tâche de notification.'),
3943 __('Paramétrage de la tâche'),
3944 var_export($task_val, true)
3945 ),
3946 DEBUG_MODE
3947 );
3948 return false;
3949 }
3950
3951 return true;
3952 }
3953
3954 /**
3955 * Cette méthode permet de savoir si l'instruction est une instruction
3956 * de recepisse (instruction lié à l'ajout du dossier).
3957 *
3958 * Pour cela, on récupère la liste des actions qui ont menées à la création
3959 * de l'instruction. Si une de ces actions est lié à un objet "demande" on
3960 * en deduis que c'est l'ajout d'une demande qui a déclenché la création de
3961 * l'instruction et donc qu'il s'agit d'un recepisse.
3962 *
3963 * @return boolean
3964 */
3965 protected function is_instruction_recepisse() {
3966 // Récupère la liste des actions qui ont mené à la création de
3967 // l'instruction
3968 $trace = debug_backtrace();
3969 // Parcours la liste des actions et si une de ces actions est lié
3970 // à la classe demande on cosidère que l'instruction est un recepisse
3971 foreach ($trace as $key => $value) {
3972 if (isset($trace[$key]['class']) === true
3973 && empty($trace[$key]['class']) === false) {
3974 if (strtolower($trace[$key]['class']) === 'demande') {
3975 return true;
3976 }
3977 }
3978 }
3979 return false;
3980 }
3981
3982 /**
3983 * A partir des informations passée en argument ajoute un nouvel élément
3984 * dans la table instruction_notification.
3985 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3986 * paramètre si le paramétrage attendus est ok.
3987 * Ajoute également un nouvel élement dans instruction_notification_document
3988 * si l'instruction possède une lettretype.
3989 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3990 * élement dans la table instruction_notification_document qui correspondra
3991 * à l'annexe de la notification.
3992 *
3993 * @param integer identifiant de l'instruction notifiée
3994 * @param string information concernant l'emetteur
3995 * @param array tableau contenant 2 entrées
3996 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3997 * - courriel : adresse mail de la personne à notifier
3998 * @param integer identifiant de la collectivité permettant de récupèrer les
3999 * paramètres à valider
4000 * @param boolean indique si la notification est automatique ou manuelle
4001 * @param integer identifiant d'une instruction dont l'édition sera annexé
4002 * à la notification
4003 *
4004 * @return integer|boolean identifiant de la notification créée si le traitement
4005 * a réussie, false sinon.
4006 */
4007 protected function ajouter_notification(
4008 $idInstruction,
4009 $emetteur,
4010 $destinataire,
4011 $collectiviteId,
4012 $annexes = array(),
4013 $demandeAuto = false,
4014 $statut = 'en cours d\'envoi',
4015 $commentaire = 'Notification en cours de traitement'
4016 ) {
4017 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
4018 // de créer la notification
4019 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
4020 $msgErreur = __("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée.");
4021 $this->addToMessage($msgErreur);
4022 $this->addToLog(
4023 sprintf('%s() : %s', __METHOD__, $msgErreur),
4024 DEBUG_MODE
4025 );
4026 return false;
4027 }
4028 // Préparation de la notification
4029 $inst_notif = $this->f->get_inst__om_dbform(array(
4030 "obj" => "instruction_notification",
4031 "idx" => "]",
4032 ));
4033 $notif_val = array(
4034 'instruction_notification' => null,
4035 'instruction' => $idInstruction,
4036 'automatique' => $demandeAuto,
4037 'emetteur' => $emetteur,
4038 'date_envoi' => null,
4039 'destinataire' => $destinataire['destinataire'],
4040 'courriel' => $destinataire['courriel'],
4041 'date_premier_acces' => null,
4042 'statut' => $statut,
4043 'commentaire' => $commentaire
4044 );
4045
4046 // Création de la notification
4047 $add_notif = $inst_notif->ajouter($notif_val);
4048 if ($add_notif === false) {
4049 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
4050 $this->addToLog(
4051 sprintf(
4052 '%s() : %s %s : %s',
4053 __METHOD__,
4054 __("Echec de l'ajout de la notification en base de données."),
4055 __('Paramétrage de la notification'),
4056 var_export($notif_val, true)
4057 ),
4058 DEBUG_MODE
4059 );
4060 return false;
4061 }
4062
4063 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
4064 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
4065 $add_notif_doc = $this->ajouter_notification_document(
4066 $inst_notif->getVal($inst_notif->clePrimaire),
4067 $this->getVal($this->clePrimaire),
4068 'instruction'
4069 );
4070 if ($add_notif_doc === false) {
4071 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
4072 return false;
4073 }
4074 }
4075 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
4076 if (! empty($annexes) && is_array($annexes)) {
4077 $add_notif_annexe = $this->ajouter_notification_document_multiple(
4078 $inst_notif->getVal($inst_notif->clePrimaire),
4079 $annexes
4080 );
4081 if ($add_notif_annexe === false) {
4082 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
4083 return false;
4084 }
4085 }
4086
4087 // Renvoie l'id de la nouvelle instance de instruction_notification
4088 return $inst_notif->getVal($inst_notif->clePrimaire);
4089 }
4090
4091 /**
4092 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
4093 * instance dans la table instruction_notification_document lié a la
4094 * notification dont l'id est passé en paramètre.
4095 *
4096 * @param array tableau contenant les informations nécessaires pour créer les annexes
4097 *
4098 * @return integer|boolean identifiant de la notification créée si le traitement
4099 * a réussie, false sinon.
4100 */
4101 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
4102 foreach ($listeDocument as $paramDoc) {
4103 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
4104 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
4105 return false;
4106 }
4107 }
4108 return true;
4109 }
4110
4111 /**
4112 * Ajoute un élément dans la table instruction_notification_document en utilisant
4113 * les éléments fourni en paramètre
4114 *
4115 * @param integer $idNotification : id de la notification à laquelle on associe le document
4116 * @param integer $idDocument : id de l'objet auquel est rattaché le document
4117 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
4118 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
4119 *
4120 * @return boolean indique si le traitement a réussi
4121 */
4122 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
4123 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
4124 "obj" => "instruction_notification_document",
4125 "idx" => "]",
4126 ));
4127 // l'attribut instruction doit obligatoirement être renseigné
4128 // pour éviter toutes confusion avec d'autres instruction l'id
4129 // 0 est donné au document n'appartenant pas aux instructions
4130 $notif_doc_val = array(
4131 'instruction_notification_document' => null,
4132 'instruction_notification' => $idNotification,
4133 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
4134 'document_type' => $tableDocument,
4135 'document_id' => $idDocument,
4136 'cle' => $this->getCleAccesDocument(),
4137 'annexe' => $isAnnexe
4138 );
4139
4140 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
4141 if ($add_notif_doc === false) {
4142 $this->addToLog(
4143 sprintf(
4144 '%s() : %s %s : %s',
4145 __METHOD__,
4146 __('Echec de l\'ajout du paramétrage du document notifié en base de données.'),
4147 __('Paramétrage du document'),
4148 var_export($notif_doc_val, true)
4149 ),
4150 DEBUG_MODE
4151 );
4152 return false;
4153 }
4154 return true;
4155 }
4156
4157 /**
4158 * Vérifie si le paramétrage de la notification des demandeurs est correct.
4159 *
4160 * @param integer identifiant de la collectivité
4161 * @return boolean
4162 */
4163 protected function is_parametrage_notification_correct($collectiviteId) {
4164 $categorie = $this->f->get_param_option_notification($collectiviteId);
4165 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
4166 if ($categorie === 'mail' && $urlAccesNotif === null) {
4167 return false;
4168 }
4169 return true;
4170 }
4171
4172 /**
4173 * TRIGGER - triggermodifierapres.
4174 *
4175 * @return boolean
4176 */
4177 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4178 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4179 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
4180 $message = '';
4181
4182 // Définit si le dossier d'instruction doit être mis à jour
4183 $update_dossier = true;
4184 // Les actions de mise à jour des dates ne doivent pas appliquer
4185 // l'action de l'événement et donc ne pas mettre à jour le dossier
4186 if ($this->getParameter("maj") == 125
4187 || $this->getParameter("maj") == 170
4188 || $this->getParameter("maj") == 175) {
4189 $update_dossier = false;
4190 }
4191
4192 // Traitement en cas de mise à jour du dossier
4193 if ($update_dossier === true) {
4194 /**
4195 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
4196 * si la date de l'evenement est modifiee
4197 */
4198 // Initialisation
4199 $valF = array();
4200 $valF_dt = array();
4201 // Initialisation du type d'événement
4202 $type_evmt = "";
4203 // Récupération de l'action correspondante à l'événement
4204 $evenement = $this->f->get_inst__om_dbform(array(
4205 "obj" => "evenement",
4206 "idx" => $this->valF['evenement']
4207 ));
4208
4209 // Récupération des paramètres de l'action
4210 // TODO : remplacer cette requête par l'instanciation de l'action
4211 $qres = $this->f->get_all_results_from_db_query(
4212 sprintf(
4213 'SELECT
4214 *
4215 FROM
4216 %1$saction
4217 WHERE
4218 action = \'%2$s\'',
4219 DB_PREFIXE,
4220 $this->f->db->escapeSimple($evenement->getVal('action'))
4221 ),
4222 array(
4223 "origin" => __METHOD__
4224 )
4225 );
4226 foreach ($qres['result'] as $row) {
4227 // application des regles sur le courrier + delai
4228 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
4229 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
4230 }
4231 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
4232 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
4233 }
4234 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
4235 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
4236 }
4237 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
4238 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
4239 }
4240 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
4241 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
4242 }
4243 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
4244 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
4245 }
4246 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
4247 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
4248 }
4249 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
4250 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
4251 }
4252 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
4253 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
4254 }
4255 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
4256 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
4257 }
4258 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
4259 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
4260 }
4261 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
4262 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
4263 }
4264 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
4265 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
4266 }
4267 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
4268 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
4269 }
4270 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
4271 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
4272 }
4273 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
4274 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
4275 }
4276 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
4277 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
4278 }
4279 if ($row['regle_donnees_techniques1'] !== '') {
4280 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
4281 }
4282 if ($row['regle_donnees_techniques2'] !== '') {
4283 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
4284 }
4285 if ($row['regle_donnees_techniques3'] !== '') {
4286 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
4287 }
4288 if ($row['regle_donnees_techniques4'] !== '') {
4289 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
4290 }
4291 if ($row['regle_donnees_techniques5'] !== '') {
4292 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
4293 }
4294 if ($row['regle_dossier_instruction_type'] !== '') {
4295 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
4296 }
4297 }
4298 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
4299 if (count($valF_dt) > 0) {
4300 $dt_id = $this->getDonneesTechniques();
4301 // On met à jour le dossier
4302 $cle = " donnees_techniques='".$dt_id."'";
4303 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
4304 $this->addToLog(
4305 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
4306 VERBOSE_MODE
4307 );
4308 $this->f->isDatabaseError($res1);
4309 // Affichage d'informations à l'utilisateur
4310 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4311 }
4312 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
4313 if (count($valF) > 0) {
4314 $inst_dossier = $this->f->get_inst__om_dbform(array(
4315 "obj" => "dossier",
4316 "idx" => $this->valF['dossier'],
4317 ));
4318 $valF['instruction'] = $id;
4319 $valF['crud'] = 'update';
4320 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
4321 if ($update_by_instruction === false) {
4322 $this->cleanMessage();
4323 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4324 return false;
4325 }
4326 // Affichage d'informations à l'utilisateur
4327 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4328 }
4329 }
4330
4331 // Par défaut les instructions à ajouter suite à la saisie d'une date
4332 // de retour signature ou de notification, utilisent l'action 0
4333 // Si la création d'événement d'instruction suivant est déclenchée par
4334 // une notification suite au traitement d'une tâche (démat') alors l'ajout
4335 // de la nouvelle instruction se fait avec l'action 176
4336 // Cela permet de ne pas contrôler la restriction lors de l'ajout de la
4337 // nouvelle instruction, depuis la méthode verifier()
4338 $code_action_add = 0;
4339 if ($this->getParameter("maj") == 175) {
4340 $code_action_add = 176;
4341 }
4342 $restriction = $this->get_restriction($val['evenement']);
4343 $this->restriction_valid = $this->restrictionIsValid($restriction);
4344
4345 if($restriction == "" || $this->restriction_valid ){
4346 // Récupération de tous les paramètres de l'événement sélectionné
4347 // TODO : remplacer cette requête par l'instanciation de l'evenement
4348 $qres = $this->f->get_all_results_from_db_query(
4349 sprintf(
4350 'SELECT
4351 *
4352 FROM
4353 %1$sevenement
4354 WHERE
4355 evenement = %2$d',
4356 DB_PREFIXE,
4357 intval($this->valF['evenement'])
4358 ),
4359 array(
4360 "origin" => __METHOD__
4361 )
4362 );
4363 $current_id = $this->getVal($this->clePrimaire);
4364 foreach ($qres['result'] as $row) {
4365 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
4366 if ($this->getVal('date_retour_signature') == "" AND
4367 $this->valF['date_retour_signature'] != "" AND
4368 $row['evenement_retour_signature'] != "") {
4369 $new_instruction = $this->f->get_inst__om_dbform(array(
4370 "obj" => "instruction",
4371 "idx" => "]",
4372 ));
4373 // Création d'un tableau avec la liste des champs de l'instruction
4374 foreach($new_instruction->champs as $champ) {
4375 $valNewInstr[$champ] = "";
4376 }
4377 // Définition des valeurs de la nouvelle instruction
4378 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
4379 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4380 $valNewInstr["dossier"] = $this->valF['dossier'];
4381 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
4382 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4383 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4384 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4385 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4386 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4387 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4388 $new_instruction->setParameter("maj", $code_action_add);
4389 $new_instruction->class_actions[$code_action_add]["identifier"] =
4390 sprintf(
4391 __("Ajout suite au retour signature de l'instruction %s"),
4392 $current_id
4393 );
4394 $retour = $new_instruction->ajouter($valNewInstr);
4395
4396 //Si une erreur s'est produite et qu'il s'agit d'un problème
4397 //de restriction
4398 if ($retour == false && !$new_instruction->restriction_valid){
4399 $error_message = $this->get_restriction_error_message($restriction);
4400 $this->f->displayMessage("error", $error_message);
4401 $this->addToLog(__METHOD__."(): evenement retour ".
4402 "instruction ".$this->valF[$this->clePrimaire]." : ".
4403 $new_instruction->msg);
4404 }
4405 //Si une erreur s'est produite après le test de la restriction
4406 elseif ($retour == false && $new_instruction->restriction_valid){
4407 $this->correct = false ;
4408 $this->msg .= $new_instruction->msg;
4409 return false;
4410 }
4411 }
4412 // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
4413 if ($this->getVal('date_retour_rar') == "" AND
4414 $this->valF['date_retour_rar'] != "") {
4415
4416 if($row['evenement_retour_ar'] != "") {
4417 $new_instruction = $this->f->get_inst__om_dbform(array(
4418 "obj" => "instruction",
4419 "idx" => "]",
4420 ));
4421 // Création d'un tableau avec la liste des champs de l'instruction
4422 foreach($new_instruction->champs as $champ) {
4423 $valNewInstr[$champ] = "";
4424 }
4425 // Définition des valeurs de la nouvelle instruction
4426 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4427 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4428 $valNewInstr["dossier"] = $this->valF['dossier'];
4429 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4430 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4431 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4432 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4433 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4434 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4435 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4436 $new_instruction->setParameter("maj", $code_action_add);
4437 $new_instruction->class_actions[$code_action_add]["identifier"] =
4438 sprintf(__("Ajout suite à la notification de l'instruction %s"), $current_id);
4439 $retour = $new_instruction->ajouter($valNewInstr);
4440
4441 //Si une erreur s'est produite et qu'il s'agit d'un problème
4442 //de restriction
4443 if ($retour == false && !$new_instruction->restriction_valid) {
4444 $error_message = $this->get_restriction_error_message($restriction);
4445 $this->f->displayMessage("error", $error_message);
4446 $this->addToLog(
4447 __METHOD__."(): evenement retour instruction ".
4448 $this->valF[$this->clePrimaire]." : ".
4449 $new_instruction->msg
4450 );
4451 }
4452 //Si une erreur s'est produite après le test de la restriction
4453 elseif ($retour == false && $new_instruction->restriction_valid){
4454 $this->correct = false ;
4455 $this->msg .= $new_instruction->msg;
4456 return false;
4457 }
4458 }
4459 }
4460 }
4461 }
4462
4463 // Traitement en cas de mise à jour du dossier
4464 if ($update_dossier === true) {
4465 /**
4466 * Mise à jour de la date de dernière modification du dossier
4467 * d'instruction
4468 */
4469 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4470 $inst_di->update_last_modification_date();
4471
4472 // Mise à jour des données du dossier d'autorisation
4473 $da = $this->f->get_inst__om_dbform(array(
4474 "obj" => "dossier_autorisation",
4475 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4476 ));
4477 $params = array(
4478 'di_id' => $this->getVal('dossier'),
4479 );
4480 if($da->majDossierAutorisation($params) === false) {
4481 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4482 $this->correct = false;
4483 return false;
4484 }
4485 }
4486
4487 // mise à jour des métadonnées issues des dates de suivi
4488 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4489 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4490 if ($dateRetourSignatureModified || $dateRetourRARModified) {
4491
4492 // Calculs des nouvelles métadonnées
4493 $metadata = $this->getMetadata("om_fichier_instruction");
4494
4495 // On vérifie si l'instruction à finaliser a un événement de type arrete
4496 // TODO : A voir pour remplacer par une instanciation de l'événement.
4497 // Voir également si l'événement ne dois pas être instancié en début de
4498 // méthode pour pouvoir être réutilisé.
4499 $qres = $this->f->get_one_result_from_db_query(
4500 sprintf(
4501 'SELECT
4502 type
4503 FROM
4504 %1$sevenement
4505 WHERE
4506 evenement = \'%2$d\'',
4507 DB_PREFIXE,
4508 intval($this->getVal("evenement"))
4509 ),
4510 array(
4511 "origin" => __METHOD__,
4512 "force_return" => true,
4513 )
4514 );
4515
4516 if ($qres["code"] !== "OK") {
4517 $this->correct = false;
4518 $this->addToMessage(__("Erreur de traitement de fichier."));
4519 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($qres['message'], true), DEBUG_MODE);
4520 return false;
4521 }
4522
4523 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4524 if ($qres['result'] == 'arrete'){
4525 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4526 }
4527
4528 // Filtre pour conserver uniquement les métadonnées liées aux dates
4529 $metadataToKeep = array(
4530 "statutAutorisation",
4531 "dateEvenementDocument",
4532 'date_cloture_metier',
4533 "NotificationArrete",
4534 "dateNotificationArrete",
4535 "controleLegalite",
4536 "dateSignature",
4537 "nomSignataire",
4538 "qualiteSignataire",
4539 "dateControleLegalite",
4540 );
4541 $metadata = array_filter(
4542 $metadata,
4543 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4544 ARRAY_FILTER_USE_KEY
4545 );
4546
4547 // Mise à jour des métadonnées du document en GED
4548 $docUid = $this->getVal("om_fichier_instruction");
4549 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4550 if ($operationOrUID == 'OP_FAILURE') {
4551 $this->correct = false;
4552 $this->addToMessage(__("Erreur de traitement de fichier."));
4553 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4554 return false;
4555 }
4556
4557 // mise à jour de l'UID du document en BDD
4558 else {
4559 $valF = array('om_fichier_instruction' => $operationOrUID);
4560 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4561 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4562 if ($this->f->isDatabaseError($res, true) === true) {
4563 $this->correct = false;
4564 $this->addToMessage(__("Erreur de traitement de fichier."));
4565 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4566 return false;
4567 }
4568 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4569 }
4570 }
4571
4572 // Déclenchement des notifications automatique après finalisation et
4573 // retour de signature
4574 if ($dateRetourSignatureModified === true
4575 && $this->valF['date_retour_signature'] !== ''
4576 && $this->valF['date_retour_signature'] !== null) {
4577
4578 // Message à afficher dans les logs pour indiquer quelle notification a échouée
4579 $msgLog = sprintf(
4580 '%s %s : %d',
4581 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) après retour signature.'),
4582 __('Instruction notifiée'),
4583 $id
4584 );
4585
4586 // Récupération de l'instance de l'événement pour accéder au paramètrage
4587 // des notifications
4588 $ev = $this->get_inst_evenement($this->valF['evenement']);
4589 // Si la notification automatique des tiers consulté est active
4590 // déclenche le traitement de notification.
4591 // Ce traitement va envoyer des courriels de notification à tous les tiers concernés
4592 $typeNotifTiers = $ev->getVal('notification_tiers');
4593 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4594 if ($typeNotifTiers === 'notification_automatique') {
4595 if ($this->traitement_notification_automatique_tiers_consulte($ev, $inst_di) === false) {
4596 $this->addToMessage(__('Le traitement de la notification automatique de tiers à échoué.'));
4597 $this->correct = false;
4598 }
4599 }
4600
4601 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4602 // Récupération de la liste des demandeurs à notifier et de la catégorie
4603 $categorie = $this->f->get_param_option_notification($collectivite_di);
4604 $isPortal = $categorie === PORTAL;
4605 $demandeursANotifie = $this->get_demandeurs_notifiable(
4606 $this->valF['dossier'],
4607 $isPortal
4608 );
4609
4610 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4611 $demandeurPrincipalNotifie = false;
4612 foreach ($demandeursANotifie as $demandeur) {
4613 // Identifie si le demandeur principal a été notifié ou pas
4614 // et récupère ses informations
4615 if ($demandeur['petitionnaire_principal'] == 't') {
4616 $demandeurPrincipalNotifie = true;
4617 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4618 // son paramétrage, on effectue pas le traitement et on passe à l'itération
4619 // suivante. On le considère également comme non notifié pour gérer l'envoie
4620 // des messages d'erreurs
4621 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4622 // d'impact sur la notification
4623 $erreursParam = $this->get_info_notification_fail();
4624 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4625 $demandeurPrincipalNotifie = false;
4626 continue;
4627 }
4628 }
4629 // Ajout de la notif et récupération de son id
4630 $idNotif = $this->ajouter_notification(
4631 $this->valF[$this->clePrimaire],
4632 $this->f->get_connected_user_login_name(),
4633 $demandeur,
4634 $collectivite_di,
4635 array(),
4636 true
4637 );
4638 if ($idNotif === false) {
4639 $this->addToLog(
4640 sprintf('%s() : %s',__METHOD__, $msgLog),
4641 DEBUG_MODE
4642 );
4643 return false;
4644 }
4645 // Création de la tache en lui donnant l'id de la notification
4646 $notification_by_task = $this->notification_by_task(
4647 $idNotif,
4648 $this->valF['dossier'],
4649 $categorie
4650 );
4651 if ($notification_by_task === false) {
4652 $this->addToLog(
4653 sprintf('%s() : %s',__METHOD__, $msgLog),
4654 DEBUG_MODE
4655 );
4656 $this->addToMessage(
4657 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4658 );
4659 return false;
4660 }
4661 }
4662 // Pour la notification par mail ou la notification via portal si le dossier a
4663 // été déposés via portal, si le demandeur principal n'est pas notifiable,
4664 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
4665 // laquelle le demandeur principal n'a pas pu être notifié
4666 $depotPortal = $this->dossier_depose_sur_portail();
4667 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
4668 // Précise dans les logs que le pétitionnaire principal n'a pas été notifié
4669 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
4670 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4671 $erreursParam = $this->get_info_notification_fail();
4672 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4673 // Ajout de la notif et récupération de son id
4674 $idNotif = $this->ajouter_notification(
4675 $this->valF[$this->clePrimaire],
4676 $this->f->get_connected_user_login_name(),
4677 $demandeurPrincipal,
4678 $collectivite_di,
4679 array(),
4680 true,
4681 'Echec',
4682 implode(' ', $erreursParam)
4683 );
4684 if ($idNotif === false) {
4685 $this->addToLog(
4686 sprintf('%s() : %s', __METHOD__, $msgLog),
4687 DEBUG_MODE
4688 );
4689 $this->addToMessage(
4690 __('Erreur : la création de la notification a échouée.').
4691 __("Veuillez contacter votre administrateur.")
4692 );
4693 return false;
4694 }
4695 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4696 // de l'échec de la notification
4697 $dossier_message = $this->get_inst_dossier_message(0);
4698 $dossier_message_val = array(
4699 'dossier' => $this->getVal('dossier'),
4700 'type' => _('erreur expedition'),
4701 'emetteur' => $this->f->get_connected_user_login_name(),
4702 'login' => $_SESSION['login'],
4703 'date_emission' => date('Y-m-d H:i:s'),
4704 'contenu' => _('Échec lors de la notification de l\'instruction ').
4705 $ev->getVal('libelle').
4706 '.<br>'.
4707 implode("\n", $erreursParam).
4708 '<br>'.
4709 _('Veuillez corriger ces informations avant de renvoyer la notification.')
4710 );
4711 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4712 // Si une erreur se produit pendant l'ajout
4713 if ($add !== true) {
4714 $this->addToLog(
4715 sprintf(
4716 '%s() : %s',
4717 __METHOD__,
4718 __("Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.")
4719 ),
4720 DEBUG_MODE
4721 );
4722 return false;
4723 }
4724 }
4725 $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.")));
4726 }
4727 }
4728
4729 return $this->add_log_to_dossier($id, $val);
4730 }
4731
4732 /**
4733 * TRIGGER - triggersupprimer.
4734 *
4735 * @return boolean
4736 */
4737 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4738 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4739 /**
4740 * L'objectif ici est de repositionner les valeurs récupérées en
4741 * archive dans le dossier d'instruction avant de supprimer l'événement
4742 * d'instruction si les valeurs du dossier sont différentes
4743 */
4744 $valF = array();
4745 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4746 foreach ($inst_di->champs as $key => $champ) {
4747 // Si le champ du DI à une archive dans l'instruction
4748 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4749 // Si la valeur entre le champ du DI et son archive dans instruction
4750 // est différente
4751 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4752 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4753 // Gestion du cas particulier 'accord_tacite' pour renvoyer la valeur ' ' (3 espaces vides) au lieu de null
4754 // Car les valeurs possibles du champ accord_tacite sont : 'Oui', 'Non' ou ' '
4755 if ($champ === "accord_tacite" && $valF[$champ] === null) {
4756 $valF[$champ] = ' ';
4757 }
4758 }
4759 }
4760 }
4761 // Spécificité du champ avis_decision dont le champ archive est nommé
4762 // différemment
4763 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4764 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4765 }
4766 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4767 // par l'archive
4768 unset($valF['date_affichage']);
4769
4770 /**
4771 * Mise à jour de la version de clôture *version_clos* du dossier si et
4772 * seulement si l'instruction met à jour l'état du dossier.
4773 */
4774 if (isset($valF['etat']) === true
4775 && $valF['etat'] !== null
4776 && $valF['etat'] !== '') {
4777 // Récupère l'état actuel du dossier d'instruction
4778 $inst_current_etat = $this->f->get_inst__om_dbform(array(
4779 "obj" => "etat",
4780 "idx" => $inst_di->get_id_etat(),
4781 ));
4782 // Instanciation de l'état archivé appliqué sur le dossier
4783 $inst_etat = $this->f->get_inst__om_dbform(array(
4784 "obj" => "etat",
4785 "idx" => $valF['etat'],
4786 ));
4787 //
4788 $update_version_clos = null;
4789 // En cas de clôture du dossier par l'état archivé
4790 if ($inst_etat->getVal('statut') === 'cloture') {
4791 $update_version_clos = $inst_di->update_version_clos('up');
4792 }
4793 // En cas de réouverture du dossier par l'état archivé
4794 if ($inst_current_etat->getVal('statut') === 'cloture'
4795 && $inst_etat->getVal('statut') !== 'cloture') {
4796 //
4797 $update_version_clos = $inst_di->update_version_clos('down');
4798 //
4799 $this->set_att_di_reopened(true);
4800 }
4801 //
4802 if ($update_version_clos === false) {
4803 $this->f->addToLog(sprintf(
4804 "%s() : ERREUR - %s %s",
4805 __METHOD__,
4806 sprintf(
4807 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4808 $inst_di->getVal($inst_di->clePrimaire)
4809 ),
4810 sprintf(
4811 __("L'instruction tente d'appliquer l'état %s."),
4812 $inst_etat->getVal($inst_etat->clePrimaire)
4813 )
4814 ));
4815 $this->addToMessage(sprintf(
4816 "%s %s",
4817 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4818 __("Veuillez contacter votre administrateur.")
4819 ));
4820 return false;
4821 }
4822 }
4823 // On supprime toutes les notications liées à l'instruction
4824 $notifASupprimer = $this->get_instruction_notification(
4825 $this->getVal($this->clePrimaire),
4826 array(
4827 'notification_recepisse',
4828 'notification_instruction',
4829 'notification_decision',
4830 'notification_service_consulte',
4831 'notification_tiers_consulte',
4832 'notification_depot_demat',
4833 'notification_commune',
4834 'notification_signataire'
4835 ),
4836 true
4837 );
4838
4839 foreach ($notifASupprimer as $idNotif) {
4840 $inst_notif = $this->f->get_inst__om_dbform(array(
4841 "obj" => "instruction_notification",
4842 "idx" => $idNotif,
4843 ));
4844 $val_notif = array();
4845 foreach ($inst_notif->champs as $champ) {
4846 $val_notif[$champ] = $inst_notif->getVal($champ);
4847 }
4848 // La suppression des notifications entrainera la suppression des tâches qui y sont
4849 // liées
4850 $supprNotif = $inst_notif->supprimer($val_notif);
4851 if ($supprNotif == false) {
4852 $this->addToMessage(sprintf(
4853 "%s %s",
4854 __("Erreur lors de la suppression des notifications de l'instruction."),
4855 __("Veuillez contacter votre administrateur.")
4856 ));
4857 return false;
4858 }
4859 }
4860
4861 // On met à jour le dossier
4862 $valF['instruction'] = $id;
4863 $valF['crud'] = 'delete';
4864 $update_by_instruction = $inst_di->update_by_instruction($valF);
4865 if ($update_by_instruction === false) {
4866 $this->cleanMessage();
4867 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4868 return false;
4869 }
4870
4871 // Affichage d'informations à l'utilisateur
4872 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4873
4874 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4875 }
4876
4877 /**
4878 * TRIGGER - triggersupprimerapres.
4879 *
4880 * @return boolean
4881 */
4882 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4883 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4884 /**
4885 * Mise à jour de la date de dernière modification du dossier
4886 * d'instruction
4887 */
4888 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4889 $inst_di->update_last_modification_date();
4890
4891 /**
4892 * Mise à jour des données du dossier d'autorisation
4893 */
4894 $da = $this->f->get_inst__om_dbform(array(
4895 "obj" => "dossier_autorisation",
4896 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4897 ));
4898 $params = array(
4899 'di_id' => $this->getVal('dossier'),
4900 'di_reopened' => $this->get_att_di_reopened(),
4901 );
4902 if($da->majDossierAutorisation($params) === false) {
4903 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4904 $this->correct = false;
4905 return false;
4906 }
4907
4908 /**
4909 * Gestion des tâches pour la dématérialisation
4910 */
4911 $inst_task_empty = $this->f->get_inst__om_dbform(array(
4912 "obj" => "task",
4913 "idx" => 0,
4914 ));
4915 foreach ($inst_di->task_types as $task_type) {
4916 $task_exists = $inst_task_empty->task_exists($task_type, $id);
4917 if ($task_exists !== false) {
4918 $inst_task = $this->f->get_inst__om_dbform(array(
4919 "obj" => "task",
4920 "idx" => $task_exists,
4921 ));
4922 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4923 $task_val = array(
4924 'state' => $inst_task::STATUS_CANCELED,
4925 );
4926 $update_task = $inst_task->update_task(array('val' => $task_val));
4927 if ($update_task === false) {
4928 $this->addToMessage(sprintf('%s %s',
4929 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4930 __("Veuillez contacter votre administrateur.")
4931 ));
4932 $this->correct = false;
4933 return false;
4934 }
4935 }
4936 }
4937 }
4938
4939 //
4940 $val['evenement'] = $this->getVal('evenement');
4941 return $this->add_log_to_dossier($id, $val);
4942 }
4943
4944 /**
4945 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4946 * "di_reopened".
4947 *
4948 * @param boolean $val
4949 */
4950 function set_att_di_reopened($val) {
4951 $this->di_reopened = $val;
4952 }
4953
4954 /**
4955 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4956 *
4957 * @return boolean
4958 */
4959 function get_att_di_reopened() {
4960 return $this->di_reopened;
4961 }
4962
4963 /**
4964 * Permet de composer un message d'erreur sur restriction non valide en
4965 * fonction du contexte.
4966 *
4967 * @param string $restriction formule de la restriction
4968 *
4969 * @return string message d'erreur
4970 */
4971 function get_restriction_error_message($restriction) {
4972 // Affichage du message si la restriction s'applique
4973 // Contexte du suivi des dates (message simple)
4974 $message_restrict = _("Probleme de dates :");
4975 // Split restriction
4976 $champs_restrict = preg_split(
4977 '/(\W+)/',
4978 $restriction,
4979 null,
4980 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4981 );
4982 $formated_restrict = "";
4983 // Ajout des chaînes à traduire
4984 foreach ($champs_restrict as $value) {
4985 $formated_restrict .= _($value)." ";
4986 }
4987 $formated_restrict = substr($formated_restrict, 0, -1);
4988 // Message d'erreur dans le contexte du suivi des dates
4989 if($this->getParameter("maj") == 170) {
4990 $message_restrict .= " "._("contactez l'instructeur du dossier");
4991 $message_restrict .= "<br/>(".$formated_restrict.")";
4992 } else {
4993 // Affichage du message si la restriction s'applique
4994 // Contexte instruction
4995 $message_restrict .= "<br/>".$formated_restrict;
4996 }
4997
4998 return $message_restrict;
4999 }
5000
5001 /**
5002 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
5003 * les vérifications suivantes :
5004 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
5005 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5006 * le message d'erreur associé à la restriction
5007 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5008 * et / ou la modification et affiche un message d'erreur
5009 * -
5010 * -
5011 * -
5012 * -
5013 * -
5014 * -
5015 *
5016 * @param array val : tableau contenant les valeurs issues du formulaire.
5017 * @param - dnu1 : Paramètre déprécié et non utilisé.
5018 * @param - dnu2 : Paramètre déprécié et non utilisé.
5019 *
5020 * @return void
5021 */
5022 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5023 parent::verifier($val);
5024 //
5025 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5026 $restriction = $this->get_restriction($val['evenement']);
5027
5028 //Test qu'une restriction est présente
5029 if ($restriction != "" ){
5030
5031 // Vérifie le contexte de la modification et test si la restriction est valide.
5032 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5033 // Il n'est donc pas nécessaire de vérifier les restrictions.
5034 $this->restriction_valid = $this->restrictionIsValid($restriction);
5035 if ($this->getParameter("maj") != 176
5036 && !$this->restriction_valid) {
5037
5038 // Affichage du message si la restriction s'applique
5039 $this->addToMessage(
5040 $this->get_restriction_error_message($restriction)
5041 );
5042 $this->correct=false;
5043 return false;
5044 }
5045
5046 // Liste des opérateurs possible
5047 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5048 // Supprime tous les espaces de la chaîne de caractère
5049 $restriction = str_replace(' ', '', $restriction);
5050
5051 // Met des espace avant et après les opérateurs puis transforme la
5052 // chaine en un tableau
5053 $tabRestriction = str_replace($operateurs, " ", $restriction);
5054 // Tableau des champ
5055 $tabRestriction = explode(" ", $tabRestriction);
5056 // Supprime les numériques du tableau
5057 foreach ($tabRestriction as $key => $value) {
5058 if (is_numeric($value)) {
5059 unset($tabRestriction[$key]);
5060 }
5061 }
5062
5063 // Vérifie les champs utilisés pour la restriction
5064 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5065 if ($check_field_exist !== true) {
5066
5067 // Liste des champs en erreur
5068 $string_error_fields = implode(", ", $check_field_exist);
5069
5070 // Message d'erreur
5071 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5072 if (count($check_field_exist) > 1) {
5073 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5074 }
5075
5076 // Affiche l'erreur
5077 $this->correct=false;
5078 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5079 $this->addToMessage(_("Veuillez contacter votre administrateur."));
5080 }
5081 }
5082
5083 }
5084 if(!$this->updateDate("date_envoi_signature")) {
5085 return false;
5086 }
5087 if(!$this->updateDate("date_retour_signature")) {
5088 return false;
5089 }
5090 if(!$this->updateDate("date_envoi_rar")) {
5091 return false;
5092 }
5093 if(!$this->updateDate("date_retour_rar")) {
5094 return false;
5095 }
5096 if(!$this->updateDate("date_envoi_controle_legalite")) {
5097 return false;
5098 }
5099 if(!$this->updateDate("date_retour_controle_legalite")) {
5100 return false;
5101 }
5102
5103 }
5104
5105 /**
5106 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5107 * principal du dossier auquel appartiens l'instruction.
5108 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5109 *
5110 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5111 * et affiche un message dans les logs.
5112 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5113 *
5114 * @param string identifiant du dossier
5115 * @return array|boolean
5116 */
5117 protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5118 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5119 // l'objet courant
5120 if (empty($dossier)) {
5121 $dossier = $this->getVal('dossier');
5122 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5123 // false et on affiche un message d'erreur dans les logs
5124 if (empty($dossier)) {
5125 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5126 return false;
5127 }
5128 }
5129
5130 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5131 // principal
5132 $qres = $this->f->get_all_results_from_db_query(
5133 sprintf(
5134 'SELECT
5135 -- Récupère toutes les informations du demandeur principal
5136 demandeur.*,
5137 CASE
5138 WHEN demandeur.qualite=\'particulier\'
5139 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5140 ELSE
5141 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5142 END AS destinataire
5143 FROM
5144 %1$sdossier
5145 LEFT JOIN %1$slien_dossier_demandeur
5146 ON lien_dossier_demandeur.dossier = dossier.dossier
5147 LEFT JOIN %1$sdemandeur
5148 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5149 WHERE
5150 dossier.dossier = \'%2$s\'
5151 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5152 DB_PREFIXE,
5153 $this->f->db->escapeSimple($dossier)
5154 ),
5155 array(
5156 "origin" => __METHOD__,
5157 )
5158 );
5159 if (is_array($qres["result"]) === true
5160 && array_key_exists(0, $qres["result"]) === true) {
5161 //
5162 return $qres["result"][0];
5163 }
5164 return null;
5165 }
5166
5167
5168
5169 /**
5170 * Finalisation des documents.
5171 * @param string $champ champ du fichier à finaliser
5172 * @param booleen $status permet de définir si on finalise ou définalise
5173 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5174 */
5175 function manage_finalizing($mode = null, $val = array()) {
5176 //
5177 $this->begin_treatment(__METHOD__);
5178
5179 //
5180 $id_inst = $this->getVal($this->clePrimaire);
5181
5182 //
5183 $admin_msg_error = _("Veuillez contacter votre administrateur.");
5184 $file_msg_error = _("Erreur de traitement de fichier.")
5185 ." ".$admin_msg_error;
5186 $bdd_msg_error = _("Erreur de base de données.")
5187 ." ".$admin_msg_error;
5188 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5189
5190 // Si on finalise le document
5191 if ($mode == "finalize"){
5192 //
5193 $etat = _('finalisation');
5194
5195 // Récupère la collectivite du dossier d'instruction
5196 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5197
5198 //
5199 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5200
5201 //
5202 $params = array(
5203 "specific" => array(),
5204 );
5205 // Si la rédaction libre est activée sur l'instruction
5206 if ($this->getVal("flag_edition_integrale") == 't') {
5207 $params["specific"]["corps"] = array(
5208 "mode" => "set",
5209 "value" => $this->getVal("corps_om_htmletatex"),
5210 );
5211 $params["specific"]["titre"] = array(
5212 "mode" => "set",
5213 "value" => $this->getVal("titre_om_htmletat"),
5214 );
5215 }
5216 // Génération du PDF
5217 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5218 $pdf_output = $result['pdf_output'];
5219
5220 //Métadonnées du document
5221 $metadata = array(
5222 'filename' => 'instruction_'.$id_inst.'.pdf',
5223 'mimetype' => 'application/pdf',
5224 'size' => strlen($pdf_output)
5225 );
5226
5227 // Récupération des métadonnées calculées après validation
5228 $spe_metadata = $this->getMetadata("om_fichier_instruction");
5229
5230 //On vérifie si l'instruction à finaliser a un événement de type arrete
5231 // TODO : A voir pour remplacer par une instanciation de l'événement.
5232 // Voir également si l'événement ne dois pas être instancié en début de
5233 // méthode pour pouvoir être réutilisé.
5234 $qres = $this->f->get_one_result_from_db_query(
5235 sprintf(
5236 'SELECT
5237 type
5238 FROM
5239 %1$sevenement
5240 WHERE
5241 evenement = \'%2$d\'',
5242 DB_PREFIXE,
5243 intval($this->getVal("evenement"))
5244 ),
5245 array(
5246 "origin" => __METHOD__,
5247 "force_return" => true,
5248 )
5249 );
5250
5251 if ($qres["code"] !== "OK") {
5252 $this->correct = false;
5253 $this->addToMessage($bdd_msg_error);
5254 return $this->end_treatment(__METHOD__, false);
5255 }
5256
5257 //Initialisation de la variable
5258 $arrete_metadata = array();
5259 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5260 if ($qres['result'] === 'arrete'){
5261 $arrete_metadata = $this->getMetadata("arrete");
5262 }
5263
5264 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5265
5266 /*
5267 // transforme le tableau de métadonnées en objet
5268 $mdf = new MetadataFactory();
5269 $md = $mdf->build('Instruction', $metadata);
5270 */
5271
5272 // Si le document a déjà été finalisé on le met à jour
5273 // en conservant son UID
5274 if ($this->getVal("om_fichier_instruction") != ''){
5275 $uid = $this->f->storage->update(
5276 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5277 }
5278 // Sinon on crée un nouveau document et dont on récupère l'UID
5279 else {
5280 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5281 }
5282 }
5283
5284 // Si on définalise le document
5285 if ($mode == "unfinalize") {
5286 //
5287 $etat = _('définalisation');
5288 // Récupération de l'uid du document finalisé
5289 $uid = $this->getVal("om_fichier_instruction");
5290 }
5291
5292 // Si on définalise l'UID doit être défini
5293 // Si on finalise la création/modification du fichier doit avoir réussi
5294 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5295 $this->correct = false;
5296 $this->addToMessage($file_msg_error);
5297 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5298 return $this->end_treatment(__METHOD__, false);
5299 }
5300
5301 //
5302 foreach ($this->champs as $key => $champ) {
5303 //
5304 $val[$champ] = $this->val[$key];
5305 }
5306
5307 //
5308 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5309 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5310 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5311 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5312 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5313 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5314 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5315 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5316 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5317 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5318 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5319 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5320 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5321 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5322 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5323 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5324 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5325 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5326 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5327 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5328 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5329 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5330 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5331 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5332 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5333 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5334 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5335 $this->setvalF($val);
5336
5337 // Verification de la validite des donnees
5338 $this->verifier($this->val);
5339 // Si les verifications precedentes sont correctes, on procede a
5340 // la modification, sinon on ne fait rien et on retourne une erreur
5341 if ($this->correct === true) {
5342 //
5343 $valF = array(
5344 "om_fichier_instruction" => $uid,
5345 "date_finalisation_courrier" => date('Y-m-d')
5346 );
5347 //
5348 if($mode=="finalize") {
5349 // état finalisé vrai
5350 $valF["om_final_instruction"] = true;
5351 // ajout log utilisateur
5352 $login = $_SESSION['login'];
5353 $nom = "";
5354 $this->f->getUserInfos();
5355 if (isset($this->f->om_utilisateur["nom"])
5356 && !empty($this->f->om_utilisateur["nom"])) {
5357 $nom = $this->f->om_utilisateur["nom"];
5358 }
5359 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5360 if ($nom != "") {
5361 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5362 }
5363 } else {
5364 // état finalisé faux
5365 $valF["om_final_instruction"] = false;
5366 // suppression log utilisateur
5367 $valF["om_final_instruction_utilisateur"] = '';
5368 }
5369
5370 // Execution de la requête de modification des donnees de l'attribut
5371 // valF de l'objet dans l'attribut table de l'objet
5372 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5373 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5374 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5375 //
5376 if ($this->f->isDatabaseError($res, true) === true) {
5377 $this->correct = false;
5378 $this->addToMessage($bdd_msg_error);
5379 return $this->end_treatment(__METHOD__, false);
5380 }
5381
5382 //
5383 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5384 //
5385 if ($this->add_log_to_dossier($id_inst, $val) === false) {
5386 return $this->end_treatment(__METHOD__, false);
5387 }
5388 //
5389 return $this->end_treatment(__METHOD__, true);
5390 }
5391 // L'appel de verifier() a déjà positionné correct à false
5392 // et défini un message d'erreur.
5393 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5394 return $this->end_treatment(__METHOD__, false);
5395 }
5396
5397 /**
5398 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5399 * @return string numéro de dossier d'instruction
5400 */
5401 protected function getDossier($champ = null) {
5402 if(empty($this->specificMetadata)) {
5403 $this->getSpecificMetadata();
5404 }
5405 return $this->specificMetadata->dossier;
5406 }
5407 /**
5408 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5409 * @return int Version
5410 */
5411 protected function getDossierVersion() {
5412 if(empty($this->specificMetadata)) {
5413 $this->getSpecificMetadata();
5414 }
5415 return $this->specificMetadata->version;
5416 }
5417 /**
5418 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5419 * @return string numéro de dossier d'autorisation
5420 */
5421 protected function getNumDemandeAutor() {
5422 if(empty($this->specificMetadata)) {
5423 $this->getSpecificMetadata();
5424 }
5425 return $this->specificMetadata->dossier_autorisation;
5426 }
5427 /**
5428 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5429 * @return date de la demande initiale
5430 */
5431 protected function getAnneemoisDemandeAutor() {
5432 if(empty($this->specificMetadata)) {
5433 $this->getSpecificMetadata();
5434 }
5435 return $this->specificMetadata->date_demande_initiale;
5436 }
5437 /**
5438 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5439 * @return string type du dossier d'instruction
5440 */
5441 protected function getTypeInstruction() {
5442 if(empty($this->specificMetadata)) {
5443 $this->getSpecificMetadata();
5444 }
5445 return $this->specificMetadata->dossier_instruction_type;
5446 }
5447 /**
5448 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5449 * @return string avis
5450 */
5451 protected function getStatutAutorisation() {
5452 if(empty($this->specificMetadata)) {
5453 $this->getSpecificMetadata();
5454 }
5455 return $this->specificMetadata->statut;
5456 }
5457 /**
5458 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5459 * @return string type du dossier d'autorisation
5460 */
5461 protected function getTypeAutorisation() {
5462 if(empty($this->specificMetadata)) {
5463 $this->getSpecificMetadata();
5464 }
5465 return $this->specificMetadata->dossier_autorisation_type;
5466 }
5467 /**
5468 * Récupération de la date d'ajout de document à ajouter aux métadonnées
5469 * @return date de l'évènement
5470 */
5471 protected function getDateEvenementDocument() {
5472 return date("Y-m-d");
5473 }
5474 /**
5475 * Récupération du groupe d'instruction à ajouter aux métadonnées
5476 * @return string Groupe d'instruction
5477 */
5478 protected function getGroupeInstruction() {
5479 if(empty($this->specificMetadata)) {
5480 $this->getSpecificMetadata();
5481 }
5482 return $this->specificMetadata->groupe_instruction;
5483 }
5484 /**
5485 * Récupération du libellé du type du document à ajouter aux métadonnées
5486 * @return string Groupe d'instruction
5487 */
5488 protected function getTitle() {
5489
5490 // Récupère le champ événement
5491 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5492 $evenement = $this->valF["evenement"];
5493 } else {
5494 $evenement = $this->getVal("evenement");
5495 }
5496
5497 // Requête sql
5498 $evenement = $this->f->get_inst__om_dbform(array(
5499 "obj" => "evenement",
5500 "idx" => $evenement
5501 ));
5502
5503 // Retourne le libelle de l'événement
5504 return $evenement->getVal('libelle');
5505 }
5506
5507
5508 /**
5509 * Récupération du champ ERP du dossier d'instruction.
5510 *
5511 * @return boolean
5512 */
5513 public function get_concerne_erp() {
5514 //
5515 if(empty($this->specificMetadata)) {
5516 $this->getSpecificMetadata();
5517 }
5518 //
5519 return $this->specificMetadata->erp;
5520 }
5521
5522
5523 /**
5524 * Cette méthode permet de stocker en attribut toutes les métadonnées
5525 * nécessaire à l'ajout d'un document.
5526 */
5527 public function getSpecificMetadata() {
5528 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5529 $dossier = $this->valF["dossier"];
5530 } else {
5531 $dossier = $this->getVal("dossier");
5532 }
5533 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5534 $qres = $this->f->get_all_results_from_db_query(
5535 sprintf(
5536 'SELECT
5537 dossier.dossier AS dossier,
5538 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5539 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5540 dossier_instruction_type.code AS dossier_instruction_type,
5541 etat_dossier_autorisation.libelle AS statut,
5542 dossier_autorisation_type.code AS dossier_autorisation_type,
5543 groupe.code AS groupe_instruction,
5544 CASE WHEN dossier.erp IS TRUE
5545 THEN \'true\'
5546 ELSE \'false\'
5547 END AS erp
5548 FROM
5549 %1$sdossier
5550 LEFT JOIN %1$sdossier_instruction_type
5551 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5552 LEFT JOIN %1$sdossier_autorisation
5553 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5554 LEFT JOIN %1$setat_dossier_autorisation
5555 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5556 LEFT JOIN %1$sdossier_autorisation_type_detaille
5557 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5558 LEFT JOIN %1$sdossier_autorisation_type
5559 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5560 LEFT JOIN %1$sgroupe
5561 ON dossier_autorisation_type.groupe = groupe.groupe
5562 WHERE
5563 dossier.dossier = \'%2$s\'',
5564 DB_PREFIXE,
5565 $this->f->db->escapeSimple($dossier)
5566 ),
5567 array(
5568 "origin" => __METHOD__,
5569 )
5570 );
5571 $row = array_shift($qres['result']);
5572
5573 //Si il y a un résultat
5574 if (! empty($row)) {
5575
5576 // Instrance de la classe dossier
5577 $inst_dossier = $this->get_inst_dossier($dossier);
5578 // TODO : améliorer ce code
5579 //
5580 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5581 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5582 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5583 // valeurs issues de la requête en objet.
5584 $metadata = (object)$row;
5585 // Insère l'attribut version à l'objet
5586 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5587
5588 //Alors on créé l'objet dossier_instruction
5589 $this->specificMetadata = $metadata;
5590
5591 }
5592 }
5593
5594 /**
5595 * Retourne le statut du dossier d'instruction
5596 * @param string $idx Identifiant du dossier d'instruction
5597 * @return string Le statut du dossier d'instruction
5598 */
5599 function getStatutAutorisationDossier($idx){
5600
5601 $statut = '';
5602
5603 //Si l'identifiant du dossier d'instruction fourni est correct
5604 if ( $idx != '' ){
5605
5606 //On récupère le statut de l'état du dossier à partir de l'identifiant du
5607 //dossier
5608 $qres = $this->f->get_one_result_from_db_query(
5609 sprintf(
5610 'SELECT
5611 etat.statut
5612 FROM
5613 %1$sdossier
5614 LEFT JOIN
5615 %1$setat
5616 ON
5617 dossier.etat = etat.etat
5618 WHERE
5619 dossier = \'%2$s\'',
5620 DB_PREFIXE,
5621 $this->f->db->escapeSimple($idx)
5622 ),
5623 array(
5624 "origin" => __METHOD__,
5625 )
5626 );
5627 }
5628
5629 return $qres['result'];
5630 }
5631
5632 /**
5633 * Récupère les données du dossier
5634 * @return array
5635 */
5636 function get_dossier_actual() {
5637
5638 // Initialisation de la valeur de retour
5639 $return = array();
5640
5641 // Récupération de toutes les valeurs du dossier d'instruction en cours
5642 // TODO : remplacer cette requête par une instanciation de l'objet
5643 $qres = $this->f->get_all_results_from_db_query(
5644 sprintf(
5645 'SELECT
5646 *
5647 FROM
5648 %1$sdossier
5649 WHERE
5650 dossier = \'%2$s\'',
5651 DB_PREFIXE,
5652 $this->f->db->escapeSimple($this->valF['dossier'])
5653 ),
5654 array(
5655 'origin' => __METHOD__
5656 )
5657 );
5658
5659 foreach ($qres['result'] as $row) {
5660
5661 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5662 // de l'état et de l'avis du dossier d'instruction
5663 $return['archive_delai'] = $row['delai'];
5664 $return['archive_accord_tacite'] = $row['accord_tacite'];
5665 $return['archive_etat'] = $row['etat'];
5666 $return['archive_avis'] = $row['avis_decision'];
5667 // Récupération de la valeur actuelle des dates du dossier
5668 // d'instruction
5669 $return['archive_date_complet'] = $row['date_complet'];
5670 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5671 $return['archive_date_rejet'] = $row['date_rejet'];
5672 $return['archive_date_limite'] = $row['date_limite'];
5673 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5674 $return['archive_date_decision'] = $row['date_decision'];
5675 $return['archive_date_validite'] = $row['date_validite'];
5676 $return['archive_date_achevement'] = $row['date_achevement'];
5677 $return['archive_date_chantier'] = $row['date_chantier'];
5678 $return['archive_date_conformite'] = $row['date_conformite'];
5679 $return['archive_incompletude'] = $row['incompletude'];
5680 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5681 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5682 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5683 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5684 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5685 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5686 $return['archive_autorite_competente'] = $row['autorite_competente'];
5687 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5688 $return['duree_validite'] = $row['duree_validite'];
5689 $return['date_depot'] = $row['date_depot'];
5690 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5691 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5692 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5693 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5694 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5695 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5696 $return['archive_date_ait'] = $row['date_ait'];
5697 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5698 $return['archive_date_affichage'] = $row['date_affichage'];
5699 $return['archive_pec_metier'] = $row['pec_metier'];
5700 $return['archive_a_qualifier'] = $row['a_qualifier'];
5701 }
5702
5703 // Retour de la fonction
5704 return $return;
5705
5706 }
5707
5708 /**
5709 * Permet de vérifier qu'un événement est verrouillable
5710 * @param integer $idx Identifiant de l'instruction
5711 * @return boolean
5712 */
5713 function checkEvenementNonVerrouillable($idx) {
5714 // Si la condition n'est pas vide
5715 if ($idx != "") {
5716
5717 // Requête SQL
5718 $qres = $this->f->get_one_result_from_db_query(
5719 sprintf(
5720 'SELECT
5721 evenement.non_verrouillable
5722 FROM
5723 %1$sevenement
5724 LEFT JOIN %1$sinstruction
5725 ON instruction.evenement = evenement.evenement
5726 WHERE
5727 instruction.instruction = \'%2$s\'',
5728 DB_PREFIXE,
5729 intval($idx)
5730 ),
5731 array(
5732 "origin" => __METHOD__,
5733 )
5734 );
5735 }
5736
5737 // Si on a un résultat et que ce résultat indique que l'événement n'est
5738 // pas vérrouillable renvoie true, sinon renvoie false
5739 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5740 }
5741
5742 /**
5743 * Mise à jour des champs archive_*
5744 * @param mixed $row La ligne de données
5745 */
5746 public function updateArchiveData($row){
5747
5748 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5749 // de l'état et de l'avis du dossier d'instruction
5750 $this->valF['archive_delai']=$row['delai'];
5751 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5752 $this->valF['archive_etat']=$row['etat'];
5753 $this->valF['archive_avis']=$row['avis_decision'];
5754 // Récupération de la valeur actuelle des 9 dates du dossier
5755 // d'instruction
5756 if ($row['date_complet'] != '') {
5757 $this->valF['archive_date_complet']=$row['date_complet'];
5758 }
5759 if ($row['date_dernier_depot'] != '') {
5760 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5761 }
5762 if ($row['date_rejet'] != '') {
5763 $this->valF['archive_date_rejet']= $row['date_rejet'];
5764 }
5765 if ($row['date_limite'] != '') {
5766 $this->valF['archive_date_limite']= $row['date_limite'];
5767 }
5768 if ($row['date_notification_delai'] != '') {
5769 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5770 }
5771 if ($row['date_decision'] != '') {
5772 $this->valF['archive_date_decision']= $row['date_decision'];
5773 }
5774 if ($row['date_validite'] != '') {
5775 $this->valF['archive_date_validite']= $row['date_validite'];
5776 }
5777 if ($row['date_achevement'] != '') {
5778 $this->valF['archive_date_achevement']= $row['date_achevement'];
5779 }
5780 if ($row['date_chantier'] != '') {
5781 $this->valF['archive_date_chantier']= $row['date_chantier'];
5782 }
5783 if ($row['date_conformite'] != '') {
5784 $this->valF['archive_date_conformite']= $row['date_conformite'];
5785 }
5786 if ($row['incompletude'] != '') {
5787 $this->valF['archive_incompletude']= $row['incompletude'];
5788 }
5789 if ($row['incomplet_notifie'] != '') {
5790 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5791 }
5792 if ($row['evenement_suivant_tacite'] != '') {
5793 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5794 }
5795 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5796 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5797 }
5798 if ($row['etat_pendant_incompletude'] != '') {
5799 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5800 }
5801 if ($row['date_limite_incompletude'] != '') {
5802 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5803 }
5804 if ($row['delai_incompletude'] != '') {
5805 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5806 }
5807 if ($row['autorite_competente'] != '') {
5808 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5809 }
5810 if ($row['duree_validite'] != '') {
5811 $this->valF['duree_validite']= $row['duree_validite'];
5812 }
5813 if ($row['date_depot'] != '') {
5814 $this->valF['date_depot']= $row['date_depot'];
5815 }
5816 if ($row['date_depot_mairie'] != '') {
5817 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5818 }
5819 // Dates concernant les dossiers contentieux
5820 if ($row['date_cloture_instruction'] != '') {
5821 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5822 }
5823 if ($row['date_premiere_visite'] != '') {
5824 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5825 }
5826 if ($row['date_derniere_visite'] != '') {
5827 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5828 }
5829 if ($row['date_contradictoire'] != '') {
5830 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5831 }
5832 if ($row['date_retour_contradictoire'] != '') {
5833 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5834 }
5835 if ($row['date_ait'] != '') {
5836 $this->valF['archive_date_ait']= $row['date_ait'];
5837 }
5838 if ($row['date_transmission_parquet'] != '') {
5839 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5840 }
5841 //
5842 if ($row['dossier_instruction_type'] != '') {
5843 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5844 }
5845 if ($row['date_affichage'] != '') {
5846 $this->valF['archive_date_affichage']= $row['date_affichage'];
5847 }
5848 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5849 $this->valF['archive_pec_metier']= $row['pec_metier'];
5850 }
5851 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5852 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5853 }
5854 }
5855
5856 // {{{
5857 // Méthodes de récupération des métadonnées arrêté
5858 /**
5859 * @return string Retourne le numéro d'arrêté
5860 */
5861 function getNumArrete() {
5862 return $this->getVal("numero_arrete");
5863 }
5864 /**
5865 * @return chaîne vide
5866 */
5867 function getReglementaireArrete() {
5868 return 'true';
5869 }
5870 /**
5871 * @return boolean de notification au pétitionnaire
5872 */
5873 function getNotificationArrete() {
5874 return 'true';
5875 }
5876 /**
5877 * @return date de notification au pétitionnaire
5878 */
5879 function getDateNotificationArrete() {
5880 if (empty($this->metadonneesArrete)) {
5881 $this->getArreteMetadata();
5882 }
5883 return $this->metadonneesArrete["datenotification"];
5884 }
5885 /**
5886 * @return boolean check si le document est passé au contrôle de légalité
5887 */
5888 function getControleLegalite() {
5889 return 'true';
5890 }
5891 /**
5892 * @return date de signature de l'arrêté
5893 */
5894 function getDateSignature() {
5895 if (empty($this->metadonneesArrete)) {
5896 $this->getArreteMetadata();
5897 }
5898 return $this->metadonneesArrete["datesignaturearrete"];
5899 }
5900 /**
5901 * @return string nom du signataire
5902 */
5903 function getNomSignataire() {
5904 if (empty($this->metadonneesArrete)) {
5905 $this->getArreteMetadata();
5906 }
5907 return $this->metadonneesArrete["nomsignataire"];
5908 }
5909 /**
5910 * @return string qualité du signataire
5911 */
5912 function getQualiteSignataire() {
5913 if (empty($this->metadonneesArrete)) {
5914 $this->getArreteMetadata();
5915 }
5916 return $this->metadonneesArrete["qualitesignataire"];
5917 }
5918 /**
5919 * @return string numéro du terrain
5920 */
5921 function getAp_numRue() {
5922 if (empty($this->metadonneesArrete)) {
5923 $this->getArreteMetadata();
5924 }
5925 return $this->metadonneesArrete["ap_numrue"];
5926 }
5927 /**
5928 * @return string nom de la rue du terrain
5929 */
5930 function getAp_nomDeLaVoie() {
5931 if (empty($this->metadonneesArrete)) {
5932 $this->getArreteMetadata();
5933 }
5934 return $this->metadonneesArrete["ap_nomdelavoie"];
5935 }
5936 /**
5937 * @return string code postal du terrain
5938 */
5939 function getAp_codePostal() {
5940 if (empty($this->metadonneesArrete)) {
5941 $this->getArreteMetadata();
5942 }
5943 return $this->metadonneesArrete["ap_codepostal"];
5944 }
5945 /**
5946 * @return string ville du terrain
5947 */
5948 function getAp_ville() {
5949 if (empty($this->metadonneesArrete)) {
5950 $this->getArreteMetadata();
5951 }
5952 return $this->metadonneesArrete["ap_ville"];
5953 }
5954 /**
5955 * @return string activité
5956 */
5957 function getActivite() {
5958 return "Droit du sol";
5959 }
5960 /**
5961 * @return string date du retour de controle légalité
5962 */
5963 function getDateControleLegalite() {
5964 if (empty($this->metadonneesArrete)) {
5965 $this->getArreteMetadata();
5966 }
5967 return $this->metadonneesArrete["datecontrolelegalite"];
5968 }
5969
5970 // Fin des méthodes de récupération des métadonnées
5971 // }}}
5972
5973 /**
5974 * Méthode de récupération des métadonnées arrêtés dans la base de données,
5975 * les données sont stockés dans l'attribut $this->metadonneesArrete
5976 */
5977 function getArreteMetadata() {
5978
5979 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5980 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5981 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5982 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5983 "ap_codepostal"=>"", "ap_ville"=>"");
5984
5985 $qres = $this->f->get_all_results_from_db_query(
5986 sprintf(
5987 'SELECT
5988 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
5989 signataire_arrete.qualite as qualitesignataire,
5990 instruction.etat as decisionarrete,
5991 instruction.date_retour_rar as datenotification,
5992 instruction.date_retour_signature as datesignaturearrete,
5993 instruction.date_retour_controle_legalite as datecontrolelegalite,
5994 dossier.terrain_adresse_voie_numero as ap_numrue,
5995 dossier.terrain_adresse_voie as ap_nomdelavoie,
5996 dossier.terrain_adresse_code_postal as ap_codepostal,
5997 dossier.terrain_adresse_localite as ap_ville
5998 FROM
5999 %1$sinstruction
6000 LEFT JOIN %1$ssignataire_arrete
6001 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
6002 LEFT JOIN %1$sdossier
6003 ON instruction.dossier = dossier.dossier
6004 LEFT JOIN %1$sdonnees_techniques
6005 ON donnees_techniques.dossier_instruction = dossier.dossier
6006 WHERE
6007 instruction.instruction = %2$d',
6008 DB_PREFIXE,
6009 intval($this->getVal('instruction'))
6010 ),
6011 array(
6012 'origin' => __METHOD__
6013 )
6014 );
6015 $this->metadonneesArrete = array_shift($qres['result']);
6016 }
6017
6018 /**
6019 * CONDITION - has_an_edition.
6020 *
6021 * Condition pour afficher le bouton de visualisation de l'édition.
6022 *
6023 * @return boolean
6024 */
6025 function has_an_edition() {
6026 // Récupère la valeur du champ lettretype
6027 $lettretype = $this->getVal("lettretype");
6028 // Si le champ est vide
6029 if ($lettretype !== '' && $lettretype !== null) {
6030 //
6031 return true;
6032 }
6033
6034 //
6035 return false;
6036 }
6037
6038 /**
6039 * CONDITION - is_modifiable.
6040 *
6041 * Controle si l'évenement est modifiable.
6042 *
6043 * @return boolean
6044 */
6045 function is_evenement_modifiable() {
6046 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6047 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6048 }
6049
6050 /**
6051 * CONDITION - is_editable.
6052 *
6053 * Condition pour la modification.
6054 *
6055 * @return boolean
6056 */
6057 function is_editable() {
6058
6059 // XXX
6060 // 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é)
6061 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6062
6063 // Contrôle si l'utilisateur possède un bypass
6064 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6065 //
6066 if ($bypass == true) {
6067 //
6068 return true;
6069 }
6070
6071 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6072 // que l'événement n'est pas identifié comme non verrouillable
6073 if ($this->f->isUserInstructeur()
6074 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6075 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6076 //
6077 return false;
6078 }
6079
6080 // Si l'utilisateur est un intructeur qui correspond à la division du
6081 // dossier
6082 if ($this->is_instructeur_from_division_dossier() === true) {
6083 //
6084 return true;
6085 }
6086
6087 // Si l'utilisateur est instructeur de la commune du dossier et que
6088 // l'instruction est créée par un instructeur de la commune
6089 if ($this->is_instructeur_from_collectivite_dossier() === true and
6090 $this->getVal('created_by_commune') === 't') {
6091 return true;
6092 }
6093
6094 //
6095 return false;
6096 }
6097
6098 /**
6099 * Vérifie si l'événement est supprimable ou pas.
6100 *
6101 * @return boolean
6102 */
6103 function is_evenement_supprimable() {
6104 // Controle si l'évenement est supprimable
6105 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6106 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6107 }
6108
6109 /**
6110 * CONDITION - is_deletable.
6111 *
6112 * Condition pour la suppression.
6113 *
6114 * @return boolean
6115 */
6116 function is_deletable() {
6117
6118 // XXX
6119 // 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é)
6120 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6121
6122 // Contrôle si l'utilisateur possède un bypass intégral
6123 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6124 //
6125 if ($bypass == true) {
6126
6127 //
6128 return true;
6129 }
6130
6131 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6132 // division du dossier et si l'utilisateur n'a pas la permission bypass
6133 // de la division
6134 if ($this->is_instructeur_from_division_dossier() === false
6135 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6136
6137 //
6138 return false;
6139 }
6140
6141 // l'événement est-il le dernier ?
6142 $dernier_evenement = false;
6143 // instanciation dossier
6144 $dossier = $this->f->get_inst__om_dbform(array(
6145 "obj" => "dossier",
6146 "idx" => $this->getVal('dossier'),
6147 ));
6148 // récupération dernier événement
6149 $id_dernier_evenement = $dossier->get_dernier_evenement();
6150 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6151 $dernier_evenement = true;
6152 }
6153
6154 // Si dossier cloturé ou si pas dernier événement
6155 // ou de type retour ou si une date est renseignée
6156 // ET utilisateur non administrateur
6157 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6158 || $dernier_evenement == false
6159 || $this->is_evenement_retour($this->getVal("evenement")) == true
6160 || $this->getVal('date_envoi_signature') != ''
6161 || $this->getVal('date_retour_signature') != ''
6162 || $this->getVal('date_envoi_rar') != ''
6163 || $this->getVal('date_retour_rar') != ''
6164 || $this->getVal('date_envoi_controle_legalite') != ''
6165 || $this->getVal('date_retour_controle_legalite') != '') {
6166 // pas le droit de supprimer
6167 return false;;
6168 }
6169
6170 //
6171 return true;
6172 }
6173
6174
6175 /**
6176 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6177 * dossier.
6178 *
6179 * @return, boolean true/false
6180 */
6181 function is_instructeur_from_collectivite_dossier() {
6182 if ($this->f->isUserInstructeur() === true and
6183 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6184 return true;
6185 }
6186 return false;
6187 }
6188
6189 /**
6190 * CONDITION - is_addable.
6191 *
6192 * Condition pour afficher les boutons modifier et supprimer.
6193 *
6194 * @return boolean
6195 */
6196 function is_addable() {
6197 // Contrôle si l'utilisateur possède un bypass
6198 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6199 //
6200 if ($bypass == true) {
6201
6202 //
6203 return true;
6204 }
6205 // Si l'utilisateur est un intructeur qui correspond à la
6206 // division du dossier ou qu'il peut changer la décision
6207 if ($this->is_instructeur_from_division_dossier() === true or
6208 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6209 //
6210 return true;
6211 }
6212
6213 //
6214 return false;
6215 }
6216
6217 /**
6218 * CONDITION - is_finalizable.
6219 *
6220 * Condition pour afficher le bouton.
6221 *
6222 * @return boolean
6223 */
6224 function is_finalizable() {
6225 // Contrôle si l'utilisateur possède un bypass
6226 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6227 //
6228 if ($bypass == true) {
6229 //
6230 return true;
6231 }
6232
6233 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6234 // que l'événement n'est pas identifié comme non verrouillable
6235 if ($this->f->isUserInstructeur()
6236 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6237 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6238 //
6239 return false;
6240 }
6241
6242 // Si l'utilisateur est un intructeur qui correspond à la division du
6243 // dossier
6244 if ($this->is_instructeur_from_division_dossier() === true) {
6245 //
6246 return true;
6247 }
6248
6249 // Si l'utilisateur est instructeur de la commune du dossier et que
6250 // l'instruction est créée par un instructeur de la commune
6251 if ($this->is_instructeur_from_collectivite_dossier() === true and
6252 $this->getVal('created_by_commune') === 't') {
6253 return true;
6254 }
6255
6256 //
6257 return false;
6258 }
6259
6260 /**
6261 * CONDITION - is_finalize_without_bypass.
6262 *
6263 * Condition pour afficher le bouton sans le bypass.
6264 *
6265 * @return boolean [description]
6266 */
6267 function is_finalizable_without_bypass() {
6268 // Récupère la valeur du champ finalisé
6269 $om_final_instruction = $this->getVal('om_final_instruction');
6270
6271 // Si le rapport n'est pas finalisé
6272 if (empty($om_final_instruction)
6273 || $om_final_instruction == 'f') {
6274 //
6275 return true;
6276 }
6277
6278 //
6279 return false;
6280 }
6281
6282 /**
6283 * CONDITION - is_unfinalizable.
6284 *
6285 * Condition pour afficher le bouton.
6286 *
6287 * @return boolean
6288 */
6289 function is_unfinalizable(){
6290 // Contrôle si l'utilisateur possède un bypass
6291 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6292 //
6293 if ($bypass == true) {
6294 //
6295 return true;
6296 }
6297
6298 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6299 // que l'événement n'est pas identifié comme non verrouillable
6300 if ($this->f->isUserInstructeur()
6301 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6302 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6303 //
6304 return false;
6305 }
6306
6307 // Si l'utilisateur est un intructeur qui correspond à la division du
6308 // dossier
6309 if ($this->is_instructeur_from_division_dossier() === true) {
6310 //
6311 return true;
6312 }
6313
6314 // Si l'utilisateur est instructeur de la commune du dossier et que
6315 // l'instruction est créée par un instructeur de la commune
6316 if ($this->is_instructeur_from_collectivite_dossier() === true and
6317 $this->getVal('created_by_commune') === 't') {
6318 return true;
6319 }
6320
6321 //
6322 return false;
6323 }
6324
6325 /**
6326 * CONDITION - is_unfinalizable_without_bypass.
6327 *
6328 * Condition pour afficher le bouton sans le bypass.
6329 *
6330 * @return boolean
6331 */
6332 function is_unfinalizable_without_bypass() {
6333 // Récupère la valeur du champ finalisé
6334 $om_final_instruction = $this->getVal('om_final_instruction');
6335
6336 // Si l'instruction est finalisée
6337 if ($om_final_instruction == 't') {
6338 //
6339 return true;
6340 }
6341
6342 //
6343 return false;
6344 }
6345
6346
6347 /**
6348 * Permet de définir si un instructeur commune peut editer une instruction
6349 *
6350 * @return boolean true si il peut
6351 */
6352 function isInstrCanChangeDecision($idx) {
6353
6354 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6355 $this->f->isUserInstructeur() !== true) {
6356 return false;
6357 }
6358
6359
6360
6361 // Sinon on vérifie l'éligibilité du dossier au changement de décision
6362 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6363 // de décision :
6364 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6365 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6366 $sql = sprintf(
6367 'SELECT
6368 dossier.dossier
6369 FROM
6370 %1$sdossier
6371 JOIN %1$setat
6372 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6373 JOIN %1$slien_dossier_demandeur
6374 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6375 JOIN %1$sdossier_instruction_type
6376 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6377 JOIN %1$sinstruction
6378 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6379 ON instruction.instruction = (
6380 SELECT instruction
6381 FROM %1$sinstruction
6382 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6383 AND evenement.retour IS FALSE
6384 WHERE instruction.dossier = dossier.dossier
6385 ORDER BY date_evenement DESC, instruction DESC
6386 LIMIT 1
6387 )
6388 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6389 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6390 -- non signée, non notifié, etc.
6391 AND (instruction.om_final_instruction IS TRUE
6392 OR instruction.created_by_commune IS TRUE)
6393 AND instruction.date_retour_signature IS NULL
6394 AND instruction.date_envoi_rar IS NULL
6395 AND instruction.date_retour_rar IS NULL
6396 AND instruction.date_envoi_controle_legalite IS NULL
6397 AND instruction.date_retour_controle_legalite IS NULL
6398 -- On vérifie que l instruction soit un arrêté ou un changement de décision
6399 JOIN %1$sevenement
6400 ON instruction.evenement=evenement.evenement
6401 AND (evenement.type = \'arrete\'
6402 OR evenement.type = \'changement_decision\')
6403 -- Recherche les informations du pétitionnaire principal pour l affichage
6404 JOIN %1$sdemandeur
6405 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6406 -- Recherche la collectivité rattachée à l instructeur
6407 JOIN %1$sinstructeur
6408 ON dossier.instructeur=instructeur.instructeur
6409 JOIN %1$sdivision
6410 ON instructeur.division=division.division
6411 JOIN %1$sdirection
6412 ON division.direction=direction.direction
6413 JOIN %1$som_collectivite
6414 ON direction.om_collectivite=om_collectivite.om_collectivite
6415 WHERE
6416 -- Vérification que la décision a été prise par l agglo
6417 om_collectivite.niveau = \'2\'
6418 AND dossier.dossier = \'%2$s\'
6419 ',
6420 DB_PREFIXE,
6421 $this->f->db->escapeSimple($idx)
6422 );
6423
6424
6425 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6426 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6427 $sql .= sprintf(
6428 ' AND dossier.om_collectivite = %1$d',
6429 intval($_SESSION['collectivite'])
6430 );
6431 }
6432 $qres = $this->f->get_one_result_from_db_query(
6433 $sql,
6434 array(
6435 "origin" => __METHOD__,
6436 )
6437 );
6438
6439 return $qres['result'] !== null;
6440 }
6441
6442
6443 /**
6444 * CONDITION - can_monitoring_dates.
6445 *
6446 * Condition pour afficher le bouton de suivi des dates.
6447 *
6448 * @return boolean
6449 */
6450 public function can_monitoring_dates() {
6451 // Récupère la valeur du champ finalisé
6452 $om_final_instruction = $this->getVal('om_final_instruction');
6453
6454 // Si l'instruction n'est pas finalisée
6455 if ($om_final_instruction !== 't') {
6456 //
6457 return false;
6458 }
6459
6460 // Contrôle si l'utilisateur possède un bypass
6461 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6462 if ($bypass === true) {
6463 return true;
6464 }
6465
6466 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6467 // un utilisateur lié à un instructeur
6468 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6469
6470 // On vérifie en premier lieu que le DI n'est pas clôturé et que
6471 // l'utilisateur ne possède pas la permission de modifier le suivi des
6472 // dates sur un dossier clôturé
6473 $inst_dossier = $this->get_inst_dossier();
6474 if ($inst_dossier->getStatut() === 'cloture'
6475 && $perm_moni_dates_d_closed === false) {
6476 //
6477 return false;
6478 }
6479 // On récupère ses infos
6480 $coll_di = $inst_dossier->getVal('om_collectivite');
6481 $div_di = $this->getDivisionFromDossier();
6482 // et celles de son éventuel instructeur
6483 $instr_di = $inst_dossier->getVal('instructeur');
6484
6485 // Il faut disposer d'une entrée instructeur
6486 if ($this->f->isUserInstructeur() === false) {
6487 return false;
6488 }
6489
6490 // Par défaut on prétend que l'instructeur n'est pas multi
6491 $instr_di_coll_multi = false;
6492 // Si un instructeur est affecté au dossier
6493 if ($instr_di !== '' && $instr_di !== null) {
6494 // Vérifie si l'instructeur est de la collectivité de niveau 2
6495 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6496 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6497 //
6498 $instr_di_coll_multi = true;
6499 }
6500 }
6501
6502 // Il faut qu'il instruise le dossier ou soit de la même division
6503 if ($this->f->om_utilisateur['instructeur'] === $instr_di
6504 || $this->f->om_utilisateur['division'] === $div_di) {
6505 //
6506 return true;
6507 }
6508
6509 // On donne également le droit s'il est de la même collectivité que
6510 // le dossier ET si l'instruction est déléguée à la communauté
6511 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6512 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6513 && $instr_di_coll_multi === true) {
6514 //
6515 return true;
6516 }
6517
6518 // Si l'instructeur ne rentre pas dans les deux cas précédents
6519 return false;
6520 }
6521
6522
6523 /**
6524 * CONDITION - is_finalized.
6525 *
6526 * Condition pour vérifier si une instruction est finalisée.
6527 *
6528 * @return boolean
6529 */
6530 public function is_finalized() {
6531
6532 return $this->getVal('om_final_instruction') === "t";
6533 }
6534
6535 /**
6536 * CONDITION - is_not_date_retour_signature_set.
6537 *
6538 * Condition pour vérifier si une date de retour signature n'est pas définie.
6539 *
6540 * @return boolean
6541 */
6542 public function is_not_date_retour_signature_set() {
6543
6544 return $this->getVal('date_retour_signature') == null;
6545
6546 }
6547
6548
6549 /**
6550 * TREATMENT - finalize.
6551 *
6552 * Permet de finaliser un enregistrement.
6553 *
6554 * @param array $val valeurs soumises par le formulaire
6555 *
6556 * @return boolean
6557 */
6558 function finalize($val = array()) {
6559
6560 // Cette méthode permet d'exécuter une routine en début des méthodes
6561 // dites de TREATMENT.
6562 $this->begin_treatment(__METHOD__);
6563 $message = '';
6564 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6565
6566 // Controle du signataire
6567 if (! $this->controle_signataire($ev)) {
6568 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6569 // Termine le traitement
6570 return $this->end_treatment(__METHOD__, false);
6571 }
6572
6573 // Traitement de la finalisation
6574 $ret = $this->manage_finalizing("finalize", $val);
6575
6576 // Si le traitement retourne une erreur
6577 if ($ret !== true) {
6578
6579 // Termine le traitement
6580 return $this->end_treatment(__METHOD__, false);
6581 }
6582
6583 // Envoi des notifications aux demandeurs si la notification est automatique
6584 // et que la signature n'est pas requise
6585 if ($ev->getVal('notification') === 'notification_automatique') {
6586 // Préparation du message de log en cas d'erreur de notification
6587 $msgLog = sprintf(
6588 '%s %s : %d',
6589 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6590 __('Instruction notifiée'),
6591 $this->getVal($this->clePrimaire)
6592 );
6593 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6594 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6595 // Récupération de la liste des demandeurs à notifier et de la catégorie
6596 $categorie = $this->f->get_param_option_notification($collectivite_di);
6597 $isPortal = $categorie === PORTAL;
6598 $demandeursANotifie = $this->get_demandeurs_notifiable(
6599 $this->getVal('dossier'),
6600 $isPortal
6601 );
6602
6603 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6604 $demandeurPrincipalNotifie = false;
6605 if (count($demandeursANotifie) > 0) {
6606 foreach ($demandeursANotifie as $demandeur) {
6607 // Identifie si le demandeur principal a été notifié ou pas
6608 // et récupère ses informations
6609 if ($demandeur['petitionnaire_principal'] == 't') {
6610 $demandeurPrincipalNotifie = true;
6611 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6612 // son paramétrage, on effectue pas le traitement et on passe à l'itération
6613 // suivante. On le considère également comme non notifié pour gérer l'envoie
6614 // des messages d'erreurs
6615 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6616 // d'impact sur la notification
6617 $erreursParam = $this->get_info_notification_fail();
6618 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6619 $demandeurPrincipalNotifie = false;
6620 continue;
6621 }
6622 }
6623 // Ajout de la notif et récupération de son id
6624 $idNotif = $this->ajouter_notification(
6625 $this->getVal($this->clePrimaire),
6626 $this->f->get_connected_user_login_name(),
6627 $demandeur,
6628 $collectivite_di,
6629 array(),
6630 true
6631 );
6632 if ($idNotif === false) {
6633 // Termine le traitement
6634 $this->addToLog(
6635 sprintf('%s() : %s', __METHOD__, $msgLog),
6636 DEBUG_MODE
6637 );
6638 return $this->end_treatment(__METHOD__, false);
6639 }
6640 $notification_by_task = $this->notification_by_task(
6641 $idNotif,
6642 $this->getVal('dossier'),
6643 $categorie
6644 );
6645 if ($notification_by_task === false) {
6646 $this->addToLog(
6647 sprintf('%s() : %s', __METHOD__, $msgLog),
6648 DEBUG_MODE
6649 );
6650 $this->addToMessage(
6651 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6652 );
6653 // Termine le traitement
6654 return $this->end_treatment(__METHOD__, false);
6655 }
6656 $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.")));
6657 }
6658 }
6659 // Pour la notification par mail ou la notification via portal si le dossier a
6660 // été déposés via portal, si le demandeur principal n'est pas notifiable,
6661 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6662 // laquelle le demandeur principal n'a pas pu être notifié
6663 $depotPortal = $this->dossier_depose_sur_portail();
6664 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6665 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6666 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6667 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6668 $erreursParam = $this->get_info_notification_fail();
6669 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6670 // Ajout de la notif et récupération de son id
6671 $idNotif = $this->ajouter_notification(
6672 $this->valF[$this->clePrimaire],
6673 $this->f->get_connected_user_login_name(),
6674 $demandeurPrincipal,
6675 $collectivite_di,
6676 array(),
6677 true,
6678 'Echec',
6679 implode(' ', $erreursParam)
6680 );
6681 if ($idNotif === false) {
6682 $this->addToMessage(
6683 __('Erreur : la création de la notification a échouée.').
6684 __("Veuillez contacter votre administrateur.")
6685 );
6686 $this->addToLog(
6687 sprintf('%s() : %s', __METHOD__, $msgLog),
6688 DEBUG_MODE
6689 );
6690 return false;
6691 }
6692 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6693 // de l'échec de la notification
6694 $dossier_message = $this->get_inst_dossier_message(0);
6695 $dossier_message_val = array(
6696 'dossier' => $this->getVal('dossier'),
6697 'type' => _('erreur expedition'),
6698 'emetteur' => $this->f->get_connected_user_login_name(),
6699 'login' => $_SESSION['login'],
6700 'date_emission' => date('Y-m-d H:i:s'),
6701 'contenu' => _('Échec lors de la notification de l\'instruction ').
6702 $ev->getVal('libelle').
6703 '.<br>'.
6704 implode("\n", $erreursParam).
6705 '<br>'.
6706 _('Veuillez corriger ces informations avant de renvoyer la notification.')
6707 );
6708 $add = $dossier_message->add_notification_message($dossier_message_val, true);
6709 // Si une erreur se produit pendant l'ajout
6710 if ($add !== true) {
6711 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6712 return false;
6713 }
6714 }
6715 }
6716
6717 // Termine le traitement
6718 return $this->end_treatment(__METHOD__, true);
6719 }
6720
6721 /**
6722 * Récupère l'instance de dossier message.
6723 *
6724 * @param string $dossier_message Identifiant du message.
6725 *
6726 * @return object
6727 */
6728 private function get_inst_dossier_message($dossier_message = null) {
6729 //
6730 return $this->get_inst_common("dossier_message", $dossier_message);
6731 }
6732
6733 /**
6734 * Vérifie si le signataire est obligatoire pour finaliser
6735 * le document apartir du paramétrage de l'événement.
6736 * Si c'est le cas, vérifie si il y a bien un signataire
6737 * renseigné.
6738 * Si c'est le cas renvoie true, sinon renvoie false.
6739 *
6740 * @param evenement évenement de l'instruction permettant de
6741 * récupérer le paramétrage
6742 * @return boolean
6743 */
6744 protected function controle_signataire($evenement) {
6745 // Vérifie si le signataire est obligatoire et si c'est le cas
6746 // vérifie si il y a bien un signataire pour le document
6747 if ($evenement->is_signataire_obligatoire() &&
6748 ($this->getVal('signataire_arrete') === null ||
6749 $this->getVal('signataire_arrete') === '')) {
6750 return false;
6751 }
6752 return true;
6753 }
6754
6755 /**
6756 * TREATMENT - unfinalize.
6757 *
6758 * Permet de définaliser un enregistrement.
6759 *
6760 * @param array $val valeurs soumises par le formulaire
6761 *
6762 * @return boolean
6763 */
6764 function unfinalize($val = array()) {
6765
6766 // Cette méthode permet d'exécuter une routine en début des méthodes
6767 // dites de TREATMENT.
6768 $this->begin_treatment(__METHOD__);
6769
6770 // Traitement de la finalisation
6771 $ret = $this->manage_finalizing("unfinalize", $val);
6772
6773 // Si le traitement retourne une erreur
6774 if ($ret !== true) {
6775
6776 // Termine le traitement
6777 return $this->end_treatment(__METHOD__, false);
6778 }
6779
6780 // Termine le traitement
6781 return $this->end_treatment(__METHOD__, true);
6782 }
6783
6784 /**
6785 * VIEW - view_edition
6786 *
6787 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6788 *
6789 * @return null Si l'action est incorrecte
6790 */
6791 function view_edition() {
6792
6793 // Si l'instruction est finalisée
6794 if($this->getVal("om_final_instruction") == 't'
6795 && $this->getVal("om_final_instruction") != null) {
6796
6797 // Ouvre le document
6798 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6799 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6800 //
6801 header("Location: ".$lien);
6802 } else {
6803
6804 // Récupère la collectivite du dossier d'instruction
6805 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6806
6807 //
6808 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6809
6810 // Paramètre du PDF
6811 $params = array(
6812 "watermark" => true,
6813 "specific" => array(
6814 "mode" => "previsualisation",
6815 ),
6816 );
6817 // Si la rédaction libre est activée sur l'instruction
6818 if ($this->getVal("flag_edition_integrale") == 't') {
6819 $params["specific"]["corps"] = array(
6820 "mode" => "set",
6821 "value" => $this->getVal("corps_om_htmletatex"),
6822 );
6823 $params["specific"]["titre"] = array(
6824 "mode" => "set",
6825 "value" => $this->getVal("titre_om_htmletat"),
6826 );
6827 }
6828
6829 // Génération du PDF
6830 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6831 // Affichage du PDF
6832 $this->expose_pdf_output(
6833 $result['pdf_output'],
6834 $result['filename']
6835 );
6836 }
6837 }
6838
6839 /**
6840 * Récupère la collectivité du dossier d'instruction.
6841 *
6842 * @param string $dossier_instruction_id Identifiant du DI.
6843 *
6844 * @return integer
6845 */
6846 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6847
6848 // Si l'identifiant n'est pas renseigné
6849 if ($dossier_instruction_id === null) {
6850 // Récupère la valeur
6851 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6852 $dossier_instruction_id = $this->getVal('dossier');
6853 } elseif ($this->getParameter('idxformulaire') !== null
6854 && $this->getParameter('idxformulaire') !== '') {
6855 //
6856 $dossier_instruction_id = $this->getParameter('idxformulaire');
6857 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6858 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6859 //
6860 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6861 }
6862 }
6863
6864 //
6865 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6866 "obj" => "dossier_instruction",
6867 "idx" => $dossier_instruction_id,
6868 ));
6869
6870 //
6871 return $dossier_instruction->getVal('om_collectivite');
6872 }
6873
6874 /**
6875 * VIEW - view_bible
6876 *
6877 * Affiche la bible manuelle.
6878 *
6879 * @return void
6880 */
6881 function view_bible() {
6882 // Vérification de l'accessibilité sur l'élément
6883 $this->checkAccessibility();
6884
6885 /**
6886 * Affichage de la structure HTML
6887 */
6888 //
6889 if ($this->f->isAjaxRequest()) {
6890 //
6891 header("Content-type: text/html; charset=".HTTPCHARSET."");
6892 } else {
6893 //
6894 $this->f->setFlag("htmlonly");
6895 $this->f->display();
6896 }
6897 //
6898 $this->f->displayStartContent();
6899 //
6900 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6901 $this->f->displayTitle();
6902
6903 /**
6904 *
6905 */
6906 //
6907 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6908 $evenement = intval($evenement);
6909 //
6910 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6911 // Récupération du code du type de DA
6912 $code_da_type = '';
6913 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6914 $code_da_type = $matches[0];
6915 }
6916 //
6917 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6918
6919 // Récupération de la collectivité du dossier
6920 $dossier = $this->f->get_inst__om_dbform(array(
6921 "obj" => "dossier",
6922 "idx" => $idx,
6923 ));
6924
6925 $qres = $this->f->get_all_results_from_db_query(
6926 sprintf(
6927 'SELECT
6928 *,
6929 bible.libelle as bible_lib
6930 FROM
6931 %1$sbible
6932 LEFT OUTER JOIN %1$sdossier_autorisation_type
6933 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6934 LEFT JOIN %1$som_collectivite
6935 ON bible.om_collectivite = om_collectivite.om_collectivite
6936 WHERE
6937 (evenement = %2$d
6938 OR evenement IS NULL)
6939 AND (complement = %3$d
6940 OR complement IS NULL)
6941 AND (bible.dossier_autorisation_type IS NULL
6942 OR dossier_autorisation_type.code = \'%4$s\')
6943 AND (om_collectivite.niveau = \'2\'
6944 OR bible.om_collectivite = %5$d)
6945 ORDER BY
6946 bible_lib ASC',
6947 DB_PREFIXE,
6948 intval($evenement),
6949 intval($complement),
6950 $this->f->db->escapeSimple($code_da_type),
6951 intval($dossier->getVal("om_collectivite"))
6952 ),
6953 array(
6954 'origin' => __METHOD__
6955 )
6956 );
6957 //
6958 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6959 //
6960 if (count($qres['result']) > 0) {
6961 //
6962 echo "\t<table id='tab-bible' width='100%'>\n";
6963 //
6964 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6965 echo "<th>"._("Choisir")."</th>";
6966 echo "<th>"._("Libelle")."</th>";
6967 echo "</tr>\n";
6968 //
6969 $i = 0;
6970 //
6971 foreach ($qres['result'] as $row) {
6972 //
6973 echo "\t\t<tr";
6974 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6975 echo ">";
6976 //
6977 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6978 // XXX utilisation de l'attribut titre pour afficher une infobulle
6979 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6980 //
6981 echo "</tr>\n";
6982 //
6983 $i++;
6984 }
6985 echo "\t</table>\n";
6986 //
6987 echo "<div class=\"formControls\">\n";
6988 $this->f->layout->display_form_button(array(
6989 "value" => _("Valider"),
6990 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6991 ));
6992 $this->f->displayLinkJsCloseWindow();
6993 echo "</div>\n";
6994
6995 } else {
6996 //
6997 $message_class = "error";
6998 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6999 $this->f->displayMessage($message_class, $message);
7000 //
7001 echo "<div class=\"formControls\">\n";
7002 $this->f->displayLinkJsCloseWindow();
7003 echo "</div>\n";
7004 }
7005 //
7006 echo "</form>\n";
7007
7008 /**
7009 * Affichage de la structure HTML
7010 */
7011 //
7012 $this->f->displayEndContent();
7013 }
7014
7015 /**
7016 * VIEW - view_bible_auto
7017 *
7018 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7019 *
7020 * @return void
7021 */
7022 function view_bible_auto() {
7023 // Vérification de l'accessibilité sur l'élément
7024 $this->checkAccessibility();
7025 //
7026 $this->f->disableLog();
7027
7028 $formatDate="AAAA-MM-JJ";
7029
7030 // Récupération des paramètres
7031 $idx = $this->f->get_submitted_get_value('idx');
7032 $evenement = $this->f->get_submitted_get_value('ev');
7033
7034 // Initialisation de la variable de retour
7035 $retour['complement_om_html'] = '';
7036 $retour['complement2_om_html'] = '';
7037 $retour['complement3_om_html'] = '';
7038 $retour['complement4_om_html'] = '';
7039
7040 // Vérification d'une consultation liée à l'événement
7041 $instEvenement = $this->f->get_inst__om_dbform(array(
7042 "obj" => "evenement",
7043 "idx" => $evenement,
7044 ));
7045
7046 // Si consultation liée, récupération du retour d'avis
7047 if($instEvenement->getVal('consultation') == 'Oui'){
7048
7049 $qres = $this->f->get_all_results_from_db_query(
7050 sprintf(
7051 'SELECT
7052 date_retour,
7053 avis_consultation.libelle as avis_consultation,
7054 COALESCE(service.libelle, tiers_consulte.libelle) as service
7055 FROM
7056 %1$sconsultation
7057 LEFT JOIN %1$stiers_consulte
7058 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7059 LEFT JOIN %1$sservice
7060 ON consultation.service = service.service
7061 LEFT JOIN %1$savis_consultation
7062 ON consultation.avis_consultation = avis_consultation.avis_consultation
7063 WHERE
7064 dossier = \'%2$s\'
7065 AND consultation.visible',
7066 DB_PREFIXE,
7067 $this->f->db->escapeSimple($idx)
7068 ),
7069 array(
7070 'origin' => __METHOD__
7071 )
7072 );
7073 // Récupération des consultations
7074 foreach ($qres['result'] as $row) {
7075 $correct=false;
7076 // date retour
7077 if ($row['date_retour']<>""){
7078 if ($formatDate=="AAAA-MM-JJ"){
7079 $date = explode("-", $row['date_retour']);
7080 // controle de date
7081 if (count($date) == 3 and
7082 checkdate($date[1], $date[2], $date[0])) {
7083 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7084 $correct=true;
7085 }else{
7086 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7087 $correct=false;
7088 }
7089 }
7090 }
7091 //
7092 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7093 if($correct == true){
7094 $temp=$temp." du ".$date_retour_f;
7095 }
7096 // Concaténation des retours d'avis de consultation
7097 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7098 } // while
7099
7100 } // consultation
7101 // Récupération des bibles automatiques pour le champ complement_om_html
7102 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7103 // Récupération des bibles automatiques pour le champ complement2_om_html
7104 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7105 // Récupération des bibles automatiques pour le champ complement3_om_html
7106 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7107 // Récupération des bibles automatiques pour le champ complement4_om_html
7108 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7109
7110
7111
7112 echo json_encode($retour);
7113 }
7114
7115 /**
7116 * VIEW - view_pdf_temp
7117 *
7118 * @return void
7119 */
7120 function view_pdf_temp() {
7121 $this->checkAccessibility();
7122 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7123 $this->f->set_submitted_value();
7124 $merge_fields = array();
7125 //
7126 if (array_key_exists('c1', $_POST) === true) {
7127 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7128 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7129 }
7130 if (array_key_exists('c2', $_POST) === true) {
7131 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7132 }
7133 if (array_key_exists('c3', $_POST) === true) {
7134 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7135 }
7136 if (array_key_exists('c4', $_POST) === true) {
7137 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7138 }
7139 $params = array(
7140 "watermark" => true,
7141 "specific" => array(
7142 "merge_fields" => $merge_fields,
7143 ),
7144 );
7145 //
7146 if (array_key_exists('corps', $_POST) === true) {
7147 $params["specific"]["corps"] = array(
7148 "mode" => "set",
7149 "value" => $_POST['corps'],
7150 );
7151 }
7152 if (array_key_exists('titre', $_POST) === true) {
7153 $params["specific"]["titre"] = array(
7154 "mode" => "set",
7155 "value" => $_POST['titre'],
7156 );
7157 }
7158 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7159 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7160 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7161 $retour = array(
7162 'base' => base64_encode($result['pdf_output']),
7163 );
7164 echo json_encode($retour);
7165 }
7166
7167 /**
7168 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7169 * PDF sans prise en compte de la valeur des compléments et le retourne en
7170 * base 64.
7171 *
7172 * @return string Rendu PDF converti en base 64.
7173 */
7174 function init_pdf_temp() {
7175 $params = array(
7176 "watermark" => true,
7177 );
7178 // Si la rédaction libre est activée sur l'instruction
7179 if ($this->getVal("flag_edition_integrale") == 't') {
7180 $params["specific"]["corps"] = array(
7181 "mode" => "set",
7182 "value" => $this->getVal("corps_om_htmletatex"),
7183 );
7184 $params["specific"]["titre"] = array(
7185 "mode" => "set",
7186 "value" => $this->getVal("titre_om_htmletat"),
7187 );
7188 }
7189 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7190 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7191 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7192
7193 return base64_encode($result['pdf_output']);
7194 }
7195
7196 /**
7197 * Récupération des éléments de bible.
7198 *
7199 * @param integer $event id de l'événement
7200 * @param string $idx id du dossier
7201 * @param integer $compnb numéro du champ complement
7202 *
7203 * @return string Chaîne de texte à insérer dans le champ complement
7204 */
7205 function getBible($event, $idx, $compnb) {
7206 // Récupération de la collectivité du dossier
7207 $dossier = $this->f->get_inst__om_dbform(array(
7208 "obj" => "dossier",
7209 "idx" => $idx,
7210 ));
7211 // Récupération du code du type de DA
7212 $code_da_type = '';
7213 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7214 $code_da_type = $matches[0];
7215 }
7216
7217 $qres = $this->f->get_all_results_from_db_query(
7218 sprintf(
7219 'SELECT
7220 *
7221 FROM
7222 %1$sbible
7223 LEFT OUTER JOIN %1$sdossier_autorisation_type
7224 ON bible.dossier_autorisation_type =
7225 dossier_autorisation_type.dossier_autorisation_type
7226 LEFT JOIN %1$som_collectivite
7227 ON bible.om_collectivite = om_collectivite.om_collectivite
7228 WHERE
7229 (evenement = %2$d
7230 OR evenement IS NULL)
7231 AND (complement = %3$d
7232 OR complement IS NULL)
7233 AND automatique = \'Oui\'
7234 AND (dossier_autorisation_type.code = \'%4$s\'
7235 OR bible.dossier_autorisation_type IS NULL)
7236 AND (om_collectivite.niveau = \'2\'
7237 OR bible.om_collectivite = %5$d)',
7238 DB_PREFIXE,
7239 intval($event),
7240 intval($compnb),
7241 $this->f->db->escapeSimple($code_da_type),
7242 intval($dossier->getVal("om_collectivite"))
7243 ),
7244 array(
7245 "origin" => __METHOD__
7246 )
7247 );
7248 $temp = "";
7249 foreach ($qres['result'] as $row) {
7250 // Remplacement des retours à la ligne par des br
7251 $temp .= preg_replace(
7252 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7253 );
7254 // Ajout d'un saut de ligne entre chaque bible.
7255 $temp .= '<br/>';
7256 } // fin while
7257 return $temp;
7258 }
7259
7260 /**
7261 * VIEW - view_suivi_bordereaux.
7262 *
7263 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7264 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7265 * collectivité des dossiers affichés.
7266 *
7267 * @return void
7268 */
7269 function view_suivi_bordereaux() {
7270 // Vérification de l'accessibilité sur l'élément
7271 $this->checkAccessibility();
7272
7273 /**
7274 * Validation du formulaire
7275 */
7276 // Si le formulaire a été validé
7277 if ($this->f->get_submitted_post_value("validation") !== null) {
7278 // Si un bordereau à été sélectionné
7279 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7280 // Si aucun bordereau n'a été sélectionné
7281 $message_class = "error";
7282 $message = _("Veuillez selectionner un bordereau.");
7283 }
7284 // Sinon si les dates ne sont pas valide
7285 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7286 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7287 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7288 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7289 // Si aucune date n'a été saisie
7290 $message_class = "error";
7291 $message = _("Veuillez saisir une date valide.");
7292 }
7293 // Sinon si les dates ne sont pas valides
7294 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7295 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7296 // Si aucune date n'a été saisie
7297 $message_class = "error";
7298 $message = _("Erreur de parametrage. Contactez votre administrateur.");
7299 }
7300 // Affiche le message de validation
7301 else {
7302 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7303 $etat = $this->f->get_inst__om_dbform(array(
7304 "obj" => "om_etat",
7305 "idx" => $this->f->get_submitted_post_value("bordereau")
7306 ));
7307 $qres = $this->f->get_one_result_from_db_query(
7308 sprintf(
7309 'SELECT
7310 om_etat.libelle
7311 FROM
7312 %som_etat
7313 WHERE
7314 om_etat.id = \'%s\'',
7315 DB_PREFIXE,
7316 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7317 ),
7318 array(
7319 "origin" => __METHOD__,
7320 )
7321 );
7322
7323 //
7324 $message_class = "valid";
7325 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7326 $message .= " : <br/><br/>";
7327 $message .= "<a class='om-prev-icon pdf-16'";
7328 $message .= " title=\""._("Bordereau")."\"";
7329 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7330 $message .= "&action=220";
7331 $message .= "&idx=0";
7332 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7333 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7334 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7335 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7336 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7337 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7338 }
7339 $message .= "'"." target='_blank'>";
7340 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7341 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7342 $message .= "</a>";
7343 }
7344 }
7345
7346 /**
7347 * Affichage des messages et du formulaire
7348 */
7349 // Affichage du message de validation ou d'erreur
7350 if (isset($message) && isset($message_class) && $message != "") {
7351 $this->f->displayMessage($message_class, $message);
7352 }
7353 // Ouverture du formulaire
7354 printf("\t<form");
7355 printf(" method=\"post\"");
7356 printf(" id=\"suivi_bordereaux_form\"");
7357 printf(" action=\"\"");
7358 printf(">\n");
7359 // Paramétrage des champs du formulaire
7360 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7361 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7362 // collectivité dans le formulaire
7363 if ($_SESSION["niveau"] == 2) {
7364 array_push($champs, "om_collectivite");
7365 }
7366 // Création d'un nouvel objet de type formulaire
7367 $form = $this->f->get_inst__om_formulaire(array(
7368 "validation" => 0,
7369 "maj" => 0,
7370 "champs" => $champs,
7371 ));
7372 // Paramétrage du champ date_bordereau_debut
7373 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7374 $form->setType("date_bordereau_debut", "date");
7375 $form->setTaille("date_bordereau_debut", 12);
7376 $form->setMax("date_bordereau_debut", 12);
7377 $form->setRequired("date_bordereau_debut");
7378 $form->setOnchange("date_bordereau_debut", "fdate(this)");
7379 $form->setVal("date_bordereau_debut", date("d/m/Y"));
7380 // Paramétrage du champ date_bordereau_fin
7381 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7382 $form->setType("date_bordereau_fin", "date");
7383 $form->setTaille("date_bordereau_fin", 12);
7384 $form->setMax("date_bordereau_fin", 12);
7385 $form->setRequired("date_bordereau_fin");
7386 $form->setOnchange("date_bordereau_fin", "fdate(this)");
7387 $form->setVal("date_bordereau_fin", date("d/m/Y"));
7388 // Paramétrage du champ bordereau
7389 $form->setLib("bordereau", _("bordereau"));
7390 $form->setType("bordereau", "select");
7391 $form->setRequired("bordereau");
7392 // Valeurs des champs
7393 if ($this->f->get_submitted_post_value("validation") !== null) {
7394 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7395 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7396 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7397 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7398 }
7399 // Données du select - On récupère ici la liste de tous les états disponibles
7400 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7401 // 'bordereau_'
7402 $qres = $this->f->get_all_results_from_db_query(
7403 sprintf(
7404 'SELECT
7405 om_etat.id,
7406 om_etat.libelle
7407 FROM
7408 %1$som_etat
7409 WHERE
7410 om_etat.id LIKE \'bordereau_%%\'
7411 ORDER BY
7412 om_etat.id',
7413 DB_PREFIXE
7414 ),
7415 array(
7416 "origin" => __METHOD__
7417 )
7418 );
7419 // Données du select
7420 $contenu = array(
7421 0 => array("", ),
7422 1 => array(_("choisir bordereau")),
7423 );
7424 foreach ($qres['result'] as $row) {
7425 $contenu[0][] = $row['id'];
7426 $contenu[1][] = $row['libelle'];
7427 }
7428 $form->setSelect("bordereau", $contenu);
7429 //
7430 if ($_SESSION["niveau"] == 2) {
7431 $form->setLib("om_collectivite", _("collectivite"));
7432 $form->setType("om_collectivite", "select");
7433
7434 // Données du select - On récupère ici la liste de tous toutes les collectivités
7435 // de niveau 1
7436 $qres = $this->f->get_all_results_from_db_query(
7437 sprintf(
7438 'SELECT
7439 om_collectivite,
7440 libelle
7441 FROM
7442 %1$som_collectivite
7443 WHERE
7444 niveau = \'1\'
7445 ORDER BY
7446 libelle',
7447 DB_PREFIXE
7448 ),
7449 array(
7450 "origin" => __METHOD__
7451 )
7452 );
7453 // La valeur par défaut du select est Toutes
7454 $list_collectivites = array(
7455 0 => array("", ),
7456 1 => array(_("toutes"))
7457 );
7458
7459 $id_colls = "";
7460 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7461 // par des virgules, pour un traitement plus facile dans la requête de sous-état
7462 foreach ($qres['result'] as $row) {
7463 if ($id_colls != "") {
7464 $id_colls .= ",";
7465 }
7466 $id_colls .= $row['om_collectivite'];
7467 $list_collectivites[0][] = $row['om_collectivite'];
7468 $list_collectivites[1][] = $row['libelle'];
7469 }
7470 // On affecte la liste d'identifiants à l'option Toutes
7471 $list_collectivites[0][0] = $id_colls ;
7472 $form->setSelect("om_collectivite", $list_collectivites);
7473 }
7474 // Affichage du formulaire
7475 $form->entete();
7476 $form->afficher($champs, 0, false, false);
7477 $form->enpied();
7478 // Affichage du bouton
7479 printf("\t<div class=\"formControls\">\n");
7480 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7481 printf("\t</div>\n");
7482 // Fermeture du formulaire
7483 printf("\t</form>\n");
7484 }
7485
7486
7487 /**
7488 * VIEW - view_generate_suivi_bordereaux.
7489 *
7490 * Génère et affiche les bordereaux de suivi.
7491 *
7492 * @return [void]
7493 */
7494 function view_generate_suivi_bordereaux() {
7495 // Vérification de l'accessibilité sur l'élément
7496 $this->checkAccessibility();
7497 // Récupération du type de bordereau
7498 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7499 // Génération du PDF
7500 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7501 // Affichage du PDF
7502 $this->expose_pdf_output(
7503 $result['pdf_output'],
7504 $result['filename']
7505 );
7506 }
7507
7508
7509 /**
7510 * VIEW - view_suivi_envoi_lettre_rar.
7511 *
7512 * Vue pour imprimer les AR.
7513 *
7514 * @return void
7515 */
7516 function view_suivi_envoi_lettre_rar() {
7517 // Vérification de l'accessibilité sur l'élément
7518 $this->checkAccessibility();
7519
7520 //
7521 if ($this->f->get_submitted_post_value("date") !== null) {
7522 $date = $this->f->get_submitted_post_value("date");
7523 } else {
7524 $date = "";
7525 }
7526 //
7527 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7528 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7529 } else {
7530 $liste_code_barres_instruction = "";
7531 }
7532
7533 // Compteur du nombre de page générées
7534 $nbLettres = 0;
7535 // Liste d'id des instructions
7536 $id4Gen = array();
7537 //
7538 $error = "";
7539
7540 // Initialisation du tableau qui va contenir les DI pour lister les liens
7541 $dossierTab = array();
7542 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7543 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7544 $hasHidden = true;
7545 // S'il ne peut pas les consulter il aura des dossiers caché
7546 if ($isAccredited === true) {
7547 $hasHidden = false;
7548 }
7549
7550 /**
7551 * Validation du formulaire
7552 */
7553 // Si le formulaire a été validé
7554 if ($this->f->get_submitted_post_value('validation') !== null) {
7555 //
7556 if (empty($date) || empty($liste_code_barres_instruction)) {
7557 //
7558 $message_class = "error";
7559 $message = _("Tous les champs doivent etre remplis.");
7560 } else {
7561 // Création d'un tableau d'instruction
7562 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7563 //
7564 foreach ($liste as $code_barres) {
7565 // On enlève les éventuels espaces saisis
7566 $code_barres = trim($code_barres);
7567 // Vérification de l'existence de l'instruction
7568 if ($code_barres != "") {
7569 // Si la valeur transmise est numérique
7570 if (is_numeric($code_barres)) {
7571 //
7572 $sql = "SELECT count(*)
7573 FROM ".DB_PREFIXE."instruction
7574 INNER JOIN ".DB_PREFIXE."dossier
7575 ON dossier.dossier=instruction.dossier
7576 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7577 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7578 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7579 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7580 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7581 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7582 INNER JOIN ".DB_PREFIXE."groupe
7583 ON dossier_autorisation_type.groupe = groupe.groupe
7584 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7585
7586 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7587 $group_clause = array();
7588 foreach ($_SESSION["groupe"] as $key => $value) {
7589 $group_clause[$key] = "(groupe.code = '".$key."'";
7590 if($value["confidentiel"] !== true) {
7591 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7592 }
7593 $group_clause[$key] .= ")";
7594 }
7595 $conditions = implode(" OR ", $group_clause);
7596 $sql .= " AND (" . $conditions . ")";
7597
7598 $qres = $this->f->get_one_result_from_db_query(
7599 $sql,
7600 array(
7601 "origin" => __METHOD__,
7602 )
7603 );
7604
7605 if ($qres['result'] == "1") {
7606 // Récupération de la date d'envoi de l'instruction bippé
7607 $qres = $this->f->get_all_results_from_db_query(
7608 sprintf(
7609 'SELECT
7610 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7611 instruction
7612 FROM
7613 %1$sinstruction
7614 WHERE
7615 code_barres = \'%2$s\'',
7616 DB_PREFIXE,
7617 $this->f->db->escapeSimple($code_barres)
7618 ),
7619 array(
7620 'origin' => __METHOD__
7621 )
7622 );
7623 $row = array_shift($qres['result']);
7624 // Si pas de date ou correspond à la date du formulaire on
7625 // effectue le traitement
7626 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7627 $instr = $this->f->get_inst__om_dbform(array(
7628 "obj" => "instruction",
7629 "idx" => $row['instruction'],
7630 ));
7631 $valF = array();
7632 foreach($instr->champs as $id => $champ) {
7633 $valF[$champ] = $instr->val[$id];
7634 }
7635
7636 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7637 if ($isAccredited === true
7638 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7639 $dossier = $this->f->get_inst__om_dbform(array(
7640 "obj" => "dossier",
7641 "idx" => $instr->getVal("dossier"),
7642 ));
7643 if ($dossier->is_user_from_allowed_collectivite()){
7644 $dossierTab[$instr->getVal("dossier")] = $dossier;
7645 } else {
7646 $hasHidden = true;
7647 }
7648 }
7649
7650 $valF['date_evenement']=
7651 $instr->dateDBToForm($valF['date_evenement']);
7652 $valF['archive_date_complet']=
7653 $instr->dateDBToForm($valF['archive_date_complet']);
7654 $valF['archive_date_rejet']=
7655 $instr->dateDBToForm($valF['archive_date_rejet']);
7656 $valF['archive_date_limite']=
7657 $instr->dateDBToForm($valF['archive_date_limite']);
7658 $valF['archive_date_notification_delai']=
7659 $instr->dateDBToForm($valF['archive_date_notification_delai']);
7660 $valF['archive_date_decision']=
7661 $instr->dateDBToForm($valF['archive_date_decision']);
7662 $valF['archive_date_validite']=
7663 $instr->dateDBToForm($valF['archive_date_validite']);
7664 $valF['archive_date_achevement']=
7665 $instr->dateDBToForm($valF['archive_date_achevement']);
7666 $valF['archive_date_chantier']=
7667 $instr->dateDBToForm($valF['archive_date_chantier']);
7668 $valF['archive_date_conformite']=
7669 $instr->dateDBToForm($valF['archive_date_conformite']);
7670 $valF['archive_date_dernier_depot']=
7671 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7672 $valF['archive_date_limite_incompletude']=
7673 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7674 $valF['date_finalisation_courrier']=
7675 $instr->dateDBToForm($valF['date_finalisation_courrier']);
7676 $valF['date_envoi_signature']=
7677 $instr->dateDBToForm($valF['date_envoi_signature']);
7678 $valF['date_retour_signature']=
7679 $instr->dateDBToForm($valF['date_retour_signature']);
7680 $valF['date_envoi_rar']=
7681 $instr->dateDBToForm($valF['date_envoi_rar']);
7682 $valF['date_retour_rar']=
7683 $instr->dateDBToForm($valF['date_retour_rar']);
7684 $valF['date_envoi_controle_legalite']=
7685 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7686 $valF['date_retour_controle_legalite']=
7687 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7688 $valF['date_envoi_rar'] = $date;
7689
7690 // Vérification de la finalisation du document
7691 // correspondant au code barres
7692 if($instr->getVal("om_final_instruction") === 't') {
7693 $instr->setParameter('maj', 1);
7694 $instr->class_actions[1]["identifier"] =
7695 "envoi lettre RAR (depuis le menu suivi des pièces)";
7696 if ($instr->modifier($valF) == true) {
7697 $id4Gen[] = $code_barres;
7698 $nbLettres ++;
7699 } else {
7700 //
7701 if ($error != "") {
7702 $error .= "<br/>";
7703 }
7704 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7705 $code_barres);
7706 $error .= " ";
7707 $error .= _("Veuillez contacter votre administrateur.");
7708 }
7709 } else {
7710 //
7711 if ($error != "") {
7712 $error .= "<br/>";
7713 }
7714 $error .= sprintf(_("Le document correspondant au
7715 code barres %s n'est pas finalise,
7716 le bordereau ne sera pas genere."),
7717 $code_barres);
7718 }
7719
7720 } else {
7721 //
7722 if ($error != "") {
7723 $error .= "<br/>";
7724 }
7725 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7726 }
7727 } else {
7728 //
7729 if ($error != "") {
7730 $error .= "<br/>";
7731 }
7732 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7733 }
7734 } else {
7735 //
7736 if ($error != "") {
7737 $error .= "<br/>";
7738 }
7739 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7740 }
7741 }
7742 }
7743 }
7744 }
7745
7746 /**
7747 * Affichage des messages et du formulaire
7748 */
7749 // Affichage du message de validation ou d'erreur
7750 if (isset($message) && isset($message_class) && $message != "") {
7751 $this->f->displayMessage($message_class, $message);
7752 }
7753 // Affichage du message d'erreur
7754 if(!empty($error)) {
7755 $this->f->displayMessage("error", $error);
7756 }
7757 // Affichage du message de validation de la saisie
7758 if ($nbLettres > 0) {
7759 //
7760 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7761 echo "\n<p>";
7762 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7763 echo "\n<span class=\"text\">";
7764 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7765 echo " : \n<br/><br/>";
7766 echo "\n<a class='om-prev-icon pdf-16'";
7767 echo "\n title=\""._("imprimer les AR")."\"";
7768 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7769 echo "\n target='_blank'>";
7770 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7771 echo "\n</a>";
7772 echo "\n</span>";
7773 echo "\n</p>";
7774 echo "\n<br/>\n";
7775 if ($isAccredited === true) {
7776 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7777 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7778 echo _('Dossiers concernés par ce traitement');
7779 echo "\n</legend>";
7780 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7781
7782 if ($hasHidden === true) {
7783 echo "\n<br/>";
7784 echo "\n<p>";
7785 echo "\n<span class='text'>";
7786 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.");
7787 echo "</span>";
7788 echo "\n</p>";
7789 echo "\n<br/>";
7790 }
7791 foreach ($dossierTab as $dossier) {
7792
7793 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7794 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7795 $code_datd = $inst_datd->getVal('code');
7796
7797 $obj = "dossier_instruction";
7798 if ($code_datd === 'REC' OR $code_datd === 'REG') {
7799 $obj = "dossier_contentieux_tous_recours";
7800 }
7801 if ($code_datd === 'IN') {
7802 $obj = "dossier_contentieux_toutes_infractions";
7803 }
7804
7805 echo "\n<div class=\"bloc group\">";
7806 echo "\n<div class=\"field field-type-text\">";
7807
7808 echo "\n<p>";
7809 echo "\n<span class='text'>";
7810 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7811 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7812 echo $dossier->getVal("dossier");
7813 echo "\">";
7814 echo "\n</a>";
7815
7816 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7817 echo " href=\"".OM_ROUTE_FORM."&obj=";
7818 echo $obj;
7819 echo "&action=3&idx=";
7820 echo $dossier->getVal("dossier");
7821 echo "\">";
7822 echo $dossier->getVal("dossier_libelle");
7823 echo "\n</a>";
7824 echo "\n</span>";
7825 echo "\n</p>";
7826
7827 echo "\n</div>";
7828 echo "\n</div>";
7829 }
7830 echo "\n</div>";
7831 echo "\n</fieldset>";
7832 }
7833 echo "\n</div>";
7834 echo "\n</div>";
7835 }
7836 // Ouverture du formulaire
7837 echo "\t<form";
7838 echo " method=\"post\"";
7839 echo " id=\"suivi_envoi_lettre_rar_form\"";
7840 echo " action=\"\"";
7841 echo ">\n";
7842 // Paramétrage des champs du formulaire
7843 $champs = array("date", "liste_code_barres_instruction");
7844 // Création d'un nouvel objet de type formulaire
7845 $form = $this->f->get_inst__om_formulaire(array(
7846 "validation" => 0,
7847 "maj" => 0,
7848 "champs" => $champs,
7849 ));
7850 // Paramétrage du champ date du formulaire
7851 $form->setLib("date", _("Date")."* :");
7852 $form->setType("date", "date");
7853 $form->setOnchange("date", "fdate(this)");
7854 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7855 $form->setTaille("date", 10);
7856 $form->setMax("date", 10);
7857 // Paramétrage du champ liste_code_barres_instruction du formulaire
7858 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7859 $form->setType("liste_code_barres_instruction", "textarea");
7860 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7861 $form->setTaille("liste_code_barres_instruction", 20);
7862 $form->setMax("liste_code_barres_instruction", 20);
7863 // Affichage du formulaire
7864 $form->entete();
7865 $form->afficher($champs, 0, false, false);
7866 $form->enpied();
7867 // Affichage du bouton
7868 echo "\t<div class=\"formControls\">\n";
7869 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7870 echo "\t</div>\n";
7871 // Fermeture du formulaire
7872 echo "\t</form>\n";
7873 }
7874
7875 /**
7876 * VIEW - view_suivi_mise_a_jour_des_dates.
7877 *
7878 * Vu pour mettre à jour les dates de suivi de l'instruction.
7879 *
7880 * @return void
7881 */
7882 function view_suivi_mise_a_jour_des_dates() {
7883 // Vérification de l'accessibilité sur l'élément
7884 $this->checkAccessibility();
7885
7886 // Récupération des valeur passées en POST ou GET
7887 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7888 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7889 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7890 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7891 } else {
7892 $type_mise_a_jour = "";
7893 }
7894 if($this->f->get_submitted_post_value('date') !== null) {
7895 $date = $this->f->get_submitted_post_value('date');
7896 } elseif($this->f->get_submitted_get_value('date') !== null) {
7897 $date = $this->f->get_submitted_get_value('date');
7898 } else {
7899 $date = "";
7900 }
7901 if($this->f->get_submitted_post_value('code_barres') !== null) {
7902 $code_barres = $this->f->get_submitted_post_value('code_barres');
7903 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7904 $code_barres = $this->f->get_submitted_get_value('code_barres');
7905 } else {
7906 $code_barres = "";
7907 }
7908 // Booléen permettant de définir si un enregistrement à eu lieu
7909 $correct = false;
7910 // Booléen permettant de définir si les dates peuvent êtres enregistrées
7911 $date_error = false;
7912 // Champs date à mettre à jour
7913 $liste_champs=array();
7914
7915 // Si le formulaire a été validé
7916 if ($this->f->get_submitted_post_value('validation') !== null) {
7917 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7918
7919 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7920 $group_clause = array();
7921 foreach ($_SESSION["groupe"] as $key => $value) {
7922 $group_clause[$key] = "(groupe.code = '".$key."'";
7923 if($value["confidentiel"] !== true) {
7924 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7925 }
7926 $group_clause[$key] .= ")";
7927 }
7928 $conditions = implode(" OR ", $group_clause);
7929 $groupFilter = " AND (" . $conditions . ")";
7930
7931 $qres = $this->f->get_all_results_from_db_query(
7932 sprintf(
7933 'SELECT
7934 instruction
7935 FROM
7936 %1$sinstruction
7937 INNER JOIN %1$sdossier
7938 ON dossier.dossier = instruction.dossier
7939 INNER JOIN %1$sdossier_instruction_type
7940 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7941 INNER JOIN %1$sdossier_autorisation_type_detaille
7942 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7943 INNER JOIN %1$sdossier_autorisation_type
7944 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7945 INNER JOIN %1$sgroupe
7946 ON dossier_autorisation_type.groupe = groupe.groupe
7947 WHERE
7948 code_barres = \'%2$s\'
7949 %3$s',
7950 DB_PREFIXE,
7951 $this->f->db->escapeSimple($code_barres),
7952 $groupFilter
7953 ),
7954 array(
7955 'origin' => __METHOD__
7956 )
7957 );
7958 if(count($qres['result']) === 1) {
7959 $liste_champs = explode(";", $type_mise_a_jour);
7960 $row = array_shift($qres['result']);
7961 $instr = $this->f->get_inst__om_dbform(array(
7962 "obj" => "instruction",
7963 "idx" => $row['instruction'],
7964 ));
7965 // Mise à jour des dates après l'écran de verification
7966 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7967 $valF = array();
7968 foreach($instr->champs as $id => $champ) {
7969 $valF[$champ] = $instr->val[$id];
7970 }
7971 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7972 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7973 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7974 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7975 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7976 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7977 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7978 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7979 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7980 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7981 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7982 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7983 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7984 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7985 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7986 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7987 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7988 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7989 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7990 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7991 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7992 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7993 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7994 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7995 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7996 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7997
7998 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7999 $valF[$maj_date]=$date;
8000 }
8001
8002 // Vérification de la finalisation du document
8003 // correspondant au code barres
8004 if($valF["om_final_instruction"] === 't' or
8005 $valF["lettretype"] == '') {
8006 $code_barres = "";
8007
8008 //Désactivation de l'autocommit
8009 $this->f->db->autoCommit(false);
8010
8011 //On modifie les valeurs de l'instruction
8012 $instr->setParameter('maj', 170);
8013 $instr->class_actions[170]["identifier"] =
8014 "mise à jour des dates (depuis le menu suivi des pièces)";
8015 $retour = $instr->modifier($valF);
8016
8017 //Si une erreur s'est produite, on défait les modifications
8018 //qui ont été faites
8019 if (!$retour){
8020 $instr->undoValidation();
8021 }
8022 //Sinon, on valide en base de données les modifications
8023 else {
8024 $this->f->db->commit();
8025 }
8026
8027 // Variable correct retourné depuis la classe instruction
8028 $correct = $instr->correct;
8029
8030 // Si la modification sur l'instruction a échoué
8031 if ($correct === false) {
8032
8033 // Message d'erreur de la classe instruction
8034 $error = $instr->msg;
8035 }
8036
8037 } else {
8038 // Indique que le traitement est en erreur
8039 $correct = false;
8040 // Message d'erreur
8041 $error = sprintf(_("Le document n'est pas finalise."),
8042 "<span class='bold'>".$code_barres."</span>");
8043 }
8044 } else {
8045 // Récupération des infos du dossier
8046 $qres = $this->f->get_all_results_from_db_query(
8047 sprintf(
8048 'SELECT
8049 dossier.dossier_libelle,
8050 evenement.libelle as evenement,
8051 autorite_competente.code as autorite_competente_code,
8052 autorite_competente.libelle as autorite_competente,
8053 evenement.type as evenement_type,
8054 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8055 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8056 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8057 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8058 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8059 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8060 FROM
8061 %1$sinstruction
8062 INNER JOIN %1$sdossier
8063 ON dossier.dossier=instruction.dossier
8064 LEFT JOIN %1$sautorite_competente
8065 ON dossier.autorite_competente=autorite_competente.autorite_competente
8066 INNER JOIN %1$sevenement
8067 ON instruction.evenement=evenement.evenement
8068 WHERE
8069 code_barres = \'%2$s\'',
8070 DB_PREFIXE,
8071 $this->f->db->escapeSimple($code_barres)
8072 ),
8073 array(
8074 "origin" => __METHOD__
8075 )
8076 );
8077 $infos = array_shift($qres['result']);
8078
8079 // Vérification de la non modification des dates de suivi
8080 foreach(explode(";", $type_mise_a_jour) as $champ) {
8081 if ($champ === 'date_envoi_controle_legalite') {
8082 if ($instr->is_sent_to_cl() === true) {
8083 $error = __("Les dates de suivis ne peuvent etre modifiees");
8084 $date_error = true;
8085 break;
8086 }
8087 }
8088 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8089 $error = _("Les dates de suivis ne peuvent etre modifiees");
8090 $date_error = true;
8091 break;
8092 }
8093 }
8094 }
8095 } else {
8096 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8097 }
8098
8099 } else {
8100 $error = _("Tous les champs doivent etre remplis.");
8101 }
8102 }
8103
8104 /**
8105 * Affichage des messages et du formulaire
8106 */
8107 // Affichage du message de validation ou d'erreur
8108 if (isset($message) && isset($message_class) && $message != "") {
8109 $this->f->displayMessage($message_class, $message);
8110 }
8111 // Affichage du message d'erreur
8112 if(!empty($error)) {
8113 $this->f->displayMessage("error", $error);
8114 }
8115
8116 // Affichage du message de validation de la saisie
8117 if($correct === true) {
8118 $this->f->displayMessage("ok", _("Saisie enregistree"));
8119 }
8120 // Ouverture du formulaire
8121 echo "\t<form";
8122 echo " method=\"post\"";
8123 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8124 echo " action=\"\"";
8125 echo ">\n";
8126 // Paramétrage des champs du formulaire
8127 if(isset($infos)) {
8128 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8129 , "autorite_competente", "date_envoi_signature",
8130 "date_retour_signature", "date_envoi_controle_legalite",
8131 "date_retour_controle_legalite", "date_envoi_rar",
8132 "date_retour_rar", "is_valid");
8133 } else {
8134 $champs = array("type_mise_a_jour", "date", "code_barres");
8135 }
8136 // Création d'un nouvel objet de type formulaire
8137 $form = $this->f->get_inst__om_formulaire(array(
8138 "validation" => 0,
8139 "maj" => 0,
8140 "champs" => $champs,
8141 ));
8142 // Paramétrage des champs du formulaire
8143 // Parametrage du champ type_mise_a_jour
8144 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8145 if(isset($infos)) {
8146 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8147
8148 } else {
8149 $form->setType("type_mise_a_jour", "select");
8150
8151 }
8152 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8153 $contenu = array();
8154
8155 $contenu[0][0] = "date_envoi_signature";
8156 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8157
8158 $contenu[0][1] = "date_retour_signature";
8159 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8160
8161 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8162 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8163
8164 $contenu[0][3] = "date_envoi_controle_legalite";
8165 $contenu[1][3] = _("date d'envoi au controle de legalite");
8166
8167 $contenu[0][4] = "date_retour_controle_legalite";
8168 $contenu[1][4] = _("date de retour de controle de legalite");
8169
8170 $contenu[0][5] = "date_retour_rar";
8171 $contenu[1][5] = __("date de notification du correspondant");
8172
8173 $form->setSelect("type_mise_a_jour", $contenu);
8174
8175 // Parametrage du champ date
8176 $form->setLib("date", _("Date")."* :");
8177 if(isset($infos)) {
8178 $form->setType("date", "hiddenstaticdate");
8179
8180 } else {
8181 $form->setType("date", "date");
8182 }
8183 $form->setVal("date", $date);
8184 $form->setTaille("date", 10);
8185 $form->setMax("date", 10);
8186
8187 // Parametrage du champ code_barres
8188 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8189 if(isset($infos)) {
8190 $form->setType("code_barres", "hiddenstatic");
8191 } else {
8192 $form->setType("code_barres", "text");
8193 }
8194 $form->setVal("code_barres", $code_barres);
8195 $form->setTaille("code_barres", 20);
8196 $form->setMax("code_barres", 20);
8197
8198 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8199 if(isset($infos)) {
8200
8201 // Tous les champs sont défini par defaut à static
8202 foreach ($infos as $key => $value) {
8203 $form->setType($key, "static");
8204 if(in_array($key, $liste_champs)) {
8205 $form->setVal($key, $date);
8206 } else {
8207 $form->setVal($key, $value);
8208 }
8209 }
8210
8211 // Les champs dont on viens de définir la valeur sont en gras
8212 foreach ($liste_champs as $value) {
8213 $form->setBloc($value,'DF',"",'bold');
8214 }
8215
8216 // Parametrage du champ dossier
8217 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8218 $form->setType("dossier_libelle", "static");
8219 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8220
8221 // Parametrage du champ evenement
8222 $form->setLib("evenement", _("evenement")." :");
8223 $form->setType("evenement", "static");
8224 $form->setVal("evenement", $infos['evenement']);
8225
8226 // Parametrage du champ autorite_competente
8227 $form->setLib("autorite_competente", _("Autorite competente")." :");
8228 $form->setType("autorite_competente", "static");
8229 $form->setVal("autorite_competente", $infos['autorite_competente']);
8230
8231 // Parametrage des libellés d'envoi avec AR
8232 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8233 $form->setLib("date_retour_rar", __("date_notification")." :");
8234
8235 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8236 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8237 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8238 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8239 // Configuration des libellé en fonction de l'autorité compétente
8240 if($infos['autorite_competente_code'] == 'ETAT') {
8241 $form->setType("date_envoi_controle_legalite", "hiddendate");
8242 $form->setType("date_retour_controle_legalite", "hiddendate");
8243 }
8244
8245 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8246 $form->setLib("is_valid", _("Valide")." :");
8247 $form->setType("is_valid", "hidden");
8248 $form->setVal("is_valid", 'true');
8249
8250 $form->setFieldset('dossier_libelle','D',_('Synthese'));
8251 $form->setFieldset('is_valid','F');
8252
8253 }
8254
8255
8256 // Création du fieldset regroupant les champs permettant la mise à jour des date
8257 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8258 $form->setFieldset('code_barres','F');
8259 // Affichage du formulaire
8260 $form->entete();
8261 $form->afficher($champs, 0, false, false);
8262 $form->enpied();
8263 // Affichage du bouton
8264 echo "\t<div class=\"formControls\">\n";
8265 //
8266 if(!$date_error) {
8267 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8268 }
8269 // Si pas sur l'écran de validation
8270 if(isset($infos)) {
8271 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8272 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8273 echo "\">Retour</a>";
8274 }
8275 echo "\t</div>\n";
8276 // Fermeture du formulaire
8277 echo "\t</form>\n";
8278 }
8279
8280 /**
8281 * [view_pdf_lettre_rar description]
8282 *
8283 * @return [type] [description]
8284 */
8285 function view_pdf_lettre_rar() {
8286 // Vérification de l'accessibilité sur l'élément
8287 $this->checkAccessibility();
8288 //
8289 $this->f->disableLog();
8290
8291 if($this->f->get_submitted_get_value('liste') != null) {
8292 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8293
8294 // Classe permettant la mise en page de l'édition pdf
8295 require_once "../obj/pdf_lettre_rar.class.php";
8296 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8297 // Initialisation de la mise en page
8298 $pdf_lettre_rar->init($this->f);
8299
8300 foreach ($listeCodeBarres as $code_barres) {
8301
8302 // On récupère le dossier
8303 $qres = $this->f->get_one_result_from_db_query(
8304 sprintf(
8305 'SELECT
8306 dossier
8307 FROM
8308 %1$sinstruction
8309 WHERE
8310 code_barres = \'%2$s\'',
8311 DB_PREFIXE,
8312 $this->f->db->escapeSimple($code_barres)
8313 ),
8314 array(
8315 "origin" => __METHOD__,
8316 )
8317 );
8318
8319 $inst_dossier = $this->f->get_inst__om_dbform(array(
8320 "obj" => "dossier",
8321 "idx" => $qres['result'],
8322 ));
8323
8324 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8325 $groupe = $inst_dossier->get_type_affichage_formulaire();
8326 switch ($groupe) {
8327 case 'CTX IN':
8328 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8329 break;
8330 case 'CTX RE':
8331 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8332 break;
8333 case 'ADS':
8334 case 'DPC':
8335 case 'CONSULTATION ENTRANTE':
8336 default:
8337 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8338 break;
8339 }
8340
8341 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8342 $qres = $this->f->get_all_results_from_db_query(
8343 sprintf(
8344 'SELECT
8345 dossier.dossier_libelle,
8346 evenement.type,
8347 count(lien_dossier_demandeur) as nbdemandeur,
8348 CASE
8349 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8350 THEN CONCAT(phase.code, \' - \', division.libelle)
8351 ELSE
8352 phase.code
8353 END AS code_phase
8354 FROM
8355 %1$sinstruction
8356 LEFT JOIN %1$sdossier
8357 ON instruction.dossier = dossier.dossier
8358 LEFT JOIN %1$sdivision
8359 ON dossier.division = division.division
8360 INNER JOIN %1$sevenement
8361 ON instruction.evenement=evenement.evenement
8362 LEFT JOIN %1$sphase
8363 ON evenement.phase = phase.phase
8364 inner JOIN %1$slien_dossier_demandeur
8365 ON instruction.dossier=lien_dossier_demandeur.dossier
8366 inner join %1$sdemandeur
8367 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8368 WHERE
8369 code_barres = \'%2$s\'
8370 AND %3$s
8371 GROUP BY
8372 dossier.dossier_libelle,
8373 evenement.type,
8374 phase.code,
8375 division.libelle',
8376 DB_PREFIXE,
8377 $this->f->db->escapeSimple($code_barres),
8378 $sql_demandeur
8379 ),
8380 array(
8381 "origin" => __METHOD__
8382 )
8383 );
8384 $testDemandeur = array_shift($qres['result']);
8385
8386
8387 // Recuperation de l'adresse de destination
8388 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8389 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8390 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8391 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8392 }
8393
8394 $qres = $this->f->get_all_results_from_db_query(
8395 sprintf(
8396 'SELECT
8397 CASE WHEN demandeur.qualite = \'particulier\'
8398 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8399 ELSE TRIM(demandeur.personne_morale_denomination)
8400 END as ligne1,
8401 CASE WHEN demandeur.qualite = \'personne_morale\'
8402 THEN TRIM(demandeur.personne_morale_raison_sociale)
8403 ELSE \'\'
8404 END as ligne1_1,
8405 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8406 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8407 ELSE \'\'
8408 END as ligne1_2,
8409 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8410 CASE demandeur.complement
8411 WHEN null THEN \'\'
8412 ELSE trim(demandeur.complement)
8413 END as ligne3,
8414 CASE demandeur.lieu_dit
8415 WHEN null THEN \'\'
8416 ELSE trim(demandeur.lieu_dit)
8417 END as ligne4,
8418 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8419 (CASE WHEN demandeur.bp IS NOT NULL
8420 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8421 ELSE \'\'
8422 END),
8423 (CASE WHEN demandeur.cedex IS NOT NULL
8424 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8425 ELSE \'\'
8426 END))
8427 as ligne5,
8428 code_barres as code_barres
8429 FROM
8430 %1$sinstruction
8431 INNER JOIN %1$sdossier
8432 ON dossier.dossier = instruction.dossier
8433 INNER JOIN %1$slien_dossier_demandeur
8434 ON dossier.dossier = lien_dossier_demandeur.dossier
8435 INNER JOIN %1$sdemandeur
8436 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8437 LEFT OUTER JOIN %1$scivilite AS pc
8438 ON demandeur.particulier_civilite = pc.civilite
8439 OR demandeur.personne_morale_civilite = pc.civilite
8440 WHERE
8441 instruction.code_barres = \'%2$s\'
8442 %3$s',
8443 DB_PREFIXE,
8444 $this->f->db->escapeSimple($code_barres),
8445 $sqlAdresse
8446 ),
8447 array(
8448 "origin" => __METHOD__
8449 )
8450 );
8451 $adresse_dest = array_shift($qres['result']);
8452
8453 // Création adresse destinataire sans ligne vide
8454 $adresse_destinataire = array();
8455 if (!empty($adresse_dest['ligne1'])) {
8456 $adresse_destinataire[] = $adresse_dest['ligne1'];
8457 }
8458 if (!empty($adresse_dest['ligne1_1'])) {
8459 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8460 }
8461 if (!empty($adresse_dest['ligne1_2'])) {
8462 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8463 }
8464 $adresse_destinataire[] = $adresse_dest['ligne2'];
8465 if (!empty($adresse_dest['ligne3'])) {
8466 $adresse_destinataire[] = $adresse_dest['ligne3'];
8467 }
8468 if (!empty($adresse_dest['ligne4'])) {
8469 $adresse_destinataire[] = $adresse_dest['ligne4'];
8470 }
8471 $adresse_destinataire[] = $adresse_dest['ligne5'];
8472
8473 // Création du champ specifique
8474 $specifique_content = array();
8475 $specifique_content[] = $adresse_dest['ligne1'];
8476 $specifique_content[] = $adresse_dest['ligne1_1'];
8477 $specifique_content[] = $adresse_dest['ligne1_2'];
8478 $specifique_content[] = $testDemandeur['dossier_libelle'];
8479 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8480 unset($adresse_dest['code_barres']);
8481 // Ajout d'une page aux pdf
8482 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8483
8484 }
8485 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8486 $om_edition = $this->f->get_inst__om_edition();
8487 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8488 }
8489 }
8490
8491 /**
8492 * VIEW - view_bordereau_envoi_maire.
8493 *
8494 * Formulaire demandant :
8495 * - le code-barres de l'événement d'instruction
8496 * - la date d'envoi du courrier pour signature par le maire
8497 *
8498 * Lors de la validation :
8499 * => met à jour cette date dans l'événement d'instruction
8500 * => crée un lien permettant de générer en PDF le bordereau
8501 *
8502 * @return void
8503 */
8504 function view_bordereau_envoi_maire() {
8505 // Vérification de l'accessibilité sur l'élément
8506 $this->checkAccessibility();
8507
8508 // Récupération des valeur passées en POST ou GET
8509 $code_barres = "";
8510 if($this->f->get_submitted_post_value('code_barres') !== null) {
8511 $code_barres = $this->f->get_submitted_post_value('code_barres');
8512 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8513 $code_barres = $this->f->get_submitted_get_value('code_barres');
8514 }
8515 $date = "";
8516 if($this->f->get_submitted_post_value('date') !== null) {
8517 $date = $this->f->get_submitted_post_value('date');
8518 } elseif($this->f->get_submitted_get_value('date') !== null) {
8519 $date = $this->f->get_submitted_get_value('date');
8520 }
8521 $validation = 0;
8522 if($this->f->get_submitted_post_value('validation') !== null) {
8523 $validation = $this->f->get_submitted_post_value('validation');
8524 } elseif($this->f->get_submitted_get_value('validation') !== null) {
8525 $validation = $this->f->get_submitted_get_value('validation');
8526 }
8527
8528 // Si le formulaire a été validé
8529 if ($this->f->get_submitted_post_value('validation') !== null) {
8530 // Tous les champs doivent obligatoirement être remplis
8531 if (!empty($date) && !empty($code_barres)) {
8532 $date_en = $this->dateDB($date);
8533 // Si date valide
8534 if ($date_en != "") {
8535 $id_instruction = $this->get_instruction_by_barcode($code_barres);
8536 // Si un événement d'instruction a été trouvé pour ce code-barres
8537 if ($id_instruction !== null) {
8538 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8539 // Si mise à jour réussie de la date d'envoi du courrier
8540 // pour signature par l'autorité compétente
8541 if($ret === true) {
8542 // Message de validation avec lien PDF
8543 $message_class = "valid";
8544 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8545 $message .= " : <br/><br/>";
8546 $message .= "<a class='om-prev-icon pdf-16'";
8547 $message .= " id=\"generer_bordereau_envoi_maire\"";
8548 $message .= " title=\""._("Bordereau")."\"";
8549 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8550 $message .= "&action=200";
8551 $message .= "&idx=".$id_instruction."'";
8552 $message .= " target='_blank'>";
8553 $message .= _("Bordereau d'envoi au maire");
8554 $message .= "</a><br/><br/>";
8555 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8556 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8557 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8558
8559 } else {
8560 // Message d'erreur
8561 $message_class = "error";
8562 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8563 $code_barres);
8564 }
8565 }
8566 else {
8567 $message_class = "error";
8568 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8569 }
8570 }
8571 else {
8572 $message_class = "error";
8573 $message = _("La date est invalide.");
8574 }
8575 } else {
8576 $message_class = "error";
8577 $message = _("Tous les champs doivent etre remplis.");
8578 }
8579 }
8580
8581 /**
8582 * Affichage des messages et du formulaire
8583 */
8584
8585 // Affichage du message de validation ou d'erreur
8586 if (isset($message) && isset($message_class) && $message != "") {
8587 $this->f->displayMessage($message_class, $message);
8588 }
8589
8590 // Ouverture du formulaire
8591 $datasubmit = $this->getDataSubmit();
8592 echo "\n<!-- ########## START DBFORM ########## -->\n";
8593 echo "<form";
8594 echo " id=\"bordereau_envoi_maire\"";
8595 echo " method=\"post\"";
8596 echo " name=\"f1\"";
8597 echo " action=\"";
8598 echo $datasubmit;
8599 echo "\"";
8600 echo ">\n";
8601
8602 // Paramétrage des champs du formulaire
8603 $champs = array("code_barres","date");
8604
8605 // Création d'un nouvel objet de type formulaire
8606 $form = $this->f->get_inst__om_formulaire(array(
8607 "validation" => 0,
8608 "maj" => 0,
8609 "champs" => $champs,
8610 ));
8611
8612 $template_required_label = '%s *';
8613 // Parametrage du champ code_barres
8614 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8615 $form->setType("code_barres", "text");
8616 $form->setVal("code_barres", $code_barres);
8617 $form->setTaille("code_barres", 20);
8618 $form->setMax("code_barres", 20);
8619 // Parametrage du champ date
8620 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8621 $form->setType("date", "date") ;
8622 if (empty($date)) {
8623 $date = date('d/m/Y');
8624 }
8625 $form->setVal("date", $date);
8626 $form->setTaille("date", 10);
8627 $form->setMax("date", 10);
8628
8629 // Création du bloc regroupant les champs
8630 $form->setBloc('code_barres','D');
8631 $form->setBloc('date','F');
8632 // Affichage du formulaire
8633 $form->entete();
8634 $form->afficher($champs, 0, false, false);
8635 $form->enpied();
8636 // Affichage du bouton
8637 printf("\t<div class=\"formControls\">\n");
8638 //
8639 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8640 printf("\t</div>\n");
8641 // Fermeture du formulaire
8642 printf("\t</form>\n");
8643 }
8644
8645 /**
8646 * VIEW - view_bordereau_envoi_maire.
8647 *
8648 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8649 *
8650 * @return [void]
8651 */
8652 function view_generate_bordereau_envoi_maire() {
8653 // Vérification de l'accessibilité sur l'élément
8654 $this->checkAccessibility();
8655 // Récupération de la collectivité du dossier d'instruction
8656 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8657 // Récupération de ses paramètres
8658 $collectivite = $this->f->getCollectivite($collectivite_di);
8659 // Génération du PDF
8660 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8661 // Affichage du PDF
8662 $this->expose_pdf_output(
8663 $result['pdf_output'],
8664 $result['filename']
8665 );
8666 }
8667
8668 /**
8669 * VIEW - view_rapport_instruction.
8670 *
8671 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8672 * Cette action est bindée pour utiliser la fonction popUpIt.
8673 *
8674 * @return void
8675 */
8676 function view_overlay_notification_manuelle() {
8677
8678 // Vérification de l'accessibilité sur l'élément
8679 $this->checkAccessibility();
8680
8681 printf(
8682 '<script type="text/javascript" >
8683 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8684 </script>',
8685 'instruction_notification_manuelle',
8686 OM_ROUTE_SOUSFORM,
8687 $this->getVal($this->clePrimaire),
8688 $this->getVal('dossier')
8689 );
8690 }
8691
8692 /**
8693 * VIEW - view_overlay_notification_service_consulte.
8694 *
8695 * Ouvre le sous-formulaire de notification des services consulte
8696 * en ajaxIt dans un overlay.
8697 * Cette action est bindée pour utiliser la fonction popUpIt.
8698 *
8699 * @return void
8700 */
8701 function view_overlay_notification_service_consulte() {
8702
8703 // Vérification de l'accessibilité sur l'élément
8704 $this->checkAccessibility();
8705
8706 printf(
8707 '<script type="text/javascript" >
8708 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8709 </script>',
8710 'instruction_notification_manuelle',
8711 OM_ROUTE_SOUSFORM,
8712 $this->getVal($this->clePrimaire),
8713 $this->getVal('dossier')
8714 );
8715 }
8716
8717 /**
8718 * VIEW - overlay_notification_tiers_consulte.
8719 *
8720 * Ouvre le sous-formulaire de notification des tiers consulte
8721 * en ajaxIt dans un overlay.
8722 * Cette action est bindée pour utiliser la fonction popUpIt.
8723 *
8724 * @return void
8725 */
8726 function view_overlay_notification_tiers_consulte() {
8727
8728 // Vérification de l'accessibilité sur l'élément
8729 $this->checkAccessibility();
8730
8731 printf(
8732 '<script type="text/javascript" >
8733 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8734 </script>',
8735 'instruction_notification_manuelle',
8736 OM_ROUTE_SOUSFORM,
8737 $this->getVal($this->clePrimaire),
8738 $this->getVal('dossier')
8739 );
8740 }
8741
8742 /**
8743 * VIEW - view_modale_selection_document_signe
8744 *
8745 * Ouvre le sous-formulaire de notification des services consulte
8746 * en ajaxIt dans un overlay.
8747 * Cette action est bindée pour utiliser la fonction popUpIt.
8748 *
8749 * @return void
8750 */
8751 function view_modale_selection_document_signe() {
8752
8753 // Vérification de l'accessibilité sur l'élément
8754 $this->checkAccessibility();
8755
8756 printf(
8757 '<script type="text/javascript" >
8758 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8759 </script>',
8760 'instruction_modale',
8761 OM_ROUTE_SOUSFORM,
8762 $this->getVal($this->clePrimaire),
8763 $this->getVal('dossier')
8764 );
8765 }
8766
8767 /**
8768 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8769 * pour exclure les dossiers du groupe contentieux.
8770 *
8771 * @param [string] $barcode numéro du code-barres
8772 * @return [mixed] ID de son instruction ou null si aucun code
8773 */
8774 function get_instruction_by_barcode($barcode) {
8775 // Begin
8776 $this->begin_treatment(__METHOD__);
8777
8778 // Vérification de l'existence de l'événement d'instruction
8779 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8780 $qres = $this->f->get_one_result_from_db_query(
8781 sprintf(
8782 'SELECT
8783 instruction
8784 FROM
8785 %1$sinstruction
8786 INNER JOIN %1$sdossier
8787 ON dossier.dossier=instruction.dossier
8788 INNER JOIN %1$sdossier_instruction_type
8789 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8790 INNER JOIN %1$sdossier_autorisation_type_detaille
8791 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8792 INNER JOIN %1$sdossier_autorisation_type
8793 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8794 INNER JOIN %1$sgroupe
8795 ON dossier_autorisation_type.groupe = groupe.groupe
8796 AND groupe.code != \'CTX\'
8797 WHERE
8798 code_barres = \'%2$s\'',
8799 DB_PREFIXE,
8800 $this->f->db->escapeSimple($barcode)
8801 ),
8802 array(
8803 "origin" => __METHOD__,
8804 )
8805 );
8806
8807 // Retourne résultat
8808 return $this->end_treatment(__METHOD__, $qres['result']);
8809 }
8810
8811 /**
8812 * Met à jour le champ date d'envoi signature
8813 * avec la date fournie et pour l'instruction donnée
8814 *
8815 * @param [string] $id ID de l'événement d'instruction
8816 * @param [string] $date date au format EN
8817 * @return [boolean] true si mise à jour avec succès
8818 */
8819 function update_date_envoi_signature($id, $date) {
8820 // Préparation du tableau
8821 $valF = array();
8822 $valF['date_envoi_signature'] = $date;
8823 // Begin
8824 $this->begin_treatment(__METHOD__);
8825 // Requête
8826 $res = $this->f->db->autoexecute(
8827 DB_PREFIXE.$this->table,
8828 $valF,
8829 DB_AUTOQUERY_UPDATE,
8830 $this->getCle($id)
8831 );
8832 $this->addToLog(
8833 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8834 VERBOSE_MODE
8835 );
8836 if ($this->f->isDatabaseError($res, true) !== false) {
8837 $this->end_treatment(__METHOD__, false);
8838 }
8839 //
8840 return $this->end_treatment(__METHOD__, true);
8841 }
8842
8843 /**
8844 * Méthode permettant de définir des valeurs à envoyer en base après
8845 * validation du formulaire d'ajout.
8846 * @param array $val tableau des valeurs retournées par le formulaire
8847 */
8848 function setValFAjout($val = array()) {
8849 // Mise à jour du flag created_by_commune lors d'un changement de décision
8850 // par un utilisateur de commune sur un dossier instruit par la comcom
8851 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8852 $this->valF['created_by_commune'] = true;
8853 }
8854
8855 //
8856 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8857 if (isset($this->valF['flag_edition_integrale']) === true) {
8858 unset($this->valF['flag_edition_integrale']);
8859 }
8860 if (isset($this->valF['signataire_arrete']) === true) {
8861 unset($this->valF['signataire_arrete']);
8862 }
8863 }
8864 }
8865
8866
8867 /**
8868 * Récupère l'instance d'un événement de workflow.
8869 *
8870 * @param mixed $evenement Identifiant de l'événement.
8871 *
8872 * @return object
8873 */
8874 function get_inst_evenement($evenement = null) {
8875 //
8876 return $this->get_inst_common("evenement", $evenement);
8877 }
8878
8879 /**
8880 * Logue l'action de l'instruction dans son DI.
8881 *
8882 * @param string $id Clé primaire de l'instruction.
8883 * @param array $val Valeurs de l'instruction.
8884 *
8885 * @return bool Vrai si traitement effectué avec succès
8886 */
8887 private function add_log_to_dossier($id, array $val) {
8888 $maj = $this->getParameter("maj");
8889 // Action = Trace par défaut
8890 $action = $this->get_backtrace();
8891 // Action = Identifant de l'action si contexte connu
8892 if (empty($maj) === false
8893 || (empty($maj) === true && $maj === 0)) {
8894 $action = $this->get_action_param($maj, 'identifier');
8895 if ($action === 'modifier_suivi') {
8896 $action = "modifier (via l'action suivi des dates)";
8897 }
8898 if ($action === 'notifier_commune'
8899 && isset($val['mails_destinataires']) === true) {
8900 $action = "notification de la commune (courriels : ";
8901 $action .= $val['mails_destinataires'].")";
8902 }
8903 }
8904 // Création du log
8905 $log = array(
8906 'date' => date('Y-m-d H:i:s'),
8907 'user' => $_SESSION['login'],
8908 'action' => $action,
8909 'values' => array(
8910 'date_evenement' => $this->dateDB($val['date_evenement']),
8911 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8912 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8913 'evenement' => $val['evenement'],
8914 'action' => $val['action'],
8915 'instruction' => $id,
8916 'etat' => $val['etat'],
8917 ),
8918 );
8919 // Ajout du log
8920 $di = $this->get_inst_dossier($val['dossier']);
8921 $ret = $di->add_log_instructions($log);
8922 if ($ret === false) {
8923 $this->correct = false;
8924 $this->msg = '';
8925 $this->addToMessage($di->msg);
8926 }
8927 return $ret;
8928 }
8929
8930
8931 /**
8932 * Retourne le contexte de déboguage formaté en HTML.
8933 *
8934 * @return string Une ligne par trace
8935 */
8936 private function get_backtrace() {
8937 $trace = debug_backtrace();
8938 $backtrace = '';
8939 $i = 1;
8940 foreach ($trace as $key => $value) {
8941 $func = $trace[$key]['function'];
8942 // On ne s'autolog pas
8943 if ($func === 'get_backtrace'
8944 || $func === 'add_log_to_dossier') {
8945 continue;
8946 }
8947 $backtrace .= $i.') ';
8948 // Si dans une classe
8949 if (isset($trace[$key]['class']) === true
8950 && empty($trace[$key]['class']) === false) {
8951 $backtrace .= $trace[$key]['class'].'->'.$func;
8952 }
8953 // Si procédural
8954 else {
8955 $file = $trace[$key]['file'];
8956 $line = $trace[$key]['line'];
8957 $truncated_file = $this->f->get_relative_path($file);
8958 if ($truncated_file !== false) {
8959 $file = $truncated_file;
8960 }
8961 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8962 }
8963 $backtrace .= '<br/>';
8964 $i++;
8965 }
8966 return $backtrace;
8967 }
8968
8969 /**
8970 * CONDITION - is_notifiable.
8971 *
8972 * Condition pour afficher l'action notifier_commune.
8973 *
8974 * @return boolean
8975 */
8976 public function is_notifiable() {
8977 // L'instruction doit être finalisée, ce qui revient à dire
8978 // définalisable sans bypass
8979 if ($this->is_unfinalizable_without_bypass() === false) {
8980 return false;
8981 }
8982 // La collectivité de l'utilisateur doit être de niveau multi
8983 if ($this->f->has_collectivite_multi() === false) {
8984 return false;
8985 }
8986 // Le paramètre multi de l'objet du courriel doit exister
8987 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8988 return false;
8989 }
8990 // Le paramètre multi du modèle du courriel doit exister
8991 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8992 return false;
8993 }
8994 // A ce stade toutes les conditions sont satisfaites
8995 return true;
8996 }
8997
8998 /**
8999 * TREATMENT - notifier_commune.
9000 *
9001 * Notifie aux communes et par courriel la finalisation d'une instruction.
9002 *
9003 * @return boolean
9004 */
9005 public function notifier_commune() {
9006 // Cette méthode permet d'exécuter une routine en début des méthodes
9007 // dites de TREATMENT.
9008 $this->begin_treatment(__METHOD__);
9009 $message = __('Erreur de paramétrage :');
9010 $erreurParametrage = false;
9011 // Récupération du paramétrage de la collectivité du dossier
9012 $id_di = $this->getVal('dossier');
9013 $di = $this->get_inst_dossier($id_di);
9014 $collectivite_di = $di->getVal('om_collectivite');
9015 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9016 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9017 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9018 $erreurParametrage = true;
9019 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9020 }
9021
9022 // Récupération de la liste des mails
9023 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9024 if (empty($adresses)) {
9025 $erreurParametrage = true;
9026 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9027 }
9028
9029 // Vérification du paramétrage des mails
9030 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9031 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9032 $erreurParametrage = true;
9033 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9034 }
9035 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9036 $erreurParametrage = true;
9037 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9038 }
9039
9040 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9041 // un message a destination de l'utilisateur est affiché
9042 if ($erreurParametrage) {
9043 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9044 $this->addToMessage($message);
9045 return $this->end_treatment(__METHOD__, false);
9046 }
9047
9048 // Création d'un notification et de sa tâche associé pour chaque mail
9049 foreach ($adresses as $adresse) {
9050 // Ajout de la notif et récupération de son id
9051 $destinataire = array(
9052 'destinataire' => $adresse,
9053 'courriel' => $adresse
9054 );
9055 $idNotif = $this->ajouter_notification(
9056 $this->getVal($this->clePrimaire),
9057 $this->f->get_connected_user_login_name(),
9058 $destinataire,
9059 $collectivite_di
9060 );
9061 if ($idNotif === false) {
9062 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9063 return $this->end_treatment(__METHOD__, false);
9064 }
9065 // Création de la tache en lui donnant l'id de la notification
9066 $notification_by_task = $this->notification_by_task(
9067 $idNotif,
9068 $this->getVal('dossier'),
9069 'mail',
9070 'notification_commune'
9071 );
9072 if ($notification_by_task === false) {
9073 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9074 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9075 return $this->end_treatment(__METHOD__, false);
9076 }
9077 }
9078 $this->addToMessage(__('La commune a été notifiée.'));
9079 return $this->end_treatment(__METHOD__, true);
9080 }
9081
9082 /**
9083 * Récupère l'instance de l'instructeur
9084 *
9085 * @param integer $instructeur Identifiant de l'instructeur.
9086 *
9087 * @return object
9088 */
9089 protected function get_inst_instructeur($instructeur) {
9090 //
9091 return $this->get_inst_common("instructeur", $instructeur);
9092 }
9093
9094
9095 /**
9096 * Récupère l'instance de l'utilisateur
9097 *
9098 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9099 *
9100 * @return object
9101 */
9102 protected function get_inst_om_utilisateur($om_utilisateur) {
9103 //
9104 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9105 }
9106
9107
9108 /**
9109 * Récupère l'instance de la division.
9110 *
9111 * @param integer $division Identifiant de la division.
9112 *
9113 * @return object
9114 */
9115 protected function get_inst_division($division) {
9116 //
9117 return $this->get_inst_common("division", $division);
9118 }
9119
9120
9121 /**
9122 * Récupère l'instance de la direction.
9123 *
9124 * @param integer $direction Identifiant de la direction.
9125 *
9126 * @return object
9127 */
9128 protected function get_inst_direction($direction) {
9129 //
9130 return $this->get_inst_common("direction", $direction);
9131 }
9132
9133
9134 /**
9135 * Récupère la collectivité d'un instructeur en passant par sa division puis
9136 * par sa direction.
9137 *
9138 * @param integer $instructeur Identifiant de l'instructeur.
9139 *
9140 * @return integer
9141 */
9142 protected function get_instructeur_om_collectivite($instructeur) {
9143 // Chemin vers la collectivité d'un instructeur
9144 $inst_instr = $this->get_inst_instructeur($instructeur);
9145 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9146 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9147
9148 // Collectivité
9149 $om_collectivite = $inst_direction->getVal('om_collectivite');
9150
9151 //
9152 return $om_collectivite;
9153 }
9154
9155 /*
9156 * CONDITION - can_user_access_dossier_contexte_ajout
9157 *
9158 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9159 * formulaire d'ajout.
9160 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9161 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9162 *
9163 */
9164 function can_user_access_dossier_contexte_ajout() {
9165
9166 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9167 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9168 //
9169 if ($id_dossier !== "") {
9170 $dossier = $this->f->get_inst__om_dbform(array(
9171 "obj" => "dossier_instruction",
9172 "idx" => $id_dossier,
9173 ));
9174 //
9175 return $dossier->can_user_access_dossier();
9176 }
9177 return false;
9178 }
9179
9180 /*
9181 * CONDITION - can_user_access_dossier
9182 *
9183 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9184 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9185 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9186 *
9187 */
9188 function can_user_access_dossier_contexte_modification() {
9189
9190 $id_dossier = $this->getVal('dossier');
9191 //
9192 if ($id_dossier !== "" && $id_dossier !== null) {
9193 $dossier = $this->f->get_inst__om_dbform(array(
9194 "obj" => "dossier_instruction",
9195 "idx" => $id_dossier,
9196 ));
9197 //
9198 return $dossier->can_user_access_dossier();
9199 }
9200 return false;
9201 }
9202
9203 /**
9204 * TREATMENT - envoyer_a_signature_sans_relecture
9205 *
9206 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9207 *
9208 * @return boolean true si l'envoi a été effectué avec succès false sinon
9209 */
9210 function envoyer_a_signature_sans_relecture() {
9211 return $this->envoyer_a_signature();
9212 }
9213
9214 /**
9215 * TREATMENT - envoyer_a_signature_avec_relecture
9216 *
9217 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9218 *
9219 * @return boolean true si l'envoi a été effectué avec succès false sinon
9220 */
9221 function envoyer_a_signature_avec_relecture() {
9222 $is_forced_view_files = true;
9223 return $this->envoyer_a_signature($is_forced_view_files);
9224 }
9225
9226 /**
9227 * TREATMENT - envoyer_a_signature
9228 *
9229 * Permet d'envoyer le document de l'instruction au parapheur pour signature
9230 *
9231 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9232 *
9233 * @return boolean true si l'envoi a été effectué avec succès false sinon
9234 */
9235 function envoyer_a_signature($is_forced_view_files = false) {
9236 $this->begin_treatment(__METHOD__);
9237 $this->correct = true;
9238
9239 // Instanciation de l'objet signataire_arrete
9240 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9241 'obj' => 'signataire_arrete',
9242 'idx' => $this->getVal('signataire_arrete'),
9243 ));
9244
9245 // Instanciation de l'objet dossier
9246 $inst_dossier = $this->f->get_inst__om_dbform(array(
9247 'obj' => 'dossier',
9248 'idx' => $this->getVal('dossier'),
9249 ));
9250
9251 //Instanciation de la classe electronicsignature
9252 $inst_es = $this->get_electronicsignature_instance();
9253 if ($inst_es === false) {
9254 $this->correct = false;
9255 return $this->end_treatment(__METHOD__, false);
9256 }
9257
9258 // Vérifie si la notification se fait via l'application ou via le parapheur
9259 try {
9260 $notification_required = $inst_es->signer_notification_is_delegated();
9261 } catch(electronicsignature_connector_method_not_implemented_exception $_) {
9262 // Si la méthode n'existe pas, on considère que la notification est faite par le parapheur
9263 $notification_required = false;
9264 }
9265
9266 // Si la notification est faite par l'application vérifie que l'adresse mail du
9267 // signataire est correcte. Si ce n'est pas le cas le document n'est pas envoyé
9268 // au parapheur car il ne sera pas accessible sans le lien transmis dans la
9269 // notification
9270 if ($notification_required === true) {
9271 $signer_mail = $inst_signataire_arrete->getVal('email');
9272 $signer_name = trim($inst_signataire_arrete->getVal('prenom').' '.$inst_signataire_arrete->getVal('nom'));
9273
9274 $err_msg = __('Le document n\'a pas pu être envoyé en signature car ');
9275
9276 if (empty($signer_mail)) {
9277 $this->correct = false;
9278 $err_detail = sprintf(__("l'email du signataire '%s' est vide."), $signer_name);
9279 $this->addToMessage($err_msg.$err_detail);
9280 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9281 return $this->end_treatment(__METHOD__, false);
9282 }
9283 if (! $this->f->checkValidEmailAddress($signer_mail)) {
9284 $this->correct = false;
9285 $err_detail = sprintf(__("l'email du signataire '%s' est invalide (%s)."), $signer_name, $signer_mail);
9286 $this->addToMessage($err_msg.$err_detail);
9287 $this->addToLog(__METHOD__.$err_msg.$err_detail.' Instruction : '.$this->getVal($this->clePrimaire), DEBUG_MODE);
9288 return $this->end_treatment(__METHOD__, false);
9289 }
9290 }
9291
9292 // Récupération du document à signer
9293 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9294 if ($file === OP_FAILURE) {
9295 $this->correct = false;
9296 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9297 // Termine le traitement
9298 return $this->end_treatment(__METHOD__, false);
9299 }
9300
9301 // Initialisation des paramètre à passer pour l'envoi en signature
9302 $data = array(
9303 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9304 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9305 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9306 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9307 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9308 // Permet d'envoyer en signature l'instruction le jour de la date limite
9309 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9310 "dossier" => $this->getVal('dossier'),
9311 "is_forced_view_files" => $is_forced_view_files,
9312 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9313 );
9314
9315 // Initialisation des métadonnées
9316 $metadonnee_dossier = $file['metadata'];
9317 // récupération de l'extension du fichier
9318 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9319 // Modification du libellé du document transmis au parapheur
9320 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9321 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9322 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9323
9324 $metadonnee_dossier['url_di'] = sprintf(
9325 '%1$sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&idx=%2$s&direct_field=dossier&direct_form=document_numerise&direct_action=4&direct_idx=%2$s',
9326 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9327 $this->getVal('dossier')
9328 );
9329
9330 $optional_data = null;
9331 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9332 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9333 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9334 if (json_last_error() !== JSON_ERROR_NONE) {
9335 $this->correct = false;
9336 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9337 $this->addToLog(__METHOD__."(): ".
9338 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9339 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9340 );
9341 // Termine le traitement
9342 return $this->end_treatment(__METHOD__, false);
9343 }
9344 }
9345
9346 // Appel de la méthode de l'abstracteur send_for_signature()
9347 // Cette méthode doit retourner un tableau de valeur
9348 try {
9349 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9350 } catch (electronicsignature_exception $e) {
9351 $this->handle_electronicsignature_exception($e);
9352 return $this->end_treatment(__METHOD__, false);
9353 }
9354
9355 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9356 $valF = array();
9357
9358 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9359 foreach($this->champs as $identifiant => $champ) {
9360 $valF[$champ] = $this->val[$identifiant];
9361 }
9362 // On fait ensuite nos modifications spécifiques
9363 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9364 $valF['statut_signature'] = $result['statut'];
9365 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9366 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9367 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9368 $valF['parapheur_lien_page_signature'] = isset($result['signature_page_url']) ? $result['signature_page_url'] : null;
9369 $ret = $this->modifier($valF);
9370
9371 if ($ret === false) {
9372 $this->correct = false;
9373 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9374 // Termine le traitement
9375 return $this->end_treatment(__METHOD__, false);
9376 }
9377
9378 // Notification du signataire
9379 if ($notification_required === true) {
9380 if ($this->notify_signer($signer_name, $signer_mail, $data['om_utilisateur_nom']) === false) {
9381 $msg = __("Une erreur s'est produite lors de la notification du signataire \"%s (%s)\". Annulation de l'envoi pour signature du document%s.");
9382 $this->addToMessage(sprintf($msg, $signer_name, $signer_mail, ''));
9383 $this->addToLog(sprintf($msg, $signer_name, $signer_mail, ' : '.$this->getVal($this->clePrimaire)), DEBUG_MODE);
9384 // Met à jour les valeurs de l'objet courant pour prendre en compte les modifications faites
9385 // precedemment
9386 $this->init_record_data($this->getVal($this->clePrimaire));
9387 $this->annuler_envoi_en_signature();
9388 $this->correct = false;
9389 return $this->end_treatment(__METHOD__, true);
9390 }
9391 }
9392
9393 // Message
9394 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9395 if ($this->f->is_option_enabled('option_afficher_lien_parapheur') === true
9396 && array_key_exists('signature_page_url', $result) === true) {
9397 $this->addToMessage(sprintf(
9398 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9399 $result['signature_page_url'],
9400 __("Signez directement le document")
9401 ));
9402 }
9403 if ($notification_required !== true) {
9404 $this->addToMessage(__("L'envoi de la notification au signataire est effectué par la plateforme."));
9405 }
9406
9407 // Tout s'est bien passé, on termine le traitement
9408 return $this->end_treatment(__METHOD__, true);
9409 }
9410
9411 /**
9412 * Notifie le signataire d'un document à signer.
9413 * Gère l'affichage des messages à destination de l'utilisateur selon l'état du traitement.
9414 * En cas d'erreur ajoute une ligne dans les logs de l'application.
9415 *
9416 * @param string $signer_name Nom du signataire
9417 * @param string $signer_mail Mail du signataire
9418 * @param string $user_name Nom de l'utilisateur openADS courant
9419 *
9420 * @return boolean true si succés, false si erreur
9421 */
9422 protected function notify_signer($signer_name, $signer_mail, $user_name) {
9423 // message d'erreur
9424 $err_msg_log = sprintf(
9425 __("Échec de la notification du signataire \"%s (%s)\" lors de l'envoi au parapaheur du document de l'instruction : %s"),
9426 $signer_name,
9427 $signer_mail,
9428 $this->getVal($this->clePrimaire)
9429 );
9430 $err_msg = sprintf(
9431 '%s %s (%s)"',
9432 __("Échec de la notification du signataire"),
9433 $signer_name,
9434 $signer_mail
9435 );
9436
9437 // vérification des informations requises
9438 if (empty($signer_name)) {
9439 $err_detail = __("le nom du signataire est vide");
9440 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9441 $this->addToMessage($err_msg.', '.$err_detail);
9442 return false;
9443 }
9444 if (empty($signer_mail)) {
9445 $err_detail = __("le courriel du signataire est vide");
9446 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9447 $this->addToMessage($err_msg.', '.$err_detail);
9448 return false;
9449 }
9450 if (empty($this->getVal('dossier'))) {
9451 $err_detail = __("l'identifiant du dossier est vide");
9452 $this->addToLog(__METHOD__.', '.$err_msg_log.', '.$err_detail, DEBUG_MODE);
9453 $this->addToMessage($err_msg.', '.$err_detail);
9454 return false;
9455 }
9456
9457 // ajout de la notification à la liste des notifications de l'instruction
9458 $instruction_id = $this->getVal($this->clePrimaire);
9459 $inst_notif = $this->f->get_inst__om_dbform(array(
9460 "obj" => "instruction_notification",
9461 "idx" => "]",
9462 ));
9463 $notif_val = array(
9464 'instruction_notification' => null,
9465 'instruction' => $instruction_id,
9466 'automatique' => true,
9467 'emetteur' => $user_name,
9468 'date_envoi' => null,
9469 'destinataire' => "$signer_name <$signer_mail>",
9470 'courriel' => $signer_mail,
9471 'date_premier_acces' => null,
9472 'statut' => '',
9473 'commentaire' => ''
9474 );
9475 $add_notif = $inst_notif->ajouter($notif_val);
9476 if ($add_notif === false) {
9477 $err_detail = __("Échec de l'ajout de la notification.");
9478 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail.' Notification : '.var_export($notif_val, true), DEBUG_MODE);
9479 $this->addToMessage($err_msg);
9480 return false;
9481 }
9482 $notification_id = $inst_notif->getVal($inst_notif->clePrimaire);
9483
9484 // ajout d'une tâche de notification (envoi du mail)
9485 $notification_task = $this->notification_by_task(
9486 $notification_id,
9487 $this->getVal('dossier'),
9488 'mail',
9489 'notification_signataire'
9490 );
9491 if ($notification_task === false) {
9492 $err_detail = sprintf(
9493 __("Échec de l'ajout de la tâche de notification (notification %s)."),
9494 $notification_id);
9495 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9496 $this->addToMessage($err_msg);
9497 return false;
9498 }
9499
9500 // Vérification de la réussite de l'envoi du mail
9501 // Fais une requête pour récupérer la liste des notifications de signataire faites par mail
9502 // et associées à l'instruction en cours. Récupère uniquement la dernière qui doit être celle
9503 // qui viens d'être créée.
9504 // Si la tâche d'envoi du mail est en erreur alors on considère que l'envoi du mail a échoué.
9505 $qres = $this->f->get_one_result_from_db_query(
9506 sprintf(
9507 'SELECT
9508 state
9509 FROM
9510 %1$stask
9511 WHERE
9512 type = \'notification_signataire\'
9513 AND category = \'mail\'
9514 AND dossier = \'%2$s\'
9515 ORDER BY
9516 task DESC
9517 LIMIT 1',
9518 DB_PREFIXE,
9519 $this->f->db->escapeSimple($this->getVal('dossier'))
9520 ),
9521 array(
9522 'origin' => __METHOD__
9523 )
9524 );
9525 if ($qres['result'] === 'error') {
9526 $err_detail = sprintf(
9527 __("Échec de l'envoi du mail de notification (notification %s)."),
9528 $notification_id);
9529 $this->addToLog(__METHOD__.' '.$err_msg_log.'. '.$err_detail, DEBUG_MODE);
9530 $this->addToMessage($err_msg);
9531 return false;
9532 }
9533
9534 // succès de la planification de la notification
9535 $this->addToMessage(sprintf(
9536 __('Le signataire "%s (%s)" sera notifié prochainement'),
9537 $signer_name,
9538 $signer_mail));
9539 return true;
9540 }
9541
9542 /**
9543 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9544 * est en incomplet notifié ou non.
9545 * On peut ajouter des jours à cette date grâce au paramètre "delay".
9546 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9547 * l'instruction en signature le jour de la date limite.
9548 *
9549 * @param int $delay Le nombre de jour à ajouter à la date limite.
9550 *
9551 * @return string $date_limite la date limite calculé ou false
9552 */
9553 private function compute_date_limite($delay) {
9554 // Instanciation de l'objet dossier
9555 $inst_dossier = $this->f->get_inst__om_dbform(array(
9556 'obj' => 'dossier',
9557 'idx' => $this->getVal('dossier'),
9558 ));
9559
9560 $date_to_compute = null;
9561 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9562 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9563 } else {
9564 $date_to_compute = $inst_dossier->getVal('date_limite');
9565 }
9566 if ($date_to_compute != null) {
9567 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9568 }
9569
9570 return null;
9571 }
9572
9573 /**
9574 * Permet de récupérer la traduction de la valeur de statut_signature
9575 *
9576 * @return string la valeur de statut_signature traduite | false
9577 */
9578 function get_trad_for_statut($value_to_trad){
9579 $statut_signature_tab = array(
9580 'waiting' => __('en préparation'),
9581 'in_progress' => __('en cours de signature'),
9582 'canceled' => __('signature annulée'),
9583 'expired' => __('délai de signature expiré'),
9584 'finished' => __('signé')
9585 );
9586 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9587 return $statut_signature_tab[$value_to_trad];
9588 }
9589
9590 return false;
9591 }
9592
9593 /**
9594 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9595 *
9596 * @return string (json) la valeur de historique_signature mis à jour | false
9597 */
9598 function get_updated_historique_signature($historique_signature_values) {
9599
9600 $historique_signature_value_tab = $this->get_historique_signature_decoded();
9601
9602 if ($historique_signature_value_tab === false) {
9603 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9604 return false;
9605 }
9606
9607 $last_val_historique_signature = array();
9608
9609 // Si la tableau récupéré n'est pas vide alors
9610 // on récupère la dernière ligne du tableau
9611 if (empty($historique_signature_value_tab) === false) {
9612 $last_val_historique_signature = end($historique_signature_value_tab);
9613 }
9614
9615 $format_date = '';
9616 $format_date_hour = '';
9617 $date_converted=array();
9618
9619 $date_to_convert = array(
9620 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9621 'date_limite_instruction' => $this->compute_date_limite(0),
9622 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9623 );
9624
9625 // Conversion des dates en fonction de leur format
9626 foreach ($date_to_convert as $key => $value) {
9627 $date_converted[$key] = null;
9628 if ($value != null) {
9629 $format_date = 'd/m/Y';
9630 $format_date_hour = 'd/m/Y H:i:s';
9631 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9632 }
9633 }
9634
9635 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9636 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9637 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9638 $tab_for_columns_trad = array(
9639 __('entry_date'),
9640 __('id_parapheur_signature'),
9641 __('emetteur'),
9642 __('signataire'),
9643 __('date_envoi'),
9644 __('date_limite'),
9645 __('date_retour'),
9646 __('statut_signature'),
9647 __('commentaire_signature')
9648 );
9649
9650 array_push($historique_signature_value_tab, array(
9651 'entry_date' => date('d/m/Y H:i:s'),
9652 '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'],
9653 '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'],
9654 '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'],
9655 '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'],
9656 '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'],
9657 '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'],
9658 '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']),
9659 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9660 ));
9661
9662 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9663 }
9664
9665 /**
9666 * TREATMENT - annuler_envoi_en_signature
9667 *
9668 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9669 *
9670 * @return boolean true si l'annulation a été effectué avec succès false sinon
9671 */
9672 function annuler_envoi_en_signature() {
9673 $this->begin_treatment(__METHOD__);
9674 $this->correct = true;
9675
9676 //Instanciation de la classe electronicsignature
9677 $inst_es = $this->get_electronicsignature_instance();
9678 if ($inst_es === false) {
9679 $this->correct = false;
9680 return $this->end_treatment(__METHOD__, false);
9681 }
9682
9683 $data = array();
9684 if (! empty($this->getVal('id_parapheur_signature'))) {
9685 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9686 } else {
9687 $this->correct = false;
9688 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9689 return $this->end_treatment(__METHOD__, false);
9690 }
9691
9692 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9693 // Cette méthode doit retourner un tableau de valeur
9694 try {
9695 $result = $inst_es->cancel_send_for_signature($data);
9696 } catch (electronicsignature_exception $e) {
9697 $this->handle_electronicsignature_exception($e);
9698 return $this->end_treatment(__METHOD__, false);
9699 }
9700
9701 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9702 $valF = array();
9703
9704 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9705 foreach($this->champs as $identifiant => $champ) {
9706 $valF[$champ] = $this->val[$identifiant];
9707 }
9708 // On fait ensuite nos modifications spécifiques
9709 $valF['id_parapheur_signature'] = null;
9710 $valF['statut_signature'] = $result['statut'];
9711 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9712 $valF['date_envoi_signature'] = null;
9713 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9714
9715 $ret = $this->modifier($valF);
9716
9717 if ($ret === false) {
9718 $this->correct = false;
9719 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9720 // Termine le traitement
9721 return $this->end_treatment(__METHOD__, false);
9722 }
9723
9724 // Message
9725 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9726
9727 // Tout s'est bien passé, on termine le traitement
9728 return $this->end_treatment(__METHOD__, true);
9729 }
9730
9731
9732 /**
9733 * Récupère le contenu du champ historique_signature et le converti en tableau
9734 *
9735 * @return array sinon false en cas d'erreur
9736 */
9737 protected function get_historique_signature_decoded() {
9738 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9739 if ($val === '' || $val == 'false') {
9740 $val = json_encode(array());
9741 }
9742 if($this->isJson($val) === false) {
9743 return false;
9744 }
9745 return json_decode($val, true);
9746 }
9747
9748 /**
9749 * Récupère les informations à afficher dans le tableau de suivi à l'aide
9750 * d'une requête sql. Stocke ces informations dans un tableau.
9751 * Converti le tableau au format json et renvoi le json obtenu.
9752 *
9753 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9754 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9755 * La clause where de la requête est construite à partir du tableau contenant les types
9756 * de tâches fourni en paramètre.
9757 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9758 *
9759 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9760 * la date de premier accès ne sera pas affichée.
9761 *
9762 * @param array liste des tâches permettant d'identifier quelles notification afficher
9763 * @param boolean permet d'afficher les notifications non liées à des tâches
9764 * @return json
9765 */
9766 public function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9767 $whereTypeTache = '';
9768 $sqlTaskNull = 'INNER';
9769
9770 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9771 $listeChampsTrad = array(
9772 __('emetteur'),
9773 __('date_envoi'),
9774 __('destinataire'),
9775 __('date_premier_acces'),
9776 __('instruction'),
9777 __('annexes'),
9778 __('statut'),
9779 __('commentaire')
9780 );
9781 $listeChamps = array(
9782 'emetteur',
9783 'date_envoi',
9784 'destinataire',
9785 'date_premier_acces',
9786 'instruction',
9787 'annexes',
9788 'statut',
9789 'commentaire'
9790 );
9791
9792 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9793 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9794 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9795 // paramétrage
9796 if(is_bool($nonLieTache) && $nonLieTache === true) {
9797 $sqlTaskNull = 'LEFT';
9798 }
9799 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9800 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9801 // tiers consulté
9802 if (is_array($typeTache) && $typeTache != array()) {
9803 if (is_array($typeTache)) {
9804 $whereTypeTache = sprintf(
9805 'AND (task.type IN (%1$s))',
9806 "'".implode("', '", $typeTache)."'"
9807 );
9808 }
9809 // La date de premier accès n'a pas besoin d'être renseigné pour
9810 // les notifications des demandeurs via le portail citoyen.
9811 // Les notifications des demandeurs sont liés à 3 types de tâches
9812 // notification_recepisse, notification_instruction, notification_decision
9813 // Si le suivi de la notification concerne un de ces types de tâches on
9814 // considère que c'est une notification de demandeurs.
9815 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9816 // via le portail. Par défaut si rien n'est paramétré on considère que la
9817 // notification est faite via le portail
9818 if ((in_array('notification_recepisse', $typeTache) ||
9819 in_array('notification_instruction', $typeTache) ||
9820 in_array('notification_decision', $typeTache))) {
9821 $dossier = $this->getVal('dossier');
9822 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9823 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9824 if ($modeNotification === PORTAL) {
9825 $listeChamps = array(
9826 'emetteur',
9827 'date_envoi',
9828 'destinataire',
9829 'instruction',
9830 'annexes',
9831 'statut',
9832 'commentaire'
9833 );
9834 }
9835 }
9836 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9837 // de les afficher dans le suivi
9838 if (in_array('notification_depot_demat', $typeTache)) {
9839 $listeChamps = array(
9840 'emetteur',
9841 'date_envoi',
9842 'destinataire',
9843 'instruction',
9844 'statut',
9845 'commentaire'
9846 );
9847 }
9848 }
9849
9850 $valSuivi = array();
9851 // Récupération des infos nécessaires à l'affichage du tableau
9852 $sql = sprintf(
9853 'SELECT DISTINCT
9854 instruction_notification.instruction_notification,
9855 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9856 CASE WHEN instruction_notification.automatique = TRUE
9857 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9858 ELSE instruction_notification.emetteur
9859 END as emetteur,
9860 date_envoi,
9861 instruction_notification.destinataire,
9862 instruction_notification.date_premier_acces,
9863 evenement.libelle as instruction,
9864 instruction_notification.statut,
9865 instruction_notification.commentaire,
9866 annexes.instruction_annexe as annexes
9867 FROM
9868 %1$sinstruction_notification
9869 LEFT JOIN %1$sinstruction
9870 ON instruction.instruction = instruction_notification.instruction
9871 LEFT JOIN %1$sevenement
9872 ON instruction.evenement = evenement.evenement
9873 LEFT JOIN %1$sinstruction_notification_document
9874 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9875 AND instruction_notification_document.annexe = true
9876 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9877 %4$s JOIN %1$stask
9878 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9879 %3$s
9880 -- Récupération de la liste des annexes sous la forme d une liste
9881 LEFT JOIN (
9882 SELECT
9883 instruction_notification,
9884 -- Récupère la liste des annexes de la notification
9885 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9886 -- à l affichage du lien vers les annexes
9887 CONCAT(
9888 \'[\',
9889 STRING_AGG(
9890 -- Affiche le nom du fichier selon le type de document/pièce
9891 CASE
9892 WHEN instruction_notification_document.document_type = \'instruction\'
9893 THEN CONCAT(
9894 \'{
9895 "obj" : "instruction",
9896 "champs" : "om_fichier_instruction",
9897 "label" : "\', evenement.libelle, \'",
9898 "id" : "\', instruction.instruction,\'"
9899 }\'
9900 )
9901 WHEN instruction_notification_document.document_type = \'consultation\'
9902 THEN CONCAT(
9903 \'{
9904 "obj" : "consultation",
9905 "champs" : "fichier",
9906 "label" : "\', CONCAT_WS( \' - \', \'Avis\', service.libelle, to_char(consultation.date_retour,\'DD/MM/YYYY\')), \'",
9907 "id" : "\', consultation.consultation, \'"
9908 }\'
9909 )
9910 ELSE
9911 CONCAT(
9912 \'{
9913 "obj" : "document_numerise",
9914 "champs" : "uid",
9915 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9916 "id" : "\', document_numerise.document_numerise,\'"
9917 }\'
9918 )
9919 END,
9920 \', \'),
9921 \']\'
9922 ) AS instruction_annexe
9923 FROM
9924 %1$sinstruction_notification_document
9925 LEFT JOIN %1$sinstruction
9926 ON instruction_notification_document.instruction = instruction.instruction
9927 LEFT JOIN %1$sevenement
9928 ON instruction.evenement = evenement.evenement
9929 LEFT JOIN %1$sconsultation
9930 ON instruction_notification_document.document_id = consultation.consultation
9931 LEFT JOIN %1$sservice
9932 ON consultation.service = service.service
9933 LEFT JOIN %1$sdocument_numerise
9934 ON instruction_notification_document.document_id = document_numerise.document_numerise
9935 LEFT JOIN %1$sdocument_numerise_type
9936 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9937 WHERE
9938 instruction_notification_document.annexe = \'t\'
9939 GROUP BY
9940 instruction_notification
9941 ) AS annexes
9942 ON
9943 annexes.instruction_notification = instruction_notification.instruction_notification
9944 WHERE
9945 instruction.instruction = %2$s
9946 ORDER BY
9947 date_envoi ASC, instruction_notification.destinataire ASC',
9948 DB_PREFIXE,
9949 intval($this->getVal('instruction')),
9950 $whereTypeTache,
9951 $sqlTaskNull
9952 );
9953 $qres = $this->f->get_all_results_from_db_query($sql, array(
9954 "origin" => __METHOD__
9955 )
9956 );
9957 // Préparation du lien de téléchargement des annexes
9958 $htmlList =
9959 '<style>
9960 #content .gridjs-td a.lien_annexe {
9961 text-decoration : underline dotted 1px;
9962 }
9963 #content a.lien_annexe:hover {
9964 text-decoration : underline solid 1px;
9965 color : #46aede;
9966 }
9967 ol {padding-left : 10px;}
9968 </style>
9969 <ol>%1$s</ol>';
9970 $lienTelechargement =
9971 '<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">
9972 Annexe
9973 </a>';
9974 // Stockage des infos de chaque notification dans un tableau
9975 foreach ($qres['result'] as $row) {
9976 $valNotif = array();
9977 foreach($listeChamps as $champ) {
9978 $valNotif[$champ] = $row[$champ];
9979 if (($champ === 'date_envoi'
9980 || $champ === 'date_premier_acces')
9981 && $row[$champ] !== null
9982 && $row[$champ] !== '') {
9983 //
9984 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9985 } else if ($champ === 'annexes') {
9986 $listeAnnexe = '';
9987 $infoAnnexes = json_decode($row[$champ], true);
9988 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9989 // A partir des infos récupérées prépare le code html du lien vers chacune
9990 // des annexes et ajoute un élément de liste par annexe
9991 foreach($infoAnnexes as $annexe) {
9992 $listeAnnexe .= sprintf(
9993 '<li>%s</li>',
9994 sprintf($lienTelechargement,
9995 $annexe['obj'],
9996 $annexe['champs'],
9997 $annexe['id'],
9998 $annexe['label']
9999 )
10000 );
10001 }
10002 // Construction de la liste des annexes
10003 $valNotif[$champ] = sprintf(
10004 $htmlList,
10005 $listeAnnexe
10006 );
10007 }
10008 }
10009 }
10010 array_push($valSuivi, $valNotif);
10011 }
10012
10013 // Passage du tableau au format json
10014 return json_encode($valSuivi, JSON_HEX_APOS);
10015 }
10016
10017 /**
10018 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
10019 *
10020 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
10021 *
10022 * @return void
10023 */
10024 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
10025 $this->f->displayMessage('error', $exception->getMessage());
10026 }
10027
10028
10029 /**
10030 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
10031 *
10032 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
10033 * @return electronicsignature Instance de l'abstracteur.
10034 */
10035 public function get_electronicsignature_instance($with_handle_error = true) {
10036 if(isset($this->electronicsignature_instance)) {
10037 return $this->electronicsignature_instance;
10038 }
10039 // Instanciation du connecteur electronicsignature
10040 try {
10041 require_once "electronicsignature.class.php";
10042 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
10043 $this->electronicsignature_instance = new electronicsignature($collectivites);
10044 } catch (electronicsignature_exception $e) {
10045 if ($with_handle_error === true) {
10046 $this->handle_electronicsignature_exception($e);
10047 }
10048 return false;
10049 }
10050 return $this->electronicsignature_instance;
10051 }
10052
10053 /**
10054 * TREATMENT - envoyer_au_controle_de_legalite
10055 *
10056 * Ajoute la tâche envoi_CL.
10057 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
10058 *
10059 * @return [type] [description]
10060 */
10061 function envoyer_au_controle_de_legalite() {
10062 $this->begin_treatment(__METHOD__);
10063 $this->correct = true;
10064
10065 //
10066 if ($this->can_be_sended_to_cl() === true) {
10067 // Création de la task 'envoi_CL'
10068 $inst_task = $this->f->get_inst__om_dbform(array(
10069 "obj" => "task",
10070 "idx" => 0,
10071 ));
10072 $task_val = array(
10073 'type' => 'envoi_CL',
10074 'object_id' => $this->getVal('instruction'),
10075 'dossier' => $this->getVal('dossier'),
10076 );
10077 // Change l'état de la tâche de notification en fonction de l'état de
10078 // transmission du dossier d'instruction
10079 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
10080 if ($this->f->is_option_mode_service_consulte_enabled() === false
10081 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
10082 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
10083 //
10084 $task_val['state'] = $inst_task::STATUS_DRAFT;
10085 }
10086 $add_task = $inst_task->add_task(array('val' => $task_val));
10087 if ($add_task === false) {
10088 $this->addToMessage(sprintf('%s %s',
10089 __("Une erreur s'est produite lors de la création tâche."),
10090 __("Veuillez contacter votre administrateur.")
10091 ));
10092 $this->correct = false;
10093 return $this->end_treatment(__METHOD__, false);
10094 }
10095 // Mise à jour du champs 'envoye_cl_platau'
10096 $instr_val = array(
10097 'envoye_cl_platau' => 't',
10098 );
10099 $res = $this->f->db->autoExecute(
10100 DB_PREFIXE.$this->table,
10101 $instr_val,
10102 DB_AUTOQUERY_UPDATE,
10103 $this->getCle($this->getVal($this->clePrimaire))
10104 );
10105 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
10106 if ($this->f->isDatabaseError($res, true) === true) {
10107 $this->addToMessage(sprintf('%s %s',
10108 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
10109 __("Veuillez contacter votre administrateur.")
10110 ));
10111 $this->correct = false;
10112 return $this->end_treatment(__METHOD__, false);
10113 }
10114 // Message de validation à l'utilisateur
10115 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
10116 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
10117 }
10118 //
10119 return $this->end_treatment(__METHOD__, true);
10120 }
10121
10122
10123 /**
10124 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
10125 *
10126 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
10127 * la vue 'sousformulaire'.
10128 *
10129 * @return string
10130 */
10131 function get_back_link($view = "formulaire") {
10132 //
10133 $href = parent::get_back_link($view);
10134 //
10135 $crud = $this->get_action_crud();
10136
10137 // Redirection vers le formulaire de modification à la validation du
10138 // formulaire d'ajout si l'événement associé possède une lettre type
10139 if (($crud === 'create'
10140 || ($crud === null
10141 && $this->getParameter('maj') == 0))
10142 && $this->correct == true
10143 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
10144
10145 // On instancie l'instruction
10146 $inst_instruction = $this->f->get_inst__om_dbform(array(
10147 "obj" => "instruction",
10148 "idx" => $this->valF[$this->clePrimaire],
10149 ));
10150
10151 // Si l'instruction n'est pas finalisée automatiquement
10152 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
10153 $href = str_replace("&action=3", "&action=1", $href);
10154 //
10155 if (strpos($href, "&retour=tab") !== false) {
10156 $href = str_replace("&retour=tab", "&retour= form", $href);
10157 } else {
10158 $href .= "&retour=form";
10159 }
10160 }
10161 }
10162
10163 //
10164 return $href;
10165 }
10166
10167 public function view_json_data() {
10168 $this->checkAccessibility();
10169 $this->f->disableLog();
10170 $view = $this->get_json_data();
10171 printf(json_encode($view));
10172 }
10173
10174 public function get_json_data() {
10175 $val = array_combine($this->champs, $this->val);
10176 foreach ($val as $key => $value) {
10177 $val[$key] = strip_tags($value);
10178 }
10179 $val['tacite'] = 'f';
10180 $inst_ad = $this->f->get_inst__om_dbform(array(
10181 "obj" => "avis_decision",
10182 "idx" => $val['avis_decision'],
10183 ));
10184 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
10185 $val['tacite'] = 't';
10186 }
10187 return $val;
10188 }
10189
10190 /**
10191 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10192 * comme événement lié le suivant définit dans l'événement de l'instruction
10193 * instanciée.
10194 *
10195 * @param string $next_type Correspond aux trois déclenchement automatique
10196 * de création d'instruction paramétré sur un événement.
10197 * @param integer $instruction Identifiant de l'instruction à instancier.
10198 * @return mixed Identifiant de l'instruction recherchée ou false.
10199 */
10200 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10201 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10202 return false;
10203 }
10204 $result = array();
10205 $evenements = array();
10206 if ($instruction === null) {
10207 $instruction = $this->getVal($this->clePrimaire);
10208 $evenement = $this->getVal('evenement');
10209 $dossier = $this->getVal('dossier');
10210 } else {
10211 $inst = $this->f->get_inst__om_dbform(array(
10212 "obj" => "instruction",
10213 "idx" => $instruction,
10214 ));
10215 $evenement = $inst->getVal('evenement');
10216 $dossier = $inst->getVal('dossier');
10217 }
10218 // Récupération de l'identifiant de l'événement paramétré comme suivant
10219 // sur l'instruction instanciée
10220 $qres = $this->f->get_one_result_from_db_query(
10221 sprintf(
10222 'SELECT
10223 evenement_%3$s
10224 FROM
10225 %1$sevenement
10226 WHERE
10227 evenement = %2$s',
10228 DB_PREFIXE,
10229 intval($evenement),
10230 $next_type
10231 ),
10232 array(
10233 "origin" => __METHOD__,
10234 "force_return" => true,
10235 )
10236 );
10237 if ($qres["code"] !== "OK") {
10238 return false;
10239 }
10240 $ev_next = $qres["result"];
10241 // Récupération de l'instruction dans le dossier utilisant l'événement
10242 // suivant identifié dans la requête précédente
10243 $qres = $this->f->get_one_result_from_db_query(
10244 sprintf(
10245 'SELECT
10246 MAX(instruction.instruction) as instruction
10247 FROM
10248 %1$sinstruction
10249 WHERE
10250 dossier = \'%3$s\'
10251 AND evenement = %2$s',
10252 DB_PREFIXE,
10253 intval($ev_next),
10254 $this->f->db->escapeSimple($dossier)
10255 ),
10256 array(
10257 "origin" => __METHOD__,
10258 "force_return" => true,
10259 )
10260 );
10261 if ($qres["code"] !== "OK") {
10262 return false;
10263 }
10264 return $qres["result"];
10265 }
10266
10267 public function get_related_instructions($instruction = null) {
10268 $result = array();
10269 $evenements = array();
10270 if ($instruction === null) {
10271 $instruction = $this->getVal($this->clePrimaire);
10272 $evenement = $this->getVal('evenement');
10273 $dossier = $this->getVal('dossier');
10274 } else {
10275 $inst = $this->f->get_inst__om_dbform(array(
10276 "obj" => "instruction",
10277 "idx" => $instruction,
10278 ));
10279 $evenement = $inst->getVal('evenement');
10280 $dossier = $inst->getVal('dossier');
10281 }
10282 //
10283 $qres = $this->f->get_one_result_from_db_query(
10284 sprintf(
10285 'SELECT
10286 evenement
10287 FROM
10288 %1$sevenement
10289 WHERE
10290 evenement_retour_ar = %2$s
10291 OR evenement_retour_signature = %2$s',
10292 DB_PREFIXE,
10293 intval($evenement)
10294 ),
10295 array(
10296 "origin" => __METHOD__,
10297 "force_return" => true,
10298 )
10299 );
10300 if ($qres["code"] !== "OK") {
10301 return false;
10302 }
10303 $ev_parent = $qres["result"];
10304 //
10305 $qres = $this->f->get_one_result_from_db_query(
10306 sprintf(
10307 'SELECT
10308 MAX(instruction.instruction) as instruction
10309 FROM
10310 %1$sinstruction
10311 WHERE
10312 dossier = \'%3$s\'
10313 AND evenement = %2$s',
10314 DB_PREFIXE,
10315 intval($ev_parent),
10316 $this->f->db->escapeSimple($dossier)
10317 ),
10318 array(
10319 "origin" => __METHOD__,
10320 "force_return" => true,
10321 )
10322 );
10323 if ($qres["code"] !== "OK") {
10324 return false;
10325 }
10326 $result[] = $qres["result"];
10327 //
10328 $qres = $this->f->get_one_result_from_db_query(
10329 sprintf(
10330 'SELECT
10331 evenement_retour_ar
10332 FROM
10333 %1$sevenement
10334 WHERE
10335 evenement = %2$d
10336 AND evenement_retour_ar != %3$d',
10337 DB_PREFIXE,
10338 intval($ev_parent),
10339 intval($evenement)
10340 ),
10341 array(
10342 "origin" => __METHOD__,
10343 "force_return" => true,
10344 )
10345 );
10346 if ($qres["code"] !== "OK") {
10347 return false;
10348 }
10349 $evenements[] = $qres["result"];
10350 //
10351 $qres = $this->f->get_one_result_from_db_query(
10352 sprintf(
10353 'SELECT
10354 evenement_retour_signature
10355 FROM
10356 %1$sevenement
10357 WHERE
10358 evenement = %2$s
10359 AND evenement_retour_signature != %3$s
10360 ',
10361 DB_PREFIXE,
10362 intval($ev_parent),
10363 intval($evenement)
10364 ),
10365 array(
10366 "origin" => __METHOD__,
10367 "force_return" => true,
10368 )
10369 );
10370 if ($qres["code"] !== "OK") {
10371 return false;
10372 }
10373 $evenements[] = $qres["result"];
10374 foreach ($evenements as $value) {
10375 if ($value !== null) {
10376 $qres = $this->f->get_one_result_from_db_query(
10377 sprintf(
10378 'SELECT
10379 MAX(instruction.instruction) as instruction
10380 FROM
10381 %1$sinstruction
10382 WHERE
10383 dossier = \'%3$s\'
10384 AND evenement = %2$s',
10385 DB_PREFIXE,
10386 intval($value),
10387 $this->f->db->escapeSimple($dossier)
10388 ),
10389 array(
10390 "origin" => __METHOD__,
10391 "force_return" => true,
10392 )
10393 );
10394 if ($qres["code"] !== "OK") {
10395 return false;
10396 }
10397 $result[] = $qres["result"];
10398 }
10399 }
10400 return $result;
10401 }
10402
10403 protected function getDocumentType($champ = null) {
10404 $evenementId = $this->getVal('evenement');
10405 if (! empty($evenementId)) {
10406 $evenement = $this->f->findObjectById('evenement', $evenementId);
10407 if (! empty($evenement)) {
10408 return __("Instruction").':'.$evenement->getVal('libelle');
10409 }
10410 }
10411 return parent::getDocumentType();
10412 }
10413
10414 /**
10415 * Récupère à l'aide d'une requête sql la liste des demandeurs
10416 * pouvant être notifié. C'est à dire les demandeurs acceptant
10417 * les notifications et pour lesquels une adresse mail existe.
10418 *
10419 * Dans le cas, d'une notification pour le portail citoyen, seul
10420 * le pétitionnaire principal doit être notifier et uniquement si
10421 * il a une adress mail et qu'il accepte les notifications.
10422 *
10423 * @param string identifiant du dossier
10424 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10425 * pour une notification de categorie portail
10426 * @return array liste des demandeurs pouvant être notifié
10427 */
10428 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10429 if ($idDossier === null) {
10430 $idDossier = $this->getVal('dossier');
10431 }
10432 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10433 // pour une notification depuis le portail citoyen
10434 $sqlPetitionnairePrincipal = '';
10435 // Gestion des champs nécessaires pour la notification d'un demandeur
10436 $condition_demandeur = "AND demandeur.notification = 't'
10437 AND demandeur.courriel IS NOT NULL";
10438 if ($portail === true) {
10439 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10440 $condition_demandeur = "AND (
10441 (notification = 't' AND courriel IS NOT NULL)
10442 OR demande.source_depot = 'portal'
10443 )";
10444 }
10445
10446 $listeDemandeursNotifiable = array();
10447
10448 // Requête de récupération des demandeurs
10449 $qres = $this->f->get_all_results_from_db_query(
10450 sprintf(
10451 'SELECT
10452 demandeur.demandeur,
10453 CASE
10454 WHEN demandeur.qualite=\'particulier\'
10455 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10456 ELSE
10457 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10458 END AS destinataire,
10459 demandeur.courriel,
10460 petitionnaire_principal
10461 FROM
10462 %1$sdossier
10463 INNER JOIN %1$slien_dossier_demandeur
10464 ON dossier.dossier = lien_dossier_demandeur.dossier
10465 INNER JOIN %1$sdemandeur
10466 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10467 -- Récupération de la plus ancienne demande associée au dossier (la demande
10468 -- de création du dossier)
10469 INNER JOIN (
10470 SELECT
10471 demande,
10472 dossier_instruction,
10473 source_depot
10474 FROM
10475 %1$sdemande
10476 WHERE
10477 dossier_instruction = \'%2$s\'
10478 ORDER BY
10479 demande ASC
10480 LIMIT 1
10481 ) as demande
10482 ON dossier.dossier = demande.dossier_instruction
10483 WHERE
10484 dossier.dossier = \'%2$s\'
10485 %3$s
10486 %4$s',
10487 DB_PREFIXE,
10488 $this->f->db->escapeSimple($idDossier),
10489 $condition_demandeur,
10490 $sqlPetitionnairePrincipal
10491 ),
10492 array(
10493 "origin" => __METHOD__
10494 )
10495 );
10496 // Récupération des infos des demandeurs et stockage dans un tableau
10497 // ayant pour clé les id des demandeurs
10498 foreach ($qres['result'] as $row) {
10499 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10500 }
10501
10502 return $listeDemandeursNotifiable;
10503 }
10504
10505 /**
10506 * Renvoie la liste des notifications liées à l'instruction
10507 *
10508 * @param integer id de l'instruction dont on cherche les notifications
10509 * @return array liste des instruction_notification liés à l'instruction
10510 */
10511 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10512 $whereTypeTache = '';
10513 $sqlTaskNull = 'INNER';
10514 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10515 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10516 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10517 // paramétrage
10518 if(is_bool($nonLieTache) && $nonLieTache === true) {
10519 $sqlTaskNull = 'LEFT';
10520 }
10521 if ($typeNotification != null) {
10522 if (is_array($typeNotification)) {
10523 $whereTypeTache = sprintf(
10524 'AND (task.type IN (%1$s))',
10525 "'".implode("', '", $typeNotification)."'"
10526 );
10527 } else {
10528 $whereTypeTache = sprintf(
10529 'AND (task.type = \'%1$s\')',
10530 $typeNotification
10531 );
10532 }
10533 }
10534 $listeInstrNotif = array();
10535 $qres = $this->f->get_all_results_from_db_query(
10536 sprintf('
10537 SELECT
10538 instruction_notification.instruction_notification
10539 FROM
10540 %1$sinstruction_notification
10541 %4$s JOIN %1$stask
10542 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10543 %3$s
10544 WHERE
10545 instruction = %2$s',
10546 DB_PREFIXE,
10547 intval($id_instruction),
10548 $whereTypeTache,
10549 $sqlTaskNull
10550 ),
10551 array(
10552 "origin" => __METHOD__
10553 )
10554 );
10555 foreach ($qres['result'] as $row) {
10556 $listeInstrNotif[] = $row['instruction_notification'];
10557 }
10558 return $listeInstrNotif;
10559 }
10560
10561 /**
10562 * Crée une clé d'accès unique permettant à un utilisateur
10563 * anonyme de récupérer le document.
10564 *
10565 * @return string clé d'accès du document
10566 */
10567 protected function getCleAccesDocument() {
10568 // Initialisation d'un tableau
10569 $number_list = array();
10570
10571 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10572 for ($i = 0; $i < 4; $i++) {
10573 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10574 }
10575
10576 // Transformation en chaîne tout en séparant les nombres par un "-"
10577 $result = implode('-', $number_list);
10578
10579 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10580 if ($this->getUidDocumentInstructionWithKey($result) != null) {
10581 return $this->getCleAccesDocument();
10582 }
10583
10584 //
10585 return $result;
10586 }
10587
10588 /**
10589 * Récupère une clé et renvoie l'uid du document liée à cette
10590 * clé. Si la clé n'existe pas renvoie null.
10591 *
10592 * @param string $cleGen clé dont on cherche l'instruction
10593 * @return integer|null
10594 */
10595 protected function getUidDocumentInstructionWithKey($cleGen) {
10596 $qres = $this->f->get_one_result_from_db_query(
10597 sprintf(
10598 'SELECT
10599 instruction.om_fichier_instruction
10600 FROM
10601 %1$sinstruction_notification_document
10602 LEFT JOIN %1$sinstruction
10603 ON instruction_notification_document.instruction = instruction.instruction
10604 WHERE
10605 instruction_notification_document.cle = \'%2$s\'',
10606 DB_PREFIXE,
10607 $this->f->db->escapeSimple($cleGen)
10608 ),
10609 array(
10610 "origin" => __METHOD__,
10611 )
10612 );
10613
10614 return $qres['result'];
10615 }
10616
10617 /**
10618 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10619 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10620 *
10621 * @param string $cleGen
10622 * @return instruction_notification
10623 */
10624 protected function getInstanceNotificationWithKey($key) {
10625 $qres = $this->f->get_one_result_from_db_query(
10626 sprintf(
10627 'SELECT
10628 instruction_notification
10629 FROM
10630 %1$sinstruction_notification_document
10631 WHERE
10632 cle = \'%2$s\'',
10633 DB_PREFIXE,
10634 $this->f->db->escapeSimple($key)
10635 ),
10636 array(
10637 "origin" => __METHOD__,
10638 )
10639 );
10640
10641 // Récupération de l'instance de notification
10642 $instNotif = $this->f->get_inst__om_dbform(array(
10643 "obj" => "instruction_notification",
10644 "idx" => $qres['result'],
10645 ));
10646 return $instNotif;
10647 }
10648
10649
10650 /**
10651 * Affiche la page de téléchargement du document de la notification.
10652 *
10653 * @param boolean $content_only Affiche le contenu seulement.
10654 *
10655 * @return void
10656 */
10657 public function view_telecharger_document_anonym() {
10658 // Par défaut on considère qu'on va afficher le formulaire
10659 $idx = 0;
10660 // Flag d'erreur
10661 $error = false;
10662 // Message d'erreur
10663 $message = '';
10664
10665 // Paramètres GET : récupération de la clé d'accès
10666 $cle_acces_document = $this->f->get_submitted_get_value('key');
10667 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10668 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10669 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10670 if ($uidFichier != null) {
10671 // Récupération du document
10672 $file = $this->f->storage->get($uidFichier);
10673
10674 // Headers
10675 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10676 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10677 header("Content-Type: ".$file['metadata']['mimetype']);
10678 header("Accept-Ranges: bytes");
10679 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10680 // Affichage du document
10681 echo $file['file_content'];
10682
10683 // Récupération de la date de premier accès et maj du suivi uniquement
10684 // si la date de 1er accès n'a pas encore été remplis
10685 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10686 if ($inst_notif->getVal('date_premier_acces') == null ||
10687 $inst_notif->getVal('date_premier_acces') == '') {
10688 $notif_val = array();
10689 foreach ($inst_notif->champs as $champ) {
10690 $notif_val[$champ] = $inst_notif->getVal($champ);
10691 }
10692 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10693 $notif_val['statut'] = 'vu';
10694 $notif_val['commentaire'] = 'Le document a été vu';
10695 $suivi_notif = $inst_notif->modifier($notif_val);
10696 }
10697
10698 } else {
10699 // Page vide 404
10700 printf('Ressource inexistante');
10701 header('HTTP/1.0 404 Not Found');
10702 }
10703 }
10704
10705 /**
10706 * Récupère le titre du document envoyé au parapheur
10707 */
10708 protected function getDocumentTitre($champ = null) {
10709 $title = $this->getTitle();
10710 $dossier = $this->getDossier();
10711 return $dossier.' '.$title;
10712 }
10713
10714 /**
10715 * Compose le nom du document à transmettre au parapheur.
10716 * Le nom ets composé de cette manière :
10717 * instruction_xxx_libelle_de_la_lettre_type_associee
10718 * ou xxx correspond au numéro de l'instruction
10719 */
10720 protected function getDocumentLibelle() {
10721 // Récupère le champ instruction
10722 $instruction = $this->getVal("instruction");
10723
10724 // Requête sql servant à récupérer le titre du document
10725 // TO_CHAR() introduit un espace avant l'affichage du nombre
10726 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10727 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10728 $documentLibelle = $this->f->get_one_result_from_db_query(
10729 sprintf(
10730 'SELECT
10731 CONCAT(
10732 \'instruction\',
10733 TO_CHAR(instruction.instruction, \'000\'),
10734 \'_\',
10735 LOWER(om_lettretype.libelle)
10736 ) AS nom_fichier
10737 FROM
10738 %1$sinstruction
10739 LEFT JOIN %1$som_lettretype
10740 ON om_lettretype.id = instruction.lettretype
10741 WHERE
10742 instruction = %2$d',
10743 DB_PREFIXE,
10744 intval($instruction)
10745 ),
10746 array(
10747 "origin" => __METHOD__,
10748 )
10749 );
10750
10751 $documentLibelle = $documentLibelle['result'];
10752
10753 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10754 // caractères spéciaux en '_'
10755 // La méthode normalize_string est utilisé pour gérer les accents
10756 $documentLibelle = $this->f->normalize_string($documentLibelle);
10757 // TODO : comparer cette liste et celle de la méthode normalize_string
10758 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10759 // liste
10760 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10761 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10762 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10763 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10764 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10765 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10766 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10767 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10768 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10769 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10770 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10771 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10772 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10773 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10774 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10775 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10776 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10777 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10778 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10779 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10780 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10781 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10782 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10783 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10784 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10785 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10786 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10787 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10788 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10789 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10790 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10791 );
10792
10793 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10794 }
10795
10796 /**
10797 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10798 * l'overlay de notification des demandeurs.
10799 */
10800 function getSubFormTitle($ent) {
10801 $actionSansPath = array('411', '420', '430');
10802 if (in_array($this->getParameter('maj'), $actionSansPath)) {
10803 return '';
10804 }
10805 return parent::getSubFormTitle($ent);
10806 }
10807
10808 /**
10809 * Traitement de la notification automatique des tiers consulté.
10810 *
10811 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10812 * récupérées ajoute une notification et une tâche de notification par mail.
10813 * La création de la tâche de notification par mail déclenchera l'envoi du mail
10814 * et la mise à jour du suivi.
10815 *
10816 * Les tiers notifiables sont ceux :
10817 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10818 * - ayant une habilitation dont le type est listé dans les paramètres de
10819 * notification de l’événement,
10820 * - intervenant sur la commune ou le département du dossier
10821 * - ayant au moins une adresse mail valide
10822 *
10823 * @param evenement instance de l'événement associée à l'instruction
10824 * @param dossier instance du dossier de l'instruction
10825 * @return boolean indique si le traitement à réussi
10826 */
10827 protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10828 // Récupération de l'identifiant plat'au du service consultant
10829 $consultationEntrante = $dossier->get_inst_consultation_entrante();
10830 // Récupération de la liste des types d'habilitations autorisées pour
10831 // cette notification
10832 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10833 // Récupération du département et de la commune du dossier
10834 $commune = $dossier->getVal('commune');
10835 // Le département est récupéré à partir de la commune du dossier donc si la
10836 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10837 $idDepartement = null;
10838 if (! empty($commune)) {
10839 $departement = $dossier->get_inst_departement_dossier();
10840 $idDepartement = $departement->getVal($departement->clePrimaire);
10841 }
10842 // Récupération des courriels des tiers notifiables
10843 $tiersANotifier = $this->get_courriels_tiers_notifiable(
10844 $typesHabilitationsNotifiable,
10845 $consultationEntrante->getVal('service_consultant_id'),
10846 $commune,
10847 $idDepartement
10848 );
10849 // Traitement de chacune des listes de diffusion pour extraire les
10850 // courriels, vérifier la validité des courriels et envoyer la
10851 // notification
10852 $notificationSend = false;
10853 if (empty($tiersANotifier)) {
10854 $this->addToLog(
10855 sprintf(
10856 '%s() : %s %s : %s',
10857 __METHOD__,
10858 __("La récupération des tiers à échoué."),
10859 __('Paramétrage'),
10860 var_export(
10861 array(
10862 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10863 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10864 'id_commune' => $commune,
10865 'id_departement' => $idDepartement
10866 ),
10867 true
10868 )
10869 ),
10870 DEBUG_MODE
10871 );
10872 return false;
10873 }
10874 foreach($tiersANotifier as $tierANotifier) {
10875 // Découpe la liste de diffusion pour stocker les adresses mails
10876 // des tiers dans un tableau
10877 $courriels =
10878 array_filter(
10879 array_map(
10880 'trim',
10881 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10882
10883 foreach ($courriels as $courriel) {
10884 // Pour chaque adresse mail vérifie si l'adresse est valide
10885 if (! $this->f->checkValidEmailAddress($courriel)) {
10886 continue;
10887 }
10888 $destinataire = array(
10889 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10890 'courriel' => $courriel
10891 );
10892 // Si l'adresse est valide ajoute une nouvelle notification
10893 // et une tâche d'envoi de mails
10894 $idNotif = $this->ajouter_notification(
10895 $this->getVal($this->clePrimaire),
10896 $this->f->get_connected_user_login_name(),
10897 $destinataire,
10898 $this->get_dossier_instruction_om_collectivite(),
10899 array(),
10900 true
10901 );
10902 if ($idNotif === false) {
10903 $this->addToLog(
10904 __METHOD__.
10905 __("L'ajout de la notification a échoué."),
10906 DEBUG_MODE
10907 );
10908 return false;
10909 }
10910 // Création de la tache en lui donnant l'id de la notification
10911 $notification_by_task = $this->notification_by_task(
10912 $idNotif,
10913 $dossier->getVal('dossier'),
10914 'mail',
10915 'notification_tiers_consulte'
10916 );
10917 if ($notification_by_task === false) {
10918 $this->addToLog(
10919 __METHOD__.
10920 __("L'ajout de la tâche de notification a échoué."),
10921 DEBUG_MODE
10922 );
10923 $this->addToMessage(
10924 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10925 );
10926 return false;
10927 }
10928 $notificationSend = true;
10929 }
10930 }
10931 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10932 // valide, affiche un message dans les logs pour avoir un suivi.
10933 if (! $notificationSend) {
10934 $this->addToLog(
10935 sprintf(
10936 '%s %s : %s %s : %s',
10937 __METHOD__,
10938 __("Il n'y a pas de tiers notifiable pour l'instruction"),
10939 $evenement->getVal('libelle'),
10940 __("du dossier"),
10941 $this->getVal('dossier')
10942 ),
10943 DEBUG_MODE
10944 );
10945 }
10946 return true;
10947 }
10948
10949 /**
10950 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10951 * respectant les conditions suvantes :
10952 * - le tiers consulté dois accepté les notifications
10953 * - la liste de diffusion ne dois pas être vide
10954 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10955 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10956 * du tiers
10957 * - le type d'habilitation des tiers dois appartenir à la liste
10958 * fournie en paramètre
10959 * - le tiers dois être associé à la commune ou au département passé
10960 * en paramètre
10961 *
10962 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10963 * pouvant être notifiée
10964 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10965 * @param integer $commune identifiant de la commune du dossier
10966 * @param integer $departement identifiant du département du dossier
10967 *
10968 * @return array listes de diffusion des tiers notifiable
10969 */
10970 protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10971 // Si paramètre non renseigné alors ne renvoie rien
10972 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10973 return false;
10974 }
10975 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10976 $filtreServiceConsulteDI = '';
10977 if (! empty($idPlatau)) {
10978 $filtreServiceConsulteDI = sprintf(
10979 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
10980 -- en charge du dossier
10981 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
10982 OR tiers_consulte.uid_platau_acteur IS NULL)",
10983 $this->f->db->escapeSimple($idPlatau)
10984 );
10985 }
10986 $rst = $this->f->get_all_results_from_db_query(
10987 sprintf(
10988 'SELECT
10989 -- Tiers notifiables lié à la commune du dossier
10990 tiers_consulte.liste_diffusion,
10991 tiers_consulte.libelle
10992 FROM
10993 %1$shabilitation_tiers_consulte
10994 LEFT JOIN %1$stiers_consulte
10995 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10996 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
10997 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
10998 -- Conservation uniquement des tiers acteur de dossiers
10999 JOIN %1$slien_dossier_tiers
11000 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11001 WHERE
11002 tiers_consulte.accepte_notification_email IS TRUE
11003 AND tiers_consulte.liste_diffusion IS NOT NULL
11004 %3$s
11005 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11006 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
11007 -- Filtre sur les tiers acteur du dossier
11008 AND lien_dossier_tiers.dossier = \'%6$s\'
11009 UNION
11010 SELECT
11011 -- Tiers notifiables lié au département du dossier
11012 tiers_consulte.liste_diffusion,
11013 tiers_consulte.libelle
11014 FROM
11015 %1$shabilitation_tiers_consulte
11016 LEFT JOIN %1$stiers_consulte
11017 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
11018 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
11019 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
11020 -- Conservation uniquement des tiers acteur de dossiers
11021 JOIN %1$slien_dossier_tiers
11022 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
11023 WHERE
11024 tiers_consulte.accepte_notification_email IS TRUE
11025 AND tiers_consulte.liste_diffusion IS NOT NULL
11026 %3$s
11027 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
11028 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
11029 -- Filtre sur les tiers acteur du dossier
11030 AND lien_dossier_tiers.dossier = \'%6$s\'',
11031 DB_PREFIXE,
11032 implode(', ', $typesHabilitations),
11033 $filtreServiceConsulteDI,
11034 intval($commune),
11035 intval($departement),
11036 $this->f->db->escapeSimple($this->getVal('dossier'))
11037 ),
11038 array(
11039 "origin" => __METHOD__
11040 )
11041 );
11042 // Faire un order by sur un union ne fonctionne pas. A la place
11043 // c'est le tableau des résultats qui est ordonné.
11044 usort($rst['result'], function($a, $b) {
11045 return strcmp($a['libelle'], $b['libelle']);
11046 });
11047 return $rst['result'];
11048 }
11049 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26