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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 14542 - (show annotations)
Thu Apr 20 13:21:47 2023 UTC (21 months, 2 weeks ago) by softime
File size: 476315 byte(s)
chore(branch): fusion de la branche d'intégration 5.17.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 );
691 }
692
693 /**
694 * CONDITION - is_edition_integrale_enabled
695 *
696 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
697 *
698 * @return boolean
699 */
700 function is_edition_integrale_enabled() {
701 if ($this->getVal("flag_edition_integrale") == 't') {
702 return true;
703 }
704 return false;
705 }
706
707 /**
708 * CONDITION - is_edition_integrale_not_enabled
709 *
710 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
711 *
712 * @return boolean
713 */
714 function is_edition_integrale_not_enabled() {
715 return !$this->is_edition_integrale_enabled();
716 }
717
718 /**
719 * CONDITION - is_option_redaction_libre_enabled
720 *
721 * Vérifie que l'option de rédaction libre est activée.
722 *
723 * @return boolean
724 */
725 function is_option_redaction_libre_enabled() {
726 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
727 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
728 }
729
730 /**
731 * CONDITION - is_option_parapheur_relecture_enabled
732 *
733 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
734 *
735 * @return boolean
736 */
737 function is_parapheur_relecture_parameter_enabled() {
738 //Instanciation de la classe electronicsignature
739 $inst_es = $this->get_electronicsignature_instance();
740 if ($inst_es === false) {
741 return false;
742 }
743
744 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
745 return false;
746 }
747
748 return true;
749 }
750
751 /**
752 * CONDITION - is_parapheur_annulation_parameter_enabled
753 *
754 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
755 *
756 * @return boolean
757 */
758 function is_parapheur_annulation_parameter_enabled() {
759 //Instanciation de la classe electronicsignature
760 $inst_es = $this->get_electronicsignature_instance();
761 if ($inst_es === false) {
762 return false;
763 }
764
765 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
766 return false;
767 }
768
769 return true;
770 }
771
772
773 /**
774 * CONDITION - is_sent_for_signature
775 *
776 * Vérifie que l'instruction a été envoyé à signature
777 *
778 * @return boolean
779 */
780 function is_sent_for_signature() {
781 // Si un parapheur a été configuré
782 // et que le champ id_parapheur_signature n'est pas vide
783 // que le status est différent de "canceled" ou "expired"
784 // alors l'évènement a été envoyé en signature
785 if ($this->has_connector_electronicsignature() === true
786 && empty($this->getVal("id_parapheur_signature")) === false
787 && ($this->getVal("statut_signature") != "canceled"
788 && $this->getVal("statut_signature") != "expired"
789 && $this->getVal("statut_signature") != "finished")) {
790 //
791 return true;
792 }
793
794 return false;
795 }
796
797 /**
798 * CONDITION - is_not_sent_for_signature
799 *
800 * Vérifie que l'instruction n'a pas été envoyé à signature
801 *
802 * @return boolean
803 */
804 function is_not_sent_for_signature() {
805 // Contrôle si l'utilisateur possède un bypass
806 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
807 if ($bypass == true) {
808 return true;
809 }
810
811 return !$this->is_sent_for_signature();
812 }
813
814
815 /**
816 * CONDITION - is_signed
817 *
818 * Vérifie que l'instruction a été signé
819 *
820 * @return boolean
821 */
822 function is_signed() {
823 // Si un parapheur a été configuré
824 // et que le champ id_parapheur_signature n'est pas vide
825 // et que le statut est égal à "finished"
826 // alors le document de l'instruciton à été signé
827 if ($this->has_connector_electronicsignature() === true
828 && empty($this->getVal("id_parapheur_signature")) === false
829 && $this->getVal("statut_signature") == "finished") {
830 //
831 return true;
832 }
833
834 return false;
835 }
836
837
838 /**
839 * is_sent_to_cl
840 *
841 * Vérifie que l'instruction a été envoyé au contrôle de légalité
842 *
843 * @return boolean
844 */
845 function is_sent_to_cl() {
846 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
847 if ($this->getVal('envoye_cl_platau') === 't') {
848 //
849 return true;
850 }
851 //
852 return false;
853 }
854
855 /**
856 * CONDITION - is_portail_notification
857 *
858 * Vérifie si la notification est une notification de catégorie portail
859 *
860 * @return boolean
861 */
862 function is_portail_notification_sans_annexe() {
863 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
864 $ev = $this->get_inst_evenement($this->getVal('evenement'));
865 if ($this->f->get_param_option_notification($collectiviteDi) === PORTAL
866 && $ev->getVal('notification') != 'notification_manuelle_annexe'
867 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
868 ) {
869 return true;
870 }
871 return false;
872 }
873
874 /**
875 * CONDITION - is_not_portail_notification
876 *
877 * Vérifie si la notification n'est pas une notification de catégorie portail
878 *
879 * @return boolean
880 */
881 function is_not_portail_notification_sans_annexe() {
882 return (! $this->is_portail_notification_sans_annexe());
883 }
884
885 /**
886 * CONDITION - can_be_signed
887 *
888 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
889 *
890 * @return boolean
891 */
892 function can_be_signed() {
893 // Instanciation de l'objet signataire_arrete
894 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
895 "obj" => "signataire_arrete",
896 "idx" => $this->getVal("signataire_arrete"),
897 ));
898 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
899 // possède une adresse email, on vérifie le champ id_parapheur_signature
900 // S'il est vide l'évènement peut être envoyé en signature
901 // S'il ne l'est pas, alors on vérifie le champ statut_signature
902 // Si la valeur de ce champ est égal à "canceled" ou "expired"
903 // alors l'évènement peut être envoyé en signature
904 if ($this->has_connector_electronicsignature() === true
905 && $this->getVal("om_final_instruction") == 't'
906 && empty($inst_signataire_arrete->getVal('email')) === false) {
907 //
908 if (empty($this->getVal("id_parapheur_signature")) === true
909 || $this->getVal("statut_signature") == "canceled"
910 || $this->getVal("statut_signature") == "expired") {
911 //
912 return true;
913 }
914 }
915
916 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
917 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
918 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
919 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
920 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
921
922 return false;
923 }
924
925 /**
926 * CONDITION - has_connector_electronicsignature
927 *
928 * Vérifie qu'un parapheur est paramétré
929 *
930 * @return boolean
931 */
932 function has_connector_electronicsignature() {
933 $inst_es = $this->get_electronicsignature_instance(false);
934 if ($inst_es === false) {
935 return false;
936 }
937 return true;
938 }
939
940 /**
941 * CONDITION - can_display_parapheur
942 *
943 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
944 *
945 * @return boolean
946 */
947 function can_display_parapheur() {
948 $evenement_id = $this->getVal("evenement");
949 $inst_evenement = $this->get_inst_evenement($evenement_id);
950 if ($this->has_connector_electronicsignature() === true
951 && $inst_evenement->getVal('lettretype') !== ''
952 && $inst_evenement->getVal('lettretype') !== null
953 && (empty($this->getVal("id_parapheur_signature")) === false
954 || empty($this->getVal("historique_signature")) === false)) {
955 //
956 return true;
957 }
958
959 return false;
960 }
961
962 /**
963 * CONDITION - can_display_notification
964 *
965 * Vérifie que le champs "Suivi notification" est affichable
966 *
967 * @return boolean
968 */
969 function can_display_notification_demandeur() {
970 // Le suivi des notification est affiché si l'événement est notifiable
971 // et si des notifications ont été envoyées
972 $evenement_id = $this->getVal("evenement");
973 $inst_evenement = $this->get_inst_evenement($evenement_id);
974 if ($inst_evenement->getVal('notification') != null &&
975 $inst_evenement->getVal('notification') != '') {
976 // Des notifications ont été envoyé si il existe au moins une notification
977 // liées à l'instruction
978 $idsNotifs = $this->get_instruction_notification(
979 $this->getVal($this->clePrimaire),
980 array(
981 'notification_recepisse',
982 'notification_instruction',
983 'notification_decision',
984 ),
985 true
986 );
987 if (isset($idsNotifs) && $idsNotifs !== array()) {
988 return true;
989 }
990 }
991 return false;
992 }
993
994 /**
995 * CONDITION - can_display_notification
996 *
997 * Vérifie que le champs "suivi_notification_service" est affichable
998 *
999 * @return boolean
1000 */
1001 function can_display_notification_service() {
1002 // Le suivi des notification est affiché si l'événement est notifiable
1003 // et si des notifications ont été envoyées
1004 $evenement_id = $this->getVal("evenement");
1005 $inst_evenement = $this->get_inst_evenement($evenement_id);
1006 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
1007 // Des notifications ont été envoyé si il existe au moins une notification
1008 // de type notification_service_consulte liées à l'instruction
1009 $idsNotifs = $this->get_instruction_notification(
1010 $this->getVal($this->clePrimaire),
1011 'notification_service_consulte'
1012 );
1013 if (isset($idsNotifs) && $idsNotifs !== array()) {
1014 return true;
1015 }
1016 }
1017 return false;
1018 }
1019
1020
1021 /**
1022 * CONDITION - can_display_notification_tiers
1023 *
1024 * Vérifie que le champs "suivi_notification_tiers" est affichable
1025 *
1026 * @return boolean
1027 */
1028 function can_display_notification_tiers() {
1029 // Le suivi des notification est affiché si l'événement est notifiable
1030 // et si des notifications ont été envoyées
1031 $evenement_id = $this->getVal("evenement");
1032 $inst_evenement = $this->get_inst_evenement($evenement_id);
1033 if (! empty($inst_evenement->getVal('notification_tiers'))) {
1034 // Des notifications ont été envoyé si il existe au moins une notification
1035 // de type notification_tiers_consulte liées à l'instruction
1036 $idsNotifs = $this->get_instruction_notification(
1037 $this->getVal($this->clePrimaire),
1038 'notification_tiers_consulte'
1039 );
1040 if (isset($idsNotifs) && $idsNotifs !== array()) {
1041 return true;
1042 }
1043 }
1044 return false;
1045 }
1046
1047 /**
1048 * CONDITION - can_display_notification_commune
1049 *
1050 * Vérifie que le champs "suivi_notification_commune" est affichable
1051 *
1052 * @return boolean
1053 */
1054 function can_display_notification_commune() {
1055 // Le suivi des notification si il existe au moins une notification
1056 // de type notification_depot_demat liées à l'instruction
1057 $idsNotifs = $this->get_instruction_notification(
1058 $this->getVal($this->clePrimaire),
1059 array('notification_depot_demat', 'notification_commune')
1060 );
1061 if (isset($idsNotifs) && $idsNotifs !== array()) {
1062 return true;
1063 }
1064 return false;
1065 }
1066
1067 /**
1068 * TREATMENT - disable_edition_integrale.
1069 *
1070 * Cette methode permet de passer la consultation en "lu"
1071 *
1072 * @return boolean true si maj effectué false sinon
1073 */
1074 function disable_edition_integrale() {
1075 // Cette méthode permet d'exécuter une routine en début des méthodes
1076 // dites de TREATMENT.
1077 $this->begin_treatment(__METHOD__);
1078 $this->correct = true;
1079 $valF = array(
1080 "flag_edition_integrale" => false,
1081 "titre_om_htmletat" => null,
1082 "corps_om_htmletatex" => null,
1083 );
1084 $res = $this->f->db->autoExecute(
1085 DB_PREFIXE.$this->table,
1086 $valF,
1087 DB_AUTOQUERY_UPDATE,
1088 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1089 );
1090 if ($this->f->isDatabaseError($res, true)) {
1091 // Appel de la methode de recuperation des erreurs
1092 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1093 $this->correct = false;
1094 // Termine le traitement
1095 return $this->end_treatment(__METHOD__, false);
1096 } else {
1097 $this->addToMessage(_("Rédaction par compléments activé."));
1098 return $this->end_treatment(__METHOD__, true);
1099 }
1100
1101 // Termine le traitement
1102 return $this->end_treatment(__METHOD__, false);
1103 }
1104
1105 /**
1106 * TREATMENT - enable_edition_integrale.
1107 *
1108 * Cette methode permet de passer la consultation en "lu"
1109 *
1110 * @return boolean true si maj effectué false sinon
1111 */
1112 function enable_edition_integrale() {
1113 // Cette méthode permet d'exécuter une routine en début des méthodes
1114 // dites de TREATMENT.
1115 $this->begin_treatment(__METHOD__);
1116 $this->correct = true;
1117
1118 // Récupère la collectivite du dossier d'instruction
1119 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1120 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1121 //
1122 $params = array(
1123 "specific" => array(
1124 "corps" => array(
1125 "mode" => "get",
1126 )
1127 ),
1128 );
1129 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1130 $corps = $result['pdf_output'];
1131 //
1132 $params = array(
1133 "specific" => array(
1134 "titre" => array(
1135 "mode" => "get",
1136 )
1137 ),
1138 );
1139 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1140 $titre = $result['pdf_output'];
1141 //
1142 $valF = array(
1143 "flag_edition_integrale" => true,
1144 "titre_om_htmletat" => $titre,
1145 "corps_om_htmletatex" => $corps,
1146 );
1147 $res = $this->f->db->autoExecute(
1148 DB_PREFIXE.$this->table,
1149 $valF,
1150 DB_AUTOQUERY_UPDATE,
1151 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1152 );
1153 if ($this->f->isDatabaseError($res, true)) {
1154 // Appel de la methode de recuperation des erreurs
1155 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1156 $this->correct = false;
1157 // Termine le traitement
1158 return $this->end_treatment(__METHOD__, false);
1159 } else {
1160 $this->addToMessage(_("Rédaction libre activé."));
1161 return $this->end_treatment(__METHOD__, true);
1162 }
1163
1164 // Termine le traitement
1165 return $this->end_treatment(__METHOD__, false);
1166 }
1167
1168 /**
1169 * Cette méthode instancie le dossier à partir de l'identifiant passé
1170 * en paramètre et renvoie l'identifiant du dossier d'autorisation (DA)
1171 * associé au dossier.
1172 * Si l'identifiant du dossier n'est pas fourni alors cette méthode
1173 * renverra NULL
1174 *
1175 * @param string identifiant du dossier
1176 * @return null|string null ou identifiant du DA
1177 */
1178 function getNumDemandeAutorFromDossier($id) {
1179 if (!isset($id)) {
1180 return NULL;
1181 }
1182
1183 $dossier = $this->f->get_inst__om_dbform(array(
1184 'obj' => 'dossier',
1185 'idx' => $id,
1186 ));
1187
1188 return $dossier->getVal('dossier_autorisation');
1189 }
1190
1191
1192 function setType(&$form, $maj) {
1193 // Récupération du mode de l'action
1194 $crud = $this->get_action_crud($maj);
1195 // Récupère la collectivité du dossier d'instruction
1196 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1197
1198 // Cache tous les champs
1199 foreach ($this->champs as $value) {
1200 $form->setType($value, 'hidden');
1201 }
1202
1203 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1204 if ($this->can_display_parapheur() === true && $maj == 3) {
1205 $form->setType('statut_signature', 'selectstatic');
1206 $form->setType('historique_signature', 'jsontotab');
1207 if ($this->getVal('commentaire_signature') == null) {
1208 $form->setType('commentaire_signature', 'hidden');
1209 } else {
1210 $form->setType('commentaire_signature', 'hiddenstatic');
1211 }
1212 }
1213
1214 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1215 if ($maj == 3 && $this->can_display_notification_demandeur() === true) {
1216 $form->setType('suivi_notification', 'jsontotab');
1217 }
1218 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1219 if ($maj == 3 && $this->can_display_notification_service() === true) {
1220 $form->setType('suivi_notification_service', 'jsontotab');
1221 }
1222 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1223 if ($maj == 3 && $this->can_display_notification_tiers() === true) {
1224 $form->setType('suivi_notification_tiers', 'jsontotab');
1225 }
1226 // Le champ de suivi des notifications des communes n'est pas affichable dans tous les cas
1227 if ($maj == 3 && $this->can_display_notification_commune() === true) {
1228 $form->setType('suivi_notification_commune', 'jsontotab');
1229 }
1230
1231 // MODE AJOUTER
1232 if ($this->getParameter('maj') == 0) {
1233 $form->setType('commentaire', 'textareahidden');
1234 // Si l'option est active passage du champ date en lecture seule
1235 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1236 $form->setType("date_evenement", "hiddenstaticdate");
1237 } else {
1238 $form->setType("date_evenement", "date");
1239 }
1240 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1241 $form->setType("evenement", "selecthiddenstatic");
1242 } else {
1243 $form->setType("evenement", "select");
1244 }
1245 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1246 $form->setType("signataire_arrete", "selecthiddenstatic");
1247 } else {
1248 $form->setType("signataire_arrete", "select");
1249 }
1250 if ($this->is_option_redaction_libre_enabled() === true) {
1251 $form->setType("flag_edition_integrale", "select");
1252 }
1253 }
1254
1255 // MODE MODIFIER
1256 if ($this->getParameter('maj') == 1) {
1257 // Si l'option est active passage du champ date en lecture seule
1258 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1259 $form->setType("date_evenement", "hiddenstaticdate");
1260 } else {
1261 $form->setType("date_evenement", "date");
1262 }
1263 $form->setType("evenement", "selecthiddenstatic");
1264 if ($this->has_an_edition() === true) {
1265 $form->setType('lettretype', 'hiddenstatic');
1266 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1267 $form->setType("signataire_arrete", "selecthiddenstatic");
1268 } else {
1269 $form->setType("signataire_arrete", "select");
1270 }
1271 if ($this->getVal("flag_edition_integrale") == "t") {
1272 $form->setType("titre_om_htmletat", "htmlEtat");
1273 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1274 } else {
1275 $form->setType("complement_om_html", "html");
1276 $form->setType("complement2_om_html", "html");
1277 $form->setType("complement3_om_html", "html");
1278 $form->setType("complement4_om_html", "html");
1279 $form->setType('bible_auto', 'httpclick');
1280 $form->setType('bible', 'httpclick');
1281 $form->setType('bible2', 'httpclick');
1282 $form->setType('bible3', 'httpclick');
1283 $form->setType('bible4', 'httpclick');
1284 }
1285 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1286 //
1287 $form->setType('btn_refresh', 'httpclickbutton');
1288 $form->setType('btn_preview', 'httpclickbutton');
1289 $form->setType('btn_redaction', 'httpclickbutton');
1290 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1291 // pour identifiant le champ de prévisualisation et régler sa taille à
1292 // l'affichage du champ. En cas de modification, le selecteur doit également
1293 // être mis à jour
1294 $form->setType('live_preview', 'previsualiser_pdf');
1295 }
1296
1297 // necessaire pour calcul de date en modification
1298 //$form->setType('delai', 'hiddenstatic');
1299 // les administrateurs technique et fonctionnel peuvent
1300 // modifier tous les champs de date
1301 // si l'instruction a déjà été finalisée au moins une fois
1302 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1303 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1304 && $this->getVal("date_finalisation_courrier") != '') {
1305 //
1306 $form->setType('date_envoi_signature', 'date');
1307 $form->setType('date_retour_signature', 'date');
1308 if ($this->is_sent_for_signature() === true
1309 && $this->is_signed() === true) {
1310 //
1311 $form->setType("date_envoi_signature", "datereadonly");
1312 $form->setType("date_retour_signature", "datereadonly");
1313 }
1314 $form->setType('date_envoi_rar', 'date');
1315 $form->setType('date_retour_rar', 'date');
1316 $form->setType('date_envoi_controle_legalite', 'date');
1317 if ($this->is_sent_to_cl() === true) {
1318 $form->setType("date_envoi_controle_legalite", "datedisabled");
1319 }
1320 $form->setType('date_retour_controle_legalite', 'date');
1321 $form->setType('date_finalisation_courrier', 'date');
1322 }
1323 }
1324 }
1325
1326 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1327 if ($this->getParameter('maj') == 3
1328 || $this->getParameter('maj') == 2
1329 || $this->getParameter('maj') == 125
1330 || $this->getParameter('maj') == 410) {
1331 //
1332 $form->setType("date_evenement", "datestatic");
1333 $form->setType("evenement", "selecthiddenstatic");
1334 if ($this->has_an_edition() === true) {
1335 $form->setType('lettretype', 'hiddenstatic');
1336 $form->setType("signataire_arrete", "selecthiddenstatic");
1337 if ($this->getVal("om_final_instruction") == 't') {
1338 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1339 } else {
1340 $form->setType('om_final_instruction_utilisateur', 'hidden');
1341 }
1342 }
1343 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1344 $form->setType('commentaire', 'textareastatic');
1345 }
1346 }
1347
1348 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1349 if ($this->getParameter('maj') == 3
1350 || $this->getParameter('maj') == 2
1351 || $this->getParameter('maj') == 410) {
1352 // Si il n'y a pas de lettre type (edition) associé à l'événement
1353 // les dates de suivi ne sont pas affichée
1354 if ($this->has_an_edition() === true) {
1355 $form->setType('date_envoi_signature', 'datestatic');
1356 $form->setType('date_retour_signature', 'datestatic');
1357 $form->setType('date_envoi_rar', 'datestatic');
1358 $form->setType('date_retour_rar', 'datestatic');
1359 $form->setType('date_envoi_controle_legalite', 'datestatic');
1360 $form->setType('date_retour_controle_legalite', 'datestatic');
1361 $form->setType('date_finalisation_courrier', 'datestatic');
1362 if ($this->getVal("flag_edition_integrale") == "t") {
1363 $form->setType("titre_om_htmletat", "htmlstatic");
1364 $form->setType("corps_om_htmletatex", "htmlstatic");
1365 } else {
1366 $form->setType("complement_om_html", "htmlstatic");
1367 $form->setType("complement2_om_html", "htmlstatic");
1368 $form->setType("complement3_om_html", "htmlstatic");
1369 $form->setType("complement4_om_html", "htmlstatic");
1370 }
1371 }
1372 }
1373
1374 // MODE SUIVI DES DATES 125
1375 if ($this->getParameter('maj') == 125) {
1376 $form->setType("date_evenement", "hiddenstaticdate");
1377 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1378 $form->setType('date_envoi_signature', 'date');
1379 $form->setType('date_retour_signature', 'date');
1380 if ($this->is_sent_for_signature() === true
1381 || $this->is_signed() === true) {
1382 //
1383 $form->setType("date_envoi_signature", "datereadonly");
1384 $form->setType("date_retour_signature", "datereadonly");
1385 }
1386 $form->setType('date_envoi_rar', 'date');
1387 $form->setType('date_retour_rar', 'date');
1388 $form->setType('date_envoi_controle_legalite', 'date');
1389 if ($this->is_sent_to_cl() === true) {
1390 $form->setType("date_envoi_controle_legalite", "datedisabled");
1391 }
1392 $form->setType('date_retour_controle_legalite', 'date');
1393 $form->setType('date_finalisation_courrier', 'date');
1394 }
1395
1396 if ($maj == 401) {
1397 foreach ($this->champs as $champ) {
1398 $form->setType($champ, 'hidden');
1399 }
1400 $form->setType('preview_edition', 'previsualiser');
1401 }
1402
1403 // Si l'instruction a été envoyé au contrôle de légalité et que la
1404 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1405 // l'utilisateur que l'envoi au cl est en cours de traitement.
1406 if ($this->is_sent_to_cl() === true
1407 && empty($this->getVal('date_envoi_controle_legalite'))
1408 && $maj == 3) {
1409 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1410 }
1411 }
1412
1413 function setOnchange(&$form,$maj){
1414 parent::setOnchange($form,$maj);
1415
1416 // MODE AJOUTER
1417 if ($this->getParameter('maj') == 0) {
1418 $form->setOnchange(
1419 "evenement",
1420 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1421 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1422 );
1423 }
1424 }
1425
1426 function evenement_has_an_edition($evenement_id) {
1427 $evenement = $this->get_inst_evenement($evenement_id);
1428 $lettretype = $evenement->getVal('lettretype');
1429 if ($lettretype !== '' && $lettretype !== null) {
1430 return true;
1431 }
1432 return false;
1433 }
1434
1435 function view_evenement_has_an_edition_json() {
1436 $json_return = array(
1437 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1438 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1439 );
1440 echo json_encode($json_return);
1441 }
1442
1443 function evenement_has_a_commentaire($evenement_id) {
1444 $evenement = $this->get_inst_evenement($evenement_id);
1445 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1446 }
1447
1448 function view_evenement_has_a_commentaire_json() {
1449 $json_return = array(
1450 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1451 );
1452 echo json_encode($json_return);
1453 }
1454
1455
1456 /**
1457 * CONDITION - can_be_sended_to_cl
1458 *
1459 * Vérifie que le contrôle de légalité est disponible
1460 *
1461 * @return boolean
1462 */
1463 function can_be_sended_to_cl() {
1464 // Si l'instruction a une édition
1465 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1466 // par Plat'AU
1467 // et que la date de retour signature est renseignée
1468 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1469 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1470 if ($this->has_an_edition() === true) {
1471 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1472 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1473 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1474 && empty($this->getVal('date_retour_signature')) === false
1475 && empty($this->getVal('date_envoi_controle_legalite')) === true
1476 && $this->getVal('envoye_cl_platau') === 'f'
1477 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1478 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1479 //
1480 return true;
1481 }
1482 }
1483 //
1484 return false;
1485 }
1486
1487 /**
1488 *
1489 * @return string
1490 */
1491 function get_var_sql_forminc__sql_signataire_arrete() {
1492 return sprintf(
1493 "SELECT
1494 signataire_arrete.signataire_arrete,
1495 CONCAT_WS(
1496 ' - ',
1497 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1498 signataire_habilitation.libelle,
1499 signataire_arrete.description
1500 )
1501 FROM
1502 %1\$ssignataire_arrete
1503 LEFT JOIN %1\$ssignataire_habilitation
1504 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1505 WHERE
1506 ((signataire_arrete.om_validite_debut IS NULL
1507 AND (signataire_arrete.om_validite_fin IS NULL
1508 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1509 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1510 AND (signataire_arrete.om_validite_fin IS NULL
1511 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1512 ORDER BY
1513 signataire_arrete.prenom,
1514 signataire_arrete.nom",
1515 DB_PREFIXE
1516 );
1517 }
1518
1519 /**
1520 *
1521 * @return string
1522 */
1523 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1524 return sprintf(
1525 "SELECT
1526 signataire_arrete.signataire_arrete,
1527 CONCAT_WS(
1528 ' - ',
1529 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1530 signataire_habilitation.libelle,
1531 signataire_arrete.description
1532 )
1533 FROM
1534 %1\$ssignataire_arrete
1535 LEFT JOIN %1\$ssignataire_habilitation
1536 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1537 WHERE
1538 signataire_arrete.signataire_arrete = <idx>",
1539 DB_PREFIXE
1540 );
1541 }
1542
1543 /**
1544 *
1545 * @return string
1546 */
1547 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1548 return sprintf(
1549 "SELECT
1550 signataire_arrete.signataire_arrete,
1551 CONCAT_WS(
1552 ' - ',
1553 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1554 signataire_habilitation.libelle,
1555 signataire_arrete.description
1556 )
1557 FROM
1558 %1\$ssignataire_arrete
1559 LEFT JOIN %1\$som_collectivite
1560 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1561 LEFT JOIN %1\$ssignataire_habilitation
1562 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1563 WHERE
1564 ((signataire_arrete.om_validite_debut IS NULL
1565 AND (signataire_arrete.om_validite_fin IS NULL
1566 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1567 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1568 AND (signataire_arrete.om_validite_fin IS NULL
1569 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1570 AND (om_collectivite.niveau = '2'
1571 OR signataire_arrete.om_collectivite = <collectivite_di>)
1572 ORDER BY
1573 signataire_arrete.prenom, signataire_arrete.nom",
1574 DB_PREFIXE
1575 );
1576 }
1577
1578 /**
1579 *
1580 * @return string
1581 */
1582 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1583 return sprintf(
1584 "SELECT
1585 signataire_arrete.signataire_arrete,
1586 CONCAT_WS(
1587 ' - ',
1588 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1589 signataire_habilitation.libelle,
1590 signataire_arrete.description
1591 )
1592 FROM
1593 %1\$ssignataire_arrete
1594 LEFT JOIN %1\$ssignataire_habilitation
1595 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1596 WHERE
1597 ((signataire_arrete.om_validite_debut IS NULL
1598 AND (signataire_arrete.om_validite_fin IS NULL
1599 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1600 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1601 AND (signataire_arrete.om_validite_fin IS NULL
1602 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1603 AND signataire_arrete.defaut IS TRUE
1604 ORDER BY
1605 signataire_arrete.prenom, signataire_arrete.nom",
1606 DB_PREFIXE
1607 );
1608 }
1609
1610 /**
1611 *
1612 * @return string
1613 */
1614 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1615 return sprintf(
1616 "SELECT
1617 signataire_arrete.signataire_arrete,
1618 CONCAT_WS(
1619 ' - ',
1620 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1621 signataire_habilitation.libelle,
1622 signataire_arrete.description
1623 )
1624 FROM
1625 %1\$ssignataire_arrete
1626 LEFT JOIN %1\$ssignataire_habilitation
1627 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1628 LEFT JOIN %1\$som_collectivite
1629 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1630 WHERE
1631 ((signataire_arrete.om_validite_debut IS NULL
1632 AND (signataire_arrete.om_validite_fin IS NULL
1633 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1634 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1635 AND (signataire_arrete.om_validite_fin IS NULL
1636 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1637 AND signataire_arrete.defaut IS TRUE
1638 AND (om_collectivite.niveau = '2'
1639 OR signataire_arrete.om_collectivite = <collectivite_di>)
1640 ORDER BY
1641 signataire_arrete.prenom,
1642 signataire_arrete.nom",
1643 DB_PREFIXE
1644 );
1645 }
1646
1647 /**
1648 * Renvoie sous la forme d'un tableau la liste des événements pouvant être ajoutés au dossier
1649 * dont l'identifiant a été passé en paramètre dans l'url.
1650 *
1651 * @return array
1652 */
1653 function get_var_sql_forminc__sql_evenement() {
1654 // Récupération du numéro de dossier
1655 $dossier = $this->getParameter("idxformulaire");
1656 // Si changement de décision par instructeur commune
1657 $filter = '';
1658 if ($this->f->isUserInstructeur() === true
1659 && $this->getDivisionFromDossier($dossier) != $_SESSION["division"]
1660 && $this->isInstrCanChangeDecision($dossier) === true) {
1661 $filter = "AND evenement.type IN ('arrete', 'changement_decision')";
1662 }
1663 // Récupération du libellé, de l'identifiant des évènement et d'un booléen permettant
1664 // de déterminer si il s'agit d'évènements suggérés.
1665 $qres = $this->f->get_all_results_from_db_query(
1666 sprintf(
1667 'SELECT
1668 DISTINCT(evenement.evenement),
1669 evenement.libelle,
1670 -- Si l evenement est suggérés alors il sera lié à la table des événements suggérés du dossier
1671 CASE WHEN evenement_suggere_dossier.evenement IS NULL
1672 THEN FALSE
1673 ELSE TRUE
1674 END AS is_suggested
1675 FROM
1676 -- Jointures permettant de récupérer la liste des évènements compatibles avec le dossier
1677 -- selon le type de dossier et l état du dossier.
1678 %1$sevenement
1679 JOIN %1$slien_dossier_instruction_type_evenement
1680 ON evenement.evenement = lien_dossier_instruction_type_evenement.evenement
1681 JOIN %1$stransition
1682 ON evenement.evenement = transition.evenement
1683 JOIN %1$sdossier
1684 ON lien_dossier_instruction_type_evenement.dossier_instruction_type = dossier.dossier_instruction_type
1685 AND transition.etat = dossier.etat
1686 -- Jointures avec une sous requêtes servant à récupérer la liste des évènements suggérés du dossier.
1687 LEFT JOIN (
1688 SELECT
1689 lien_sig_contrainte_evenement.evenement,
1690 dossier.dossier
1691 FROM
1692 %1$slien_sig_contrainte_evenement
1693 JOIN %1$ssig_contrainte
1694 ON lien_sig_contrainte_evenement.sig_contrainte = sig_contrainte.sig_contrainte
1695 JOIN %1$slien_sig_contrainte_dossier_instruction_type
1696 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_dossier_instruction_type.sig_contrainte
1697 JOIN %1$slien_sig_contrainte_om_collectivite
1698 ON sig_contrainte.sig_contrainte = lien_sig_contrainte_om_collectivite.sig_contrainte
1699 JOIN %1$scontrainte
1700 ON sig_contrainte.libelle = contrainte.libelle
1701 JOIN %1$sdossier_contrainte
1702 ON contrainte.contrainte = dossier_contrainte.contrainte
1703 JOIN %1$sdossier
1704 ON dossier_contrainte.dossier = dossier.dossier
1705 AND lien_sig_contrainte_dossier_instruction_type.dossier_instruction_type = dossier.dossier_instruction_type
1706 JOIN %1$som_collectivite
1707 ON lien_sig_contrainte_om_collectivite.om_collectivite = om_collectivite.om_collectivite
1708 AND (dossier.om_collectivite = om_collectivite.om_collectivite
1709 OR om_collectivite.niveau = \'2\')
1710 ) AS evenement_suggere_dossier
1711 ON evenement.evenement = evenement_suggere_dossier.evenement
1712 AND dossier.dossier = evenement_suggere_dossier.dossier
1713 WHERE
1714 dossier.dossier = \'%2$s\'
1715 %3$s
1716 ORDER BY
1717 is_suggested DESC,
1718 evenement.libelle',
1719 DB_PREFIXE,
1720 $this->f->db->escapeSimple($dossier),
1721 $filter
1722 ),
1723 array(
1724 "origin" => __METHOD__
1725 )
1726 );
1727 return $qres['result'];
1728 }
1729
1730 /**
1731 * Récupère un tableau contenant des évènements de la forme :
1732 * $events = array(
1733 * 1 => array(
1734 * 'libelle' => 'evenement_libelle',
1735 * 'evenement' => 'identifiant_evenement',
1736 * 'is_suggested' => true/false -> booleen indiquant si c'est un événement suggéré
1737 * ))
1738 * Et le transforme pour pouvoir l'utiliser pour le remplissage d'un select de formulaire.
1739 *
1740 * Le format de sorti est le suivant :
1741 * $select = array(
1742 * 0 => array( -> liste des id des événements
1743 * '0' => '',
1744 * '1' => array(
1745 * '0' => array(), -> liste des id des événements suggérés
1746 * '1' => array(), -> liste des libelles des événements suggérés
1747 * ),
1748 * ...,
1749 * n => 'id_evenement_n'
1750 * ),
1751 * 1 => array(
1752 * '0' => '__('choisir')." ".__('evenement')',
1753 * '1' => '💡 Suggestions',
1754 * ...,
1755 * 'n' => 'libelle_evenement_n',
1756 * )
1757 * )
1758 *
1759 * @param array tableau des événements
1760 * @return array
1761 */
1762 protected function convert_events_array_to_select_format($events) {
1763 // Remplissage du tableau du select en incluant le groupe des instructions suggérées.
1764 $contenu = array(
1765 0 => array("",),
1766 1 => array(__('choisir')." ".__('evenement'),)
1767 );
1768
1769 if (! empty($events)) {
1770 // S'il y a des évènements suggérés extraction de ces événements et mise en place du groupe
1771 $suggested_event_group = array_filter($events, function($a) {
1772 return $a['is_suggested'] === 't';
1773 });
1774 if (! empty($suggested_event_group)) {
1775 // Prépare les données qui permettront d'afficher le groupe des événements
1776 // suggérés.
1777 $values = array();
1778 $labels = array();
1779 foreach ($suggested_event_group as $index => $suggested_event) {
1780 $values[] = $suggested_event['evenement'];
1781 $labels[] = $suggested_event['libelle'];
1782 // Supprime les évènements suggérés de la liste des évènements
1783 unset($events[$index]);
1784 }
1785 // Remplissage du select pour le groupe
1786 $contenu[0][] = array($values, $labels);
1787 $contenu[1][] = __('💡 Suggestions');
1788 }
1789
1790 // Remplissage du select
1791 foreach ($events as $event) {
1792 $contenu[0][] = $event['evenement'];
1793 $contenu[1][] = $event['libelle'];
1794 }
1795 }
1796 return $contenu;
1797 }
1798
1799 /**
1800 * SETTER_FORM - setSelect.
1801 *
1802 * @return void
1803 */
1804 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1805 //parent::setSelect($form, $maj);
1806 /**
1807 * On ne surcharge pas la méthode parent car une requête sur la table
1808 * dossier est mauvaise pour les performances, car la requête qui
1809 * concerne evenement est plus complexe que celle générée et car les
1810 * champs action, avis_decision et etat ne sont pas utilisés comme des
1811 * select
1812 */
1813 //// action
1814 //$this->init_select($form, $this->f->db, $maj, null, "action",
1815 // $sql_action, $sql_action_by_id, false);
1816
1817 //// avis_decision
1818 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1819 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1820
1821 //// dossier
1822 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1823 // $sql_dossier, $sql_dossier_by_id, false);
1824
1825 //// etat
1826 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1827 // $sql_etat, $sql_etat_by_id, false);
1828
1829 //// evenement
1830 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1831 // $sql_evenement, $sql_evenement_by_id, false);
1832
1833 // signataire_arrete
1834 // si contexte DI
1835 if ($this->getParameter("retourformulaire") == "dossier"
1836 || $this->f->contexte_dossier_instruction()) {
1837 // on recupère les signataires de la multicollectivité et de celle du DI
1838 $di = $this->f->get_inst__om_dbform(array(
1839 "obj" => "dossier_instruction",
1840 "idx" => $this->getParameter('idxformulaire'),
1841 ));
1842 $sql_signataire_arrete_by_di = str_replace(
1843 '<collectivite_di>',
1844 $di->getVal("om_collectivite"),
1845 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1846 );
1847 $this->init_select(
1848 $form,
1849 $this->f->db,
1850 $maj,
1851 null,
1852 "signataire_arrete",
1853 $sql_signataire_arrete_by_di,
1854 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1855 true
1856 );
1857 } else {
1858 $this->init_select(
1859 $form,
1860 $this->f->db,
1861 $maj,
1862 null,
1863 "signataire_arrete",
1864 $this->get_var_sql_forminc__sql("signataire_arrete"),
1865 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1866 true
1867 );
1868 }
1869
1870 /**
1871 * Gestion du filtre sur les événements de workflow disponibles
1872 * On récupère ici en fonction de l'état du dossier d'instruction en
1873 * cours et du type du dossier d'instruction en cours la liste
1874 * événements disponibles.
1875 */
1876 if ($maj == 0) {
1877 $evenements = $this->get_var_sql_forminc__sql_evenement();
1878 $form->setSelect("evenement", $this->convert_events_array_to_select_format($evenements));
1879 } else {
1880 // Instanciation de l'événement pour récupérer son libellé
1881 $evenement = $this->f->get_inst__om_dbform(array(
1882 "obj" => "evenement",
1883 "idx" => $this->getVal("evenement"),
1884 ));
1885
1886 $contenu = array(
1887 0 => array($this->getVal("evenement"),),
1888 1 => array($evenement->getVal('libelle'),)
1889 );
1890 $form->setSelect("evenement", $contenu);
1891 }
1892
1893 /**
1894 * Gesion des liens vers la bible
1895 */
1896 // lien bible_auto
1897 $contenu = array(_("automatique"));
1898 $form->setSelect("bible_auto",$contenu);
1899 // lien bible1
1900 $contenu = array(_("bible"));
1901 $form->setSelect("bible",$contenu);
1902 // lien bible2
1903 $contenu = array(_("bible"));
1904 $form->setSelect("bible2",$contenu);
1905 // lien bible3
1906 $contenu = array(_("bible"));
1907 $form->setSelect("bible3",$contenu);
1908 // lien bible4
1909 $contenu = array(_("bible"));
1910 $form->setSelect("bible4",$contenu);
1911
1912 if ($maj == 1) {
1913 $base64 = $this->init_pdf_temp();
1914 $form->setSelect('live_preview', array('base64'=>$base64));
1915 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1916 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1917 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1918 }
1919
1920 // Selection du type de rédaction à l'ajout
1921 $content = array(
1922 0 => array('f', 't', ),
1923 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1924 );
1925 $form->setSelect('flag_edition_integrale', $content);
1926
1927 $contenu = array();
1928 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1929 $contenu[0][] = $value;
1930 $contenu[1][] = $this->get_trad_for_statut($value);
1931 }
1932 $form->setSelect('statut_signature', $contenu);
1933
1934
1935 if ($maj == 401) {
1936 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1937 $form->setSelect('preview_edition', array(
1938 'base64' => base64_encode($file['file_content']),
1939 'mimetype' => $file['metadata']['mimetype'],
1940 'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1941 'href' => sprintf(
1942 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1943 $this->getVal($this->clePrimaire)
1944 )
1945 ));
1946 }
1947 }
1948
1949 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1950 //
1951 // Vérifie uniquementla cle secondaire : demande
1952 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1953
1954 $id = $this->getVal($this->clePrimaire);
1955
1956 //Requête de vérification que cet événement d'instruction n'est pas lié
1957 //à la création d'un dossier d'instruction
1958 $qres = $this->f->get_one_result_from_db_query(
1959 sprintf(
1960 'SELECT
1961 demande_type.dossier_instruction_type
1962 FROM
1963 %1$sdemande_type
1964 LEFT JOIN %1$sdemande
1965 ON demande.demande_type = demande_type.demande_type
1966 WHERE
1967 demande.instruction_recepisse = \'%2$d\'',
1968 DB_PREFIXE,
1969 intval($id)
1970 ),
1971 array(
1972 "origin" => __METHOD__,
1973 )
1974 );
1975
1976 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1977 //création de dossier d'instruction, l'événement d'instruction peut être
1978 //supprimé
1979 if ( $this->correct !== false || $qres['result'] == null || $qres['result'] == ""){
1980 // Requête de vérification que cet événement d'instruction est lié
1981 // à une demande
1982 $qres = $this->f->get_one_result_from_db_query(
1983 sprintf(
1984 'SELECT
1985 demande
1986 FROM
1987 %1$sdemande
1988 WHERE
1989 instruction_recepisse = \'%2$d\'',
1990 DB_PREFIXE,
1991 intval($id)
1992 ),
1993 array(
1994 "origin" => __METHOD__,
1995 )
1996 );
1997
1998 //Si c'est un événement d'instruction lié à une demande
1999 if ($qres['result'] != null || $qres['result'] != ""){
2000 $demande = $this->f->get_inst__om_dbform(array(
2001 "obj" => "demande",
2002 "idx" => $qres['result'],
2003 ));
2004
2005 //On met à jour la demande en supprimant la liaison vers
2006 //l'événement d'instruction
2007 $demande->setParameter("maj", 1);
2008 $valF = array();
2009 foreach($demande->champs as $identifiant => $champ) {
2010 $valF[$champ] = $demande->val[$identifiant];
2011 }
2012 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
2013 $valF['instruction_recepisse']=NULL;
2014 $ret = $demande->modifier($valF);
2015 }
2016
2017 /**
2018 * Vérification que l'élément supprimé est le dernier pour pouvoir
2019 * remodifier les données de manière itérative.
2020 */
2021 $qres = $this->f->get_one_result_from_db_query(
2022 sprintf(
2023 'SELECT
2024 max(instruction)
2025 FROM
2026 %1$sinstruction
2027 WHERE
2028 dossier = \'%2$s\'',
2029 DB_PREFIXE,
2030 $this->f->db->escapeSimple($this->getParameter("idxformulaire"))
2031 ),
2032 array(
2033 "origin" => __METHOD__,
2034 )
2035 );
2036
2037 // Si on se trouve effectivement sur le dernier evenement d'instruction
2038 // alors on valide la suppression sinon on l'annule
2039 $this->correct = false;
2040 $message = __("Seul le dernier evenement d'instruction peut etre supprime.");
2041 if ($qres['result'] == $id) {
2042 // Alors on valide la suppression
2043 $this->correct = true;
2044 $message = __('Destruction_chronologique');
2045 }
2046 $this->addToMessage($message);
2047 }
2048 }
2049
2050 /**
2051 * Vérification de la possibilité ou non de modifier des dates de suivi
2052 * @param string $champ champ date à vérifier
2053 */
2054 function updateDate($champ) {
2055
2056 //Si le retourformulaire est "dossier_instruction"
2057 if ($this->getParameter("retourformulaire") == "dossier"
2058 || $this->f->contexte_dossier_instruction()) {
2059
2060 // Vérification de la possibilité de modifier les dates si déjà éditées
2061 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
2062 // si l'utilisateur n'est pas un admin
2063 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
2064 $this->correct = false;
2065 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
2066 }
2067 }
2068 }
2069
2070 //
2071 return true;
2072 }
2073
2074 /**
2075 * SETTER_FORM - setValsousformulaire (setVal).
2076 *
2077 * @return void
2078 */
2079 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
2080 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
2081 //
2082 $this->retourformulaire = $retourformulaire;
2083 //
2084 if ($maj == 0) {
2085 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
2086 $form->setVal("dossier", $this->getParameter("idxformulaire"));
2087 }
2088
2089 // Si l'instruction a été envoyé au contrôle de légalité et que la
2090 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
2091 // l'utilisateur que l'envoi au cl est en cours de traitement.
2092 if ($this->is_sent_to_cl() === true
2093 && empty($this->getVal('date_envoi_controle_legalite'))
2094 && $maj == 3) {
2095 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
2096 }
2097 //
2098 $this->set_form_default_values($form, $maj, $validation);
2099 }
2100
2101 /**
2102 * SETTER_FORM - set_form_default_values (setVal).
2103 *
2104 * @return void
2105 */
2106 function set_form_default_values(&$form, $maj, $validation) {
2107 //
2108 if ($maj == 0) {
2109 // si contexte DI
2110 if ($this->getParameter("retourformulaire") == "dossier"
2111 || $this->f->contexte_dossier_instruction()) {
2112 // on recupère les signataires de la multicollectivité et de celle du DI
2113 $di = $this->f->get_inst__om_dbform(array(
2114 "obj" => "dossier_instruction",
2115 "idx" => $this->getParameter("idxformulaire"),
2116 ));
2117 $sql = str_replace(
2118 "<collectivite_di>",
2119 $di->getVal("om_collectivite"),
2120 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
2121 );
2122 } else {
2123 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
2124 }
2125
2126 $qres = $this->f->get_all_results_from_db_query($sql, array(
2127 "origin" => __METHOD__));
2128 $row = array_shift($qres['result']);
2129 if (isset($row["signataire_arrete"])
2130 && is_numeric($row["signataire_arrete"])) {
2131 //
2132 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
2133 }
2134 // Date du jour
2135 $form->setVal("date_evenement", date("Y-m-d"));
2136 }
2137 //
2138 if ($maj == 0 || $maj == 1 || $maj == 125) {
2139 $form->setVal("bible_auto", "bible_auto()");
2140 $form->setVal("bible", "bible(1)");
2141 $form->setVal("bible2", "bible(2)");
2142 $form->setVal("bible3", "bible(3)");
2143 $form->setVal("bible4", "bible(4)");
2144 }
2145 //
2146 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2147 if ($maj == 1
2148 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2149 && $this->has_an_edition() === true) {
2150 //
2151 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
2152 $form->setVal("btn_refresh", "reload_pdf_viewer()");
2153 $form->setVal("btn_preview", "show_instr_preview()");
2154 $form->setVal("btn_redaction", "show_instr_redaction()");
2155 }
2156
2157 // Gestion de l'affichage des suivis de notification des demandeurs, des services, des tiers et
2158 // des communes
2159 if ($maj == 3) {
2160 if ($this->can_display_notification_demandeur()) {
2161 $typeNotification = array(
2162 'notification_recepisse',
2163 'notification_instruction',
2164 'notification_decision',
2165 );
2166 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2167 }
2168 if ($this->can_display_notification_service()) {
2169 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2170 }
2171 if ($this->can_display_notification_tiers()) {
2172 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2173 }
2174 if ($this->can_display_notification_commune()) {
2175 $form->setVal("suivi_notification_commune", $this->get_json_suivi_notification(array('notification_depot_demat', 'notification_commune')));
2176 }
2177 }
2178 }
2179
2180 function setLayout(&$form, $maj){
2181 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2182 // citoyen, si la notification des demandeurs est activée sur l'évenement
2183 // d'instruction et que le paramétrage du demandeur principal n'est pas
2184 // correct alors un message a destination de l'instructeur est affiché.
2185 if ($maj == 3) {
2186 // Si le dossier n'a pas été déposé sur le portail citoyen (ou si
2187 // la requête permettant de savoir le type de demande à échouée) et si
2188 // la notification se fait par mail vérifie si il y a des erreurs de
2189 // paramétrage et si c'est le cas on affiche un message d'information
2190 $collectivite = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
2191 $categorieNotif = $this->f->get_param_option_notification($collectivite);
2192 if (($this->dossier_depose_sur_portail() == null ||
2193 ! $this->dossier_depose_sur_portail()) &&
2194 $categorieNotif === 'mail' ) {
2195 $erreurParam = $this->get_info_notification_fail();
2196 // Récupération de l'évenement d'instruction
2197 $instEV = $this->get_inst_evenement();
2198 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2199 $class = 'text-info ui-state-highlight ui-state-info';
2200 $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2201 $this->f->display_panel_information(
2202 $class,
2203 $message,
2204 $erreurParam,
2205 __('Veuillez corriger les informations suivantes.'),
2206 'erreur_param_notif'
2207 );
2208 }
2209 }
2210 }
2211 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2212
2213 $form->setFieldset('evenement','D',_('Evenement'));
2214 $form->setFieldset('om_final_instruction_utilisateur','F','');
2215
2216 $form->setBloc('om_final_instruction_utilisateur','F');
2217
2218 $form->setBloc('date_finalisation_courrier','D',"","");
2219
2220 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2221 $form->setBloc('date_finalisation_courrier','D',"","col_6");
2222 $form->setBloc('date_envoi_controle_legalite','F');
2223
2224 $form->setBloc('date_retour_signature','D',"","col_6");
2225 $form->setBloc('date_retour_controle_legalite','F');
2226 $form->setFieldset('date_retour_controle_legalite','F','');
2227
2228 $form->setBloc('date_retour_controle_legalite','F');
2229
2230 $form->setBloc('statut_signature','D');
2231 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2232 $form->setBloc('commentaire_signature','F');
2233 $form->setBloc('historique_signature','D');
2234 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2235 $form->setBloc('historique_signature','F');
2236 $form->setFieldset('historique_signature','F');
2237
2238 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2239 $form->setFieldset('suivi_notification','F');
2240 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2241 $form->setFieldset('suivi_notification_service','F');
2242 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2243 $form->setFieldset('suivi_notification_tiers','F');
2244 $form->setFieldset('suivi_notification_commune', 'D', __("Suivi notification commune"), "collapsible");
2245 $form->setFieldset('suivi_notification_commune','F');
2246
2247 if ($maj == 1) {
2248 // Récupère la collectivité du dossier d'instruction
2249 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2250
2251 //
2252 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2253 && $this->has_an_edition() === true) {
2254 //
2255 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2256 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2257 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2258 $form->setFieldset('complement_om_html','D',_('Complement'));
2259 $form->setFieldset('bible','F','');
2260 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2261 $form->setFieldset('bible2','F','');
2262 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2263 $form->setFieldset('bible3','F','');
2264 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2265 $form->setFieldset('bible4','F','');
2266 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2267 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2268 $form->setBloc('corps_om_htmletatex','F');
2269 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2270 $form->setBloc('btn_preview','F');
2271 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2272 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2273 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2274 $form->setFieldset('live_preview','F');
2275 $form->setBloc('live_preview','F');
2276 $form->setBloc('live_preview','F');
2277 } else {
2278 $form->setBloc('complement_om_html','D',"","hidelabel");
2279 $form->setFieldset('complement_om_html','D',_('Complement'));
2280 $form->setFieldset('bible','F','');
2281 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2282 $form->setFieldset('bible2','F','');
2283 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2284 $form->setFieldset('bible3','F','');
2285 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2286 $form->setFieldset('bible4','F','');
2287 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2288 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2289 $form->setBloc('corps_om_htmletatex','F');
2290 }
2291 } else {
2292 $form->setBloc('complement_om_html','D',"","hidelabel");
2293 $form->setFieldset('complement_om_html','D',_('Complement'));
2294 $form->setFieldset('bible','F','');
2295 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2296 $form->setFieldset('bible2','F','');
2297 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2298 $form->setFieldset('bible3','F','');
2299 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2300 $form->setFieldset('bible4','F','');
2301 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2302 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2303 $form->setBloc('corps_om_htmletatex','F');
2304 }
2305 }
2306
2307 function setLib(&$form, $maj) {
2308 //
2309 parent::setLib($form, $maj);
2310 //
2311 $form->setLib('bible_auto', "");
2312 $form->setLib('bible', "");
2313 $form->setLib('bible2', "");
2314 $form->setLib('bible3', "");
2315 $form->setLib('bible4', "");
2316 $form->setLib('btn_refresh', "");
2317 $form->setLib('btn_preview', "");
2318 $form->setLib('btn_redaction', "");
2319 $form->setLib('live_preview', "");
2320 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2321 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2322 $form->setLib('date_retour_rar', __("date_notification"));
2323 $form->setLib('statut_signature', __("statut"));
2324 $form->setLib('commentaire_signature', __("commentaire"));
2325 $form->setLib('historique_signature', '');
2326 $form->setLib('suivi_notification', '');
2327 $form->setLib('suivi_notification_service', '');
2328 $form->setLib('suivi_notification_tiers', '');
2329 $form->setLib('suivi_notification_commune', '');
2330 $form->setLib('preview_edition', "");
2331
2332 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2333 // ajout et que l'option de rédaction libre est activée sur la
2334 // collectivité du dossier
2335 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2336 //
2337 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2338 $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.");
2339 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2340 }
2341 else {
2342 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2343 }
2344
2345 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2346 // modification et que l'option de prévisualisation de l'édition est
2347 // activée sur la collectivité du dossier
2348 if ($maj === '1'
2349 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2350 //
2351 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2352 $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.");
2353 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2354 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2355 }
2356 }
2357
2358 /**
2359 * TRIGGER - triggerajouter.
2360 *
2361 * @return boolean
2362 */
2363 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2364 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2365 /**
2366 * Le code suivant permet de récupérer des valeurs des tables evenement
2367 * et dossier pour les stocker dans l'instruction :
2368 * DEPUIS L'EVENEMENT
2369 * - action
2370 * - delai
2371 * - accord_tacite
2372 * - etat
2373 * - avis_decision
2374 * - delai_notification
2375 * - lettretype
2376 * - autorite_competente
2377 * - pec_metier
2378 * - complement_om_html
2379 * - complement2_om_html
2380 * - complement3_om_html
2381 * - complement4_om_html
2382 * - complement5_om_html
2383 * DEPUIS LE DOSSIER D'INSTRUCTION
2384 * - archive_delai
2385 * - archive_accord_tacite
2386 * - archive_etat
2387 * - archive_avis
2388 * - date_complet
2389 * - date_rejet
2390 * - date_limite
2391 * - date_notification_delai
2392 * - date_decision
2393 * - date_validite
2394 * - date_achevement
2395 * - date_chantier
2396 * - date_conformite
2397 * - avis_decision
2398 */
2399 // Récupération de tous les paramètres de l'événement sélectionné
2400 // TODO : remplacer cette requête par l'instanciation de l'événement
2401 $qres = $this->f->get_all_results_from_db_query(
2402 sprintf(
2403 'SELECT
2404 *
2405 FROM
2406 %1$sevenement
2407 WHERE
2408 evenement = %2$d',
2409 DB_PREFIXE,
2410 intval($this->valF['evenement'])
2411 ),
2412 array(
2413 "origin" => __METHOD__,
2414 )
2415 );
2416 foreach ($qres['result'] as $row) {
2417 // Récupération de l'identifiant de l'action
2418 // si une action est paramétrée dans l'événement
2419 $this->valF['action'] = NULL;
2420 if (isset($row['action']) and !empty($row['action'])) {
2421 $this->valF['action']=$row['action'];
2422 }
2423 // Récupération de la valeur du délai
2424 $this->valF['delai'] = $row['delai'];
2425 // Récupération de l'identifiant de l'état
2426 // si un état est paramétré dans l'événement
2427 $this->valF['etat']=NULL;
2428 if (isset($row['etat']) and !empty($row['etat'])) {
2429 $this->valF['etat']=$row['etat'];
2430 }
2431 // Récupération de la valeur d'accord tacite
2432 $this->valF['accord_tacite']=$row['accord_tacite'];
2433 // Récupération de la valeur du délai de notification
2434 $this->valF['delai_notification']=$row['delai_notification'];
2435 // Récupération de l'identifiant de l'avis
2436 // si un avis est paramétré dans l'événement
2437 $this->valF['avis_decision'] = NULL;
2438 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2439 $this->valF['avis_decision']=$row['avis_decision'];
2440 }
2441 // Récupération de la valeur de l'autorité compétente
2442 // si l'autorité compétente est paramétré dans l'événement
2443 $this->valF['autorite_competente'] = NULL;
2444 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2445 $this->valF['autorite_competente']=$row['autorite_competente'];
2446 }
2447 // Récupération de la valeur de la lettre type
2448 $this->valF['lettretype']=$row['lettretype'];
2449 // Récupération de la valeur de la prise en compte métier
2450 // si la prise en compte métier est paramétrée dans l'événement
2451 $this->valF['pec_metier'] = NULL;
2452 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2453 $this->valF['pec_metier'] = $row['pec_metier'];
2454 }
2455 }
2456 // Récupération de toutes les valeurs du dossier d'instruction en cours
2457 // TODO : remplacer cette requête par l'instanciation de l'objet
2458 $qres = $this->f->get_all_results_from_db_query(
2459 sprintf(
2460 'SELECT
2461 *
2462 FROM
2463 %1$sdossier
2464 WHERE
2465 dossier = \'%2$s\'',
2466 DB_PREFIXE,
2467 $this->f->db->escapeSimple($this->valF['dossier'])
2468 ),
2469 array(
2470 "origin" => __METHOD__,
2471 )
2472 );
2473 $row = array_shift($qres['result']);
2474 $this->updateArchiveData($row);
2475
2476 // Récupération de la duree de validite du dossier d'autorisation
2477 $qres = $this->f->get_one_result_from_db_query(
2478 sprintf(
2479 'SELECT
2480 duree_validite_parametrage
2481 FROM
2482 %1$sdossier_autorisation_type_detaille
2483 LEFT JOIN %1$sdossier_autorisation
2484 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2485 LEFT JOIN %1$sdossier
2486 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2487 WHERE
2488 dossier.dossier = \'%2$s\'',
2489 DB_PREFIXE,
2490 $this->f->db->escapeSimple($this->valF['dossier'])
2491 ),
2492 array(
2493 "origin" => __METHOD__,
2494 )
2495 );
2496
2497 if ($qres['result'] != '') {
2498 $this->valF['duree_validite_parametrage'] = $qres['result'];
2499 }
2500
2501 // Identifiant du type de courrier
2502 $idTypeCourrier = '11';
2503 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2504 // Code barres
2505 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2506 }
2507
2508 /**
2509 * Test si une restriction est valide.
2510 *
2511 * @return boolean
2512 */
2513 function restrictionIsValid($restriction){
2514 if($this->restriction_valid != null) {
2515 return $this->restriction_valid;
2516 }
2517 if(empty($restriction)) {
2518 $this->restriction_valid = true;
2519 return $this->restriction_valid;
2520 }
2521 // Liste des opérateurs possibles sans espace
2522 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2523 // Liste identique mais avec le marqueur §
2524 $mark = "§";
2525 $operateurs_marked = array();
2526 foreach ($operateurs as $operateur) {
2527 $operateurs_marked[] = $mark.$operateur.$mark;
2528 }
2529
2530 // Supprime tous les espaces de la chaîne de caractère
2531 $restriction = preg_replace('/\s+/', '', $restriction);
2532
2533 // Met un marqueur avant et après les opérateurs
2534 // puis transforme la chaine en un tableau
2535 $restriction = str_replace($operateurs, $operateurs_marked,
2536 $restriction);
2537
2538 // Pour chaque opérateur logique
2539 foreach (array('&&', '||') as $operator) {
2540
2541 // S'il est absent on ne fait aucun traitement
2542 if (strpos($restriction, $mark.$operator.$mark) === false) {
2543 continue;
2544 }
2545 // Sinon on vérifie les deux conditions avec le OU/ET logique
2546 $restrictions = explode($mark.$operator.$mark, $restriction);
2547 $restrictions[0] = explode($mark, $restrictions[0]);
2548 $restrictions[1] = explode($mark, $restrictions[1]);
2549 $res_bool = false;
2550 if ($operator == '&&') {
2551 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2552 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2553 $res_bool = true;
2554 }
2555 }
2556 if ($operator == '||') {
2557 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2558 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2559 $res_bool = true;
2560 }
2561 }
2562 return $res_bool;
2563 }
2564 $tabRestriction = explode($mark, $restriction);
2565 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2566
2567 }
2568
2569 function is_restriction_satisfied($restriction, $operateurs) {
2570 // Tableau comprenant les résultat
2571 $res = array();
2572 // Compteur pour les résultat
2573 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2574 $j = 1;
2575 // Comparateur du calcul
2576 $comparateur = '';
2577 // Booléen retourné
2578 $res_bool = true;
2579
2580 // S'il y a un comparateur
2581 if (in_array(">=", $restriction)
2582 || in_array("<=", $restriction)
2583 || in_array("==", $restriction)
2584 || in_array("!=", $restriction)) {
2585
2586 // Si le tableau n'est pas vide
2587 if (count($restriction) > 0) {
2588
2589 // Boucle dans le tableau pour récupérer seulement les valeurs
2590 foreach ($restriction as $key => $value) {
2591 //
2592 if (!in_array($value, $operateurs)) {
2593 if ($this->getRestrictionValue($value) != false) {
2594 $res[] = $this->getRestrictionValue($value);
2595 } else {
2596 // Message d'erreur
2597 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2598 $this->addToMessage($error_message);
2599 // Arrête le traitement
2600 return false;
2601 }
2602 }
2603 }
2604
2605 // Boucle dans le tableau
2606 // commence à 1 car le 0 doit rester inchangé tout au long du
2607 // traitement
2608 for ($i = 1; $i<count($restriction); $i++) {
2609
2610 // Récupère le comparateur
2611 if ($restriction[$i] === ">="
2612 || $restriction[$i] === "<="
2613 || $restriction[$i] === "=="
2614 || $restriction[$i] === "!=") {
2615 $comparateur = $restriction[$i];
2616 }
2617
2618 // Si l'opérateur qui suit est un "+"
2619 if ($restriction[$i] === "+") {
2620 $dateDep = $res[$j];
2621 unset($res[$j]);$j++;
2622 $duree = $res[$j];
2623 unset($res[$j]);
2624 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2625 }
2626
2627 // Si l'opérateur qui suit est un "-"
2628 if ($restriction[$i] === "-") {
2629 $dateDep = $res[$j];
2630 unset($res[$j]);$j++;
2631 $duree = $res[$j];
2632 unset($res[$j]);
2633 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2634 }
2635 }
2636
2637 }
2638
2639 // Si les tableau des résultats n'est pas vide
2640 if (count($res) > 0) {
2641 //
2642 $res_bool = false;
2643 // Effectue le test
2644 if ($comparateur === ">=") {
2645 //
2646 if (strtotime($res[0]) >= strtotime($res[$j])) {
2647 $res_bool = true;
2648 }
2649 }
2650 if ($comparateur === "<=") {
2651 //
2652 if (strtotime($res[0]) <= strtotime($res[$j])) {
2653 $res_bool = true;
2654 }
2655 }
2656 if ($comparateur === "==") {
2657 //
2658 if (strtotime($res[0]) == strtotime($res[$j])) {
2659 $res_bool = true;
2660 }
2661 }
2662 if ($comparateur === "!=") {
2663 //
2664 if (strtotime($res[0]) != strtotime($res[$j])) {
2665 $res_bool = true;
2666 }
2667 }
2668 }
2669 // Sinon une erreur s'affiche
2670 } else {
2671
2672 // Message d'erreur
2673 $error_message = _("Mauvais parametrage de la restriction.")." ".
2674 _("Contactez votre administrateur");
2675 $this->addToMessage($error_message);
2676 // Arrête le traitement
2677 return false;
2678 }
2679
2680 return $res_bool;
2681
2682 }
2683
2684 /**
2685 * Permet de définir si l'événement passé en paramètre est un événement retour.
2686 * @param integer $evenement événement à tester
2687 *
2688 * @return boolean retourne true si événement retour sinon false
2689 */
2690 function is_evenement_retour($evenement) {
2691 if(empty($evenement) || !is_numeric($evenement)) {
2692 return "";
2693 }
2694
2695 $evenement = $this->f->get_inst__om_dbform(array(
2696 "obj" => "evenement",
2697 "idx" => $evenement,
2698 ));
2699
2700 return $evenement->getVal('retour') == 't';
2701 }
2702
2703 /**
2704 * Retourne le champ restriction de l'événement passé en paramètre.
2705 *
2706 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2707 *
2708 * @return string contenu du champ restriction
2709 */
2710 function get_restriction($evenement) {
2711 if(empty($evenement) || !is_numeric($evenement)) {
2712 return "";
2713 }
2714 //Récupère la restriction
2715 $evenement = $this->f->get_inst__om_dbform(array(
2716 "obj" => "evenement",
2717 "idx" => $evenement,
2718 ));
2719
2720 return $evenement->getVal('restriction');
2721 }
2722
2723 /**
2724 * Récupère la valeur du champ dans la restriction
2725 * @param string $restrictionValue Nom du champ
2726 * @return mixed Valeur du champ
2727 */
2728 function getRestrictionValue($restrictionValue){
2729
2730 // Initialisation de la valeur de retour
2731 $return = false;
2732
2733 // Récupére les valeurs du dossier
2734 $value_dossier = $this->get_dossier_actual();
2735
2736 //
2737 if (is_numeric($restrictionValue)) {
2738 $return = $restrictionValue;
2739 }elseif (isset($value_dossier[$restrictionValue])) {
2740 $return = $value_dossier[$restrictionValue];
2741 }elseif (isset($this->valF[$restrictionValue])) {
2742 $return = $this->valF[$restrictionValue];
2743 }
2744
2745 // Retourne la valeur du champ
2746 return $return;
2747 }
2748
2749
2750 /**
2751 * Calcul des règle d'action selon leur type.
2752 *
2753 * Types de règle :
2754 * - date
2755 * - numeric
2756 * - text
2757 * - bool
2758 * - specific
2759 * - technical_data
2760 *
2761 * @param string $rule Règle d'action.
2762 * @param string $rule_name Nom de la règle.
2763 * @param string $type Type de la règle.
2764 *
2765 * @return mixed Résultat de la règle
2766 */
2767 public function regle($rule, $rule_name, $type = null) {
2768
2769 // Supprime tous les espaces de la chaîne de caractère
2770 $rule = str_replace(' ', '', $rule);
2771 // Coupe la chaîne au niveau de l'opérateur
2772 $operands = explode ("+", $rule);
2773 // Nombre d'opérande
2774 $nb_operands = count($operands);
2775
2776 // Règle à null
2777 if ($rule == "null") {
2778 return null;
2779 }
2780
2781 // Tableau des champs de type date
2782 $rule_type_date = array(
2783 "regle_date_limite",
2784 "regle_date_notification_delai",
2785 "regle_date_complet",
2786 "regle_date_validite",
2787 "regle_date_decision",
2788 "regle_date_chantier",
2789 "regle_date_achevement",
2790 "regle_date_conformite",
2791 "regle_date_rejet",
2792 "regle_date_dernier_depot",
2793 "regle_date_limite_incompletude",
2794 "regle_date_cloture_instruction",
2795 "regle_date_premiere_visite",
2796 "regle_date_derniere_visite",
2797 "regle_date_contradictoire",
2798 "regle_date_retour_contradictoire",
2799 "regle_date_ait",
2800 "regle_date_transmission_parquet",
2801 "regle_date_affichage",
2802 );
2803 // Tableau des champs de type numérique
2804 $rule_type_numeric = array(
2805 "regle_delai",
2806 "regle_delai_incompletude",
2807 );
2808 // Tableau des champs de type text
2809 $rule_type_text = array(
2810 );
2811 // Tableau des champs de type booléen
2812 $rule_type_bool = array(
2813 "regle_a_qualifier",
2814 "regle_incompletude",
2815 "regle_incomplet_notifie",
2816 "regle_evenement_suivant_tacite_incompletude",
2817 );
2818 // Tableau des champs spécifiques
2819 $rule_type_specific = array(
2820 "regle_autorite_competente",
2821 "regle_etat",
2822 "regle_accord_tacite",
2823 "regle_avis",
2824 "regle_pec_metier",
2825 "regle_etat_pendant_incompletude",
2826 );
2827 // Tableau des champs de données techniques
2828 $rule_type_technical_data = array(
2829 'regle_donnees_techniques1',
2830 'regle_donnees_techniques2',
2831 'regle_donnees_techniques3',
2832 'regle_donnees_techniques4',
2833 'regle_donnees_techniques5',
2834 );
2835 // Tableau des champs simple
2836 $rule_type_simple = array(
2837 "regle_dossier_instruction_type",
2838 );
2839
2840 // Définit le type du champ
2841 if (in_array($rule_name, $rule_type_date) == true) {
2842 $type = "date";
2843 }
2844 if (in_array($rule_name, $rule_type_numeric) == true) {
2845 $type = "numeric";
2846 }
2847 if (in_array($rule_name, $rule_type_text) === true) {
2848 $type = "text";
2849 }
2850 if (in_array($rule_name, $rule_type_bool) === true) {
2851 $type = "bool";
2852 }
2853 if (in_array($rule_name, $rule_type_specific) === true) {
2854 $type = "specific";
2855 }
2856 if (in_array($rule_name, $rule_type_technical_data) === true) {
2857 $type = 'text';
2858 }
2859 if (in_array($rule_name, $rule_type_simple) === true) {
2860 $type = 'simple';
2861 }
2862
2863 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2864 // Récupère directement la valeur de l'opérande
2865 if ($type === 'specific') {
2866 //
2867 return $this->get_value_for_rule($rule);
2868 }
2869
2870 // Initialisation des variables
2871 $key_date = 0;
2872 $total_numeric = 0;
2873 $res_text = '';
2874
2875 // Pour chaque opérande
2876 foreach ($operands as $key => $operand) {
2877
2878 // Si c'est une règle de type date
2879 if ($type == 'date') {
2880 // Vérifie si au moins une des opérandes est une date
2881 if (is_numeric($operand) === false
2882 && $this->get_value_for_rule($operand) !== null
2883 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2884 // Récupère la position de la date
2885 $key_date = $key;
2886 }
2887 // Les autres opérandes doivent être que des numériques
2888 if (is_numeric($operand) == true) {
2889 // Ajoute l'opérande au total
2890 $total_numeric += $operand;
2891 }
2892 if (is_numeric($operand) === false
2893 && $this->get_value_for_rule($operand) !== null
2894 && is_numeric($this->get_value_for_rule($operand)) == true) {
2895 // Ajoute l'opérande au total
2896 $total_numeric += $this->get_value_for_rule($operand);
2897 }
2898 }
2899
2900 // Si c'est une règle de type numérique
2901 if ($type == 'numeric') {
2902 // Les opérandes doivent être que des numériques
2903 if (is_numeric($operand) == true) {
2904 // Ajoute l'opérande au total
2905 $total_numeric += $operand;
2906 }
2907 if (is_numeric($operand) === false
2908 && $this->get_value_for_rule($operand) !== null
2909 && is_numeric($this->get_value_for_rule($operand)) == true) {
2910 // Ajoute l'opérande au total
2911 $total_numeric += $this->get_value_for_rule($operand);
2912 }
2913 }
2914
2915 // Si c'est une règle de type text
2916 if ($type === 'text') {
2917 // Concatène toutes les chaînes de caractère
2918 $res_text .= $this->get_value_for_rule($operand);
2919 }
2920 }
2921
2922 // Résultat pour une règle de type date
2923 if ($type == 'date') {
2924 // Retourne le calcul de la date
2925 return $this->f->mois_date($this->valF[$operands[$key_date]],
2926 $total_numeric, "+");
2927 }
2928
2929 // Résultat pour une règle de type numérique
2930 if ($type == 'numeric') {
2931 // Retourne le calcul
2932 return $total_numeric;
2933 }
2934
2935 // Résultat pour une règle de type text
2936 if ($type === 'text') {
2937 // Retourne la chaîne de caractère
2938 return $res_text;
2939 }
2940 if ($type === 'simple' || $type === 'bool') {
2941 // Retourne la valeur du champs rule
2942 return $rule;
2943 }
2944 }
2945
2946
2947 /**
2948 * Récupère la valeur du champs dans l'instruction ou dans les données
2949 * techniques.
2950 * Spécifique au calcul des règles.
2951 *
2952 * @param string $field Champ
2953 *
2954 * @return mixed Valeur du champ
2955 */
2956 private function get_value_for_rule($field) {
2957 // Si le champ n'existe pas dans la table instruction
2958 if (array_key_exists($field, $this->valF) === false) {
2959 // Récupère l'instance de la classe donnees_techniques
2960 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2961 // Retourne la valeur de la donnée technique
2962 return $inst_donnees_techniques->getVal($field);
2963 }
2964
2965 //
2966 return $this->valF[$field];
2967 }
2968
2969
2970 /**
2971 * [get_inst_donnees_techniques description]
2972 *
2973 * @param [type] $donnees_techniques [description]
2974 *
2975 * @return [type] [description]
2976 */
2977 function get_inst_donnees_techniques($donnees_techniques = null) {
2978 //
2979 if (isset($this->inst_donnees_techniques) === false or
2980 $this->inst_donnees_techniques === null) {
2981 //
2982 if (is_null($donnees_techniques)) {
2983 $donnees_techniques = $this->getDonneesTechniques();
2984 }
2985 //
2986 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2987 "obj" => "donnees_techniques",
2988 "idx" => $donnees_techniques,
2989 ));
2990 }
2991 //
2992 return $this->inst_donnees_techniques;
2993 }
2994
2995
2996 /**
2997 * Retourne l'identifiant des données techniques liées du dossier
2998 * @return string L'identifiant des données techniques liées du dossier
2999 */
3000 function getDonneesTechniques() {
3001
3002 $qres = $this->f->get_one_result_from_db_query(
3003 sprintf(
3004 'SELECT
3005 donnees_techniques
3006 FROM
3007 %1$sdonnees_techniques
3008 WHERE
3009 dossier_instruction = \'%2$s\'',
3010 DB_PREFIXE,
3011 $this->f->db->escapeSimple($this->valF["dossier"])
3012 ),
3013 array(
3014 "origin" => __METHOD__,
3015 )
3016 );
3017
3018 return $qres['result'];
3019 }
3020
3021 /**
3022 * TRIGGER - triggerajouterapres.
3023 *
3024 * - Mise à jour des informations liées au workflow sur le dossier
3025 * - Interface avec le référentiel ERP [105][111]
3026 * - Mise à jour du DA
3027 * - Historisation de la vie du DI
3028 *
3029 * @return boolean
3030 */
3031 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3032 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3033
3034 // On a besoin de l'instance du dossier lié à l'événement d'instruction
3035 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
3036 // Instance de la classe evenement
3037 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
3038 // Instance de l'état courant du dossier d'instruction
3039 $inst_current_etat = $this->f->get_inst__om_dbform(array(
3040 "obj" => "etat",
3041 "idx" => $inst_di->get_id_etat(),
3042 ));
3043
3044 /**
3045 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
3046 * par l'action
3047 */
3048 // état de complétude actuel du dossier
3049 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
3050 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
3051 $ev_suiv_tacite_incompletude = false;
3052 // Initialisation
3053 $valF = array();
3054 $valF_dt = array();
3055 //
3056 // Récupération des paramètres de l'action
3057 // TODO : remplacer cette requête par l'instanciation de l'action
3058 $qres = $this->f->get_all_results_from_db_query(
3059 sprintf(
3060 'SELECT
3061 *
3062 FROM
3063 %1$saction
3064 WHERE
3065 action = \'%2$s\'',
3066 DB_PREFIXE,
3067 $this->f->db->escapeSimple($this->valF['action'])
3068 ),
3069 array(
3070 "origin" => __METHOD__
3071 )
3072 );
3073 foreach ($qres['result'] as $row) {
3074
3075 // pour chacune des regles, on applique la regle
3076 if ($row['regle_delai'] != '') {
3077 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
3078 }
3079 if ($row['regle_accord_tacite'] != '') {
3080 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
3081 }
3082 if ($row['regle_avis'] != '') {
3083 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
3084 }
3085 if ($row['regle_date_limite'] != '') {
3086 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
3087 }
3088 if ($row['regle_date_complet'] != '') {
3089 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
3090 }
3091 if ($row['regle_date_dernier_depot'] != '') {
3092 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3093 }
3094 if ($row['regle_date_notification_delai'] != '') {
3095 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3096 }
3097 if ($row['regle_date_decision'] != '') {
3098 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
3099 }
3100 if ($row['regle_date_rejet'] != '') {
3101 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3102 }
3103 if ($row['regle_date_validite'] != '') {
3104 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
3105 }
3106 if ($row['regle_date_chantier'] != '') {
3107 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3108 }
3109 if ($row['regle_date_achevement'] != '') {
3110 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3111 }
3112 if ($row['regle_date_conformite'] != '') {
3113 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3114 }
3115 if ($row['regle_date_limite_incompletude'] != '') {
3116 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
3117 }
3118 if ($row['regle_delai_incompletude'] != '') {
3119 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
3120 }
3121 if ($row['regle_autorite_competente'] != '') {
3122 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
3123 }
3124 if ($row['regle_etat'] != '') {
3125 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
3126 }
3127 if ($row['regle_date_cloture_instruction'] !== '') {
3128 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3129 }
3130 if ($row['regle_date_premiere_visite'] !== '') {
3131 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3132 }
3133 if ($row['regle_date_derniere_visite'] !== '') {
3134 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3135 }
3136 if ($row['regle_date_contradictoire'] !== '') {
3137 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3138 }
3139 if ($row['regle_date_retour_contradictoire'] !== '') {
3140 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3141 }
3142 if ($row['regle_date_ait'] !== '') {
3143 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
3144 }
3145 if ($row['regle_donnees_techniques1'] !== '') {
3146 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3147 }
3148 if ($row['regle_donnees_techniques2'] !== '') {
3149 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3150 }
3151 if ($row['regle_donnees_techniques3'] !== '') {
3152 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3153 }
3154 if ($row['regle_donnees_techniques4'] !== '') {
3155 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3156 }
3157 if ($row['regle_donnees_techniques5'] !== '') {
3158 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3159 }
3160 if ($row['regle_date_transmission_parquet'] !== '') {
3161 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3162 }
3163 if ($row['regle_dossier_instruction_type'] !== '') {
3164 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3165 }
3166 // La date d'affichage est modifiée seulement si le champ n'est pas
3167 // renseigné
3168 if ($row['regle_date_affichage'] !== ''
3169 && ($inst_di->getVal('date_affichage') === ''
3170 || $inst_di->getVal('date_affichage') === null)) {
3171 //
3172 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
3173 }
3174 //
3175 if ($row['regle_pec_metier'] != '') {
3176 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
3177 }
3178 if ($row['regle_a_qualifier'] != '') {
3179 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
3180 }
3181 //
3182 if ($row['regle_incompletude'] != '') {
3183 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
3184 }
3185 if ($row['regle_incomplet_notifie'] != '') {
3186 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
3187 }
3188 if ($row['regle_etat_pendant_incompletude'] != '') {
3189 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
3190 }
3191 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
3192 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
3193 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
3194 $ev_suiv_tacite_incompletude = true;
3195 }
3196 }
3197 }
3198
3199 // Si l'événement a un événement suivant tacite
3200 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
3201 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3202 // pas associé de le même façon au dossier d'instruction
3203 if ($ev_suiv_tacite_incompletude === false) {
3204 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3205 }
3206 if ($ev_suiv_tacite_incompletude === true) {
3207 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3208 }
3209 }
3210 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3211 if (count($valF_dt) > 0) {
3212 $dt_id = $this->getDonneesTechniques();
3213 // On met à jour le dossier
3214 $cle = " donnees_techniques='".$dt_id."'";
3215 $res1 = $this->f->db->autoexecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3216 $this->addToLog(
3217 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");",
3218 VERBOSE_MODE
3219 );
3220 $this->f->isDatabaseError($res1);
3221 // Affichage d'informations à l'utilisateur
3222 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3223 }
3224 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3225 if (count($valF) > 0) {
3226 //
3227 $inst_dossier = $this->f->get_inst__om_dbform(array(
3228 "obj" => "dossier",
3229 "idx" => $this->valF['dossier'],
3230 ));
3231 $valF['instruction'] = $id;
3232 $valF['crud'] = 'create';
3233 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3234 if ($update_by_instruction === false) {
3235 $this->cleanMessage();
3236 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3237 return false;
3238 }
3239 // Affichage d'informations à l'utilisateur
3240 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3241 }
3242
3243 /**
3244 * Interface avec le référentiel ERP.
3245 *
3246 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3247 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3248 * Déclencheur :
3249 * - L'option ERP est activée
3250 * - Le dossier est marqué comme "connecté au référentiel ERP"
3251 * - Le dossier est de type PC
3252 * - Le formulaire d'ajout d'un événement d'instruction est validé
3253 * avec un événement pour lequel les services ERP doivent être
3254 * informé
3255 */
3256 //
3257 if ($this->f->is_option_referentiel_erp_enabled() === true
3258 && $inst_di->is_connected_to_referentiel_erp() === true
3259 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3260 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3261 //
3262 $infos = array(
3263 "dossier_instruction" => $this->valF['dossier'],
3264 "decision" => $inst_evenement->getVal("libelle"),
3265 );
3266 //
3267 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3268 if ($ret !== true) {
3269 $this->cleanMessage();
3270 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3271 return false;
3272 }
3273 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3274 }
3275
3276 // Si le mode en rédaction intégrale est activé
3277 if (isset($this->valF['flag_edition_integrale']) === true
3278 && $this->valF['flag_edition_integrale'] === true) {
3279 $redactionIntegraleValF = array();
3280
3281 // Récupère la collectivite du dossier d'instruction
3282 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3283 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3284 // Récupère le corps de la lettre type
3285 $params = array(
3286 "specific" => array(
3287 "corps" => array(
3288 "mode" => "get",
3289 )
3290 ),
3291 );
3292 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3293 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3294 // Récupère le titre de la lettre type
3295 $params = array(
3296 "specific" => array(
3297 "titre" => array(
3298 "mode" => "get",
3299 )
3300 ),
3301 );
3302 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3303 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3304
3305 // mise à jour en base de données
3306 $res = $this->f->db->autoExecute(
3307 DB_PREFIXE.$this->table,
3308 $redactionIntegraleValF,
3309 DB_AUTOQUERY_UPDATE,
3310 $this->clePrimaire."=".$id
3311 );
3312 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3313 if ($this->f->isDatabaseError($res, true) === true) {
3314 return false;
3315 }
3316 }
3317
3318 /**
3319 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3320 */
3321 // Si la finalisation automatique de l'événement est activée
3322 // ET si l'instruction n'a pas déjà été finalisée
3323 // ET s'il existe une lettre type associée
3324 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3325 && $inst_evenement->getVal('om_final_instruction') !== 't'
3326 && $inst_evenement->getVal('lettretype') !== ''
3327 && $inst_evenement->getVal('lettretype') !== null) {
3328
3329 // On instancie l'instruction
3330 $inst_instruction = $this->f->get_inst__om_dbform(array(
3331 "obj" => "instruction",
3332 "idx" => $this->valF[$this->clePrimaire],
3333 ));
3334
3335 // On finalise l'instruction dans le contexte de finalisation : action 100
3336 $inst_instruction->setParameter('maj', 100);
3337 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3338
3339 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3340 // et dans le message d'erreur
3341 if ($finalize === false) {
3342 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3343 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3344 return false;
3345 }
3346 }
3347
3348 /**
3349 * Finalisation automatique des instructions tacites ou retours.
3350 */
3351 // Si l'option de finalisation automatique des instructions tacites ou
3352 // retours est activée et l'événement d'instruction a une lettre type
3353 // associée
3354 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3355 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3356 && $inst_evenement->getVal('lettretype') !== ''
3357 && $inst_evenement->getVal('lettretype') !== null) {
3358
3359 // Rècupère l'identifiant de l'événement
3360 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3361
3362 // Si l'événement d'instruction est identifié comme un événement
3363 // retour
3364 // OU l'événement d'instruction est l'événement suivant tacite du
3365 // dossier d'instruction (incomplétude prise en compte)
3366 // ET l'événement d'instruction n'a pas déjà été finalisé
3367 if (($inst_evenement->getVal("retour") === 't'
3368 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3369 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3370 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3371
3372 // Finalise l'instruction
3373 $inst_instruction = $this->f->get_inst__om_dbform(array(
3374 "obj" => "instruction",
3375 "idx" => $this->valF[$this->clePrimaire],
3376 ));
3377 $inst_instruction->setParameter('maj', 100);
3378 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3379 if ($finalize === false) {
3380 //
3381 return false;
3382 }
3383 }
3384 }
3385
3386 /**
3387 * Mise à jour de la version de clôture *version_clos* du dossier si et
3388 * seulement si l'instruction met à jour l'état du dossier.
3389 */
3390 if (isset($valF['etat']) === true
3391 && $valF['etat'] !== null
3392 && $valF['etat'] !== '') {
3393 // Instanciation de l'état appliqué sur le dossier par l'instruction
3394 $inst_etat = $this->f->get_inst__om_dbform(array(
3395 "obj" => "etat",
3396 "idx" => $valF['etat'],
3397 ));
3398 //
3399 $update_version_clos = null;
3400 // En cas d'instruction qui clôture le dossier
3401 if ($inst_etat->getVal('statut') === 'cloture') {
3402 $update_version_clos = $inst_di->update_version_clos('up');
3403 }
3404 // En cas d'instruction qui rouvre le dossier
3405 if ($inst_current_etat->getVal('statut') === 'cloture'
3406 && $inst_etat->getVal('statut') !== 'cloture') {
3407 //
3408 $update_version_clos = $inst_di->update_version_clos('down');
3409 //
3410 $params = array(
3411 'di_reopened' => true,
3412 );
3413 }
3414 //
3415 if ($update_version_clos === false) {
3416 $this->f->addToLog(sprintf(
3417 "%s() : ERREUR - %s %s",
3418 __METHOD__,
3419 sprintf(
3420 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3421 $inst_di->getVal($inst_di->clePrimaire)
3422 ),
3423 sprintf(
3424 __("L'instruction tente d'appliquer l'état %s."),
3425 $inst_etat->getVal($inst_etat->clePrimaire)
3426 )
3427 ));
3428 $this->addToMessage(sprintf(
3429 "%s %s",
3430 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3431 __("Veuillez contacter votre administrateur.")
3432 ));
3433 return false;
3434 }
3435 }
3436
3437 /**
3438 * Notification automatique
3439 */
3440 // Notification automatique à l'ajout de l'instruction si la notification
3441 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3442 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3443 ($inst_evenement->getVal('lettretype') === null ||
3444 $inst_evenement->getVal('lettretype') === '')) {
3445 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3446 $msgLog = sprintf(
3447 '%s %s : %d',
3448 __('Erreur lors de la notification automatique du(des) pétitionnaire(s).'),
3449 __('Instruction notifiée'),
3450 $id
3451 );
3452
3453 // Récupération de la liste des demandeurs à notifier et de la catégorie
3454 $categorie = $this->f->get_param_option_notification($collectivite_di);
3455 $isPortal = $categorie === PORTAL;
3456 $demandeursANotifie = $this->get_demandeurs_notifiable(
3457 $this->valF['dossier'],
3458 $isPortal
3459 );
3460
3461 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3462 $demandeurPrincipalNotifie = false;
3463 foreach ($demandeursANotifie as $demandeur) {
3464 // Identifie si le demandeur principal a été notifié ou pas
3465 // et récupère ses informations
3466 if ($demandeur['petitionnaire_principal'] == 't') {
3467 $demandeurPrincipalNotifie = true;
3468 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3469 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3470 // suivante. On le considère également comme non notifié pour gérer l'envoie
3471 // des messages d'erreurs
3472 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3473 // d'impact sur la notification
3474 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3475 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3476 $demandeurPrincipalNotifie = false;
3477 continue;
3478 }
3479 }
3480 // Ajout de la notif et récupération de son id
3481 $idNotif = $this->ajouter_notification(
3482 $this->valF[$this->clePrimaire],
3483 $this->f->get_connected_user_login_name(),
3484 $demandeur,
3485 $collectivite_di,
3486 array(),
3487 true
3488 );
3489 if ($idNotif === false) {
3490 $this->addToLog(
3491 sprintf('%s() : %s', __METHOD__, $msgLog),
3492 DEBUG_MODE
3493 );
3494 return false;
3495 }
3496 // Création de la tache en lui donnant l'id de la notification
3497 $notification_by_task = $this->notification_by_task(
3498 $idNotif,
3499 $this->valF['dossier'],
3500 $categorie
3501 );
3502 if ($notification_by_task === false) {
3503 $this->addToLog(
3504 sprintf('%s() : %s', __METHOD__, $msgLog),
3505 DEBUG_MODE
3506 );
3507 $this->addToMessage(
3508 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3509 );
3510 return false;
3511 }
3512 }
3513 // Pour la notification par mail ou la notification via portal si le dossier a
3514 // été déposés via portal, si le demandeur principal n'est pas notifiable,
3515 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
3516 // laquelle le demandeur principal n'a pas pu être notifié
3517 $depotPortal = $this->dossier_depose_sur_portail();
3518 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
3519 // Précision dans les logs que le pétitionnaire principal n'est pas notifiable.
3520 // ' ' permet de mettre un espace entre les 2 msg de log.
3521 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
3522 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3523 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3524 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3525 // Ajout de la notif et récupération de son id
3526 $idNotif = $this->ajouter_notification(
3527 $this->valF[$this->clePrimaire],
3528 $this->f->get_connected_user_login_name(),
3529 $demandeurPrincipal,
3530 $collectivite_di,
3531 array(),
3532 true,
3533 'Echec',
3534 implode(' ', $erreursParam)
3535 );
3536 if ($idNotif === false) {
3537 $this->addToLog(
3538 sprintf('%s() : %s', __METHOD__, $msgLog),
3539 DEBUG_MODE
3540 );
3541 $this->addToMessage(
3542 __('Erreur : la création de la notification a échouée.').
3543 __("Veuillez contacter votre administrateur.")
3544 );
3545 return false;
3546 }
3547 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3548 // de l'échec de la notification
3549 $dossier_message = $this->get_inst_dossier_message(0);
3550 $dossier_message_val = array(
3551 'dossier' => $val['dossier'],
3552 'type' => _('erreur expedition'),
3553 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3554 'login' => $_SESSION['login'],
3555 'date_emission' => date('Y-m-d H:i:s'),
3556 'contenu' => _('Échec lors de la notification de l\'instruction ').
3557 $inst_evenement->getVal('libelle').
3558 '.<br>'.
3559 implode("\n", $erreursParam).
3560 '<br>'.
3561 _('Veuillez corriger ces informations avant de renvoyer la notification.')
3562 );
3563 $add = $dossier_message->add_notification_message($dossier_message_val, true);
3564 // Si une erreur se produit pendant l'ajout
3565 if ($add !== true) {
3566 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3567 return false;
3568 }
3569 }
3570 $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.")));
3571 }
3572
3573 // Notification automatique en cas de dépôt de dossier dématérialisé
3574 // Vérifie si l'option de notification est active et si il s'agit bien d'une
3575 // instruction de récépissé
3576 if (
3577 $this->f->is_option_notification_depot_demat_enabled($collectivite_di)
3578 && $this->is_instruction_recepisse()
3579 ) {
3580 // Message à afficher dans les logs pour indiquer quelle notification a échouée
3581 $msgLog = sprintf(
3582 __('Erreur lors de la notification de dépôt du dossier dématérialisé : %s.'),
3583 $val['dossier']
3584 );
3585 // Récupère l'instance de la demande
3586 $demande = $inst_di->get_inst_demande();
3587 // Vérifie que le dossier a été déposé via platau ou portal
3588 if (
3589 ($demande->getVal('source_depot') == PLATAU ||
3590 $demande->getVal('source_depot') == PORTAL)
3591 ) {
3592 // Récupère la liste des mails fournis en paramètre. Si aucun adresse n'a été récupéré
3593 // l'envoi de la notification n'est pas effectué et un message d'erreur est affiché.
3594 $listeEmails = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
3595 if (empty($listeEmails)) {
3596 $this->addToLog(
3597 sprintf(
3598 '%s(): %s %s',
3599 __METHOD__,
3600 $msgLog,
3601 __('Aucun courriel paramétré.')
3602 ),
3603 DEBUG_MODE
3604 );
3605 } else {
3606 foreach ($listeEmails as $email) {
3607 // Ajout de la notif et récupération de son id
3608 $destinataire = array(
3609 'destinataire' => $email,
3610 'courriel' => $email
3611 );
3612 $idNotif = $this->ajouter_notification(
3613 $this->valF[$this->clePrimaire],
3614 $this->f->get_connected_user_login_name(),
3615 $destinataire,
3616 $collectivite_di,
3617 array(),
3618 true
3619 );
3620 if ($idNotif === false) {
3621 $this->addToLog(
3622 sprintf('%s(): %s', __METHOD__, $msgLog),
3623 DEBUG_MODE
3624 );
3625 return false;
3626 }
3627 // Création de la tache en lui donnant l'id de la notification
3628 $notification_by_task = $this->notification_by_task(
3629 $idNotif,
3630 $this->valF['dossier'],
3631 'mail',
3632 'notification_depot_demat'
3633 );
3634 if ($notification_by_task === false) {
3635 $this->addToMessage(
3636 __("Erreur lors de la génération de la notification de dépot de dossier par voie dématérialisée.")
3637 );
3638 $this->addToLog(
3639 sprintf('%s(): %s', __METHOD__, $msgLog),
3640 DEBUG_MODE
3641 );
3642 return false;
3643 }
3644 }
3645 }
3646 }
3647 }
3648
3649 /**
3650 * Mise à jour de la date de dernière modification du dossier
3651 */
3652 $inst_di->update_last_modification_date();
3653
3654 /**
3655 * Mise à jour des données du DA.
3656 */
3657 $inst_da = $inst_di->get_inst_dossier_autorisation();
3658 $params['di_id'] = $this->valF['dossier'];
3659 if ($inst_da->majDossierAutorisation($params) === false) {
3660 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3661 $this->correct = false;
3662 return false;
3663 }
3664
3665 /**
3666 * Historisation de la vie du DI.
3667 */
3668 //
3669 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3670 }
3671
3672 /**
3673 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3674 * sont remplies.
3675 * Les conditions vérifiées sont les suivantes :
3676 * - L'option de notification *option_notification* doit être définie
3677 * - Le petitionnaire principal doit accepter les notifications
3678 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3679 * - Le pétitionnaire principal doit avoir une adresse mail correcte
3680 * Pour chaque vérification effectué un message d'erreur est ajouté si la
3681 * condition n'est pas remplie.
3682 * Renvoie le message d'erreur en sortie.
3683 *
3684 * @param string identifiant du dossier sur lequel les notifications ont échouée
3685 * @return string
3686 */
3687 protected function get_info_notification_fail($dossier = null) {
3688 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3689 // utilise celui associé à l'instruction
3690 if ($dossier == null) {
3691 $dossier = $this->getVal('dossier');
3692 }
3693 // Tableau contenant la liste des messages d'erreur
3694 $errorMessage = array();
3695 // Récupère l'option de notification
3696 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3697 $option_notification = $this->f->get_param_option_notification($collectivite_di);
3698 if ($option_notification !== PORTAL && $option_notification !== 'mail') {
3699 $errorMessage[] = __("L'option de notification option_notification doit obligatoirement être définie.");
3700 }
3701 // Récupère les informations du demandeurs principal
3702 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3703 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3704 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3705 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3706 }
3707 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3708 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3709 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3710 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3711 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3712 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3713 $infoPetitionnaire['courriel'].
3714 '.';
3715 }
3716 } else {
3717 // Si le courriel du pétitionnaire principal
3718 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3719 }
3720
3721 return $errorMessage;
3722 }
3723
3724 /**
3725 * Méthode servant à vérifier si un dossier a été déposé sur
3726 * le portail citoyen ou pas.
3727 * La verification se fait via une requête sql dans laquelle
3728 * on va chercher un dossier ayant pour id l'identifiant de
3729 * dossier associé à l'instruction et pour lequel la demande
3730 * associée la plus ancienne est une demande de création de
3731 * dossier via portail
3732 *
3733 * @param string identifiant du dossier. Si non renseigné c'est le dossier
3734 * associé à l'instruction qui est utilisé
3735 * @return boolean|void true : dossier déposé via portail, false : dossier
3736 * non déposé via portail et null : erreur de base de données.
3737 */
3738 protected function dossier_depose_sur_portail($dossier = null) {
3739 if (empty($dossier)) {
3740 $dossier = $this->getVal('dossier');
3741 }
3742 $qres = $this->f->get_one_result_from_db_query(
3743 sprintf(
3744 'SELECT
3745 dossier
3746 FROM
3747 %1$sdossier
3748 -- Récuperation de la première demande associée au dossier
3749 LEFT JOIN (
3750 SELECT
3751 demande,
3752 dossier_instruction,
3753 source_depot
3754 FROM
3755 %1$sdemande
3756 WHERE
3757 dossier_instruction = \'%2$s\'
3758 ORDER BY
3759 demande ASC
3760 LIMIT 1
3761 ) AS demande
3762 ON dossier.dossier = demande.dossier_instruction
3763 WHERE
3764 dossier.dossier = \'%2$s\'
3765 AND demande.source_depot = \'portal\'',
3766 DB_PREFIXE,
3767 $this->f->db->escapeSimple($dossier)
3768 ),
3769 array(
3770 "origin" => __METHOD__,
3771 "force_return" => true,
3772 )
3773 );
3774 if ($qres["code"] !== "OK") {
3775 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3776 return;
3777 }
3778 // Si on a un résultat c'est que le dossier a été déposé via le portail
3779 return ! empty($qres["result"]);
3780 }
3781
3782 public function is_service_notifiable() {
3783 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3784
3785 // Si l'instruction a une édition non finalisé quel que soit
3786 // le type de notification, il n'est pas notifiable
3787 if ($this->has_an_edition() === true) {
3788 if ($this->is_unfinalizable_without_bypass() === false) {
3789 return false;
3790 }
3791 }
3792 // Vérifie si la notification des tiers est active pour l'évènement
3793 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3794 }
3795
3796 public function is_tiers_notifiable() {
3797 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3798
3799 // Si l'instruction a une édition non finalisé quel que soit
3800 // le type de notification, il n'est pas notifiable
3801 if ($this->has_an_edition() === true) {
3802 if ($this->is_unfinalizable_without_bypass() === false) {
3803 return false;
3804 }
3805 }
3806 // Vérifie si la notification des tiers est active pour l'évènement
3807 return ! empty($evenement->getVal('notification_tiers'));
3808 }
3809
3810 /**
3811 * Méthode permettant de savoir si une instruction peut
3812 * être notifiée manuellement selon les différents types
3813 * de notification.
3814 *
3815 * Si l'instruction a une édition non finalisée alors elle n'est pas
3816 * manuellement notifiable.
3817 * Si l'instruction est associé à un événement de notification pour
3818 * lequel un retour signature est recquis, elle n'est notifiable que
3819 * si la date de retour de signature est remplie.
3820 * Par défaut si le type de notification n'est pas connu alors l'instruction
3821 * n'est pas notifiable.
3822 * Pour tous les autres cas l'instruction est manuellement notifiable.
3823 *
3824 * @return boolean true : notifiable | false : non notifiable
3825 */
3826 public function is_notifiable_by_task_manual() {
3827 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3828
3829 // Si l'instruction a une édition non finalisé quel que soit
3830 // le type de notification, il n'est pas notifiable
3831 if ($this->has_an_edition() === true) {
3832 if ($this->is_unfinalizable_without_bypass() === false) {
3833 return false;
3834 }
3835 }
3836
3837 // Gestion des différents cas selon la valeur du champs notification
3838 if ($ev->getVal('notification') == 'notification_manuelle' ||
3839 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3840 $ev->getVal('notification') == 'notification_automatique'
3841 ) {
3842 return true;
3843 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3844 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3845 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3846 $this->getVal('date_retour_signature') != null &&
3847 $this->getVal('date_retour_signature') != ''
3848 ) {
3849 return true ;
3850 }
3851 return false;
3852 }
3853
3854 /**
3855 * Crée une instance de notification et une tache notification_instruction de catégorie portal
3856 * pour le demandeur principal.
3857 *
3858 * @return boolean true si le traitement à réussi
3859 */
3860 protected function notifier_demandeur_principal_via_portal() {
3861 $this->begin_treatment(__METHOD__);
3862 $message = '';
3863 // Récupération des informations concernant le demandeur
3864 $dossier = $this->getVal('dossier');
3865 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3866 $demandeur = $this->get_demandeurs_notifiable(
3867 $dossier,
3868 true
3869 );
3870 if ($demandeur !== array()) {
3871 $destinataire = array_values($demandeur);
3872 // Ajout de la notif et récupération de son id
3873 $idNotification = $this->ajouter_notification(
3874 $this->getVal($this->clePrimaire),
3875 $this->f->get_connected_user_login_name(),
3876 $destinataire[0],
3877 $collectivite_di,
3878 array(),
3879 true
3880 );
3881 if ($idNotification === false) {
3882 return $this->end_treatment(__METHOD__, false);
3883 }
3884 // Création de la tâche en lui donnant l'id de la notification
3885 $notification_by_task = $this->notification_by_task($idNotification, $dossier, PORTAL);
3886 if ($notification_by_task === false) {
3887 $this->addToMessage(
3888 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3889 );
3890 return $this->end_treatment(__METHOD__, false);
3891 }
3892 $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.")));
3893 return $this->end_treatment(__METHOD__, true);
3894 }
3895 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3896 return $this->end_treatment(__METHOD__, false);
3897 }
3898
3899 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3900 // Si le type n'est pas correctement spécifié, alors il est calculé
3901 if ($type !== 'notification_recepisse'
3902 && $type !== 'notification_instruction'
3903 && $type !== 'notification_decision'
3904 && $type !== 'notification_service_consulte'
3905 && $type !== 'notification_tiers_consulte'
3906 && $type !== 'notification_depot_demat'
3907 && $type !== 'notification_commune') {
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 }
4754 }
4755 }
4756 // Spécificité du champ avis_decision dont le champ archive est nommé
4757 // différemment
4758 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4759 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4760 }
4761 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4762 // par l'archive
4763 unset($valF['date_affichage']);
4764
4765 /**
4766 * Mise à jour de la version de clôture *version_clos* du dossier si et
4767 * seulement si l'instruction met à jour l'état du dossier.
4768 */
4769 if (isset($valF['etat']) === true
4770 && $valF['etat'] !== null
4771 && $valF['etat'] !== '') {
4772 // Récupère l'état actuel du dossier d'instruction
4773 $inst_current_etat = $this->f->get_inst__om_dbform(array(
4774 "obj" => "etat",
4775 "idx" => $inst_di->get_id_etat(),
4776 ));
4777 // Instanciation de l'état archivé appliqué sur le dossier
4778 $inst_etat = $this->f->get_inst__om_dbform(array(
4779 "obj" => "etat",
4780 "idx" => $valF['etat'],
4781 ));
4782 //
4783 $update_version_clos = null;
4784 // En cas de clôture du dossier par l'état archivé
4785 if ($inst_etat->getVal('statut') === 'cloture') {
4786 $update_version_clos = $inst_di->update_version_clos('up');
4787 }
4788 // En cas de réouverture du dossier par l'état archivé
4789 if ($inst_current_etat->getVal('statut') === 'cloture'
4790 && $inst_etat->getVal('statut') !== 'cloture') {
4791 //
4792 $update_version_clos = $inst_di->update_version_clos('down');
4793 //
4794 $this->set_att_di_reopened(true);
4795 }
4796 //
4797 if ($update_version_clos === false) {
4798 $this->f->addToLog(sprintf(
4799 "%s() : ERREUR - %s %s",
4800 __METHOD__,
4801 sprintf(
4802 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4803 $inst_di->getVal($inst_di->clePrimaire)
4804 ),
4805 sprintf(
4806 __("L'instruction tente d'appliquer l'état %s."),
4807 $inst_etat->getVal($inst_etat->clePrimaire)
4808 )
4809 ));
4810 $this->addToMessage(sprintf(
4811 "%s %s",
4812 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4813 __("Veuillez contacter votre administrateur.")
4814 ));
4815 return false;
4816 }
4817 }
4818 // On supprime toutes les notications liées à l'instruction
4819 $notifASupprimer = $this->get_instruction_notification(
4820 $this->getVal($this->clePrimaire),
4821 array(
4822 'notification_recepisse',
4823 'notification_instruction',
4824 'notification_decision',
4825 'notification_service_consulte',
4826 'notification_tiers_consulte',
4827 'notification_depot_demat',
4828 'notification_commune'
4829 ),
4830 true
4831 );
4832
4833 foreach ($notifASupprimer as $idNotif) {
4834 $inst_notif = $this->f->get_inst__om_dbform(array(
4835 "obj" => "instruction_notification",
4836 "idx" => $idNotif,
4837 ));
4838 $val_notif = array();
4839 foreach ($inst_notif->champs as $champ) {
4840 $val_notif[$champ] = $inst_notif->getVal($champ);
4841 }
4842 // La suppression des notifications entrainera la suppression des tâches qui y sont
4843 // liées
4844 $supprNotif = $inst_notif->supprimer($val_notif);
4845 if ($supprNotif == false) {
4846 $this->addToMessage(sprintf(
4847 "%s %s",
4848 __("Erreur lors de la suppression des notifications de l'instruction."),
4849 __("Veuillez contacter votre administrateur.")
4850 ));
4851 return false;
4852 }
4853 }
4854
4855 // On met à jour le dossier
4856 $valF['instruction'] = $id;
4857 $valF['crud'] = 'delete';
4858 $update_by_instruction = $inst_di->update_by_instruction($valF);
4859 if ($update_by_instruction === false) {
4860 $this->cleanMessage();
4861 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4862 return false;
4863 }
4864
4865 // Affichage d'informations à l'utilisateur
4866 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4867
4868 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4869 }
4870
4871 /**
4872 * TRIGGER - triggersupprimerapres.
4873 *
4874 * @return boolean
4875 */
4876 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4877 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4878 /**
4879 * Mise à jour de la date de dernière modification du dossier
4880 * d'instruction
4881 */
4882 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4883 $inst_di->update_last_modification_date();
4884
4885 /**
4886 * Mise à jour des données du dossier d'autorisation
4887 */
4888 $da = $this->f->get_inst__om_dbform(array(
4889 "obj" => "dossier_autorisation",
4890 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4891 ));
4892 $params = array(
4893 'di_id' => $this->getVal('dossier'),
4894 'di_reopened' => $this->get_att_di_reopened(),
4895 );
4896 if($da->majDossierAutorisation($params) === false) {
4897 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4898 $this->correct = false;
4899 return false;
4900 }
4901
4902 /**
4903 * Gestion des tâches pour la dématérialisation
4904 */
4905 $inst_task_empty = $this->f->get_inst__om_dbform(array(
4906 "obj" => "task",
4907 "idx" => 0,
4908 ));
4909 foreach ($inst_di->task_types as $task_type) {
4910 $task_exists = $inst_task_empty->task_exists($task_type, $id);
4911 if ($task_exists !== false) {
4912 $inst_task = $this->f->get_inst__om_dbform(array(
4913 "obj" => "task",
4914 "idx" => $task_exists,
4915 ));
4916 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4917 $task_val = array(
4918 'state' => $inst_task::STATUS_CANCELED,
4919 );
4920 $update_task = $inst_task->update_task(array('val' => $task_val));
4921 if ($update_task === false) {
4922 $this->addToMessage(sprintf('%s %s',
4923 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4924 __("Veuillez contacter votre administrateur.")
4925 ));
4926 $this->correct = false;
4927 return false;
4928 }
4929 }
4930 }
4931 }
4932
4933 //
4934 $val['evenement'] = $this->getVal('evenement');
4935 return $this->add_log_to_dossier($id, $val);
4936 }
4937
4938 /**
4939 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4940 * "di_reopened".
4941 *
4942 * @param boolean $val
4943 */
4944 function set_att_di_reopened($val) {
4945 $this->di_reopened = $val;
4946 }
4947
4948 /**
4949 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4950 *
4951 * @return boolean
4952 */
4953 function get_att_di_reopened() {
4954 return $this->di_reopened;
4955 }
4956
4957 /**
4958 * Permet de composer un message d'erreur sur restriction non valide en
4959 * fonction du contexte.
4960 *
4961 * @param string $restriction formule de la restriction
4962 *
4963 * @return string message d'erreur
4964 */
4965 function get_restriction_error_message($restriction) {
4966 // Affichage du message si la restriction s'applique
4967 // Contexte du suivi des dates (message simple)
4968 $message_restrict = _("Probleme de dates :");
4969 // Split restriction
4970 $champs_restrict = preg_split(
4971 '/(\W+)/',
4972 $restriction,
4973 null,
4974 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4975 );
4976 $formated_restrict = "";
4977 // Ajout des chaînes à traduire
4978 foreach ($champs_restrict as $value) {
4979 $formated_restrict .= _($value)." ";
4980 }
4981 $formated_restrict = substr($formated_restrict, 0, -1);
4982 // Message d'erreur dans le contexte du suivi des dates
4983 if($this->getParameter("maj") == 170) {
4984 $message_restrict .= " "._("contactez l'instructeur du dossier");
4985 $message_restrict .= "<br/>(".$formated_restrict.")";
4986 } else {
4987 // Affichage du message si la restriction s'applique
4988 // Contexte instruction
4989 $message_restrict .= "<br/>".$formated_restrict;
4990 }
4991
4992 return $message_restrict;
4993 }
4994
4995 /**
4996 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4997 * les vérifications suivantes :
4998 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4999 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
5000 * le message d'erreur associé à la restriction
5001 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
5002 * et / ou la modification et affiche un message d'erreur
5003 * -
5004 * -
5005 * -
5006 * -
5007 * -
5008 * -
5009 *
5010 * @param array val : tableau contenant les valeurs issues du formulaire.
5011 * @param - dnu1 : Paramètre déprécié et non utilisé.
5012 * @param - dnu2 : Paramètre déprécié et non utilisé.
5013 *
5014 * @return void
5015 */
5016 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
5017 parent::verifier($val);
5018 //
5019 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
5020 $restriction = $this->get_restriction($val['evenement']);
5021
5022 //Test qu'une restriction est présente
5023 if ($restriction != "" ){
5024
5025 // Vérifie le contexte de la modification et test si la restriction est valide.
5026 // Si l'instruction est modifiée par une tache le dossier n'est pas impacté.
5027 // Il n'est donc pas nécessaire de vérifier les restrictions.
5028 $this->restriction_valid = $this->restrictionIsValid($restriction);
5029 if ($this->getParameter("maj") != 176
5030 && !$this->restriction_valid) {
5031
5032 // Affichage du message si la restriction s'applique
5033 $this->addToMessage(
5034 $this->get_restriction_error_message($restriction)
5035 );
5036 $this->correct=false;
5037 return false;
5038 }
5039
5040 // Liste des opérateurs possible
5041 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
5042 // Supprime tous les espaces de la chaîne de caractère
5043 $restriction = str_replace(' ', '', $restriction);
5044
5045 // Met des espace avant et après les opérateurs puis transforme la
5046 // chaine en un tableau
5047 $tabRestriction = str_replace($operateurs, " ", $restriction);
5048 // Tableau des champ
5049 $tabRestriction = explode(" ", $tabRestriction);
5050 // Supprime les numériques du tableau
5051 foreach ($tabRestriction as $key => $value) {
5052 if (is_numeric($value)) {
5053 unset($tabRestriction[$key]);
5054 }
5055 }
5056
5057 // Vérifie les champs utilisés pour la restriction
5058 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
5059 if ($check_field_exist !== true) {
5060
5061 // Liste des champs en erreur
5062 $string_error_fields = implode(", ", $check_field_exist);
5063
5064 // Message d'erreur
5065 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
5066 if (count($check_field_exist) > 1) {
5067 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
5068 }
5069
5070 // Affiche l'erreur
5071 $this->correct=false;
5072 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
5073 $this->addToMessage(_("Veuillez contacter votre administrateur."));
5074 }
5075 }
5076
5077 }
5078 if(!$this->updateDate("date_envoi_signature")) {
5079 return false;
5080 }
5081 if(!$this->updateDate("date_retour_signature")) {
5082 return false;
5083 }
5084 if(!$this->updateDate("date_envoi_rar")) {
5085 return false;
5086 }
5087 if(!$this->updateDate("date_retour_rar")) {
5088 return false;
5089 }
5090 if(!$this->updateDate("date_envoi_controle_legalite")) {
5091 return false;
5092 }
5093 if(!$this->updateDate("date_retour_controle_legalite")) {
5094 return false;
5095 }
5096
5097 }
5098
5099 /**
5100 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
5101 * principal du dossier auquel appartiens l'instruction.
5102 * Renvoie un tableau contenant les informations du pétitionnaire principal.
5103 *
5104 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
5105 * et affiche un message dans les logs.
5106 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
5107 *
5108 * @param string identifiant du dossier
5109 * @return array|boolean
5110 */
5111 protected function get_info_petitionnaire_principal_dossier($dossier = null) {
5112 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
5113 // l'objet courant
5114 if (empty($dossier)) {
5115 $dossier = $this->getVal('dossier');
5116 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
5117 // false et on affiche un message d'erreur dans les logs
5118 if (empty($dossier)) {
5119 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
5120 return false;
5121 }
5122 }
5123
5124 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
5125 // principal
5126 $qres = $this->f->get_all_results_from_db_query(
5127 sprintf(
5128 'SELECT
5129 -- Récupère toutes les informations du demandeur principal
5130 demandeur.*,
5131 CASE
5132 WHEN demandeur.qualite=\'particulier\'
5133 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
5134 ELSE
5135 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
5136 END AS destinataire
5137 FROM
5138 %1$sdossier
5139 LEFT JOIN %1$slien_dossier_demandeur
5140 ON lien_dossier_demandeur.dossier = dossier.dossier
5141 LEFT JOIN %1$sdemandeur
5142 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
5143 WHERE
5144 dossier.dossier = \'%2$s\'
5145 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
5146 DB_PREFIXE,
5147 $this->f->db->escapeSimple($dossier)
5148 ),
5149 array(
5150 "origin" => __METHOD__,
5151 )
5152 );
5153 if (is_array($qres["result"]) === true
5154 && array_key_exists(0, $qres["result"]) === true) {
5155 //
5156 return $qres["result"][0];
5157 }
5158 return null;
5159 }
5160
5161
5162
5163 /**
5164 * Finalisation des documents.
5165 * @param string $champ champ du fichier à finaliser
5166 * @param booleen $status permet de définir si on finalise ou définalise
5167 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
5168 */
5169 function manage_finalizing($mode = null, $val = array()) {
5170 //
5171 $this->begin_treatment(__METHOD__);
5172
5173 //
5174 $id_inst = $this->getVal($this->clePrimaire);
5175
5176 //
5177 $admin_msg_error = _("Veuillez contacter votre administrateur.");
5178 $file_msg_error = _("Erreur de traitement de fichier.")
5179 ." ".$admin_msg_error;
5180 $bdd_msg_error = _("Erreur de base de données.")
5181 ." ".$admin_msg_error;
5182 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
5183
5184 // Si on finalise le document
5185 if ($mode == "finalize"){
5186 //
5187 $etat = _('finalisation');
5188
5189 // Récupère la collectivite du dossier d'instruction
5190 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
5191
5192 //
5193 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
5194
5195 //
5196 $params = array(
5197 "specific" => array(),
5198 );
5199 // Si la rédaction libre est activée sur l'instruction
5200 if ($this->getVal("flag_edition_integrale") == 't') {
5201 $params["specific"]["corps"] = array(
5202 "mode" => "set",
5203 "value" => $this->getVal("corps_om_htmletatex"),
5204 );
5205 $params["specific"]["titre"] = array(
5206 "mode" => "set",
5207 "value" => $this->getVal("titre_om_htmletat"),
5208 );
5209 }
5210 // Génération du PDF
5211 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
5212 $pdf_output = $result['pdf_output'];
5213
5214 //Métadonnées du document
5215 $metadata = array(
5216 'filename' => 'instruction_'.$id_inst.'.pdf',
5217 'mimetype' => 'application/pdf',
5218 'size' => strlen($pdf_output)
5219 );
5220
5221 // Récupération des métadonnées calculées après validation
5222 $spe_metadata = $this->getMetadata("om_fichier_instruction");
5223
5224 //On vérifie si l'instruction à finaliser a un événement de type arrete
5225 // TODO : A voir pour remplacer par une instanciation de l'événement.
5226 // Voir également si l'événement ne dois pas être instancié en début de
5227 // méthode pour pouvoir être réutilisé.
5228 $qres = $this->f->get_one_result_from_db_query(
5229 sprintf(
5230 'SELECT
5231 type
5232 FROM
5233 %1$sevenement
5234 WHERE
5235 evenement = \'%2$d\'',
5236 DB_PREFIXE,
5237 intval($this->getVal("evenement"))
5238 ),
5239 array(
5240 "origin" => __METHOD__,
5241 "force_return" => true,
5242 )
5243 );
5244
5245 if ($qres["code"] !== "OK") {
5246 $this->correct = false;
5247 $this->addToMessage($bdd_msg_error);
5248 return $this->end_treatment(__METHOD__, false);
5249 }
5250
5251 //Initialisation de la variable
5252 $arrete_metadata = array();
5253 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
5254 if ($qres['result'] === 'arrete'){
5255 $arrete_metadata = $this->getMetadata("arrete");
5256 }
5257
5258 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
5259
5260 /*
5261 // transforme le tableau de métadonnées en objet
5262 $mdf = new MetadataFactory();
5263 $md = $mdf->build('Instruction', $metadata);
5264 */
5265
5266 // Si le document a déjà été finalisé on le met à jour
5267 // en conservant son UID
5268 if ($this->getVal("om_fichier_instruction") != ''){
5269 $uid = $this->f->storage->update(
5270 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
5271 }
5272 // Sinon on crée un nouveau document et dont on récupère l'UID
5273 else {
5274 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
5275 }
5276 }
5277
5278 // Si on définalise le document
5279 if ($mode == "unfinalize") {
5280 //
5281 $etat = _('définalisation');
5282 // Récupération de l'uid du document finalisé
5283 $uid = $this->getVal("om_fichier_instruction");
5284 }
5285
5286 // Si on définalise l'UID doit être défini
5287 // Si on finalise la création/modification du fichier doit avoir réussi
5288 if ($uid == '' || $uid == 'OP_FAILURE' ) {
5289 $this->correct = false;
5290 $this->addToMessage($file_msg_error);
5291 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5292 return $this->end_treatment(__METHOD__, false);
5293 }
5294
5295 //
5296 foreach ($this->champs as $key => $champ) {
5297 //
5298 $val[$champ] = $this->val[$key];
5299 }
5300
5301 //
5302 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
5303 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
5304 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
5305 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
5306 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
5307 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
5308 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
5309 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
5310 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
5311 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
5312 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
5313 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
5314 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
5315 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
5316 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
5317 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
5318 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
5319 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
5320 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
5321 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
5322 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
5323 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
5324 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
5325 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
5326 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
5327 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
5328 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
5329 $this->setvalF($val);
5330
5331 // Verification de la validite des donnees
5332 $this->verifier($this->val);
5333 // Si les verifications precedentes sont correctes, on procede a
5334 // la modification, sinon on ne fait rien et on retourne une erreur
5335 if ($this->correct === true) {
5336 //
5337 $valF = array(
5338 "om_fichier_instruction" => $uid,
5339 "date_finalisation_courrier" => date('Y-m-d')
5340 );
5341 //
5342 if($mode=="finalize") {
5343 // état finalisé vrai
5344 $valF["om_final_instruction"] = true;
5345 // ajout log utilisateur
5346 $login = $_SESSION['login'];
5347 $nom = "";
5348 $this->f->getUserInfos();
5349 if (isset($this->f->om_utilisateur["nom"])
5350 && !empty($this->f->om_utilisateur["nom"])) {
5351 $nom = $this->f->om_utilisateur["nom"];
5352 }
5353 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
5354 if ($nom != "") {
5355 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
5356 }
5357 } else {
5358 // état finalisé faux
5359 $valF["om_final_instruction"] = false;
5360 // suppression log utilisateur
5361 $valF["om_final_instruction_utilisateur"] = '';
5362 }
5363
5364 // Execution de la requête de modification des donnees de l'attribut
5365 // valF de l'objet dans l'attribut table de l'objet
5366 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
5367 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
5368 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
5369 //
5370 if ($this->f->isDatabaseError($res, true) === true) {
5371 $this->correct = false;
5372 $this->addToMessage($bdd_msg_error);
5373 return $this->end_treatment(__METHOD__, false);
5374 }
5375
5376 //
5377 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
5378 //
5379 if ($this->add_log_to_dossier($id_inst, $val) === false) {
5380 return $this->end_treatment(__METHOD__, false);
5381 }
5382 //
5383 return $this->end_treatment(__METHOD__, true);
5384 }
5385 // L'appel de verifier() a déjà positionné correct à false
5386 // et défini un message d'erreur.
5387 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
5388 return $this->end_treatment(__METHOD__, false);
5389 }
5390
5391 /**
5392 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
5393 * @return string numéro de dossier d'instruction
5394 */
5395 protected function getDossier($champ = null) {
5396 if(empty($this->specificMetadata)) {
5397 $this->getSpecificMetadata();
5398 }
5399 return $this->specificMetadata->dossier;
5400 }
5401 /**
5402 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
5403 * @return int Version
5404 */
5405 protected function getDossierVersion() {
5406 if(empty($this->specificMetadata)) {
5407 $this->getSpecificMetadata();
5408 }
5409 return $this->specificMetadata->version;
5410 }
5411 /**
5412 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
5413 * @return string numéro de dossier d'autorisation
5414 */
5415 protected function getNumDemandeAutor() {
5416 if(empty($this->specificMetadata)) {
5417 $this->getSpecificMetadata();
5418 }
5419 return $this->specificMetadata->dossier_autorisation;
5420 }
5421 /**
5422 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
5423 * @return date de la demande initiale
5424 */
5425 protected function getAnneemoisDemandeAutor() {
5426 if(empty($this->specificMetadata)) {
5427 $this->getSpecificMetadata();
5428 }
5429 return $this->specificMetadata->date_demande_initiale;
5430 }
5431 /**
5432 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
5433 * @return string type du dossier d'instruction
5434 */
5435 protected function getTypeInstruction() {
5436 if(empty($this->specificMetadata)) {
5437 $this->getSpecificMetadata();
5438 }
5439 return $this->specificMetadata->dossier_instruction_type;
5440 }
5441 /**
5442 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
5443 * @return string avis
5444 */
5445 protected function getStatutAutorisation() {
5446 if(empty($this->specificMetadata)) {
5447 $this->getSpecificMetadata();
5448 }
5449 return $this->specificMetadata->statut;
5450 }
5451 /**
5452 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
5453 * @return string type du dossier d'autorisation
5454 */
5455 protected function getTypeAutorisation() {
5456 if(empty($this->specificMetadata)) {
5457 $this->getSpecificMetadata();
5458 }
5459 return $this->specificMetadata->dossier_autorisation_type;
5460 }
5461 /**
5462 * Récupération de la date d'ajout de document à ajouter aux métadonnées
5463 * @return date de l'évènement
5464 */
5465 protected function getDateEvenementDocument() {
5466 return date("Y-m-d");
5467 }
5468 /**
5469 * Récupération du groupe d'instruction à ajouter aux métadonnées
5470 * @return string Groupe d'instruction
5471 */
5472 protected function getGroupeInstruction() {
5473 if(empty($this->specificMetadata)) {
5474 $this->getSpecificMetadata();
5475 }
5476 return $this->specificMetadata->groupe_instruction;
5477 }
5478 /**
5479 * Récupération du libellé du type du document à ajouter aux métadonnées
5480 * @return string Groupe d'instruction
5481 */
5482 protected function getTitle() {
5483
5484 // Récupère le champ événement
5485 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
5486 $evenement = $this->valF["evenement"];
5487 } else {
5488 $evenement = $this->getVal("evenement");
5489 }
5490
5491 // Requête sql
5492 $evenement = $this->f->get_inst__om_dbform(array(
5493 "obj" => "evenement",
5494 "idx" => $evenement
5495 ));
5496
5497 // Retourne le libelle de l'événement
5498 return $evenement->getVal('libelle');
5499 }
5500
5501
5502 /**
5503 * Récupération du champ ERP du dossier d'instruction.
5504 *
5505 * @return boolean
5506 */
5507 public function get_concerne_erp() {
5508 //
5509 if(empty($this->specificMetadata)) {
5510 $this->getSpecificMetadata();
5511 }
5512 //
5513 return $this->specificMetadata->erp;
5514 }
5515
5516
5517 /**
5518 * Cette méthode permet de stocker en attribut toutes les métadonnées
5519 * nécessaire à l'ajout d'un document.
5520 */
5521 public function getSpecificMetadata() {
5522 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5523 $dossier = $this->valF["dossier"];
5524 } else {
5525 $dossier = $this->getVal("dossier");
5526 }
5527 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5528 $qres = $this->f->get_all_results_from_db_query(
5529 sprintf(
5530 'SELECT
5531 dossier.dossier AS dossier,
5532 dossier_autorisation.dossier_autorisation AS dossier_autorisation,
5533 to_char(dossier.date_demande, \'YYYY/MM\') AS date_demande_initiale,
5534 dossier_instruction_type.code AS dossier_instruction_type,
5535 etat_dossier_autorisation.libelle AS statut,
5536 dossier_autorisation_type.code AS dossier_autorisation_type,
5537 groupe.code AS groupe_instruction,
5538 CASE WHEN dossier.erp IS TRUE
5539 THEN \'true\'
5540 ELSE \'false\'
5541 END AS erp
5542 FROM
5543 %1$sdossier
5544 LEFT JOIN %1$sdossier_instruction_type
5545 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5546 LEFT JOIN %1$sdossier_autorisation
5547 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5548 LEFT JOIN %1$setat_dossier_autorisation
5549 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5550 LEFT JOIN %1$sdossier_autorisation_type_detaille
5551 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5552 LEFT JOIN %1$sdossier_autorisation_type
5553 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5554 LEFT JOIN %1$sgroupe
5555 ON dossier_autorisation_type.groupe = groupe.groupe
5556 WHERE
5557 dossier.dossier = \'%2$s\'',
5558 DB_PREFIXE,
5559 $this->f->db->escapeSimple($dossier)
5560 ),
5561 array(
5562 "origin" => __METHOD__,
5563 )
5564 );
5565 $row = array_shift($qres['result']);
5566
5567 //Si il y a un résultat
5568 if (! empty($row)) {
5569
5570 // Instrance de la classe dossier
5571 $inst_dossier = $this->get_inst_dossier($dossier);
5572 // TODO : améliorer ce code
5573 //
5574 // Avant l e résultat été récupéré dans un objet à partir de la requête mais en modifiant pour
5575 // utiliser la méthode get_all_results_from_db_query() c'est maintenant un tableau
5576 // qu'on obtiens. Pour garder le même fonctionnement on transforme le tableau des
5577 // valeurs issues de la requête en objet.
5578 $metadata = (object)$row;
5579 // Insère l'attribut version à l'objet
5580 $metadata->version = $inst_dossier->get_di_numero_suffixe();
5581
5582 //Alors on créé l'objet dossier_instruction
5583 $this->specificMetadata = $metadata;
5584
5585 }
5586 }
5587
5588 /**
5589 * Retourne le statut du dossier d'instruction
5590 * @param string $idx Identifiant du dossier d'instruction
5591 * @return string Le statut du dossier d'instruction
5592 */
5593 function getStatutAutorisationDossier($idx){
5594
5595 $statut = '';
5596
5597 //Si l'identifiant du dossier d'instruction fourni est correct
5598 if ( $idx != '' ){
5599
5600 //On récupère le statut de l'état du dossier à partir de l'identifiant du
5601 //dossier
5602 $qres = $this->f->get_one_result_from_db_query(
5603 sprintf(
5604 'SELECT
5605 etat.statut
5606 FROM
5607 %1$sdossier
5608 LEFT JOIN
5609 %1$setat
5610 ON
5611 dossier.etat = etat.etat
5612 WHERE
5613 dossier = \'%2$s\'',
5614 DB_PREFIXE,
5615 $this->f->db->escapeSimple($idx)
5616 ),
5617 array(
5618 "origin" => __METHOD__,
5619 )
5620 );
5621 }
5622
5623 return $qres['result'];
5624 }
5625
5626 /**
5627 * Récupère les données du dossier
5628 * @return array
5629 */
5630 function get_dossier_actual() {
5631
5632 // Initialisation de la valeur de retour
5633 $return = array();
5634
5635 // Récupération de toutes les valeurs du dossier d'instruction en cours
5636 // TODO : remplacer cette requête par une instanciation de l'objet
5637 $qres = $this->f->get_all_results_from_db_query(
5638 sprintf(
5639 'SELECT
5640 *
5641 FROM
5642 %1$sdossier
5643 WHERE
5644 dossier = \'%2$s\'',
5645 DB_PREFIXE,
5646 $this->f->db->escapeSimple($this->valF['dossier'])
5647 ),
5648 array(
5649 'origin' => __METHOD__
5650 )
5651 );
5652
5653 foreach ($qres['result'] as $row) {
5654
5655 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5656 // de l'état et de l'avis du dossier d'instruction
5657 $return['archive_delai'] = $row['delai'];
5658 $return['archive_accord_tacite'] = $row['accord_tacite'];
5659 $return['archive_etat'] = $row['etat'];
5660 $return['archive_avis'] = $row['avis_decision'];
5661 // Récupération de la valeur actuelle des dates du dossier
5662 // d'instruction
5663 $return['archive_date_complet'] = $row['date_complet'];
5664 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5665 $return['archive_date_rejet'] = $row['date_rejet'];
5666 $return['archive_date_limite'] = $row['date_limite'];
5667 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5668 $return['archive_date_decision'] = $row['date_decision'];
5669 $return['archive_date_validite'] = $row['date_validite'];
5670 $return['archive_date_achevement'] = $row['date_achevement'];
5671 $return['archive_date_chantier'] = $row['date_chantier'];
5672 $return['archive_date_conformite'] = $row['date_conformite'];
5673 $return['archive_incompletude'] = $row['incompletude'];
5674 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5675 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5676 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5677 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5678 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5679 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5680 $return['archive_autorite_competente'] = $row['autorite_competente'];
5681 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5682 $return['duree_validite'] = $row['duree_validite'];
5683 $return['date_depot'] = $row['date_depot'];
5684 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5685 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5686 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5687 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5688 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5689 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5690 $return['archive_date_ait'] = $row['date_ait'];
5691 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5692 $return['archive_date_affichage'] = $row['date_affichage'];
5693 $return['archive_pec_metier'] = $row['pec_metier'];
5694 $return['archive_a_qualifier'] = $row['a_qualifier'];
5695 }
5696
5697 // Retour de la fonction
5698 return $return;
5699
5700 }
5701
5702 /**
5703 * Permet de vérifier qu'un événement est verrouillable
5704 * @param integer $idx Identifiant de l'instruction
5705 * @return boolean
5706 */
5707 function checkEvenementNonVerrouillable($idx) {
5708 // Si la condition n'est pas vide
5709 if ($idx != "") {
5710
5711 // Requête SQL
5712 $qres = $this->f->get_one_result_from_db_query(
5713 sprintf(
5714 'SELECT
5715 evenement.non_verrouillable
5716 FROM
5717 %1$sevenement
5718 LEFT JOIN %1$sinstruction
5719 ON instruction.evenement = evenement.evenement
5720 WHERE
5721 instruction.instruction = \'%2$s\'',
5722 DB_PREFIXE,
5723 intval($idx)
5724 ),
5725 array(
5726 "origin" => __METHOD__,
5727 )
5728 );
5729 }
5730
5731 // Si on a un résultat et que ce résultat indique que l'événement n'est
5732 // pas vérrouillable renvoie true, sinon renvoie false
5733 return isset($qres) && isset($qres['result']) && $qres['result'] == 't';
5734 }
5735
5736 /**
5737 * Mise à jour des champs archive_*
5738 * @param mixed $row La ligne de données
5739 */
5740 public function updateArchiveData($row){
5741
5742 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5743 // de l'état et de l'avis du dossier d'instruction
5744 $this->valF['archive_delai']=$row['delai'];
5745 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5746 $this->valF['archive_etat']=$row['etat'];
5747 $this->valF['archive_avis']=$row['avis_decision'];
5748 // Récupération de la valeur actuelle des 9 dates du dossier
5749 // d'instruction
5750 if ($row['date_complet'] != '') {
5751 $this->valF['archive_date_complet']=$row['date_complet'];
5752 }
5753 if ($row['date_dernier_depot'] != '') {
5754 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5755 }
5756 if ($row['date_rejet'] != '') {
5757 $this->valF['archive_date_rejet']= $row['date_rejet'];
5758 }
5759 if ($row['date_limite'] != '') {
5760 $this->valF['archive_date_limite']= $row['date_limite'];
5761 }
5762 if ($row['date_notification_delai'] != '') {
5763 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5764 }
5765 if ($row['date_decision'] != '') {
5766 $this->valF['archive_date_decision']= $row['date_decision'];
5767 }
5768 if ($row['date_validite'] != '') {
5769 $this->valF['archive_date_validite']= $row['date_validite'];
5770 }
5771 if ($row['date_achevement'] != '') {
5772 $this->valF['archive_date_achevement']= $row['date_achevement'];
5773 }
5774 if ($row['date_chantier'] != '') {
5775 $this->valF['archive_date_chantier']= $row['date_chantier'];
5776 }
5777 if ($row['date_conformite'] != '') {
5778 $this->valF['archive_date_conformite']= $row['date_conformite'];
5779 }
5780 if ($row['incompletude'] != '') {
5781 $this->valF['archive_incompletude']= $row['incompletude'];
5782 }
5783 if ($row['incomplet_notifie'] != '') {
5784 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5785 }
5786 if ($row['evenement_suivant_tacite'] != '') {
5787 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5788 }
5789 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5790 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5791 }
5792 if ($row['etat_pendant_incompletude'] != '') {
5793 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5794 }
5795 if ($row['date_limite_incompletude'] != '') {
5796 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5797 }
5798 if ($row['delai_incompletude'] != '') {
5799 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5800 }
5801 if ($row['autorite_competente'] != '') {
5802 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5803 }
5804 if ($row['duree_validite'] != '') {
5805 $this->valF['duree_validite']= $row['duree_validite'];
5806 }
5807 if ($row['date_depot'] != '') {
5808 $this->valF['date_depot']= $row['date_depot'];
5809 }
5810 if ($row['date_depot_mairie'] != '') {
5811 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5812 }
5813 // Dates concernant les dossiers contentieux
5814 if ($row['date_cloture_instruction'] != '') {
5815 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5816 }
5817 if ($row['date_premiere_visite'] != '') {
5818 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5819 }
5820 if ($row['date_derniere_visite'] != '') {
5821 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5822 }
5823 if ($row['date_contradictoire'] != '') {
5824 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5825 }
5826 if ($row['date_retour_contradictoire'] != '') {
5827 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5828 }
5829 if ($row['date_ait'] != '') {
5830 $this->valF['archive_date_ait']= $row['date_ait'];
5831 }
5832 if ($row['date_transmission_parquet'] != '') {
5833 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5834 }
5835 //
5836 if ($row['dossier_instruction_type'] != '') {
5837 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5838 }
5839 if ($row['date_affichage'] != '') {
5840 $this->valF['archive_date_affichage']= $row['date_affichage'];
5841 }
5842 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5843 $this->valF['archive_pec_metier']= $row['pec_metier'];
5844 }
5845 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5846 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5847 }
5848 }
5849
5850 // {{{
5851 // Méthodes de récupération des métadonnées arrêté
5852 /**
5853 * @return string Retourne le numéro d'arrêté
5854 */
5855 function getNumArrete() {
5856 return $this->getVal("numero_arrete");
5857 }
5858 /**
5859 * @return chaîne vide
5860 */
5861 function getReglementaireArrete() {
5862 return 'true';
5863 }
5864 /**
5865 * @return boolean de notification au pétitionnaire
5866 */
5867 function getNotificationArrete() {
5868 return 'true';
5869 }
5870 /**
5871 * @return date de notification au pétitionnaire
5872 */
5873 function getDateNotificationArrete() {
5874 if (empty($this->metadonneesArrete)) {
5875 $this->getArreteMetadata();
5876 }
5877 return $this->metadonneesArrete["datenotification"];
5878 }
5879 /**
5880 * @return boolean check si le document est passé au contrôle de légalité
5881 */
5882 function getControleLegalite() {
5883 return 'true';
5884 }
5885 /**
5886 * @return date de signature de l'arrêté
5887 */
5888 function getDateSignature() {
5889 if (empty($this->metadonneesArrete)) {
5890 $this->getArreteMetadata();
5891 }
5892 return $this->metadonneesArrete["datesignaturearrete"];
5893 }
5894 /**
5895 * @return string nom du signataire
5896 */
5897 function getNomSignataire() {
5898 if (empty($this->metadonneesArrete)) {
5899 $this->getArreteMetadata();
5900 }
5901 return $this->metadonneesArrete["nomsignataire"];
5902 }
5903 /**
5904 * @return string qualité du signataire
5905 */
5906 function getQualiteSignataire() {
5907 if (empty($this->metadonneesArrete)) {
5908 $this->getArreteMetadata();
5909 }
5910 return $this->metadonneesArrete["qualitesignataire"];
5911 }
5912 /**
5913 * @return string numéro du terrain
5914 */
5915 function getAp_numRue() {
5916 if (empty($this->metadonneesArrete)) {
5917 $this->getArreteMetadata();
5918 }
5919 return $this->metadonneesArrete["ap_numrue"];
5920 }
5921 /**
5922 * @return string nom de la rue du terrain
5923 */
5924 function getAp_nomDeLaVoie() {
5925 if (empty($this->metadonneesArrete)) {
5926 $this->getArreteMetadata();
5927 }
5928 return $this->metadonneesArrete["ap_nomdelavoie"];
5929 }
5930 /**
5931 * @return string code postal du terrain
5932 */
5933 function getAp_codePostal() {
5934 if (empty($this->metadonneesArrete)) {
5935 $this->getArreteMetadata();
5936 }
5937 return $this->metadonneesArrete["ap_codepostal"];
5938 }
5939 /**
5940 * @return string ville du terrain
5941 */
5942 function getAp_ville() {
5943 if (empty($this->metadonneesArrete)) {
5944 $this->getArreteMetadata();
5945 }
5946 return $this->metadonneesArrete["ap_ville"];
5947 }
5948 /**
5949 * @return string activité
5950 */
5951 function getActivite() {
5952 return "Droit du sol";
5953 }
5954 /**
5955 * @return string date du retour de controle légalité
5956 */
5957 function getDateControleLegalite() {
5958 if (empty($this->metadonneesArrete)) {
5959 $this->getArreteMetadata();
5960 }
5961 return $this->metadonneesArrete["datecontrolelegalite"];
5962 }
5963
5964 // Fin des méthodes de récupération des métadonnées
5965 // }}}
5966
5967 /**
5968 * Méthode de récupération des métadonnées arrêtés dans la base de données,
5969 * les données sont stockés dans l'attribut $this->metadonneesArrete
5970 */
5971 function getArreteMetadata() {
5972
5973 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5974 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5975 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5976 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5977 "ap_codepostal"=>"", "ap_ville"=>"");
5978
5979 $qres = $this->f->get_all_results_from_db_query(
5980 sprintf(
5981 'SELECT
5982 signataire_arrete.prenom || \' \' ||signataire_arrete.nom as nomsignataire,
5983 signataire_arrete.qualite as qualitesignataire,
5984 instruction.etat as decisionarrete,
5985 instruction.date_retour_rar as datenotification,
5986 instruction.date_retour_signature as datesignaturearrete,
5987 instruction.date_retour_controle_legalite as datecontrolelegalite,
5988 dossier.terrain_adresse_voie_numero as ap_numrue,
5989 dossier.terrain_adresse_voie as ap_nomdelavoie,
5990 dossier.terrain_adresse_code_postal as ap_codepostal,
5991 dossier.terrain_adresse_localite as ap_ville
5992 FROM
5993 %1$sinstruction
5994 LEFT JOIN %1$ssignataire_arrete
5995 ON instruction.signataire_arrete = signataire_arrete.signataire_arrete
5996 LEFT JOIN %1$sdossier
5997 ON instruction.dossier = dossier.dossier
5998 LEFT JOIN %1$sdonnees_techniques
5999 ON donnees_techniques.dossier_instruction = dossier.dossier
6000 WHERE
6001 instruction.instruction = %2$d',
6002 DB_PREFIXE,
6003 intval($this->getVal('instruction'))
6004 ),
6005 array(
6006 'origin' => __METHOD__
6007 )
6008 );
6009 $this->metadonneesArrete = array_shift($qres['result']);
6010 }
6011
6012 /**
6013 * CONDITION - has_an_edition.
6014 *
6015 * Condition pour afficher le bouton de visualisation de l'édition.
6016 *
6017 * @return boolean
6018 */
6019 function has_an_edition() {
6020 // Récupère la valeur du champ lettretype
6021 $lettretype = $this->getVal("lettretype");
6022 // Si le champ est vide
6023 if ($lettretype !== '' && $lettretype !== null) {
6024 //
6025 return true;
6026 }
6027
6028 //
6029 return false;
6030 }
6031
6032 /**
6033 * CONDITION - is_modifiable.
6034 *
6035 * Controle si l'évenement est modifiable.
6036 *
6037 * @return boolean
6038 */
6039 function is_evenement_modifiable() {
6040 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6041 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
6042 }
6043
6044 /**
6045 * CONDITION - is_editable.
6046 *
6047 * Condition pour la modification.
6048 *
6049 * @return boolean
6050 */
6051 function is_editable() {
6052
6053 // XXX
6054 // 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é)
6055 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6056
6057 // Contrôle si l'utilisateur possède un bypass
6058 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
6059 //
6060 if ($bypass == true) {
6061 //
6062 return true;
6063 }
6064
6065 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6066 // que l'événement n'est pas identifié comme non verrouillable
6067 if ($this->f->isUserInstructeur()
6068 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6069 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6070 //
6071 return false;
6072 }
6073
6074 // Si l'utilisateur est un intructeur qui correspond à la division du
6075 // dossier
6076 if ($this->is_instructeur_from_division_dossier() === true) {
6077 //
6078 return true;
6079 }
6080
6081 // Si l'utilisateur est instructeur de la commune du dossier et que
6082 // l'instruction est créée par un instructeur de la commune
6083 if ($this->is_instructeur_from_collectivite_dossier() === true and
6084 $this->getVal('created_by_commune') === 't') {
6085 return true;
6086 }
6087
6088 //
6089 return false;
6090 }
6091
6092 /**
6093 * Vérifie si l'événement est supprimable ou pas.
6094 *
6095 * @return boolean
6096 */
6097 function is_evenement_supprimable() {
6098 // Controle si l'évenement est supprimable
6099 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
6100 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
6101 }
6102
6103 /**
6104 * CONDITION - is_deletable.
6105 *
6106 * Condition pour la suppression.
6107 *
6108 * @return boolean
6109 */
6110 function is_deletable() {
6111
6112 // XXX
6113 // 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é)
6114 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
6115
6116 // Contrôle si l'utilisateur possède un bypass intégral
6117 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
6118 //
6119 if ($bypass == true) {
6120
6121 //
6122 return true;
6123 }
6124
6125 // Si l'utilisateur est un intructeur qui ne correspond pas à la
6126 // division du dossier et si l'utilisateur n'a pas la permission bypass
6127 // de la division
6128 if ($this->is_instructeur_from_division_dossier() === false
6129 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
6130
6131 //
6132 return false;
6133 }
6134
6135 // l'événement est-il le dernier ?
6136 $dernier_evenement = false;
6137 // instanciation dossier
6138 $dossier = $this->f->get_inst__om_dbform(array(
6139 "obj" => "dossier",
6140 "idx" => $this->getVal('dossier'),
6141 ));
6142 // récupération dernier événement
6143 $id_dernier_evenement = $dossier->get_dernier_evenement();
6144 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
6145 $dernier_evenement = true;
6146 }
6147
6148 // Si dossier cloturé ou si pas dernier événement
6149 // ou de type retour ou si une date est renseignée
6150 // ET utilisateur non administrateur
6151 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
6152 || $dernier_evenement == false
6153 || $this->is_evenement_retour($this->getVal("evenement")) == true
6154 || $this->getVal('date_envoi_signature') != ''
6155 || $this->getVal('date_retour_signature') != ''
6156 || $this->getVal('date_envoi_rar') != ''
6157 || $this->getVal('date_retour_rar') != ''
6158 || $this->getVal('date_envoi_controle_legalite') != ''
6159 || $this->getVal('date_retour_controle_legalite') != '') {
6160 // pas le droit de supprimer
6161 return false;;
6162 }
6163
6164 //
6165 return true;
6166 }
6167
6168
6169 /**
6170 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
6171 * dossier.
6172 *
6173 * @return, boolean true/false
6174 */
6175 function is_instructeur_from_collectivite_dossier() {
6176 if ($this->f->isUserInstructeur() === true and
6177 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
6178 return true;
6179 }
6180 return false;
6181 }
6182
6183 /**
6184 * CONDITION - is_addable.
6185 *
6186 * Condition pour afficher les boutons modifier et supprimer.
6187 *
6188 * @return boolean
6189 */
6190 function is_addable() {
6191 // Contrôle si l'utilisateur possède un bypass
6192 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
6193 //
6194 if ($bypass == true) {
6195
6196 //
6197 return true;
6198 }
6199 // Si l'utilisateur est un intructeur qui correspond à la
6200 // division du dossier ou qu'il peut changer la décision
6201 if ($this->is_instructeur_from_division_dossier() === true or
6202 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
6203 //
6204 return true;
6205 }
6206
6207 //
6208 return false;
6209 }
6210
6211 /**
6212 * CONDITION - is_finalizable.
6213 *
6214 * Condition pour afficher le bouton.
6215 *
6216 * @return boolean
6217 */
6218 function is_finalizable() {
6219 // Contrôle si l'utilisateur possède un bypass
6220 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
6221 //
6222 if ($bypass == true) {
6223 //
6224 return true;
6225 }
6226
6227 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6228 // que l'événement n'est pas identifié comme non verrouillable
6229 if ($this->f->isUserInstructeur()
6230 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6231 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6232 //
6233 return false;
6234 }
6235
6236 // Si l'utilisateur est un intructeur qui correspond à la division du
6237 // dossier
6238 if ($this->is_instructeur_from_division_dossier() === true) {
6239 //
6240 return true;
6241 }
6242
6243 // Si l'utilisateur est instructeur de la commune du dossier et que
6244 // l'instruction est créée par un instructeur de la commune
6245 if ($this->is_instructeur_from_collectivite_dossier() === true and
6246 $this->getVal('created_by_commune') === 't') {
6247 return true;
6248 }
6249
6250 //
6251 return false;
6252 }
6253
6254 /**
6255 * CONDITION - is_finalize_without_bypass.
6256 *
6257 * Condition pour afficher le bouton sans le bypass.
6258 *
6259 * @return boolean [description]
6260 */
6261 function is_finalizable_without_bypass() {
6262 // Récupère la valeur du champ finalisé
6263 $om_final_instruction = $this->getVal('om_final_instruction');
6264
6265 // Si le rapport n'est pas finalisé
6266 if (empty($om_final_instruction)
6267 || $om_final_instruction == 'f') {
6268 //
6269 return true;
6270 }
6271
6272 //
6273 return false;
6274 }
6275
6276 /**
6277 * CONDITION - is_unfinalizable.
6278 *
6279 * Condition pour afficher le bouton.
6280 *
6281 * @return boolean
6282 */
6283 function is_unfinalizable(){
6284 // Contrôle si l'utilisateur possède un bypass
6285 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
6286 //
6287 if ($bypass == true) {
6288 //
6289 return true;
6290 }
6291
6292 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
6293 // que l'événement n'est pas identifié comme non verrouillable
6294 if ($this->f->isUserInstructeur()
6295 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
6296 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
6297 //
6298 return false;
6299 }
6300
6301 // Si l'utilisateur est un intructeur qui correspond à la division du
6302 // dossier
6303 if ($this->is_instructeur_from_division_dossier() === true) {
6304 //
6305 return true;
6306 }
6307
6308 // Si l'utilisateur est instructeur de la commune du dossier et que
6309 // l'instruction est créée par un instructeur de la commune
6310 if ($this->is_instructeur_from_collectivite_dossier() === true and
6311 $this->getVal('created_by_commune') === 't') {
6312 return true;
6313 }
6314
6315 //
6316 return false;
6317 }
6318
6319 /**
6320 * CONDITION - is_unfinalizable_without_bypass.
6321 *
6322 * Condition pour afficher le bouton sans le bypass.
6323 *
6324 * @return boolean
6325 */
6326 function is_unfinalizable_without_bypass() {
6327 // Récupère la valeur du champ finalisé
6328 $om_final_instruction = $this->getVal('om_final_instruction');
6329
6330 // Si l'instruction est finalisée
6331 if ($om_final_instruction == 't') {
6332 //
6333 return true;
6334 }
6335
6336 //
6337 return false;
6338 }
6339
6340
6341 /**
6342 * Permet de définir si un instructeur commune peut editer une instruction
6343 *
6344 * @return boolean true si il peut
6345 */
6346 function isInstrCanChangeDecision($idx) {
6347
6348 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
6349 $this->f->isUserInstructeur() !== true) {
6350 return false;
6351 }
6352
6353
6354
6355 // Sinon on vérifie l'éligibilité du dossier au changement de décision
6356 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
6357 // de décision :
6358 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
6359 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
6360 $sql = sprintf(
6361 'SELECT
6362 dossier.dossier
6363 FROM
6364 %1$sdossier
6365 JOIN %1$setat
6366 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
6367 JOIN %1$slien_dossier_demandeur
6368 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
6369 JOIN %1$sdossier_instruction_type
6370 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
6371 JOIN %1$sinstruction
6372 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
6373 ON instruction.instruction = (
6374 SELECT instruction
6375 FROM %1$sinstruction
6376 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
6377 AND evenement.retour IS FALSE
6378 WHERE instruction.dossier = dossier.dossier
6379 ORDER BY date_evenement DESC, instruction DESC
6380 LIMIT 1
6381 )
6382 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
6383 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
6384 -- non signée, non notifié, etc.
6385 AND (instruction.om_final_instruction IS TRUE
6386 OR instruction.created_by_commune IS TRUE)
6387 AND instruction.date_retour_signature IS NULL
6388 AND instruction.date_envoi_rar IS NULL
6389 AND instruction.date_retour_rar IS NULL
6390 AND instruction.date_envoi_controle_legalite IS NULL
6391 AND instruction.date_retour_controle_legalite IS NULL
6392 -- On vérifie que l instruction soit un arrêté ou un changement de décision
6393 JOIN %1$sevenement
6394 ON instruction.evenement=evenement.evenement
6395 AND (evenement.type = \'arrete\'
6396 OR evenement.type = \'changement_decision\')
6397 -- Recherche les informations du pétitionnaire principal pour l affichage
6398 JOIN %1$sdemandeur
6399 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
6400 -- Recherche la collectivité rattachée à l instructeur
6401 JOIN %1$sinstructeur
6402 ON dossier.instructeur=instructeur.instructeur
6403 JOIN %1$sdivision
6404 ON instructeur.division=division.division
6405 JOIN %1$sdirection
6406 ON division.direction=direction.direction
6407 JOIN %1$som_collectivite
6408 ON direction.om_collectivite=om_collectivite.om_collectivite
6409 WHERE
6410 -- Vérification que la décision a été prise par l agglo
6411 om_collectivite.niveau = \'2\'
6412 AND dossier.dossier = \'%2$s\'
6413 ',
6414 DB_PREFIXE,
6415 $this->f->db->escapeSimple($idx)
6416 );
6417
6418
6419 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
6420 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
6421 $sql .= sprintf(
6422 ' AND dossier.om_collectivite = %1$d',
6423 intval($_SESSION['collectivite'])
6424 );
6425 }
6426 $qres = $this->f->get_one_result_from_db_query(
6427 $sql,
6428 array(
6429 "origin" => __METHOD__,
6430 )
6431 );
6432
6433 return $qres['result'] !== null;
6434 }
6435
6436
6437 /**
6438 * CONDITION - can_monitoring_dates.
6439 *
6440 * Condition pour afficher le bouton de suivi des dates.
6441 *
6442 * @return boolean
6443 */
6444 public function can_monitoring_dates() {
6445 // Récupère la valeur du champ finalisé
6446 $om_final_instruction = $this->getVal('om_final_instruction');
6447
6448 // Si l'instruction n'est pas finalisée
6449 if ($om_final_instruction !== 't') {
6450 //
6451 return false;
6452 }
6453
6454 // Contrôle si l'utilisateur possède un bypass
6455 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
6456 if ($bypass === true) {
6457 return true;
6458 }
6459
6460 // Permission de modifier le suivi des dates sur un dossier cloturé pour
6461 // un utilisateur lié à un instructeur
6462 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
6463
6464 // On vérifie en premier lieu que le DI n'est pas clôturé et que
6465 // l'utilisateur ne possède pas la permission de modifier le suivi des
6466 // dates sur un dossier clôturé
6467 $inst_dossier = $this->get_inst_dossier();
6468 if ($inst_dossier->getStatut() === 'cloture'
6469 && $perm_moni_dates_d_closed === false) {
6470 //
6471 return false;
6472 }
6473 // On récupère ses infos
6474 $coll_di = $inst_dossier->getVal('om_collectivite');
6475 $div_di = $this->getDivisionFromDossier();
6476 // et celles de son éventuel instructeur
6477 $instr_di = $inst_dossier->getVal('instructeur');
6478
6479 // Il faut disposer d'une entrée instructeur
6480 if ($this->f->isUserInstructeur() === false) {
6481 return false;
6482 }
6483
6484 // Par défaut on prétend que l'instructeur n'est pas multi
6485 $instr_di_coll_multi = false;
6486 // Si un instructeur est affecté au dossier
6487 if ($instr_di !== '' && $instr_di !== null) {
6488 // Vérifie si l'instructeur est de la collectivité de niveau 2
6489 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
6490 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
6491 //
6492 $instr_di_coll_multi = true;
6493 }
6494 }
6495
6496 // Il faut qu'il instruise le dossier ou soit de la même division
6497 if ($this->f->om_utilisateur['instructeur'] === $instr_di
6498 || $this->f->om_utilisateur['division'] === $div_di) {
6499 //
6500 return true;
6501 }
6502
6503 // On donne également le droit s'il est de la même collectivité que
6504 // le dossier ET si l'instruction est déléguée à la communauté
6505 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
6506 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
6507 && $instr_di_coll_multi === true) {
6508 //
6509 return true;
6510 }
6511
6512 // Si l'instructeur ne rentre pas dans les deux cas précédents
6513 return false;
6514 }
6515
6516
6517 /**
6518 * CONDITION - is_finalized.
6519 *
6520 * Condition pour vérifier si une instruction est finalisée.
6521 *
6522 * @return boolean
6523 */
6524 public function is_finalized() {
6525
6526 return $this->getVal('om_final_instruction') === "t";
6527 }
6528
6529 /**
6530 * CONDITION - is_not_date_retour_signature_set.
6531 *
6532 * Condition pour vérifier si une date de retour signature n'est pas définie.
6533 *
6534 * @return boolean
6535 */
6536 public function is_not_date_retour_signature_set() {
6537
6538 return $this->getVal('date_retour_signature') == null;
6539
6540 }
6541
6542
6543 /**
6544 * TREATMENT - finalize.
6545 *
6546 * Permet de finaliser un enregistrement.
6547 *
6548 * @param array $val valeurs soumises par le formulaire
6549 *
6550 * @return boolean
6551 */
6552 function finalize($val = array()) {
6553
6554 // Cette méthode permet d'exécuter une routine en début des méthodes
6555 // dites de TREATMENT.
6556 $this->begin_treatment(__METHOD__);
6557 $message = '';
6558 $ev = $this->get_inst_evenement($this->getVal('evenement'));
6559
6560 // Controle du signataire
6561 if (! $this->controle_signataire($ev)) {
6562 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
6563 // Termine le traitement
6564 return $this->end_treatment(__METHOD__, false);
6565 }
6566
6567 // Traitement de la finalisation
6568 $ret = $this->manage_finalizing("finalize", $val);
6569
6570 // Si le traitement retourne une erreur
6571 if ($ret !== true) {
6572
6573 // Termine le traitement
6574 return $this->end_treatment(__METHOD__, false);
6575 }
6576
6577 // Envoi des notifications aux demandeurs si la notification est automatique
6578 // et que la signature n'est pas requise
6579 if ($ev->getVal('notification') === 'notification_automatique') {
6580 // Préparation du message de log en cas d'erreur de notification
6581 $msgLog = sprintf(
6582 '%s %s : %d',
6583 __('Erreur lors de la notification automatique du(des) pétitionnaire(s) suite à la finalisation de l\'instruction.'),
6584 __('Instruction notifiée'),
6585 $this->getVal($this->clePrimaire)
6586 );
6587 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6588 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6589 // Récupération de la liste des demandeurs à notifier et de la catégorie
6590 $categorie = $this->f->get_param_option_notification($collectivite_di);
6591 $isPortal = $categorie === PORTAL;
6592 $demandeursANotifie = $this->get_demandeurs_notifiable(
6593 $this->getVal('dossier'),
6594 $isPortal
6595 );
6596
6597 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6598 $demandeurPrincipalNotifie = false;
6599 if (count($demandeursANotifie) > 0) {
6600 foreach ($demandeursANotifie as $demandeur) {
6601 // Identifie si le demandeur principal a été notifié ou pas
6602 // et récupère ses informations
6603 if ($demandeur['petitionnaire_principal'] == 't') {
6604 $demandeurPrincipalNotifie = true;
6605 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6606 // son paramétrage, on effectue pas le traitement et on passe à l'itération
6607 // suivante. On le considère également comme non notifié pour gérer l'envoie
6608 // des messages d'erreurs
6609 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6610 // d'impact sur la notification
6611 $erreursParam = $this->get_info_notification_fail();
6612 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6613 $demandeurPrincipalNotifie = false;
6614 continue;
6615 }
6616 }
6617 // Ajout de la notif et récupération de son id
6618 $idNotif = $this->ajouter_notification(
6619 $this->getVal($this->clePrimaire),
6620 $this->f->get_connected_user_login_name(),
6621 $demandeur,
6622 $collectivite_di,
6623 array(),
6624 true
6625 );
6626 if ($idNotif === false) {
6627 // Termine le traitement
6628 $this->addToLog(
6629 sprintf('%s() : %s', __METHOD__, $msgLog),
6630 DEBUG_MODE
6631 );
6632 return $this->end_treatment(__METHOD__, false);
6633 }
6634 $notification_by_task = $this->notification_by_task(
6635 $idNotif,
6636 $this->getVal('dossier'),
6637 $categorie
6638 );
6639 if ($notification_by_task === false) {
6640 $this->addToLog(
6641 sprintf('%s() : %s', __METHOD__, $msgLog),
6642 DEBUG_MODE
6643 );
6644 $this->addToMessage(
6645 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6646 );
6647 // Termine le traitement
6648 return $this->end_treatment(__METHOD__, false);
6649 }
6650 $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.")));
6651 }
6652 }
6653 // Pour la notification par mail ou la notification via portal si le dossier a
6654 // été déposés via portal, si le demandeur principal n'est pas notifiable,
6655 // on créé une nouvelle notification en erreur avec en commentaire la raison pour
6656 // laquelle le demandeur principal n'a pas pu être notifié
6657 $depotPortal = $this->dossier_depose_sur_portail();
6658 if (! $demandeurPrincipalNotifie && ($isPortal === false || $depotPortal === true)) {
6659 // Préparation des logs pour indiquer que le pétitionnaire principale n'est pas notifiable
6660 $msgLog .= sprintf(' %s', __('Le pétitionnaire principale n\'est pas notifiable.'));
6661 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6662 $erreursParam = $this->get_info_notification_fail();
6663 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6664 // Ajout de la notif et récupération de son id
6665 $idNotif = $this->ajouter_notification(
6666 $this->valF[$this->clePrimaire],
6667 $this->f->get_connected_user_login_name(),
6668 $demandeurPrincipal,
6669 $collectivite_di,
6670 array(),
6671 true,
6672 'Echec',
6673 implode(' ', $erreursParam)
6674 );
6675 if ($idNotif === false) {
6676 $this->addToMessage(
6677 __('Erreur : la création de la notification a échouée.').
6678 __("Veuillez contacter votre administrateur.")
6679 );
6680 $this->addToLog(
6681 sprintf('%s() : %s', __METHOD__, $msgLog),
6682 DEBUG_MODE
6683 );
6684 return false;
6685 }
6686 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6687 // de l'échec de la notification
6688 $dossier_message = $this->get_inst_dossier_message(0);
6689 $dossier_message_val = array(
6690 'dossier' => $this->getVal('dossier'),
6691 'type' => _('erreur expedition'),
6692 'emetteur' => $this->f->get_connected_user_login_name(),
6693 'login' => $_SESSION['login'],
6694 'date_emission' => date('Y-m-d H:i:s'),
6695 'contenu' => _('Échec lors de la notification de l\'instruction ').
6696 $ev->getVal('libelle').
6697 '.<br>'.
6698 implode("\n", $erreursParam).
6699 '<br>'.
6700 _('Veuillez corriger ces informations avant de renvoyer la notification.')
6701 );
6702 $add = $dossier_message->add_notification_message($dossier_message_val, true);
6703 // Si une erreur se produit pendant l'ajout
6704 if ($add !== true) {
6705 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6706 return false;
6707 }
6708 }
6709 }
6710
6711 // Termine le traitement
6712 return $this->end_treatment(__METHOD__, true);
6713 }
6714
6715 /**
6716 * Récupère l'instance de dossier message.
6717 *
6718 * @param string $dossier_message Identifiant du message.
6719 *
6720 * @return object
6721 */
6722 private function get_inst_dossier_message($dossier_message = null) {
6723 //
6724 return $this->get_inst_common("dossier_message", $dossier_message);
6725 }
6726
6727 /**
6728 * Vérifie si le signataire est obligatoire pour finaliser
6729 * le document apartir du paramétrage de l'événement.
6730 * Si c'est le cas, vérifie si il y a bien un signataire
6731 * renseigné.
6732 * Si c'est le cas renvoie true, sinon renvoie false.
6733 *
6734 * @param evenement évenement de l'instruction permettant de
6735 * récupérer le paramétrage
6736 * @return boolean
6737 */
6738 protected function controle_signataire($evenement) {
6739 // Vérifie si le signataire est obligatoire et si c'est le cas
6740 // vérifie si il y a bien un signataire pour le document
6741 if ($evenement->is_signataire_obligatoire() &&
6742 ($this->getVal('signataire_arrete') === null ||
6743 $this->getVal('signataire_arrete') === '')) {
6744 return false;
6745 }
6746 return true;
6747 }
6748
6749 /**
6750 * TREATMENT - unfinalize.
6751 *
6752 * Permet de définaliser un enregistrement.
6753 *
6754 * @param array $val valeurs soumises par le formulaire
6755 *
6756 * @return boolean
6757 */
6758 function unfinalize($val = array()) {
6759
6760 // Cette méthode permet d'exécuter une routine en début des méthodes
6761 // dites de TREATMENT.
6762 $this->begin_treatment(__METHOD__);
6763
6764 // Traitement de la finalisation
6765 $ret = $this->manage_finalizing("unfinalize", $val);
6766
6767 // Si le traitement retourne une erreur
6768 if ($ret !== true) {
6769
6770 // Termine le traitement
6771 return $this->end_treatment(__METHOD__, false);
6772 }
6773
6774 // Termine le traitement
6775 return $this->end_treatment(__METHOD__, true);
6776 }
6777
6778 /**
6779 * VIEW - view_edition
6780 *
6781 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6782 *
6783 * @return null Si l'action est incorrecte
6784 */
6785 function view_edition() {
6786
6787 // Si l'instruction est finalisée
6788 if($this->getVal("om_final_instruction") == 't'
6789 && $this->getVal("om_final_instruction") != null) {
6790
6791 // Ouvre le document
6792 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6793 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6794 //
6795 header("Location: ".$lien);
6796 } else {
6797
6798 // Récupère la collectivite du dossier d'instruction
6799 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6800
6801 //
6802 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6803
6804 // Paramètre du PDF
6805 $params = array(
6806 "watermark" => true,
6807 "specific" => array(
6808 "mode" => "previsualisation",
6809 ),
6810 );
6811 // Si la rédaction libre est activée sur l'instruction
6812 if ($this->getVal("flag_edition_integrale") == 't') {
6813 $params["specific"]["corps"] = array(
6814 "mode" => "set",
6815 "value" => $this->getVal("corps_om_htmletatex"),
6816 );
6817 $params["specific"]["titre"] = array(
6818 "mode" => "set",
6819 "value" => $this->getVal("titre_om_htmletat"),
6820 );
6821 }
6822
6823 // Génération du PDF
6824 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6825 // Affichage du PDF
6826 $this->expose_pdf_output(
6827 $result['pdf_output'],
6828 $result['filename']
6829 );
6830 }
6831 }
6832
6833 /**
6834 * Récupère la collectivité du dossier d'instruction.
6835 *
6836 * @param string $dossier_instruction_id Identifiant du DI.
6837 *
6838 * @return integer
6839 */
6840 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6841
6842 // Si l'identifiant n'est pas renseigné
6843 if ($dossier_instruction_id === null) {
6844 // Récupère la valeur
6845 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6846 $dossier_instruction_id = $this->getVal('dossier');
6847 } elseif ($this->getParameter('idxformulaire') !== null
6848 && $this->getParameter('idxformulaire') !== '') {
6849 //
6850 $dossier_instruction_id = $this->getParameter('idxformulaire');
6851 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6852 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6853 //
6854 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6855 }
6856 }
6857
6858 //
6859 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6860 "obj" => "dossier_instruction",
6861 "idx" => $dossier_instruction_id,
6862 ));
6863
6864 //
6865 return $dossier_instruction->getVal('om_collectivite');
6866 }
6867
6868 /**
6869 * VIEW - view_bible
6870 *
6871 * Affiche la bible manuelle.
6872 *
6873 * @return void
6874 */
6875 function view_bible() {
6876 // Vérification de l'accessibilité sur l'élément
6877 $this->checkAccessibility();
6878
6879 /**
6880 * Affichage de la structure HTML
6881 */
6882 //
6883 if ($this->f->isAjaxRequest()) {
6884 //
6885 header("Content-type: text/html; charset=".HTTPCHARSET."");
6886 } else {
6887 //
6888 $this->f->setFlag("htmlonly");
6889 $this->f->display();
6890 }
6891 //
6892 $this->f->displayStartContent();
6893 //
6894 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6895 $this->f->displayTitle();
6896
6897 /**
6898 *
6899 */
6900 //
6901 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6902 $evenement = intval($evenement);
6903 //
6904 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6905 // Récupération du code du type de DA
6906 $code_da_type = '';
6907 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6908 $code_da_type = $matches[0];
6909 }
6910 //
6911 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6912
6913 // Récupération de la collectivité du dossier
6914 $dossier = $this->f->get_inst__om_dbform(array(
6915 "obj" => "dossier",
6916 "idx" => $idx,
6917 ));
6918
6919 $qres = $this->f->get_all_results_from_db_query(
6920 sprintf(
6921 'SELECT
6922 *,
6923 bible.libelle as bible_lib
6924 FROM
6925 %1$sbible
6926 LEFT OUTER JOIN %1$sdossier_autorisation_type
6927 ON bible.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6928 LEFT JOIN %1$som_collectivite
6929 ON bible.om_collectivite = om_collectivite.om_collectivite
6930 WHERE
6931 (evenement = %2$d
6932 OR evenement IS NULL)
6933 AND (complement = %3$d
6934 OR complement IS NULL)
6935 AND (bible.dossier_autorisation_type IS NULL
6936 OR dossier_autorisation_type.code = \'%4$s\')
6937 AND (om_collectivite.niveau = \'2\'
6938 OR bible.om_collectivite = %5$d)
6939 ORDER BY
6940 bible_lib ASC',
6941 DB_PREFIXE,
6942 intval($evenement),
6943 intval($complement),
6944 $this->f->db->escapeSimple($code_da_type),
6945 intval($dossier->getVal("om_collectivite"))
6946 ),
6947 array(
6948 'origin' => __METHOD__
6949 )
6950 );
6951 //
6952 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6953 //
6954 if (count($qres['result']) > 0) {
6955 //
6956 echo "\t<table id='tab-bible' width='100%'>\n";
6957 //
6958 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6959 echo "<th>"._("Choisir")."</th>";
6960 echo "<th>"._("Libelle")."</th>";
6961 echo "</tr>\n";
6962 //
6963 $i = 0;
6964 //
6965 foreach ($qres['result'] as $row) {
6966 //
6967 echo "\t\t<tr";
6968 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6969 echo ">";
6970 //
6971 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6972 // XXX utilisation de l'attribut titre pour afficher une infobulle
6973 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6974 //
6975 echo "</tr>\n";
6976 //
6977 $i++;
6978 }
6979 echo "\t</table>\n";
6980 //
6981 echo "<div class=\"formControls\">\n";
6982 $this->f->layout->display_form_button(array(
6983 "value" => _("Valider"),
6984 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6985 ));
6986 $this->f->displayLinkJsCloseWindow();
6987 echo "</div>\n";
6988
6989 } else {
6990 //
6991 $message_class = "error";
6992 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6993 $this->f->displayMessage($message_class, $message);
6994 //
6995 echo "<div class=\"formControls\">\n";
6996 $this->f->displayLinkJsCloseWindow();
6997 echo "</div>\n";
6998 }
6999 //
7000 echo "</form>\n";
7001
7002 /**
7003 * Affichage de la structure HTML
7004 */
7005 //
7006 $this->f->displayEndContent();
7007 }
7008
7009 /**
7010 * VIEW - view_bible_auto
7011 *
7012 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
7013 *
7014 * @return void
7015 */
7016 function view_bible_auto() {
7017 // Vérification de l'accessibilité sur l'élément
7018 $this->checkAccessibility();
7019 //
7020 $this->f->disableLog();
7021
7022 $formatDate="AAAA-MM-JJ";
7023
7024 // Récupération des paramètres
7025 $idx = $this->f->get_submitted_get_value('idx');
7026 $evenement = $this->f->get_submitted_get_value('ev');
7027
7028 // Initialisation de la variable de retour
7029 $retour['complement_om_html'] = '';
7030 $retour['complement2_om_html'] = '';
7031 $retour['complement3_om_html'] = '';
7032 $retour['complement4_om_html'] = '';
7033
7034 // Vérification d'une consultation liée à l'événement
7035 $instEvenement = $this->f->get_inst__om_dbform(array(
7036 "obj" => "evenement",
7037 "idx" => $evenement,
7038 ));
7039
7040 // Si consultation liée, récupération du retour d'avis
7041 if($instEvenement->getVal('consultation') == 'Oui'){
7042
7043 $qres = $this->f->get_all_results_from_db_query(
7044 sprintf(
7045 'SELECT
7046 date_retour,
7047 avis_consultation.libelle as avis_consultation,
7048 COALESCE(service.libelle, tiers_consulte.libelle) as service
7049 FROM
7050 %1$sconsultation
7051 LEFT JOIN %1$stiers_consulte
7052 ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
7053 LEFT JOIN %1$sservice
7054 ON consultation.service = service.service
7055 LEFT JOIN %1$savis_consultation
7056 ON consultation.avis_consultation = avis_consultation.avis_consultation
7057 WHERE
7058 dossier = \'%2$s\'
7059 AND consultation.visible',
7060 DB_PREFIXE,
7061 $this->f->db->escapeSimple($idx)
7062 ),
7063 array(
7064 'origin' => __METHOD__
7065 )
7066 );
7067 // Récupération des consultations
7068 foreach ($qres['result'] as $row) {
7069 $correct=false;
7070 // date retour
7071 if ($row['date_retour']<>""){
7072 if ($formatDate=="AAAA-MM-JJ"){
7073 $date = explode("-", $row['date_retour']);
7074 // controle de date
7075 if (count($date) == 3 and
7076 checkdate($date[1], $date[2], $date[0])) {
7077 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
7078 $correct=true;
7079 }else{
7080 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
7081 $correct=false;
7082 }
7083 }
7084 }
7085 //
7086 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
7087 if($correct == true){
7088 $temp=$temp." du ".$date_retour_f;
7089 }
7090 // Concaténation des retours d'avis de consultation
7091 $retour['complement_om_html'] .= $temp . "<br/><br/>";
7092 } // while
7093
7094 } // consultation
7095 // Récupération des bibles automatiques pour le champ complement_om_html
7096 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
7097 // Récupération des bibles automatiques pour le champ complement2_om_html
7098 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
7099 // Récupération des bibles automatiques pour le champ complement3_om_html
7100 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
7101 // Récupération des bibles automatiques pour le champ complement4_om_html
7102 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
7103
7104
7105
7106 echo json_encode($retour);
7107 }
7108
7109 /**
7110 * VIEW - view_pdf_temp
7111 *
7112 * @return void
7113 */
7114 function view_pdf_temp() {
7115 $this->checkAccessibility();
7116 // Utilisation de $_POST pour ne pas que les textes soient altérés.
7117 $this->f->set_submitted_value();
7118 $merge_fields = array();
7119 //
7120 if (array_key_exists('c1', $_POST) === true) {
7121 $merge_fields['[complement_instruction]'] = $_POST['c1'];
7122 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
7123 }
7124 if (array_key_exists('c2', $_POST) === true) {
7125 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
7126 }
7127 if (array_key_exists('c3', $_POST) === true) {
7128 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
7129 }
7130 if (array_key_exists('c4', $_POST) === true) {
7131 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
7132 }
7133 $params = array(
7134 "watermark" => true,
7135 "specific" => array(
7136 "merge_fields" => $merge_fields,
7137 ),
7138 );
7139 //
7140 if (array_key_exists('corps', $_POST) === true) {
7141 $params["specific"]["corps"] = array(
7142 "mode" => "set",
7143 "value" => $_POST['corps'],
7144 );
7145 }
7146 if (array_key_exists('titre', $_POST) === true) {
7147 $params["specific"]["titre"] = array(
7148 "mode" => "set",
7149 "value" => $_POST['titre'],
7150 );
7151 }
7152 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7153 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7154 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7155 $retour = array(
7156 'base' => base64_encode($result['pdf_output']),
7157 );
7158 echo json_encode($retour);
7159 }
7160
7161 /**
7162 * Dans le contexte de prévisualisation des éditions, génère le rendu du
7163 * PDF sans prise en compte de la valeur des compléments et le retourne en
7164 * base 64.
7165 *
7166 * @return string Rendu PDF converti en base 64.
7167 */
7168 function init_pdf_temp() {
7169 $params = array(
7170 "watermark" => true,
7171 );
7172 // Si la rédaction libre est activée sur l'instruction
7173 if ($this->getVal("flag_edition_integrale") == 't') {
7174 $params["specific"]["corps"] = array(
7175 "mode" => "set",
7176 "value" => $this->getVal("corps_om_htmletatex"),
7177 );
7178 $params["specific"]["titre"] = array(
7179 "mode" => "set",
7180 "value" => $this->getVal("titre_om_htmletat"),
7181 );
7182 }
7183 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
7184 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
7185 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
7186
7187 return base64_encode($result['pdf_output']);
7188 }
7189
7190 /**
7191 * Récupération des éléments de bible.
7192 *
7193 * @param integer $event id de l'événement
7194 * @param string $idx id du dossier
7195 * @param integer $compnb numéro du champ complement
7196 *
7197 * @return string Chaîne de texte à insérer dans le champ complement
7198 */
7199 function getBible($event, $idx, $compnb) {
7200 // Récupération de la collectivité du dossier
7201 $dossier = $this->f->get_inst__om_dbform(array(
7202 "obj" => "dossier",
7203 "idx" => $idx,
7204 ));
7205 // Récupération du code du type de DA
7206 $code_da_type = '';
7207 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
7208 $code_da_type = $matches[0];
7209 }
7210
7211 $qres = $this->f->get_all_results_from_db_query(
7212 sprintf(
7213 'SELECT
7214 *
7215 FROM
7216 %1$sbible
7217 LEFT OUTER JOIN %1$sdossier_autorisation_type
7218 ON bible.dossier_autorisation_type =
7219 dossier_autorisation_type.dossier_autorisation_type
7220 LEFT JOIN %1$som_collectivite
7221 ON bible.om_collectivite = om_collectivite.om_collectivite
7222 WHERE
7223 (evenement = %2$d
7224 OR evenement IS NULL)
7225 AND (complement = %3$d
7226 OR complement IS NULL)
7227 AND automatique = \'Oui\'
7228 AND (dossier_autorisation_type.code = \'%4$s\'
7229 OR bible.dossier_autorisation_type IS NULL)
7230 AND (om_collectivite.niveau = \'2\'
7231 OR bible.om_collectivite = %5$d)',
7232 DB_PREFIXE,
7233 intval($event),
7234 intval($compnb),
7235 $this->f->db->escapeSimple($code_da_type),
7236 intval($dossier->getVal("om_collectivite"))
7237 ),
7238 array(
7239 "origin" => __METHOD__
7240 )
7241 );
7242 $temp = "";
7243 foreach ($qres['result'] as $row) {
7244 // Remplacement des retours à la ligne par des br
7245 $temp .= preg_replace(
7246 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
7247 );
7248 // Ajout d'un saut de ligne entre chaque bible.
7249 $temp .= '<br/>';
7250 } // fin while
7251 return $temp;
7252 }
7253
7254 /**
7255 * VIEW - view_suivi_bordereaux.
7256 *
7257 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
7258 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
7259 * collectivité des dossiers affichés.
7260 *
7261 * @return void
7262 */
7263 function view_suivi_bordereaux() {
7264 // Vérification de l'accessibilité sur l'élément
7265 $this->checkAccessibility();
7266
7267 /**
7268 * Validation du formulaire
7269 */
7270 // Si le formulaire a été validé
7271 if ($this->f->get_submitted_post_value("validation") !== null) {
7272 // Si un bordereau à été sélectionné
7273 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
7274 // Si aucun bordereau n'a été sélectionné
7275 $message_class = "error";
7276 $message = _("Veuillez selectionner un bordereau.");
7277 }
7278 // Sinon si les dates ne sont pas valide
7279 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
7280 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
7281 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
7282 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
7283 // Si aucune date n'a été saisie
7284 $message_class = "error";
7285 $message = _("Veuillez saisir une date valide.");
7286 }
7287 // Sinon si les dates ne sont pas valides
7288 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
7289 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
7290 // Si aucune date n'a été saisie
7291 $message_class = "error";
7292 $message = _("Erreur de parametrage. Contactez votre administrateur.");
7293 }
7294 // Affiche le message de validation
7295 else {
7296 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
7297 $etat = $this->f->get_inst__om_dbform(array(
7298 "obj" => "om_etat",
7299 "idx" => $this->f->get_submitted_post_value("bordereau")
7300 ));
7301 $qres = $this->f->get_one_result_from_db_query(
7302 sprintf(
7303 'SELECT
7304 om_etat.libelle
7305 FROM
7306 %som_etat
7307 WHERE
7308 om_etat.id = \'%s\'',
7309 DB_PREFIXE,
7310 $this->f->db->escapeSimple($this->f->get_submitted_post_value("bordereau"))
7311 ),
7312 array(
7313 "origin" => __METHOD__,
7314 )
7315 );
7316
7317 //
7318 $message_class = "valid";
7319 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
7320 $message .= " : <br/><br/>";
7321 $message .= "<a class='om-prev-icon pdf-16'";
7322 $message .= " title=\""._("Bordereau")."\"";
7323 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
7324 $message .= "&action=220";
7325 $message .= "&idx=0";
7326 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
7327 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
7328 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
7329 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
7330 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
7331 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
7332 }
7333 $message .= "'"." target='_blank'>";
7334 $message .= $qres['result']." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
7335 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
7336 $message .= "</a>";
7337 }
7338 }
7339
7340 /**
7341 * Affichage des messages et du formulaire
7342 */
7343 // Affichage du message de validation ou d'erreur
7344 if (isset($message) && isset($message_class) && $message != "") {
7345 $this->f->displayMessage($message_class, $message);
7346 }
7347 // Ouverture du formulaire
7348 printf("\t<form");
7349 printf(" method=\"post\"");
7350 printf(" id=\"suivi_bordereaux_form\"");
7351 printf(" action=\"\"");
7352 printf(">\n");
7353 // Paramétrage des champs du formulaire
7354 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
7355 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
7356 // collectivité dans le formulaire
7357 if ($_SESSION["niveau"] == 2) {
7358 array_push($champs, "om_collectivite");
7359 }
7360 // Création d'un nouvel objet de type formulaire
7361 $form = $this->f->get_inst__om_formulaire(array(
7362 "validation" => 0,
7363 "maj" => 0,
7364 "champs" => $champs,
7365 ));
7366 // Paramétrage du champ date_bordereau_debut
7367 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
7368 $form->setType("date_bordereau_debut", "date");
7369 $form->setTaille("date_bordereau_debut", 12);
7370 $form->setMax("date_bordereau_debut", 12);
7371 $form->setRequired("date_bordereau_debut");
7372 $form->setOnchange("date_bordereau_debut", "fdate(this)");
7373 $form->setVal("date_bordereau_debut", date("d/m/Y"));
7374 // Paramétrage du champ date_bordereau_fin
7375 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
7376 $form->setType("date_bordereau_fin", "date");
7377 $form->setTaille("date_bordereau_fin", 12);
7378 $form->setMax("date_bordereau_fin", 12);
7379 $form->setRequired("date_bordereau_fin");
7380 $form->setOnchange("date_bordereau_fin", "fdate(this)");
7381 $form->setVal("date_bordereau_fin", date("d/m/Y"));
7382 // Paramétrage du champ bordereau
7383 $form->setLib("bordereau", _("bordereau"));
7384 $form->setType("bordereau", "select");
7385 $form->setRequired("bordereau");
7386 // Valeurs des champs
7387 if ($this->f->get_submitted_post_value("validation") !== null) {
7388 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
7389 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
7390 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
7391 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
7392 }
7393 // Données du select - On récupère ici la liste de tous les états disponibles
7394 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
7395 // 'bordereau_'
7396 $qres = $this->f->get_all_results_from_db_query(
7397 sprintf(
7398 'SELECT
7399 om_etat.id,
7400 om_etat.libelle
7401 FROM
7402 %1$som_etat
7403 WHERE
7404 om_etat.id LIKE \'bordereau_%%\'
7405 ORDER BY
7406 om_etat.id',
7407 DB_PREFIXE
7408 ),
7409 array(
7410 "origin" => __METHOD__
7411 )
7412 );
7413 // Données du select
7414 $contenu = array(
7415 0 => array("", ),
7416 1 => array(_("choisir bordereau")),
7417 );
7418 foreach ($qres['result'] as $row) {
7419 $contenu[0][] = $row['id'];
7420 $contenu[1][] = $row['libelle'];
7421 }
7422 $form->setSelect("bordereau", $contenu);
7423 //
7424 if ($_SESSION["niveau"] == 2) {
7425 $form->setLib("om_collectivite", _("collectivite"));
7426 $form->setType("om_collectivite", "select");
7427
7428 // Données du select - On récupère ici la liste de tous toutes les collectivités
7429 // de niveau 1
7430 $qres = $this->f->get_all_results_from_db_query(
7431 sprintf(
7432 'SELECT
7433 om_collectivite,
7434 libelle
7435 FROM
7436 %1$som_collectivite
7437 WHERE
7438 niveau = \'1\'
7439 ORDER BY
7440 libelle',
7441 DB_PREFIXE
7442 ),
7443 array(
7444 "origin" => __METHOD__
7445 )
7446 );
7447 // La valeur par défaut du select est Toutes
7448 $list_collectivites = array(
7449 0 => array("", ),
7450 1 => array(_("toutes"))
7451 );
7452
7453 $id_colls = "";
7454 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
7455 // par des virgules, pour un traitement plus facile dans la requête de sous-état
7456 foreach ($qres['result'] as $row) {
7457 if ($id_colls != "") {
7458 $id_colls .= ",";
7459 }
7460 $id_colls .= $row['om_collectivite'];
7461 $list_collectivites[0][] = $row['om_collectivite'];
7462 $list_collectivites[1][] = $row['libelle'];
7463 }
7464 // On affecte la liste d'identifiants à l'option Toutes
7465 $list_collectivites[0][0] = $id_colls ;
7466 $form->setSelect("om_collectivite", $list_collectivites);
7467 }
7468 // Affichage du formulaire
7469 $form->entete();
7470 $form->afficher($champs, 0, false, false);
7471 $form->enpied();
7472 // Affichage du bouton
7473 printf("\t<div class=\"formControls\">\n");
7474 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7475 printf("\t</div>\n");
7476 // Fermeture du formulaire
7477 printf("\t</form>\n");
7478 }
7479
7480
7481 /**
7482 * VIEW - view_generate_suivi_bordereaux.
7483 *
7484 * Génère et affiche les bordereaux de suivi.
7485 *
7486 * @return [void]
7487 */
7488 function view_generate_suivi_bordereaux() {
7489 // Vérification de l'accessibilité sur l'élément
7490 $this->checkAccessibility();
7491 // Récupération du type de bordereau
7492 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
7493 // Génération du PDF
7494 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
7495 // Affichage du PDF
7496 $this->expose_pdf_output(
7497 $result['pdf_output'],
7498 $result['filename']
7499 );
7500 }
7501
7502
7503 /**
7504 * VIEW - view_suivi_envoi_lettre_rar.
7505 *
7506 * Vue pour imprimer les AR.
7507 *
7508 * @return void
7509 */
7510 function view_suivi_envoi_lettre_rar() {
7511 // Vérification de l'accessibilité sur l'élément
7512 $this->checkAccessibility();
7513
7514 //
7515 if ($this->f->get_submitted_post_value("date") !== null) {
7516 $date = $this->f->get_submitted_post_value("date");
7517 } else {
7518 $date = "";
7519 }
7520 //
7521 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
7522 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
7523 } else {
7524 $liste_code_barres_instruction = "";
7525 }
7526
7527 // Compteur du nombre de page générées
7528 $nbLettres = 0;
7529 // Liste d'id des instructions
7530 $id4Gen = array();
7531 //
7532 $error = "";
7533
7534 // Initialisation du tableau qui va contenir les DI pour lister les liens
7535 $dossierTab = array();
7536 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
7537 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
7538 $hasHidden = true;
7539 // S'il ne peut pas les consulter il aura des dossiers caché
7540 if ($isAccredited === true) {
7541 $hasHidden = false;
7542 }
7543
7544 /**
7545 * Validation du formulaire
7546 */
7547 // Si le formulaire a été validé
7548 if ($this->f->get_submitted_post_value('validation') !== null) {
7549 //
7550 if (empty($date) || empty($liste_code_barres_instruction)) {
7551 //
7552 $message_class = "error";
7553 $message = _("Tous les champs doivent etre remplis.");
7554 } else {
7555 // Création d'un tableau d'instruction
7556 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
7557 //
7558 foreach ($liste as $code_barres) {
7559 // On enlève les éventuels espaces saisis
7560 $code_barres = trim($code_barres);
7561 // Vérification de l'existence de l'instruction
7562 if ($code_barres != "") {
7563 // Si la valeur transmise est numérique
7564 if (is_numeric($code_barres)) {
7565 //
7566 $sql = "SELECT count(*)
7567 FROM ".DB_PREFIXE."instruction
7568 INNER JOIN ".DB_PREFIXE."dossier
7569 ON dossier.dossier=instruction.dossier
7570 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7571 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7572 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7573 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7574 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7575 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7576 INNER JOIN ".DB_PREFIXE."groupe
7577 ON dossier_autorisation_type.groupe = groupe.groupe
7578 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7579
7580 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7581 $group_clause = array();
7582 foreach ($_SESSION["groupe"] as $key => $value) {
7583 $group_clause[$key] = "(groupe.code = '".$key."'";
7584 if($value["confidentiel"] !== true) {
7585 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7586 }
7587 $group_clause[$key] .= ")";
7588 }
7589 $conditions = implode(" OR ", $group_clause);
7590 $sql .= " AND (" . $conditions . ")";
7591
7592 $qres = $this->f->get_one_result_from_db_query(
7593 $sql,
7594 array(
7595 "origin" => __METHOD__,
7596 )
7597 );
7598
7599 if ($qres['result'] == "1") {
7600 // Récupération de la date d'envoi de l'instruction bippé
7601 $qres = $this->f->get_all_results_from_db_query(
7602 sprintf(
7603 'SELECT
7604 to_char(date_envoi_rar, \'DD/MM/YYYY\') as date_envoi_rar,
7605 instruction
7606 FROM
7607 %1$sinstruction
7608 WHERE
7609 code_barres = \'%2$s\'',
7610 DB_PREFIXE,
7611 $this->f->db->escapeSimple($code_barres)
7612 ),
7613 array(
7614 'origin' => __METHOD__
7615 )
7616 );
7617 $row = array_shift($qres['result']);
7618 // Si pas de date ou correspond à la date du formulaire on
7619 // effectue le traitement
7620 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
7621 $instr = $this->f->get_inst__om_dbform(array(
7622 "obj" => "instruction",
7623 "idx" => $row['instruction'],
7624 ));
7625 $valF = array();
7626 foreach($instr->champs as $id => $champ) {
7627 $valF[$champ] = $instr->val[$id];
7628 }
7629
7630 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
7631 if ($isAccredited === true
7632 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
7633 $dossier = $this->f->get_inst__om_dbform(array(
7634 "obj" => "dossier",
7635 "idx" => $instr->getVal("dossier"),
7636 ));
7637 if ($dossier->is_user_from_allowed_collectivite()){
7638 $dossierTab[$instr->getVal("dossier")] = $dossier;
7639 } else {
7640 $hasHidden = true;
7641 }
7642 }
7643
7644 $valF['date_evenement']=
7645 $instr->dateDBToForm($valF['date_evenement']);
7646 $valF['archive_date_complet']=
7647 $instr->dateDBToForm($valF['archive_date_complet']);
7648 $valF['archive_date_rejet']=
7649 $instr->dateDBToForm($valF['archive_date_rejet']);
7650 $valF['archive_date_limite']=
7651 $instr->dateDBToForm($valF['archive_date_limite']);
7652 $valF['archive_date_notification_delai']=
7653 $instr->dateDBToForm($valF['archive_date_notification_delai']);
7654 $valF['archive_date_decision']=
7655 $instr->dateDBToForm($valF['archive_date_decision']);
7656 $valF['archive_date_validite']=
7657 $instr->dateDBToForm($valF['archive_date_validite']);
7658 $valF['archive_date_achevement']=
7659 $instr->dateDBToForm($valF['archive_date_achevement']);
7660 $valF['archive_date_chantier']=
7661 $instr->dateDBToForm($valF['archive_date_chantier']);
7662 $valF['archive_date_conformite']=
7663 $instr->dateDBToForm($valF['archive_date_conformite']);
7664 $valF['archive_date_dernier_depot']=
7665 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7666 $valF['archive_date_limite_incompletude']=
7667 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7668 $valF['date_finalisation_courrier']=
7669 $instr->dateDBToForm($valF['date_finalisation_courrier']);
7670 $valF['date_envoi_signature']=
7671 $instr->dateDBToForm($valF['date_envoi_signature']);
7672 $valF['date_retour_signature']=
7673 $instr->dateDBToForm($valF['date_retour_signature']);
7674 $valF['date_envoi_rar']=
7675 $instr->dateDBToForm($valF['date_envoi_rar']);
7676 $valF['date_retour_rar']=
7677 $instr->dateDBToForm($valF['date_retour_rar']);
7678 $valF['date_envoi_controle_legalite']=
7679 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7680 $valF['date_retour_controle_legalite']=
7681 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7682 $valF['date_envoi_rar'] = $date;
7683
7684 // Vérification de la finalisation du document
7685 // correspondant au code barres
7686 if($instr->getVal("om_final_instruction") === 't') {
7687 $instr->setParameter('maj', 1);
7688 $instr->class_actions[1]["identifier"] =
7689 "envoi lettre RAR (depuis le menu suivi des pièces)";
7690 if ($instr->modifier($valF) == true) {
7691 $id4Gen[] = $code_barres;
7692 $nbLettres ++;
7693 } else {
7694 //
7695 if ($error != "") {
7696 $error .= "<br/>";
7697 }
7698 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7699 $code_barres);
7700 $error .= " ";
7701 $error .= _("Veuillez contacter votre administrateur.");
7702 }
7703 } else {
7704 //
7705 if ($error != "") {
7706 $error .= "<br/>";
7707 }
7708 $error .= sprintf(_("Le document correspondant au
7709 code barres %s n'est pas finalise,
7710 le bordereau ne sera pas genere."),
7711 $code_barres);
7712 }
7713
7714 } else {
7715 //
7716 if ($error != "") {
7717 $error .= "<br/>";
7718 }
7719 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7720 }
7721 } else {
7722 //
7723 if ($error != "") {
7724 $error .= "<br/>";
7725 }
7726 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7727 }
7728 } else {
7729 //
7730 if ($error != "") {
7731 $error .= "<br/>";
7732 }
7733 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7734 }
7735 }
7736 }
7737 }
7738 }
7739
7740 /**
7741 * Affichage des messages et du formulaire
7742 */
7743 // Affichage du message de validation ou d'erreur
7744 if (isset($message) && isset($message_class) && $message != "") {
7745 $this->f->displayMessage($message_class, $message);
7746 }
7747 // Affichage du message d'erreur
7748 if(!empty($error)) {
7749 $this->f->displayMessage("error", $error);
7750 }
7751 // Affichage du message de validation de la saisie
7752 if ($nbLettres > 0) {
7753 //
7754 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7755 echo "\n<p>";
7756 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7757 echo "\n<span class=\"text\">";
7758 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7759 echo " : \n<br/><br/>";
7760 echo "\n<a class='om-prev-icon pdf-16'";
7761 echo "\n title=\""._("imprimer les AR")."\"";
7762 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7763 echo "\n target='_blank'>";
7764 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7765 echo "\n</a>";
7766 echo "\n</span>";
7767 echo "\n</p>";
7768 echo "\n<br/>\n";
7769 if ($isAccredited === true) {
7770 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7771 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7772 echo _('Dossiers concernés par ce traitement');
7773 echo "\n</legend>";
7774 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7775
7776 if ($hasHidden === true) {
7777 echo "\n<br/>";
7778 echo "\n<p>";
7779 echo "\n<span class='text'>";
7780 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.");
7781 echo "</span>";
7782 echo "\n</p>";
7783 echo "\n<br/>";
7784 }
7785 foreach ($dossierTab as $dossier) {
7786
7787 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7788 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7789 $code_datd = $inst_datd->getVal('code');
7790
7791 $obj = "dossier_instruction";
7792 if ($code_datd === 'REC' OR $code_datd === 'REG') {
7793 $obj = "dossier_contentieux_tous_recours";
7794 }
7795 if ($code_datd === 'IN') {
7796 $obj = "dossier_contentieux_toutes_infractions";
7797 }
7798
7799 echo "\n<div class=\"bloc group\">";
7800 echo "\n<div class=\"field field-type-text\">";
7801
7802 echo "\n<p>";
7803 echo "\n<span class='text'>";
7804 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7805 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7806 echo $dossier->getVal("dossier");
7807 echo "\">";
7808 echo "\n</a>";
7809
7810 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7811 echo " href=\"".OM_ROUTE_FORM."&obj=";
7812 echo $obj;
7813 echo "&action=3&idx=";
7814 echo $dossier->getVal("dossier");
7815 echo "\">";
7816 echo $dossier->getVal("dossier_libelle");
7817 echo "\n</a>";
7818 echo "\n</span>";
7819 echo "\n</p>";
7820
7821 echo "\n</div>";
7822 echo "\n</div>";
7823 }
7824 echo "\n</div>";
7825 echo "\n</fieldset>";
7826 }
7827 echo "\n</div>";
7828 echo "\n</div>";
7829 }
7830 // Ouverture du formulaire
7831 echo "\t<form";
7832 echo " method=\"post\"";
7833 echo " id=\"suivi_envoi_lettre_rar_form\"";
7834 echo " action=\"\"";
7835 echo ">\n";
7836 // Paramétrage des champs du formulaire
7837 $champs = array("date", "liste_code_barres_instruction");
7838 // Création d'un nouvel objet de type formulaire
7839 $form = $this->f->get_inst__om_formulaire(array(
7840 "validation" => 0,
7841 "maj" => 0,
7842 "champs" => $champs,
7843 ));
7844 // Paramétrage du champ date du formulaire
7845 $form->setLib("date", _("Date")."* :");
7846 $form->setType("date", "date");
7847 $form->setOnchange("date", "fdate(this)");
7848 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7849 $form->setTaille("date", 10);
7850 $form->setMax("date", 10);
7851 // Paramétrage du champ liste_code_barres_instruction du formulaire
7852 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7853 $form->setType("liste_code_barres_instruction", "textarea");
7854 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7855 $form->setTaille("liste_code_barres_instruction", 20);
7856 $form->setMax("liste_code_barres_instruction", 20);
7857 // Affichage du formulaire
7858 $form->entete();
7859 $form->afficher($champs, 0, false, false);
7860 $form->enpied();
7861 // Affichage du bouton
7862 echo "\t<div class=\"formControls\">\n";
7863 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7864 echo "\t</div>\n";
7865 // Fermeture du formulaire
7866 echo "\t</form>\n";
7867 }
7868
7869 /**
7870 * VIEW - view_suivi_mise_a_jour_des_dates.
7871 *
7872 * Vu pour mettre à jour les dates de suivi de l'instruction.
7873 *
7874 * @return void
7875 */
7876 function view_suivi_mise_a_jour_des_dates() {
7877 // Vérification de l'accessibilité sur l'élément
7878 $this->checkAccessibility();
7879
7880 // Récupération des valeur passées en POST ou GET
7881 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7882 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7883 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7884 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7885 } else {
7886 $type_mise_a_jour = "";
7887 }
7888 if($this->f->get_submitted_post_value('date') !== null) {
7889 $date = $this->f->get_submitted_post_value('date');
7890 } elseif($this->f->get_submitted_get_value('date') !== null) {
7891 $date = $this->f->get_submitted_get_value('date');
7892 } else {
7893 $date = "";
7894 }
7895 if($this->f->get_submitted_post_value('code_barres') !== null) {
7896 $code_barres = $this->f->get_submitted_post_value('code_barres');
7897 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7898 $code_barres = $this->f->get_submitted_get_value('code_barres');
7899 } else {
7900 $code_barres = "";
7901 }
7902 // Booléen permettant de définir si un enregistrement à eu lieu
7903 $correct = false;
7904 // Booléen permettant de définir si les dates peuvent êtres enregistrées
7905 $date_error = false;
7906 // Champs date à mettre à jour
7907 $liste_champs=array();
7908
7909 // Si le formulaire a été validé
7910 if ($this->f->get_submitted_post_value('validation') !== null) {
7911 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7912
7913 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7914 $group_clause = array();
7915 foreach ($_SESSION["groupe"] as $key => $value) {
7916 $group_clause[$key] = "(groupe.code = '".$key."'";
7917 if($value["confidentiel"] !== true) {
7918 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7919 }
7920 $group_clause[$key] .= ")";
7921 }
7922 $conditions = implode(" OR ", $group_clause);
7923 $groupFilter = " AND (" . $conditions . ")";
7924
7925 $qres = $this->f->get_all_results_from_db_query(
7926 sprintf(
7927 'SELECT
7928 instruction
7929 FROM
7930 %1$sinstruction
7931 INNER JOIN %1$sdossier
7932 ON dossier.dossier = instruction.dossier
7933 INNER JOIN %1$sdossier_instruction_type
7934 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7935 INNER JOIN %1$sdossier_autorisation_type_detaille
7936 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7937 INNER JOIN %1$sdossier_autorisation_type
7938 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7939 INNER JOIN %1$sgroupe
7940 ON dossier_autorisation_type.groupe = groupe.groupe
7941 WHERE
7942 code_barres = \'%2$s\'
7943 %3$s',
7944 DB_PREFIXE,
7945 $this->f->db->escapeSimple($code_barres),
7946 $groupFilter
7947 ),
7948 array(
7949 'origin' => __METHOD__
7950 )
7951 );
7952 if(count($qres['result']) === 1) {
7953 $liste_champs = explode(";", $type_mise_a_jour);
7954 $row = array_shift($qres['result']);
7955 $instr = $this->f->get_inst__om_dbform(array(
7956 "obj" => "instruction",
7957 "idx" => $row['instruction'],
7958 ));
7959 // Mise à jour des dates après l'écran de verification
7960 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7961 $valF = array();
7962 foreach($instr->champs as $id => $champ) {
7963 $valF[$champ] = $instr->val[$id];
7964 }
7965 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7966 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7967 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7968 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7969 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7970 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7971 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7972 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7973 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7974 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7975 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7976 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7977 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7978 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7979 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7980 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7981 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7982 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7983 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7984 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7985 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7986 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7987 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7988 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7989 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7990 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7991
7992 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7993 $valF[$maj_date]=$date;
7994 }
7995
7996 // Vérification de la finalisation du document
7997 // correspondant au code barres
7998 if($valF["om_final_instruction"] === 't' or
7999 $valF["lettretype"] == '') {
8000 $code_barres = "";
8001
8002 //Désactivation de l'autocommit
8003 $this->f->db->autoCommit(false);
8004
8005 //On modifie les valeurs de l'instruction
8006 $instr->setParameter('maj', 170);
8007 $instr->class_actions[170]["identifier"] =
8008 "mise à jour des dates (depuis le menu suivi des pièces)";
8009 $retour = $instr->modifier($valF);
8010
8011 //Si une erreur s'est produite, on défait les modifications
8012 //qui ont été faites
8013 if (!$retour){
8014 $instr->undoValidation();
8015 }
8016 //Sinon, on valide en base de données les modifications
8017 else {
8018 $this->f->db->commit();
8019 }
8020
8021 // Variable correct retourné depuis la classe instruction
8022 $correct = $instr->correct;
8023
8024 // Si la modification sur l'instruction a échoué
8025 if ($correct === false) {
8026
8027 // Message d'erreur de la classe instruction
8028 $error = $instr->msg;
8029 }
8030
8031 } else {
8032 // Indique que le traitement est en erreur
8033 $correct = false;
8034 // Message d'erreur
8035 $error = sprintf(_("Le document n'est pas finalise."),
8036 "<span class='bold'>".$code_barres."</span>");
8037 }
8038 } else {
8039 // Récupération des infos du dossier
8040 $qres = $this->f->get_all_results_from_db_query(
8041 sprintf(
8042 'SELECT
8043 dossier.dossier_libelle,
8044 evenement.libelle as evenement,
8045 autorite_competente.code as autorite_competente_code,
8046 autorite_competente.libelle as autorite_competente,
8047 evenement.type as evenement_type,
8048 to_char(date_envoi_signature,\'DD/MM/YYYY\') as date_envoi_signature,
8049 to_char(date_retour_signature,\'DD/MM/YYYY\') as date_retour_signature,
8050 to_char(date_envoi_controle_legalite,\'DD/MM/YYYY\') as date_envoi_controle_legalite,
8051 to_char(date_retour_controle_legalite,\'DD/MM/YYYY\') as date_retour_controle_legalite,
8052 to_char(date_envoi_rar,\'DD/MM/YYYY\') as date_envoi_rar,
8053 to_char(date_retour_rar,\'DD/MM/YYYY\') as date_retour_rar
8054 FROM
8055 %1$sinstruction
8056 INNER JOIN %1$sdossier
8057 ON dossier.dossier=instruction.dossier
8058 LEFT JOIN %1$sautorite_competente
8059 ON dossier.autorite_competente=autorite_competente.autorite_competente
8060 INNER JOIN %1$sevenement
8061 ON instruction.evenement=evenement.evenement
8062 WHERE
8063 code_barres = \'%2$s\'',
8064 DB_PREFIXE,
8065 $this->f->db->escapeSimple($code_barres)
8066 ),
8067 array(
8068 "origin" => __METHOD__
8069 )
8070 );
8071 $infos = array_shift($qres['result']);
8072
8073 // Vérification de la non modification des dates de suivi
8074 foreach(explode(";", $type_mise_a_jour) as $champ) {
8075 if ($champ === 'date_envoi_controle_legalite') {
8076 if ($instr->is_sent_to_cl() === true) {
8077 $error = __("Les dates de suivis ne peuvent etre modifiees");
8078 $date_error = true;
8079 break;
8080 }
8081 }
8082 if($infos[$champ] != "" AND $infos[$champ] != $date) {
8083 $error = _("Les dates de suivis ne peuvent etre modifiees");
8084 $date_error = true;
8085 break;
8086 }
8087 }
8088 }
8089 } else {
8090 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
8091 }
8092
8093 } else {
8094 $error = _("Tous les champs doivent etre remplis.");
8095 }
8096 }
8097
8098 /**
8099 * Affichage des messages et du formulaire
8100 */
8101 // Affichage du message de validation ou d'erreur
8102 if (isset($message) && isset($message_class) && $message != "") {
8103 $this->f->displayMessage($message_class, $message);
8104 }
8105 // Affichage du message d'erreur
8106 if(!empty($error)) {
8107 $this->f->displayMessage("error", $error);
8108 }
8109
8110 // Affichage du message de validation de la saisie
8111 if($correct === true) {
8112 $this->f->displayMessage("ok", _("Saisie enregistree"));
8113 }
8114 // Ouverture du formulaire
8115 echo "\t<form";
8116 echo " method=\"post\"";
8117 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
8118 echo " action=\"\"";
8119 echo ">\n";
8120 // Paramétrage des champs du formulaire
8121 if(isset($infos)) {
8122 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
8123 , "autorite_competente", "date_envoi_signature",
8124 "date_retour_signature", "date_envoi_controle_legalite",
8125 "date_retour_controle_legalite", "date_envoi_rar",
8126 "date_retour_rar", "is_valid");
8127 } else {
8128 $champs = array("type_mise_a_jour", "date", "code_barres");
8129 }
8130 // Création d'un nouvel objet de type formulaire
8131 $form = $this->f->get_inst__om_formulaire(array(
8132 "validation" => 0,
8133 "maj" => 0,
8134 "champs" => $champs,
8135 ));
8136 // Paramétrage des champs du formulaire
8137 // Parametrage du champ type_mise_a_jour
8138 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
8139 if(isset($infos)) {
8140 $form->setType("type_mise_a_jour", "selecthiddenstatic");
8141
8142 } else {
8143 $form->setType("type_mise_a_jour", "select");
8144
8145 }
8146 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
8147 $contenu = array();
8148
8149 $contenu[0][0] = "date_envoi_signature";
8150 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
8151
8152 $contenu[0][1] = "date_retour_signature";
8153 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
8154
8155 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
8156 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
8157
8158 $contenu[0][3] = "date_envoi_controle_legalite";
8159 $contenu[1][3] = _("date d'envoi au controle de legalite");
8160
8161 $contenu[0][4] = "date_retour_controle_legalite";
8162 $contenu[1][4] = _("date de retour de controle de legalite");
8163
8164 $contenu[0][5] = "date_retour_rar";
8165 $contenu[1][5] = __("date de notification du correspondant");
8166
8167 $form->setSelect("type_mise_a_jour", $contenu);
8168
8169 // Parametrage du champ date
8170 $form->setLib("date", _("Date")."* :");
8171 if(isset($infos)) {
8172 $form->setType("date", "hiddenstaticdate");
8173
8174 } else {
8175 $form->setType("date", "date");
8176 }
8177 $form->setVal("date", $date);
8178 $form->setTaille("date", 10);
8179 $form->setMax("date", 10);
8180
8181 // Parametrage du champ code_barres
8182 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
8183 if(isset($infos)) {
8184 $form->setType("code_barres", "hiddenstatic");
8185 } else {
8186 $form->setType("code_barres", "text");
8187 }
8188 $form->setVal("code_barres", $code_barres);
8189 $form->setTaille("code_barres", 20);
8190 $form->setMax("code_barres", 20);
8191
8192 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
8193 if(isset($infos)) {
8194
8195 // Tous les champs sont défini par defaut à static
8196 foreach ($infos as $key => $value) {
8197 $form->setType($key, "static");
8198 if(in_array($key, $liste_champs)) {
8199 $form->setVal($key, $date);
8200 } else {
8201 $form->setVal($key, $value);
8202 }
8203 }
8204
8205 // Les champs dont on viens de définir la valeur sont en gras
8206 foreach ($liste_champs as $value) {
8207 $form->setBloc($value,'DF',"",'bold');
8208 }
8209
8210 // Parametrage du champ dossier
8211 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
8212 $form->setType("dossier_libelle", "static");
8213 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
8214
8215 // Parametrage du champ evenement
8216 $form->setLib("evenement", _("evenement")." :");
8217 $form->setType("evenement", "static");
8218 $form->setVal("evenement", $infos['evenement']);
8219
8220 // Parametrage du champ autorite_competente
8221 $form->setLib("autorite_competente", _("Autorite competente")." :");
8222 $form->setType("autorite_competente", "static");
8223 $form->setVal("autorite_competente", $infos['autorite_competente']);
8224
8225 // Parametrage des libellés d'envoi avec AR
8226 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
8227 $form->setLib("date_retour_rar", __("date_notification")." :");
8228
8229 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
8230 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
8231 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
8232 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
8233 // Configuration des libellé en fonction de l'autorité compétente
8234 if($infos['autorite_competente_code'] == 'ETAT') {
8235 $form->setType("date_envoi_controle_legalite", "hiddendate");
8236 $form->setType("date_retour_controle_legalite", "hiddendate");
8237 }
8238
8239 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
8240 $form->setLib("is_valid", _("Valide")." :");
8241 $form->setType("is_valid", "hidden");
8242 $form->setVal("is_valid", 'true');
8243
8244 $form->setFieldset('dossier_libelle','D',_('Synthese'));
8245 $form->setFieldset('is_valid','F');
8246
8247 }
8248
8249
8250 // Création du fieldset regroupant les champs permettant la mise à jour des date
8251 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
8252 $form->setFieldset('code_barres','F');
8253 // Affichage du formulaire
8254 $form->entete();
8255 $form->afficher($champs, 0, false, false);
8256 $form->enpied();
8257 // Affichage du bouton
8258 echo "\t<div class=\"formControls\">\n";
8259 //
8260 if(!$date_error) {
8261 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8262 }
8263 // Si pas sur l'écran de validation
8264 if(isset($infos)) {
8265 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
8266 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
8267 echo "\">Retour</a>";
8268 }
8269 echo "\t</div>\n";
8270 // Fermeture du formulaire
8271 echo "\t</form>\n";
8272 }
8273
8274 /**
8275 * [view_pdf_lettre_rar description]
8276 *
8277 * @return [type] [description]
8278 */
8279 function view_pdf_lettre_rar() {
8280 // Vérification de l'accessibilité sur l'élément
8281 $this->checkAccessibility();
8282 //
8283 $this->f->disableLog();
8284
8285 if($this->f->get_submitted_get_value('liste') != null) {
8286 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
8287
8288 // Classe permettant la mise en page de l'édition pdf
8289 require_once "../obj/pdf_lettre_rar.class.php";
8290 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
8291 // Initialisation de la mise en page
8292 $pdf_lettre_rar->init($this->f);
8293
8294 foreach ($listeCodeBarres as $code_barres) {
8295
8296 // On récupère le dossier
8297 $qres = $this->f->get_one_result_from_db_query(
8298 sprintf(
8299 'SELECT
8300 dossier
8301 FROM
8302 %1$sinstruction
8303 WHERE
8304 code_barres = \'%2$s\'',
8305 DB_PREFIXE,
8306 $this->f->db->escapeSimple($code_barres)
8307 ),
8308 array(
8309 "origin" => __METHOD__,
8310 )
8311 );
8312
8313 $inst_dossier = $this->f->get_inst__om_dbform(array(
8314 "obj" => "dossier",
8315 "idx" => $qres['result'],
8316 ));
8317
8318 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
8319 $groupe = $inst_dossier->get_type_affichage_formulaire();
8320 switch ($groupe) {
8321 case 'CTX IN':
8322 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
8323 break;
8324 case 'CTX RE':
8325 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
8326 break;
8327 case 'ADS':
8328 case 'DPC':
8329 case 'CONSULTATION ENTRANTE':
8330 default:
8331 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
8332 break;
8333 }
8334
8335 // Test si l'evenement est de type arrete et si un délégataire a été nommé
8336 $qres = $this->f->get_all_results_from_db_query(
8337 sprintf(
8338 'SELECT
8339 dossier.dossier_libelle,
8340 evenement.type,
8341 count(lien_dossier_demandeur) as nbdemandeur,
8342 CASE
8343 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
8344 THEN CONCAT(phase.code, \' - \', division.libelle)
8345 ELSE
8346 phase.code
8347 END AS code_phase
8348 FROM
8349 %1$sinstruction
8350 LEFT JOIN %1$sdossier
8351 ON instruction.dossier = dossier.dossier
8352 LEFT JOIN %1$sdivision
8353 ON dossier.division = division.division
8354 INNER JOIN %1$sevenement
8355 ON instruction.evenement=evenement.evenement
8356 LEFT JOIN %1$sphase
8357 ON evenement.phase = phase.phase
8358 inner JOIN %1$slien_dossier_demandeur
8359 ON instruction.dossier=lien_dossier_demandeur.dossier
8360 inner join %1$sdemandeur
8361 ON demandeur.demandeur=lien_dossier_demandeur.demandeur
8362 WHERE
8363 code_barres = \'%2$s\'
8364 AND %3$s
8365 GROUP BY
8366 dossier.dossier_libelle,
8367 evenement.type,
8368 phase.code,
8369 division.libelle',
8370 DB_PREFIXE,
8371 $this->f->db->escapeSimple($code_barres),
8372 $sql_demandeur
8373 ),
8374 array(
8375 "origin" => __METHOD__
8376 )
8377 );
8378 $testDemandeur = array_shift($qres['result']);
8379
8380
8381 // Recuperation de l'adresse de destination
8382 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
8383 $sqlAdresse = " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
8384 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
8385 $sqlAdresse = " AND demandeur.type_demandeur='delegataire'";
8386 }
8387
8388 $qres = $this->f->get_all_results_from_db_query(
8389 sprintf(
8390 'SELECT
8391 CASE WHEN demandeur.qualite = \'particulier\'
8392 THEN TRIM(CONCAT_WS(\' \', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
8393 ELSE TRIM(demandeur.personne_morale_denomination)
8394 END as ligne1,
8395 CASE WHEN demandeur.qualite = \'personne_morale\'
8396 THEN TRIM(demandeur.personne_morale_raison_sociale)
8397 ELSE \'\'
8398 END as ligne1_1,
8399 CASE WHEN demandeur.qualite = \'personne_morale\' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
8400 THEN TRIM(CONCAT_WS(\' \', \'rep. par\', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
8401 ELSE \'\'
8402 END as ligne1_2,
8403 trim(concat(demandeur.numero,\' \',demandeur.voie)) as ligne2,
8404 CASE demandeur.complement
8405 WHEN null THEN \'\'
8406 ELSE trim(demandeur.complement)
8407 END as ligne3,
8408 CASE demandeur.lieu_dit
8409 WHEN null THEN \'\'
8410 ELSE trim(demandeur.lieu_dit)
8411 END as ligne4,
8412 CONCAT_WS(\' \', demandeur.code_postal, demandeur.localite,
8413 (CASE WHEN demandeur.bp IS NOT NULL
8414 THEN CONCAT_WS(\' \', \'BP\', demandeur.bp)
8415 ELSE \'\'
8416 END),
8417 (CASE WHEN demandeur.cedex IS NOT NULL
8418 THEN CONCAT_WS(\' \', \'CEDEX\', demandeur.cedex)
8419 ELSE \'\'
8420 END))
8421 as ligne5,
8422 code_barres as code_barres
8423 FROM
8424 %1$sinstruction
8425 INNER JOIN %1$sdossier
8426 ON dossier.dossier = instruction.dossier
8427 INNER JOIN %1$slien_dossier_demandeur
8428 ON dossier.dossier = lien_dossier_demandeur.dossier
8429 INNER JOIN %1$sdemandeur
8430 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
8431 LEFT OUTER JOIN %1$scivilite AS pc
8432 ON demandeur.particulier_civilite = pc.civilite
8433 OR demandeur.personne_morale_civilite = pc.civilite
8434 WHERE
8435 instruction.code_barres = \'%2$s\'
8436 %3$s',
8437 DB_PREFIXE,
8438 $this->f->db->escapeSimple($code_barres),
8439 $sqlAdresse
8440 ),
8441 array(
8442 "origin" => __METHOD__
8443 )
8444 );
8445 $adresse_dest = array_shift($qres['result']);
8446
8447 // Création adresse destinataire sans ligne vide
8448 $adresse_destinataire = array();
8449 if (!empty($adresse_dest['ligne1'])) {
8450 $adresse_destinataire[] = $adresse_dest['ligne1'];
8451 }
8452 if (!empty($adresse_dest['ligne1_1'])) {
8453 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
8454 }
8455 if (!empty($adresse_dest['ligne1_2'])) {
8456 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
8457 }
8458 $adresse_destinataire[] = $adresse_dest['ligne2'];
8459 if (!empty($adresse_dest['ligne3'])) {
8460 $adresse_destinataire[] = $adresse_dest['ligne3'];
8461 }
8462 if (!empty($adresse_dest['ligne4'])) {
8463 $adresse_destinataire[] = $adresse_dest['ligne4'];
8464 }
8465 $adresse_destinataire[] = $adresse_dest['ligne5'];
8466
8467 // Création du champ specifique
8468 $specifique_content = array();
8469 $specifique_content[] = $adresse_dest['ligne1'];
8470 $specifique_content[] = $adresse_dest['ligne1_1'];
8471 $specifique_content[] = $adresse_dest['ligne1_2'];
8472 $specifique_content[] = $testDemandeur['dossier_libelle'];
8473 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
8474 unset($adresse_dest['code_barres']);
8475 // Ajout d'une page aux pdf
8476 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
8477
8478 }
8479 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
8480 $om_edition = $this->f->get_inst__om_edition();
8481 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
8482 }
8483 }
8484
8485 /**
8486 * VIEW - view_bordereau_envoi_maire.
8487 *
8488 * Formulaire demandant :
8489 * - le code-barres de l'événement d'instruction
8490 * - la date d'envoi du courrier pour signature par le maire
8491 *
8492 * Lors de la validation :
8493 * => met à jour cette date dans l'événement d'instruction
8494 * => crée un lien permettant de générer en PDF le bordereau
8495 *
8496 * @return void
8497 */
8498 function view_bordereau_envoi_maire() {
8499 // Vérification de l'accessibilité sur l'élément
8500 $this->checkAccessibility();
8501
8502 // Récupération des valeur passées en POST ou GET
8503 $code_barres = "";
8504 if($this->f->get_submitted_post_value('code_barres') !== null) {
8505 $code_barres = $this->f->get_submitted_post_value('code_barres');
8506 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
8507 $code_barres = $this->f->get_submitted_get_value('code_barres');
8508 }
8509 $date = "";
8510 if($this->f->get_submitted_post_value('date') !== null) {
8511 $date = $this->f->get_submitted_post_value('date');
8512 } elseif($this->f->get_submitted_get_value('date') !== null) {
8513 $date = $this->f->get_submitted_get_value('date');
8514 }
8515 $validation = 0;
8516 if($this->f->get_submitted_post_value('validation') !== null) {
8517 $validation = $this->f->get_submitted_post_value('validation');
8518 } elseif($this->f->get_submitted_get_value('validation') !== null) {
8519 $validation = $this->f->get_submitted_get_value('validation');
8520 }
8521
8522 // Si le formulaire a été validé
8523 if ($this->f->get_submitted_post_value('validation') !== null) {
8524 // Tous les champs doivent obligatoirement être remplis
8525 if (!empty($date) && !empty($code_barres)) {
8526 $date_en = $this->dateDB($date);
8527 // Si date valide
8528 if ($date_en != "") {
8529 $id_instruction = $this->get_instruction_by_barcode($code_barres);
8530 // Si un événement d'instruction a été trouvé pour ce code-barres
8531 if ($id_instruction !== null) {
8532 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
8533 // Si mise à jour réussie de la date d'envoi du courrier
8534 // pour signature par l'autorité compétente
8535 if($ret === true) {
8536 // Message de validation avec lien PDF
8537 $message_class = "valid";
8538 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
8539 $message .= " : <br/><br/>";
8540 $message .= "<a class='om-prev-icon pdf-16'";
8541 $message .= " id=\"generer_bordereau_envoi_maire\"";
8542 $message .= " title=\""._("Bordereau")."\"";
8543 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
8544 $message .= "&action=200";
8545 $message .= "&idx=".$id_instruction."'";
8546 $message .= " target='_blank'>";
8547 $message .= _("Bordereau d'envoi au maire");
8548 $message .= "</a><br/><br/>";
8549 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
8550 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
8551 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
8552
8553 } else {
8554 // Message d'erreur
8555 $message_class = "error";
8556 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
8557 $code_barres);
8558 }
8559 }
8560 else {
8561 $message_class = "error";
8562 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
8563 }
8564 }
8565 else {
8566 $message_class = "error";
8567 $message = _("La date est invalide.");
8568 }
8569 } else {
8570 $message_class = "error";
8571 $message = _("Tous les champs doivent etre remplis.");
8572 }
8573 }
8574
8575 /**
8576 * Affichage des messages et du formulaire
8577 */
8578
8579 // Affichage du message de validation ou d'erreur
8580 if (isset($message) && isset($message_class) && $message != "") {
8581 $this->f->displayMessage($message_class, $message);
8582 }
8583
8584 // Ouverture du formulaire
8585 $datasubmit = $this->getDataSubmit();
8586 echo "\n<!-- ########## START DBFORM ########## -->\n";
8587 echo "<form";
8588 echo " id=\"bordereau_envoi_maire\"";
8589 echo " method=\"post\"";
8590 echo " name=\"f1\"";
8591 echo " action=\"";
8592 echo $datasubmit;
8593 echo "\"";
8594 echo ">\n";
8595
8596 // Paramétrage des champs du formulaire
8597 $champs = array("code_barres","date");
8598
8599 // Création d'un nouvel objet de type formulaire
8600 $form = $this->f->get_inst__om_formulaire(array(
8601 "validation" => 0,
8602 "maj" => 0,
8603 "champs" => $champs,
8604 ));
8605
8606 $template_required_label = '%s *';
8607 // Parametrage du champ code_barres
8608 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
8609 $form->setType("code_barres", "text");
8610 $form->setVal("code_barres", $code_barres);
8611 $form->setTaille("code_barres", 20);
8612 $form->setMax("code_barres", 20);
8613 // Parametrage du champ date
8614 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
8615 $form->setType("date", "date") ;
8616 if (empty($date)) {
8617 $date = date('d/m/Y');
8618 }
8619 $form->setVal("date", $date);
8620 $form->setTaille("date", 10);
8621 $form->setMax("date", 10);
8622
8623 // Création du bloc regroupant les champs
8624 $form->setBloc('code_barres','D');
8625 $form->setBloc('date','F');
8626 // Affichage du formulaire
8627 $form->entete();
8628 $form->afficher($champs, 0, false, false);
8629 $form->enpied();
8630 // Affichage du bouton
8631 printf("\t<div class=\"formControls\">\n");
8632 //
8633 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
8634 printf("\t</div>\n");
8635 // Fermeture du formulaire
8636 printf("\t</form>\n");
8637 }
8638
8639 /**
8640 * VIEW - view_bordereau_envoi_maire.
8641 *
8642 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
8643 *
8644 * @return [void]
8645 */
8646 function view_generate_bordereau_envoi_maire() {
8647 // Vérification de l'accessibilité sur l'élément
8648 $this->checkAccessibility();
8649 // Récupération de la collectivité du dossier d'instruction
8650 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
8651 // Récupération de ses paramètres
8652 $collectivite = $this->f->getCollectivite($collectivite_di);
8653 // Génération du PDF
8654 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
8655 // Affichage du PDF
8656 $this->expose_pdf_output(
8657 $result['pdf_output'],
8658 $result['filename']
8659 );
8660 }
8661
8662 /**
8663 * VIEW - view_rapport_instruction.
8664 *
8665 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
8666 * Cette action est bindée pour utiliser la fonction popUpIt.
8667 *
8668 * @return void
8669 */
8670 function view_overlay_notification_manuelle() {
8671
8672 // Vérification de l'accessibilité sur l'élément
8673 $this->checkAccessibility();
8674
8675 printf(
8676 '<script type="text/javascript" >
8677 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
8678 </script>',
8679 'instruction_notification_manuelle',
8680 OM_ROUTE_SOUSFORM,
8681 $this->getVal($this->clePrimaire),
8682 $this->getVal('dossier')
8683 );
8684 }
8685
8686 /**
8687 * VIEW - view_overlay_notification_service_consulte.
8688 *
8689 * Ouvre le sous-formulaire de notification des services consulte
8690 * en ajaxIt dans un overlay.
8691 * Cette action est bindée pour utiliser la fonction popUpIt.
8692 *
8693 * @return void
8694 */
8695 function view_overlay_notification_service_consulte() {
8696
8697 // Vérification de l'accessibilité sur l'élément
8698 $this->checkAccessibility();
8699
8700 printf(
8701 '<script type="text/javascript" >
8702 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
8703 </script>',
8704 'instruction_notification_manuelle',
8705 OM_ROUTE_SOUSFORM,
8706 $this->getVal($this->clePrimaire),
8707 $this->getVal('dossier')
8708 );
8709 }
8710
8711 /**
8712 * VIEW - overlay_notification_tiers_consulte.
8713 *
8714 * Ouvre le sous-formulaire de notification des tiers consulte
8715 * en ajaxIt dans un overlay.
8716 * Cette action est bindée pour utiliser la fonction popUpIt.
8717 *
8718 * @return void
8719 */
8720 function view_overlay_notification_tiers_consulte() {
8721
8722 // Vérification de l'accessibilité sur l'élément
8723 $this->checkAccessibility();
8724
8725 printf(
8726 '<script type="text/javascript" >
8727 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
8728 </script>',
8729 'instruction_notification_manuelle',
8730 OM_ROUTE_SOUSFORM,
8731 $this->getVal($this->clePrimaire),
8732 $this->getVal('dossier')
8733 );
8734 }
8735
8736 /**
8737 * VIEW - view_modale_selection_document_signe
8738 *
8739 * Ouvre le sous-formulaire de notification des services consulte
8740 * en ajaxIt dans un overlay.
8741 * Cette action est bindée pour utiliser la fonction popUpIt.
8742 *
8743 * @return void
8744 */
8745 function view_modale_selection_document_signe() {
8746
8747 // Vérification de l'accessibilité sur l'élément
8748 $this->checkAccessibility();
8749
8750 printf(
8751 '<script type="text/javascript" >
8752 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=115&idx=%3$s\', 1);
8753 </script>',
8754 'instruction_modale',
8755 OM_ROUTE_SOUSFORM,
8756 $this->getVal($this->clePrimaire),
8757 $this->getVal('dossier')
8758 );
8759 }
8760
8761 /**
8762 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8763 * pour exclure les dossiers du groupe contentieux.
8764 *
8765 * @param [string] $barcode numéro du code-barres
8766 * @return [mixed] ID de son instruction ou null si aucun code
8767 */
8768 function get_instruction_by_barcode($barcode) {
8769 // Begin
8770 $this->begin_treatment(__METHOD__);
8771
8772 // Vérification de l'existence de l'événement d'instruction
8773 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8774 $qres = $this->f->get_one_result_from_db_query(
8775 sprintf(
8776 'SELECT
8777 instruction
8778 FROM
8779 %1$sinstruction
8780 INNER JOIN %1$sdossier
8781 ON dossier.dossier=instruction.dossier
8782 INNER JOIN %1$sdossier_instruction_type
8783 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8784 INNER JOIN %1$sdossier_autorisation_type_detaille
8785 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8786 INNER JOIN %1$sdossier_autorisation_type
8787 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8788 INNER JOIN %1$sgroupe
8789 ON dossier_autorisation_type.groupe = groupe.groupe
8790 AND groupe.code != \'CTX\'
8791 WHERE
8792 code_barres = \'%2$s\'',
8793 DB_PREFIXE,
8794 $this->f->db->escapeSimple($barcode)
8795 ),
8796 array(
8797 "origin" => __METHOD__,
8798 )
8799 );
8800
8801 // Retourne résultat
8802 return $this->end_treatment(__METHOD__, $qres['result']);
8803 }
8804
8805 /**
8806 * Met à jour le champ date d'envoi signature
8807 * avec la date fournie et pour l'instruction donnée
8808 *
8809 * @param [string] $id ID de l'événement d'instruction
8810 * @param [string] $date date au format EN
8811 * @return [boolean] true si mise à jour avec succès
8812 */
8813 function update_date_envoi_signature($id, $date) {
8814 // Préparation du tableau
8815 $valF = array();
8816 $valF['date_envoi_signature'] = $date;
8817 // Begin
8818 $this->begin_treatment(__METHOD__);
8819 // Requête
8820 $res = $this->f->db->autoexecute(
8821 DB_PREFIXE.$this->table,
8822 $valF,
8823 DB_AUTOQUERY_UPDATE,
8824 $this->getCle($id)
8825 );
8826 $this->addToLog(
8827 __METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id)."\");",
8828 VERBOSE_MODE
8829 );
8830 if ($this->f->isDatabaseError($res, true) !== false) {
8831 $this->end_treatment(__METHOD__, false);
8832 }
8833 //
8834 return $this->end_treatment(__METHOD__, true);
8835 }
8836
8837 /**
8838 * Méthode permettant de définir des valeurs à envoyer en base après
8839 * validation du formulaire d'ajout.
8840 * @param array $val tableau des valeurs retournées par le formulaire
8841 */
8842 function setValFAjout($val = array()) {
8843 // Mise à jour du flag created_by_commune lors d'un changement de décision
8844 // par un utilisateur de commune sur un dossier instruit par la comcom
8845 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8846 $this->valF['created_by_commune'] = true;
8847 }
8848
8849 //
8850 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8851 if (isset($this->valF['flag_edition_integrale']) === true) {
8852 unset($this->valF['flag_edition_integrale']);
8853 }
8854 if (isset($this->valF['signataire_arrete']) === true) {
8855 unset($this->valF['signataire_arrete']);
8856 }
8857 }
8858 }
8859
8860
8861 /**
8862 * Récupère l'instance d'un événement de workflow.
8863 *
8864 * @param mixed $evenement Identifiant de l'événement.
8865 *
8866 * @return object
8867 */
8868 function get_inst_evenement($evenement = null) {
8869 //
8870 return $this->get_inst_common("evenement", $evenement);
8871 }
8872
8873 /**
8874 * Logue l'action de l'instruction dans son DI.
8875 *
8876 * @param string $id Clé primaire de l'instruction.
8877 * @param array $val Valeurs de l'instruction.
8878 *
8879 * @return bool Vrai si traitement effectué avec succès
8880 */
8881 private function add_log_to_dossier($id, array $val) {
8882 $maj = $this->getParameter("maj");
8883 // Action = Trace par défaut
8884 $action = $this->get_backtrace();
8885 // Action = Identifant de l'action si contexte connu
8886 if (empty($maj) === false
8887 || (empty($maj) === true && $maj === 0)) {
8888 $action = $this->get_action_param($maj, 'identifier');
8889 if ($action === 'modifier_suivi') {
8890 $action = "modifier (via l'action suivi des dates)";
8891 }
8892 if ($action === 'notifier_commune'
8893 && isset($val['mails_destinataires']) === true) {
8894 $action = "notification de la commune (courriels : ";
8895 $action .= $val['mails_destinataires'].")";
8896 }
8897 }
8898 // Création du log
8899 $log = array(
8900 'date' => date('Y-m-d H:i:s'),
8901 'user' => $_SESSION['login'],
8902 'action' => $action,
8903 'values' => array(
8904 'date_evenement' => $this->dateDB($val['date_evenement']),
8905 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8906 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8907 'evenement' => $val['evenement'],
8908 'action' => $val['action'],
8909 'instruction' => $id,
8910 'etat' => $val['etat'],
8911 ),
8912 );
8913 // Ajout du log
8914 $di = $this->get_inst_dossier($val['dossier']);
8915 $ret = $di->add_log_instructions($log);
8916 if ($ret === false) {
8917 $this->correct = false;
8918 $this->msg = '';
8919 $this->addToMessage($di->msg);
8920 }
8921 return $ret;
8922 }
8923
8924
8925 /**
8926 * Retourne le contexte de déboguage formaté en HTML.
8927 *
8928 * @return string Une ligne par trace
8929 */
8930 private function get_backtrace() {
8931 $trace = debug_backtrace();
8932 $backtrace = '';
8933 $i = 1;
8934 foreach ($trace as $key => $value) {
8935 $func = $trace[$key]['function'];
8936 // On ne s'autolog pas
8937 if ($func === 'get_backtrace'
8938 || $func === 'add_log_to_dossier') {
8939 continue;
8940 }
8941 $backtrace .= $i.') ';
8942 // Si dans une classe
8943 if (isset($trace[$key]['class']) === true
8944 && empty($trace[$key]['class']) === false) {
8945 $backtrace .= $trace[$key]['class'].'->'.$func;
8946 }
8947 // Si procédural
8948 else {
8949 $file = $trace[$key]['file'];
8950 $line = $trace[$key]['line'];
8951 $truncated_file = $this->f->get_relative_path($file);
8952 if ($truncated_file !== false) {
8953 $file = $truncated_file;
8954 }
8955 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8956 }
8957 $backtrace .= '<br/>';
8958 $i++;
8959 }
8960 return $backtrace;
8961 }
8962
8963 /**
8964 * CONDITION - is_notifiable.
8965 *
8966 * Condition pour afficher l'action notifier_commune.
8967 *
8968 * @return boolean
8969 */
8970 public function is_notifiable() {
8971 // L'instruction doit être finalisée, ce qui revient à dire
8972 // définalisable sans bypass
8973 if ($this->is_unfinalizable_without_bypass() === false) {
8974 return false;
8975 }
8976 // La collectivité de l'utilisateur doit être de niveau multi
8977 if ($this->f->has_collectivite_multi() === false) {
8978 return false;
8979 }
8980 // Le paramètre multi de l'objet du courriel doit exister
8981 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8982 return false;
8983 }
8984 // Le paramètre multi du modèle du courriel doit exister
8985 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8986 return false;
8987 }
8988 // A ce stade toutes les conditions sont satisfaites
8989 return true;
8990 }
8991
8992 /**
8993 * TREATMENT - notifier_commune.
8994 *
8995 * Notifie aux communes et par courriel la finalisation d'une instruction.
8996 *
8997 * @return boolean
8998 */
8999 public function notifier_commune() {
9000 // Cette méthode permet d'exécuter une routine en début des méthodes
9001 // dites de TREATMENT.
9002 $this->begin_treatment(__METHOD__);
9003 $message = __('Erreur de paramétrage :');
9004 $erreurParametrage = false;
9005 // Récupération du paramétrage de la collectivité du dossier
9006 $id_di = $this->getVal('dossier');
9007 $di = $this->get_inst_dossier($id_di);
9008 $collectivite_di = $di->getVal('om_collectivite');
9009 // Récupération de l'url permettant d'accèder à l'instruction et au dossier
9010 $urlAcces = $this->f->get_parametre_notification_url_acces($collectivite_di);
9011 if (empty($urlAcces) && empty(PATH_BASE_URL)) {
9012 $erreurParametrage = true;
9013 $message .= '<br>'.__("* l'url de notification n'est pas correctement paramétré");
9014 }
9015
9016 // Récupération de la liste des mails
9017 $adresses = $this->f->get_param_courriel_de_notification_commune($collectivite_di);
9018 if (empty($adresses)) {
9019 $erreurParametrage = true;
9020 $message .= '<br>'.__("* aucun courriel valide de destinataire de la commune");
9021 }
9022
9023 // Vérification du paramétrage des mails
9024 $paramMail = $this->f->get_notification_commune_parametre_courriel_type($collectivite_di);
9025 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_message'])) {
9026 $erreurParametrage = true;
9027 $message .= '<br>'.__("* le modèle du courriel envoyé aux communes est vide");
9028 }
9029 if (empty($paramMail) || empty($paramMail['parametre_courriel_type_titre'])) {
9030 $erreurParametrage = true;
9031 $message .= '<br>'.__("* l'objet du courriel envoyé aux communes est vide");
9032 }
9033
9034 // Si il y a des erreurs de paramétrage on ne déclenche pas la notification et
9035 // un message a destination de l'utilisateur est affiché
9036 if ($erreurParametrage) {
9037 $message .= '<br>'.__("Veuillez contacter votre administrateur.");
9038 $this->addToMessage($message);
9039 return $this->end_treatment(__METHOD__, false);
9040 }
9041
9042 // Création d'un notification et de sa tâche associé pour chaque mail
9043 foreach ($adresses as $adresse) {
9044 // Ajout de la notif et récupération de son id
9045 $destinataire = array(
9046 'destinataire' => $adresse,
9047 'courriel' => $adresse
9048 );
9049 $idNotif = $this->ajouter_notification(
9050 $this->getVal($this->clePrimaire),
9051 $this->f->get_connected_user_login_name(),
9052 $destinataire,
9053 $collectivite_di
9054 );
9055 if ($idNotif === false) {
9056 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9057 return $this->end_treatment(__METHOD__, false);
9058 }
9059 // Création de la tache en lui donnant l'id de la notification
9060 $notification_by_task = $this->notification_by_task(
9061 $idNotif,
9062 $this->getVal('dossier'),
9063 'mail',
9064 'notification_commune'
9065 );
9066 if ($notification_by_task === false) {
9067 $this->addToMessage(__("Erreur lors de la préparation de la notification des communes."));
9068 $this->addToMessage(__("Veuillez contacter votre administrateur."));
9069 return $this->end_treatment(__METHOD__, false);
9070 }
9071 }
9072 $this->addToMessage(__('La commune a été notifiée.'));
9073 return $this->end_treatment(__METHOD__, true);
9074 }
9075
9076 /**
9077 * Récupère l'instance de l'instructeur
9078 *
9079 * @param integer $instructeur Identifiant de l'instructeur.
9080 *
9081 * @return object
9082 */
9083 protected function get_inst_instructeur($instructeur) {
9084 //
9085 return $this->get_inst_common("instructeur", $instructeur);
9086 }
9087
9088
9089 /**
9090 * Récupère l'instance de l'utilisateur
9091 *
9092 * @param integer $om_utilisateur Identifiant de l'utilisateur.
9093 *
9094 * @return object
9095 */
9096 protected function get_inst_om_utilisateur($om_utilisateur) {
9097 //
9098 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
9099 }
9100
9101
9102 /**
9103 * Récupère l'instance de la division.
9104 *
9105 * @param integer $division Identifiant de la division.
9106 *
9107 * @return object
9108 */
9109 protected function get_inst_division($division) {
9110 //
9111 return $this->get_inst_common("division", $division);
9112 }
9113
9114
9115 /**
9116 * Récupère l'instance de la direction.
9117 *
9118 * @param integer $direction Identifiant de la direction.
9119 *
9120 * @return object
9121 */
9122 protected function get_inst_direction($direction) {
9123 //
9124 return $this->get_inst_common("direction", $direction);
9125 }
9126
9127
9128 /**
9129 * Récupère la collectivité d'un instructeur en passant par sa division puis
9130 * par sa direction.
9131 *
9132 * @param integer $instructeur Identifiant de l'instructeur.
9133 *
9134 * @return integer
9135 */
9136 protected function get_instructeur_om_collectivite($instructeur) {
9137 // Chemin vers la collectivité d'un instructeur
9138 $inst_instr = $this->get_inst_instructeur($instructeur);
9139 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
9140 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
9141
9142 // Collectivité
9143 $om_collectivite = $inst_direction->getVal('om_collectivite');
9144
9145 //
9146 return $om_collectivite;
9147 }
9148
9149 /*
9150 * CONDITION - can_user_access_dossier_contexte_ajout
9151 *
9152 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
9153 * formulaire d'ajout.
9154 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9155 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9156 *
9157 */
9158 function can_user_access_dossier_contexte_ajout() {
9159
9160 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
9161 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
9162 //
9163 if ($id_dossier !== "") {
9164 $dossier = $this->f->get_inst__om_dbform(array(
9165 "obj" => "dossier_instruction",
9166 "idx" => $id_dossier,
9167 ));
9168 //
9169 return $dossier->can_user_access_dossier();
9170 }
9171 return false;
9172 }
9173
9174 /*
9175 * CONDITION - can_user_access_dossier
9176 *
9177 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
9178 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
9179 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
9180 *
9181 */
9182 function can_user_access_dossier_contexte_modification() {
9183
9184 $id_dossier = $this->getVal('dossier');
9185 //
9186 if ($id_dossier !== "" && $id_dossier !== null) {
9187 $dossier = $this->f->get_inst__om_dbform(array(
9188 "obj" => "dossier_instruction",
9189 "idx" => $id_dossier,
9190 ));
9191 //
9192 return $dossier->can_user_access_dossier();
9193 }
9194 return false;
9195 }
9196
9197 /**
9198 * TREATMENT - envoyer_a_signature_sans_relecture
9199 *
9200 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
9201 *
9202 * @return boolean true si l'envoi a été effectué avec succès false sinon
9203 */
9204 function envoyer_a_signature_sans_relecture() {
9205 return $this->envoyer_a_signature();
9206 }
9207
9208 /**
9209 * TREATMENT - envoyer_a_signature_avec_relecture
9210 *
9211 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
9212 *
9213 * @return boolean true si l'envoi a été effectué avec succès false sinon
9214 */
9215 function envoyer_a_signature_avec_relecture() {
9216 $is_forced_view_files = true;
9217 return $this->envoyer_a_signature($is_forced_view_files);
9218 }
9219
9220 /**
9221 * TREATMENT - envoyer_a_signature
9222 *
9223 * Permet d'envoyer le document de l'instruction au parapheur pour signature
9224 *
9225 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
9226 *
9227 * @return boolean true si l'envoi a été effectué avec succès false sinon
9228 */
9229 function envoyer_a_signature($is_forced_view_files = false) {
9230 $this->begin_treatment(__METHOD__);
9231 $this->correct = true;
9232
9233 // Instanciation de l'objet signataire_arrete
9234 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
9235 'obj' => 'signataire_arrete',
9236 'idx' => $this->getVal('signataire_arrete'),
9237 ));
9238
9239 // Instanciation de l'objet dossier
9240 $inst_dossier = $this->f->get_inst__om_dbform(array(
9241 'obj' => 'dossier',
9242 'idx' => $this->getVal('dossier'),
9243 ));
9244
9245 // Récupération du document à signer
9246 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
9247 if ($file === OP_FAILURE) {
9248 $this->correct = false;
9249 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
9250 // Termine le traitement
9251 return $this->end_treatment(__METHOD__, false);
9252 }
9253
9254 // Initialisation des paramètre à passer pour l'envoi en signature
9255 $data = array(
9256 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
9257 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
9258 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
9259 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
9260 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
9261 // Permet d'envoyer en signature l'instruction le jour de la date limite
9262 "date_limite_instruction" => $this->compute_date_limite(1) != null ? $this->compute_date_limite(1) : null,
9263 "dossier" => $this->getVal('dossier'),
9264 "is_forced_view_files" => $is_forced_view_files,
9265 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
9266 );
9267
9268 // Initialisation des métadonnées
9269 $metadonnee_dossier = $file['metadata'];
9270 // récupération de l'extension du fichier
9271 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
9272 // Modification du libellé du document transmis au parapheur
9273 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
9274 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
9275 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
9276
9277 $metadonnee_dossier['url_di'] = sprintf(
9278 '%sapp/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx=%s',
9279 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
9280 $this->getVal($this->clePrimaire)
9281 );
9282
9283 $optional_data = null;
9284 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
9285 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
9286 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
9287 if (json_last_error() !== JSON_ERROR_NONE) {
9288 $this->correct = false;
9289 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
9290 $this->addToLog(__METHOD__."(): ".
9291 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
9292 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
9293 );
9294 // Termine le traitement
9295 return $this->end_treatment(__METHOD__, false);
9296 }
9297 }
9298
9299 //Instanciation de la classe electronicsignature
9300 $inst_es = $this->get_electronicsignature_instance();
9301 if ($inst_es === false) {
9302 $this->correct = false;
9303 return $this->end_treatment(__METHOD__, false);
9304 }
9305
9306 // Appel de la méthode de l'abstracteur send_for_signature()
9307 // Cette méthode doit retourner un tableau de valeur
9308 try {
9309 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
9310 } catch (electronicsignature_exception $e) {
9311 $this->handle_electronicsignature_exception($e);
9312 return $this->end_treatment(__METHOD__, false);
9313 }
9314
9315 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9316 $valF = array();
9317
9318 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9319 foreach($this->champs as $identifiant => $champ) {
9320 $valF[$champ] = $this->val[$identifiant];
9321 }
9322 // On fait ensuite nos modifications spécifiques
9323 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
9324 $valF['statut_signature'] = $result['statut'];
9325 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9326 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
9327 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9328
9329 $ret = $this->modifier($valF);
9330
9331 if ($ret === false) {
9332 $this->correct = false;
9333 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9334 // Termine le traitement
9335 return $this->end_treatment(__METHOD__, false);
9336 }
9337
9338 // Message
9339 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
9340 if (array_key_exists('signature_page_url', $result) === true) {
9341 $this->addToMessage(sprintf(
9342 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
9343 $result['signature_page_url'],
9344 __("Signez directement le document")
9345 ));
9346 }
9347
9348 // Tout s'est bien passé, on termine le traitement
9349 return $this->end_treatment(__METHOD__, true);
9350 }
9351
9352 /**
9353 * Permet de récupérer la bonne date limite en fonction de si l'instruction
9354 * est en incomplet notifié ou non.
9355 * On peut ajouter des jours à cette date grâce au paramètre "delay".
9356 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
9357 * l'instruction en signature le jour de la date limite.
9358 *
9359 * @param int $delay Le nombre de jour à ajouter à la date limite.
9360 *
9361 * @return string $date_limite la date limite calculé ou false
9362 */
9363 private function compute_date_limite($delay) {
9364 // Instanciation de l'objet dossier
9365 $inst_dossier = $this->f->get_inst__om_dbform(array(
9366 'obj' => 'dossier',
9367 'idx' => $this->getVal('dossier'),
9368 ));
9369
9370 $date_to_compute = null;
9371 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
9372 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
9373 } else {
9374 $date_to_compute = $inst_dossier->getVal('date_limite');
9375 }
9376 if ($date_to_compute != null) {
9377 return date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
9378 }
9379
9380 return null;
9381 }
9382
9383 /**
9384 * Permet de récupérer la traduction de la valeur de statut_signature
9385 *
9386 * @return string la valeur de statut_signature traduite | false
9387 */
9388 function get_trad_for_statut($value_to_trad){
9389 $statut_signature_tab = array(
9390 'waiting' => __('en préparation'),
9391 'in_progress' => __('en cours de signature'),
9392 'canceled' => __('signature annulée'),
9393 'expired' => __('délai de signature expiré'),
9394 'finished' => __('signé')
9395 );
9396 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
9397 return $statut_signature_tab[$value_to_trad];
9398 }
9399
9400 return false;
9401 }
9402
9403 /**
9404 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
9405 *
9406 * @return string (json) la valeur de historique_signature mis à jour | false
9407 */
9408 function get_updated_historique_signature($historique_signature_values) {
9409
9410 $historique_signature_value_tab = $this->get_historique_signature_decoded();
9411
9412 if ($historique_signature_value_tab === false) {
9413 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
9414 return false;
9415 }
9416
9417 $last_val_historique_signature = array();
9418
9419 // Si la tableau récupéré n'est pas vide alors
9420 // on récupère la dernière ligne du tableau
9421 if (empty($historique_signature_value_tab) === false) {
9422 $last_val_historique_signature = end($historique_signature_value_tab);
9423 }
9424
9425 $format_date = '';
9426 $format_date_hour = '';
9427 $date_converted=array();
9428
9429 $date_to_convert = array(
9430 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
9431 'date_limite_instruction' => $this->compute_date_limite(0),
9432 'date_retour_signature' => $historique_signature_values['date_retour_signature']
9433 );
9434
9435 // Conversion des dates en fonction de leur format
9436 foreach ($date_to_convert as $key => $value) {
9437 $date_converted[$key] = null;
9438 if ($value != null) {
9439 $format_date = 'd/m/Y';
9440 $format_date_hour = 'd/m/Y H:i:s';
9441 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
9442 }
9443 }
9444
9445 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
9446 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
9447 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
9448 $tab_for_columns_trad = array(
9449 __('entry_date'),
9450 __('id_parapheur_signature'),
9451 __('emetteur'),
9452 __('signataire'),
9453 __('date_envoi'),
9454 __('date_limite'),
9455 __('date_retour'),
9456 __('statut_signature'),
9457 __('commentaire_signature')
9458 );
9459
9460 array_push($historique_signature_value_tab, array(
9461 'entry_date' => date('d/m/Y H:i:s'),
9462 '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'],
9463 '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'],
9464 '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'],
9465 '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'],
9466 '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'],
9467 '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'],
9468 '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']),
9469 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
9470 ));
9471
9472 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
9473 }
9474
9475 /**
9476 * TREATMENT - annuler_envoi_en_signature
9477 *
9478 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
9479 *
9480 * @return boolean true si l'annulation a été effectué avec succès false sinon
9481 */
9482 function annuler_envoi_en_signature() {
9483 $this->begin_treatment(__METHOD__);
9484 $this->correct = true;
9485
9486 //Instanciation de la classe electronicsignature
9487 $inst_es = $this->get_electronicsignature_instance();
9488 if ($inst_es === false) {
9489 $this->correct = false;
9490 return $this->end_treatment(__METHOD__, false);
9491 }
9492
9493 $data = array();
9494 if (! empty($this->getVal('id_parapheur_signature'))) {
9495 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
9496 } else {
9497 $this->correct = false;
9498 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
9499 return $this->end_treatment(__METHOD__, false);
9500 }
9501
9502 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
9503 // Cette méthode doit retourner un tableau de valeur
9504 try {
9505 $result = $inst_es->cancel_send_for_signature($data);
9506 } catch (electronicsignature_exception $e) {
9507 $this->handle_electronicsignature_exception($e);
9508 return $this->end_treatment(__METHOD__, false);
9509 }
9510
9511 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
9512 $valF = array();
9513
9514 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
9515 foreach($this->champs as $identifiant => $champ) {
9516 $valF[$champ] = $this->val[$identifiant];
9517 }
9518 // On fait ensuite nos modifications spécifiques
9519 $valF['id_parapheur_signature'] = null;
9520 $valF['statut_signature'] = $result['statut'];
9521 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
9522 $valF['date_envoi_signature'] = null;
9523 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
9524
9525 $ret = $this->modifier($valF);
9526
9527 if ($ret === false) {
9528 $this->correct = false;
9529 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
9530 // Termine le traitement
9531 return $this->end_treatment(__METHOD__, false);
9532 }
9533
9534 // Message
9535 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
9536
9537 // Tout s'est bien passé, on termine le traitement
9538 return $this->end_treatment(__METHOD__, true);
9539 }
9540
9541
9542 /**
9543 * Récupère le contenu du champ historique_signature et le converti en tableau
9544 *
9545 * @return array sinon false en cas d'erreur
9546 */
9547 protected function get_historique_signature_decoded() {
9548 $val = str_replace("'", '"', $this->getVal('historique_signature'));
9549 if ($val === '' || $val == 'false') {
9550 $val = json_encode(array());
9551 }
9552 if($this->isJson($val) === false) {
9553 return false;
9554 }
9555 return json_decode($val, true);
9556 }
9557
9558 /**
9559 * Récupère les informations à afficher dans le tableau de suivi à l'aide
9560 * d'une requête sql. Stocke ces informations dans un tableau.
9561 * Converti le tableau au format json et renvoi le json obtenu.
9562 *
9563 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
9564 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
9565 * La clause where de la requête est construite à partir du tableau contenant les types
9566 * de tâches fourni en paramètre.
9567 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
9568 *
9569 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
9570 * la date de premier accès ne sera pas affichée.
9571 *
9572 * @param array liste des tâches permettant d'identifier quelles notification afficher
9573 * @param boolean permet d'afficher les notifications non liées à des tâches
9574 * @return json
9575 */
9576 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
9577 $whereTypeTache = '';
9578 $sqlTaskNull = '';
9579
9580 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
9581 $listeChampsTrad = array(
9582 __('emetteur'),
9583 __('date_envoi'),
9584 __('destinataire'),
9585 __('date_premier_acces'),
9586 __('instruction'),
9587 __('annexes'),
9588 __('statut'),
9589 __('commentaire')
9590 );
9591 $listeChamps = array(
9592 'emetteur',
9593 'date_envoi',
9594 'destinataire',
9595 'date_premier_acces',
9596 'instruction',
9597 'annexes',
9598 'statut',
9599 'commentaire'
9600 );
9601
9602 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9603 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9604 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9605 // paramétrage
9606 if(is_bool($nonLieTache) && $nonLieTache === true) {
9607 $sqlTaskNull = 'OR task.type is null';
9608 }
9609 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
9610 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
9611 // tiers consulté
9612 if (is_array($typeTache) && $typeTache != array()) {
9613 if (is_array($typeTache)) {
9614 $whereTypeTache = sprintf(
9615 'AND (task.type IN (%1$s) %2$s)',
9616 "'".implode("', '", $typeTache)."'",
9617 $sqlTaskNull
9618 );
9619 }
9620 // La date de premier accès n'a pas besoin d'être renseigné pour
9621 // les notifications des demandeurs via le portail citoyen.
9622 // Les notifications des demandeurs sont liés à 3 types de tâches
9623 // notification_recepisse, notification_instruction, notification_decision
9624 // Si le suivi de la notification concerne un de ces types de tâches on
9625 // considère que c'est une notification de demandeurs.
9626 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
9627 // via le portail. Par défaut si rien n'est paramétré on considère que la
9628 // notification est faite via le portail
9629 if ((in_array('notification_recepisse', $typeTache) ||
9630 in_array('notification_instruction', $typeTache) ||
9631 in_array('notification_decision', $typeTache))) {
9632 $dossier = $this->getVal('dossier');
9633 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
9634 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
9635 if ($modeNotification === PORTAL) {
9636 $listeChamps = array(
9637 'emetteur',
9638 'date_envoi',
9639 'destinataire',
9640 'instruction',
9641 'annexes',
9642 'statut',
9643 'commentaire'
9644 );
9645 }
9646 }
9647 // Il n'y a pas d'annexe pour la notification des communes donc pas besoin
9648 // de les afficher dans le suivi
9649 if (in_array('notification_depot_demat', $typeTache)) {
9650 $listeChamps = array(
9651 'emetteur',
9652 'date_envoi',
9653 'destinataire',
9654 'instruction',
9655 'statut',
9656 'commentaire'
9657 );
9658 }
9659 }
9660
9661 $valSuivi = array();
9662 // Récupération des infos nécessaires à l'affichage du tableau
9663 $sql = sprintf(
9664 'SELECT DISTINCT
9665 instruction_notification.instruction_notification,
9666 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
9667 CASE WHEN instruction_notification.automatique = TRUE
9668 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
9669 ELSE instruction_notification.emetteur
9670 END as emetteur,
9671 date_envoi,
9672 instruction_notification.destinataire,
9673 instruction_notification.date_premier_acces,
9674 evenement.libelle as instruction,
9675 instruction_notification.statut,
9676 instruction_notification.commentaire,
9677 annexes.instruction_annexe as annexes
9678 FROM
9679 %1$sinstruction_notification
9680 LEFT JOIN %1$sinstruction
9681 ON instruction.instruction = instruction_notification.instruction
9682 LEFT JOIN %1$sevenement
9683 ON instruction.evenement = evenement.evenement
9684 LEFT JOIN %1$sinstruction_notification_document
9685 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
9686 AND instruction_notification_document.annexe = true
9687 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
9688 LEFT JOIN %1$stask
9689 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9690 -- Récupération de la liste des annexes sous la forme d une liste
9691 LEFT JOIN (
9692 SELECT
9693 instruction_notification,
9694 -- Récupère la liste des annexes de la notification
9695 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
9696 -- à l affichage du lien vers les annexes
9697 CONCAT(
9698 \'[\',
9699 STRING_AGG(
9700 -- Affiche le nom du fichier selon le type de document/pièce
9701 CASE
9702 WHEN instruction_notification_document.document_type = \'instruction\'
9703 THEN CONCAT(
9704 \'{
9705 "obj" : "instruction",
9706 "champs" : "om_fichier_instruction",
9707 "label" : "\', evenement.libelle, \'",
9708 "id" : "\', instruction.instruction,\'"
9709 }\'
9710 )
9711 WHEN instruction_notification_document.document_type = \'consultation\'
9712 THEN CONCAT(
9713 \'{
9714 "obj" : "consultation",
9715 "champs" : "fichier",
9716 "label" : "Avis - \', service.libelle, \'",
9717 "id" : "\', consultation.consultation,\'"
9718 }\'
9719 )
9720 ELSE
9721 CONCAT(
9722 \'{
9723 "obj" : "document_numerise",
9724 "champs" : "uid",
9725 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9726 "id" : "\', document_numerise.document_numerise,\'"
9727 }\'
9728 )
9729 END,
9730 \', \'),
9731 \']\'
9732 ) AS instruction_annexe
9733 FROM
9734 %1$sinstruction_notification_document
9735 LEFT JOIN %1$sinstruction
9736 ON instruction_notification_document.instruction = instruction.instruction
9737 LEFT JOIN %1$sevenement
9738 ON instruction.evenement = evenement.evenement
9739 LEFT JOIN %1$sconsultation
9740 ON instruction_notification_document.document_id = consultation.consultation
9741 LEFT JOIN %1$sservice
9742 ON consultation.service = service.service
9743 LEFT JOIN %1$sdocument_numerise
9744 ON instruction_notification_document.document_id = document_numerise.document_numerise
9745 LEFT JOIN %1$sdocument_numerise_type
9746 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9747 WHERE
9748 instruction_notification_document.annexe = \'t\'
9749 GROUP BY
9750 instruction_notification
9751 ) AS annexes
9752 ON
9753 annexes.instruction_notification = instruction_notification.instruction_notification
9754 WHERE
9755 instruction.instruction = %2$s
9756 %3$s
9757 ORDER BY
9758 date_envoi ASC, instruction_notification.destinataire ASC',
9759 DB_PREFIXE,
9760 intval($this->getVal('instruction')),
9761 $whereTypeTache
9762 );
9763 $qres = $this->f->get_all_results_from_db_query($sql, array(
9764 "origin" => __METHOD__
9765 )
9766 );
9767 // Préparation du lien de téléchargement des annexes
9768 $htmlList =
9769 '<style>
9770 #content .gridjs-td a.lien_annexe {
9771 text-decoration : underline dotted 1px;
9772 }
9773 #content a.lien_annexe:hover {
9774 text-decoration : underline solid 1px;
9775 color : #46aede;
9776 }
9777 ol {padding-left : 10px;}
9778 </style>
9779 <ol>%1$s</ol>';
9780 $lienTelechargement =
9781 '<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">
9782 Annexe
9783 </a>';
9784 // Stockage des infos de chaque notification dans un tableau
9785 foreach ($qres['result'] as $row) {
9786 $valNotif = array();
9787 foreach($listeChamps as $champ) {
9788 $valNotif[$champ] = $row[$champ];
9789 if (($champ === 'date_envoi'
9790 || $champ === 'date_premier_acces')
9791 && $row[$champ] !== null
9792 && $row[$champ] !== '') {
9793 //
9794 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9795 } else if ($champ === 'annexes') {
9796 $listeAnnexe = '';
9797 $infoAnnexes = json_decode($row[$champ], true);
9798 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9799 // A partir des infos récupérées prépare le code html du lien vers chacune
9800 // des annexes et ajoute un élément de liste par annexe
9801 foreach($infoAnnexes as $annexe) {
9802 $listeAnnexe .= sprintf(
9803 '<li>%s</li>',
9804 sprintf($lienTelechargement,
9805 $annexe['obj'],
9806 $annexe['champs'],
9807 $annexe['id'],
9808 $annexe['label']
9809 )
9810 );
9811 }
9812 // Construction de la liste des annexes
9813 $valNotif[$champ] = sprintf(
9814 $htmlList,
9815 $listeAnnexe
9816 );
9817 }
9818 }
9819 }
9820 array_push($valSuivi, $valNotif);
9821 }
9822
9823 // Passage du tableau au format json
9824 return json_encode($valSuivi, JSON_HEX_APOS);
9825 }
9826
9827 /**
9828 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9829 *
9830 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9831 *
9832 * @return void
9833 */
9834 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9835 $this->f->displayMessage('error', $exception->getMessage());
9836 }
9837
9838
9839 /**
9840 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9841 *
9842 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9843 * @return electronicsignature Instance de l'abstracteur.
9844 */
9845 public function get_electronicsignature_instance($with_handle_error = true) {
9846 if(isset($this->electronicsignature_instance)) {
9847 return $this->electronicsignature_instance;
9848 }
9849 // Instanciation du connecteur electronicsignature
9850 try {
9851 require_once "electronicsignature.class.php";
9852 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9853 $this->electronicsignature_instance = new electronicsignature($collectivites);
9854 } catch (electronicsignature_exception $e) {
9855 if ($with_handle_error === true) {
9856 $this->handle_electronicsignature_exception($e);
9857 }
9858 return false;
9859 }
9860 return $this->electronicsignature_instance;
9861 }
9862
9863 /**
9864 * TREATMENT - envoyer_au_controle_de_legalite
9865 *
9866 * Ajoute la tâche envoi_CL.
9867 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9868 *
9869 * @return [type] [description]
9870 */
9871 function envoyer_au_controle_de_legalite() {
9872 $this->begin_treatment(__METHOD__);
9873 $this->correct = true;
9874
9875 //
9876 if ($this->can_be_sended_to_cl() === true) {
9877 // Création de la task 'envoi_CL'
9878 $inst_task = $this->f->get_inst__om_dbform(array(
9879 "obj" => "task",
9880 "idx" => 0,
9881 ));
9882 $task_val = array(
9883 'type' => 'envoi_CL',
9884 'object_id' => $this->getVal('instruction'),
9885 'dossier' => $this->getVal('dossier'),
9886 );
9887 // Change l'état de la tâche de notification en fonction de l'état de
9888 // transmission du dossier d'instruction
9889 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9890 if ($this->f->is_option_mode_service_consulte_enabled() === false
9891 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9892 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9893 //
9894 $task_val['state'] = $inst_task::STATUS_DRAFT;
9895 }
9896 $add_task = $inst_task->add_task(array('val' => $task_val));
9897 if ($add_task === false) {
9898 $this->addToMessage(sprintf('%s %s',
9899 __("Une erreur s'est produite lors de la création tâche."),
9900 __("Veuillez contacter votre administrateur.")
9901 ));
9902 $this->correct = false;
9903 return $this->end_treatment(__METHOD__, false);
9904 }
9905 // Mise à jour du champs 'envoye_cl_platau'
9906 $instr_val = array(
9907 'envoye_cl_platau' => 't',
9908 );
9909 $res = $this->f->db->autoExecute(
9910 DB_PREFIXE.$this->table,
9911 $instr_val,
9912 DB_AUTOQUERY_UPDATE,
9913 $this->getCle($this->getVal($this->clePrimaire))
9914 );
9915 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
9916 if ($this->f->isDatabaseError($res, true) === true) {
9917 $this->addToMessage(sprintf('%s %s',
9918 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9919 __("Veuillez contacter votre administrateur.")
9920 ));
9921 $this->correct = false;
9922 return $this->end_treatment(__METHOD__, false);
9923 }
9924 // Message de validation à l'utilisateur
9925 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9926 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9927 }
9928 //
9929 return $this->end_treatment(__METHOD__, true);
9930 }
9931
9932
9933 /**
9934 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9935 *
9936 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9937 * la vue 'sousformulaire'.
9938 *
9939 * @return string
9940 */
9941 function get_back_link($view = "formulaire") {
9942 //
9943 $href = parent::get_back_link($view);
9944 //
9945 $crud = $this->get_action_crud();
9946
9947 // Redirection vers le formulaire de modification à la validation du
9948 // formulaire d'ajout si l'événement associé possède une lettre type
9949 if (($crud === 'create'
9950 || ($crud === null
9951 && $this->getParameter('maj') == 0))
9952 && $this->correct == true
9953 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9954
9955 // On instancie l'instruction
9956 $inst_instruction = $this->f->get_inst__om_dbform(array(
9957 "obj" => "instruction",
9958 "idx" => $this->valF[$this->clePrimaire],
9959 ));
9960
9961 // Si l'instruction n'est pas finalisée automatiquement
9962 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9963 $href = str_replace("&action=3", "&action=1", $href);
9964 //
9965 if (strpos($href, "&retour=tab") !== false) {
9966 $href = str_replace("&retour=tab", "&retour= form", $href);
9967 } else {
9968 $href .= "&retour=form";
9969 }
9970 }
9971 }
9972
9973 //
9974 return $href;
9975 }
9976
9977 public function view_json_data() {
9978 $this->checkAccessibility();
9979 $this->f->disableLog();
9980 $view = $this->get_json_data();
9981 printf(json_encode($view));
9982 }
9983
9984 public function get_json_data() {
9985 $val = array_combine($this->champs, $this->val);
9986 foreach ($val as $key => $value) {
9987 $val[$key] = strip_tags($value);
9988 }
9989 $val['tacite'] = 'f';
9990 $inst_ad = $this->f->get_inst__om_dbform(array(
9991 "obj" => "avis_decision",
9992 "idx" => $val['avis_decision'],
9993 ));
9994 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9995 $val['tacite'] = 't';
9996 }
9997 return $val;
9998 }
9999
10000 /**
10001 * Permet de récupérer l'identifiant de l'instruction sur le dossier, ayant
10002 * comme événement lié le suivant définit dans l'événement de l'instruction
10003 * instanciée.
10004 *
10005 * @param string $next_type Correspond aux trois déclenchement automatique
10006 * de création d'instruction paramétré sur un événement.
10007 * @param integer $instruction Identifiant de l'instruction à instancier.
10008 * @return mixed Identifiant de l'instruction recherchée ou false.
10009 */
10010 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
10011 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
10012 return false;
10013 }
10014 $result = array();
10015 $evenements = array();
10016 if ($instruction === null) {
10017 $instruction = $this->getVal($this->clePrimaire);
10018 $evenement = $this->getVal('evenement');
10019 $dossier = $this->getVal('dossier');
10020 } else {
10021 $inst = $this->f->get_inst__om_dbform(array(
10022 "obj" => "instruction",
10023 "idx" => $instruction,
10024 ));
10025 $evenement = $inst->getVal('evenement');
10026 $dossier = $inst->getVal('dossier');
10027 }
10028 // Récupération de l'identifiant de l'événement paramétré comme suivant
10029 // sur l'instruction instanciée
10030 $qres = $this->f->get_one_result_from_db_query(
10031 sprintf(
10032 'SELECT
10033 evenement_%3$s
10034 FROM
10035 %1$sevenement
10036 WHERE
10037 evenement = %2$s',
10038 DB_PREFIXE,
10039 intval($evenement),
10040 $next_type
10041 ),
10042 array(
10043 "origin" => __METHOD__,
10044 "force_return" => true,
10045 )
10046 );
10047 if ($qres["code"] !== "OK") {
10048 return false;
10049 }
10050 $ev_next = $qres["result"];
10051 // Récupération de l'instruction dans le dossier utilisant l'événement
10052 // suivant identifié dans la requête précédente
10053 $qres = $this->f->get_one_result_from_db_query(
10054 sprintf(
10055 'SELECT
10056 MAX(instruction.instruction) as instruction
10057 FROM
10058 %1$sinstruction
10059 WHERE
10060 dossier = \'%3$s\'
10061 AND evenement = %2$s',
10062 DB_PREFIXE,
10063 intval($ev_next),
10064 $this->f->db->escapeSimple($dossier)
10065 ),
10066 array(
10067 "origin" => __METHOD__,
10068 "force_return" => true,
10069 )
10070 );
10071 if ($qres["code"] !== "OK") {
10072 return false;
10073 }
10074 return $qres["result"];
10075 }
10076
10077 public function get_related_instructions($instruction = null) {
10078 $result = array();
10079 $evenements = array();
10080 if ($instruction === null) {
10081 $instruction = $this->getVal($this->clePrimaire);
10082 $evenement = $this->getVal('evenement');
10083 $dossier = $this->getVal('dossier');
10084 } else {
10085 $inst = $this->f->get_inst__om_dbform(array(
10086 "obj" => "instruction",
10087 "idx" => $instruction,
10088 ));
10089 $evenement = $inst->getVal('evenement');
10090 $dossier = $inst->getVal('dossier');
10091 }
10092 //
10093 $qres = $this->f->get_one_result_from_db_query(
10094 sprintf(
10095 'SELECT
10096 evenement
10097 FROM
10098 %1$sevenement
10099 WHERE
10100 evenement_retour_ar = %2$s
10101 OR evenement_retour_signature = %2$s',
10102 DB_PREFIXE,
10103 intval($evenement)
10104 ),
10105 array(
10106 "origin" => __METHOD__,
10107 "force_return" => true,
10108 )
10109 );
10110 if ($qres["code"] !== "OK") {
10111 return false;
10112 }
10113 $ev_parent = $qres["result"];
10114 //
10115 $qres = $this->f->get_one_result_from_db_query(
10116 sprintf(
10117 'SELECT
10118 MAX(instruction.instruction) as instruction
10119 FROM
10120 %1$sinstruction
10121 WHERE
10122 dossier = \'%3$s\'
10123 AND evenement = %2$s',
10124 DB_PREFIXE,
10125 intval($ev_parent),
10126 $this->f->db->escapeSimple($dossier)
10127 ),
10128 array(
10129 "origin" => __METHOD__,
10130 "force_return" => true,
10131 )
10132 );
10133 if ($qres["code"] !== "OK") {
10134 return false;
10135 }
10136 $result[] = $qres["result"];
10137 //
10138 $qres = $this->f->get_one_result_from_db_query(
10139 sprintf(
10140 'SELECT
10141 evenement_retour_ar
10142 FROM
10143 %1$sevenement
10144 WHERE
10145 evenement = %2$d
10146 AND evenement_retour_ar != %3$d',
10147 DB_PREFIXE,
10148 intval($ev_parent),
10149 intval($evenement)
10150 ),
10151 array(
10152 "origin" => __METHOD__,
10153 "force_return" => true,
10154 )
10155 );
10156 if ($qres["code"] !== "OK") {
10157 return false;
10158 }
10159 $evenements[] = $qres["result"];
10160 //
10161 $qres = $this->f->get_one_result_from_db_query(
10162 sprintf(
10163 'SELECT
10164 evenement_retour_signature
10165 FROM
10166 %1$sevenement
10167 WHERE
10168 evenement = %2$s
10169 AND evenement_retour_signature != %3$s
10170 ',
10171 DB_PREFIXE,
10172 intval($ev_parent),
10173 intval($evenement)
10174 ),
10175 array(
10176 "origin" => __METHOD__,
10177 "force_return" => true,
10178 )
10179 );
10180 if ($qres["code"] !== "OK") {
10181 return false;
10182 }
10183 $evenements[] = $qres["result"];
10184 foreach ($evenements as $value) {
10185 if ($value !== null) {
10186 $qres = $this->f->get_one_result_from_db_query(
10187 sprintf(
10188 'SELECT
10189 MAX(instruction.instruction) as instruction
10190 FROM
10191 %1$sinstruction
10192 WHERE
10193 dossier = \'%3$s\'
10194 AND evenement = %2$s',
10195 DB_PREFIXE,
10196 intval($value),
10197 $this->f->db->escapeSimple($dossier)
10198 ),
10199 array(
10200 "origin" => __METHOD__,
10201 "force_return" => true,
10202 )
10203 );
10204 if ($qres["code"] !== "OK") {
10205 return false;
10206 }
10207 $result[] = $qres["result"];
10208 }
10209 }
10210 return $result;
10211 }
10212
10213 protected function getDocumentType($champ = null) {
10214 $evenementId = $this->getVal('evenement');
10215 if (! empty($evenementId)) {
10216 $evenement = $this->f->findObjectById('evenement', $evenementId);
10217 if (! empty($evenement)) {
10218 return __("Instruction").':'.$evenement->getVal('libelle');
10219 }
10220 }
10221 return parent::getDocumentType();
10222 }
10223
10224 /**
10225 * Récupère à l'aide d'une requête sql la liste des demandeurs
10226 * pouvant être notifié. C'est à dire les demandeurs acceptant
10227 * les notifications et pour lesquels une adresse mail existe.
10228 *
10229 * Dans le cas, d'une notification pour le portail citoyen, seul
10230 * le pétitionnaire principal doit être notifier et uniquement si
10231 * il a une adress mail et qu'il accepte les notifications.
10232 *
10233 * @param string identifiant du dossier
10234 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
10235 * pour une notification de categorie portail
10236 * @return array liste des demandeurs pouvant être notifié
10237 */
10238 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
10239 if ($idDossier === null) {
10240 $idDossier = $this->getVal('dossier');
10241 }
10242 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
10243 // pour une notification depuis le portail citoyen
10244 $sqlPetitionnairePrincipal = '';
10245 // Gestion des champs nécessaires pour la notification d'un demandeur
10246 $condition_demandeur = "AND demandeur.notification = 't'
10247 AND demandeur.courriel IS NOT NULL";
10248 if ($portail === true) {
10249 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
10250 $condition_demandeur = "AND (
10251 (notification = 't' AND courriel IS NOT NULL)
10252 OR demande.source_depot = 'portal'
10253 )";
10254 }
10255
10256 $listeDemandeursNotifiable = array();
10257
10258 // Requête de récupération des demandeurs
10259 $qres = $this->f->get_all_results_from_db_query(
10260 sprintf(
10261 'SELECT
10262 demandeur.demandeur,
10263 CASE
10264 WHEN demandeur.qualite=\'particulier\'
10265 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
10266 ELSE
10267 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
10268 END AS destinataire,
10269 demandeur.courriel,
10270 petitionnaire_principal
10271 FROM
10272 %1$sdossier
10273 INNER JOIN %1$slien_dossier_demandeur
10274 ON dossier.dossier = lien_dossier_demandeur.dossier
10275 INNER JOIN %1$sdemandeur
10276 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
10277 -- Récupération de la plus ancienne demande associée au dossier (la demande
10278 -- de création du dossier)
10279 INNER JOIN (
10280 SELECT
10281 demande,
10282 dossier_instruction,
10283 source_depot
10284 FROM
10285 %1$sdemande
10286 WHERE
10287 dossier_instruction = \'%2$s\'
10288 ORDER BY
10289 demande ASC
10290 LIMIT 1
10291 ) as demande
10292 ON dossier.dossier = demande.dossier_instruction
10293 WHERE
10294 dossier.dossier = \'%2$s\'
10295 %3$s
10296 %4$s',
10297 DB_PREFIXE,
10298 $this->f->db->escapeSimple($idDossier),
10299 $condition_demandeur,
10300 $sqlPetitionnairePrincipal
10301 ),
10302 array(
10303 "origin" => __METHOD__
10304 )
10305 );
10306 // Récupération des infos des demandeurs et stockage dans un tableau
10307 // ayant pour clé les id des demandeurs
10308 foreach ($qres['result'] as $row) {
10309 $listeDemandeursNotifiable[$row['demandeur']] = $row;
10310 }
10311
10312 return $listeDemandeursNotifiable;
10313 }
10314
10315 /**
10316 * Renvoie la liste des notifications liées à l'instruction
10317 *
10318 * @param integer id de l'instruction dont on cherche les notifications
10319 * @return array liste des instruction_notification liés à l'instruction
10320 */
10321 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
10322 $whereTypeTache = '';
10323 $sqlTaskNull = '';
10324 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
10325 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
10326 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
10327 // paramétrage
10328 if(is_bool($nonLieTache) && $nonLieTache === true) {
10329 $sqlTaskNull = 'OR task.type is null';
10330 }
10331 if ($typeNotification != null) {
10332 if (is_array($typeNotification)) {
10333 $whereTypeTache = sprintf(
10334 'AND (task.type IN (%1$s) %2$s)',
10335 "'".implode("', '", $typeNotification)."'",
10336 $sqlTaskNull
10337 );
10338 } else {
10339 $whereTypeTache = sprintf(
10340 'AND (task.type = \'%1$s\' %2$s)',
10341 $typeNotification,
10342 $sqlTaskNull
10343 );
10344 }
10345 }
10346 $listeInstrNotif = array();
10347 $qres = $this->f->get_all_results_from_db_query(
10348 sprintf('
10349 SELECT
10350 instruction_notification.instruction_notification
10351 FROM
10352 %1$sinstruction_notification
10353 LEFT JOIN %1$stask
10354 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
10355 WHERE
10356 instruction = %2$s
10357 %3$s',
10358 DB_PREFIXE,
10359 intval($id_instruction),
10360 $whereTypeTache
10361 ),
10362 array(
10363 "origin" => __METHOD__
10364 )
10365 );
10366 foreach ($qres['result'] as $row) {
10367 $listeInstrNotif[] = $row['instruction_notification'];
10368 }
10369 return $listeInstrNotif;
10370 }
10371
10372 /**
10373 * Crée une clé d'accès unique permettant à un utilisateur
10374 * anonyme de récupérer le document.
10375 *
10376 * @return string clé d'accès du document
10377 */
10378 protected function getCleAccesDocument() {
10379 // Initialisation d'un tableau
10380 $number_list = array();
10381
10382 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
10383 for ($i = 0; $i < 4; $i++) {
10384 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
10385 }
10386
10387 // Transformation en chaîne tout en séparant les nombres par un "-"
10388 $result = implode('-', $number_list);
10389
10390 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
10391 if ($this->getUidDocumentInstructionWithKey($result) != null) {
10392 return $this->getCleAccesDocument();
10393 }
10394
10395 //
10396 return $result;
10397 }
10398
10399 /**
10400 * Récupère une clé et renvoie l'uid du document liée à cette
10401 * clé. Si la clé n'existe pas renvoie null.
10402 *
10403 * @param string $cleGen clé dont on cherche l'instruction
10404 * @return integer|null
10405 */
10406 protected function getUidDocumentInstructionWithKey($cleGen) {
10407 $qres = $this->f->get_one_result_from_db_query(
10408 sprintf(
10409 'SELECT
10410 instruction.om_fichier_instruction
10411 FROM
10412 %1$sinstruction_notification_document
10413 LEFT JOIN %1$sinstruction
10414 ON instruction_notification_document.instruction = instruction.instruction
10415 WHERE
10416 instruction_notification_document.cle = \'%2$s\'',
10417 DB_PREFIXE,
10418 $this->f->db->escapeSimple($cleGen)
10419 ),
10420 array(
10421 "origin" => __METHOD__,
10422 )
10423 );
10424
10425 return $qres['result'];
10426 }
10427
10428 /**
10429 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
10430 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
10431 *
10432 * @param string $cleGen
10433 * @return instruction_notification
10434 */
10435 protected function getInstanceNotificationWithKey($key) {
10436 $qres = $this->f->get_one_result_from_db_query(
10437 sprintf(
10438 'SELECT
10439 instruction_notification
10440 FROM
10441 %1$sinstruction_notification_document
10442 WHERE
10443 cle = \'%2$s\'',
10444 DB_PREFIXE,
10445 $this->f->db->escapeSimple($key)
10446 ),
10447 array(
10448 "origin" => __METHOD__,
10449 )
10450 );
10451
10452 // Récupération de l'instance de notification
10453 $instNotif = $this->f->get_inst__om_dbform(array(
10454 "obj" => "instruction_notification",
10455 "idx" => $qres['result'],
10456 ));
10457 return $instNotif;
10458 }
10459
10460
10461 /**
10462 * Affiche la page de téléchargement du document de la notification.
10463 *
10464 * @param boolean $content_only Affiche le contenu seulement.
10465 *
10466 * @return void
10467 */
10468 public function view_telecharger_document_anonym() {
10469 // Par défaut on considère qu'on va afficher le formulaire
10470 $idx = 0;
10471 // Flag d'erreur
10472 $error = false;
10473 // Message d'erreur
10474 $message = '';
10475
10476 // Paramètres GET : récupération de la clé d'accès
10477 $cle_acces_document = $this->f->get_submitted_get_value('key');
10478 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
10479 // Vérification de l'existence de la clé et récupération de l'uid du fichier
10480 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
10481 if ($uidFichier != null) {
10482 // Récupération du document
10483 $file = $this->f->storage->get($uidFichier);
10484
10485 // Headers
10486 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
10487 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
10488 header("Content-Type: ".$file['metadata']['mimetype']);
10489 header("Accept-Ranges: bytes");
10490 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
10491 // Affichage du document
10492 echo $file['file_content'];
10493
10494 // Récupération de la date de premier accès et maj du suivi uniquement
10495 // si la date de 1er accès n'a pas encore été remplis
10496 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
10497 if ($inst_notif->getVal('date_premier_acces') == null ||
10498 $inst_notif->getVal('date_premier_acces') == '') {
10499 $notif_val = array();
10500 foreach ($inst_notif->champs as $champ) {
10501 $notif_val[$champ] = $inst_notif->getVal($champ);
10502 }
10503 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
10504 $notif_val['statut'] = 'vu';
10505 $notif_val['commentaire'] = 'Le document a été vu';
10506 $suivi_notif = $inst_notif->modifier($notif_val);
10507 }
10508
10509 } else {
10510 // Page vide 404
10511 printf('Ressource inexistante');
10512 header('HTTP/1.0 404 Not Found');
10513 }
10514 }
10515
10516 /**
10517 * Récupère le titre du document envoyé au parapheur
10518 */
10519 protected function getDocumentTitre($champ = null) {
10520 $title = $this->getTitle();
10521 $dossier = $this->getDossier();
10522 return $dossier.' '.$title;
10523 }
10524
10525 /**
10526 * Compose le nom du document à transmettre au parapheur.
10527 * Le nom ets composé de cette manière :
10528 * instruction_xxx_libelle_de_la_lettre_type_associee
10529 * ou xxx correspond au numéro de l'instruction
10530 */
10531 protected function getDocumentLibelle() {
10532 // Récupère le champ instruction
10533 $instruction = $this->getVal("instruction");
10534
10535 // Requête sql servant à récupérer le titre du document
10536 // TO_CHAR() introduit un espace avant l'affichage du nombre
10537 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
10538 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
10539 $documentLibelle = $this->f->get_one_result_from_db_query(
10540 sprintf(
10541 'SELECT
10542 CONCAT(
10543 \'instruction\',
10544 TO_CHAR(instruction.instruction, \'000\'),
10545 \'_\',
10546 LOWER(om_lettretype.libelle)
10547 ) AS nom_fichier
10548 FROM
10549 %1$sinstruction
10550 LEFT JOIN %1$som_lettretype
10551 ON om_lettretype.id = instruction.lettretype
10552 WHERE
10553 instruction = %2$d',
10554 DB_PREFIXE,
10555 intval($instruction)
10556 ),
10557 array(
10558 "origin" => __METHOD__,
10559 )
10560 );
10561
10562 $documentLibelle = $documentLibelle['result'];
10563
10564 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
10565 // caractères spéciaux en '_'
10566 // La méthode normalize_string est utilisé pour gérer les accents
10567 $documentLibelle = $this->f->normalize_string($documentLibelle);
10568 // TODO : comparer cette liste et celle de la méthode normalize_string
10569 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
10570 // liste
10571 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
10572 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
10573 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
10574 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
10575 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
10576 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
10577 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
10578 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
10579 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
10580 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
10581 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
10582 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
10583 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
10584 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
10585 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
10586 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
10587 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
10588 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
10589 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
10590 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
10591 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
10592 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
10593 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
10594 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
10595 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
10596 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
10597 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
10598 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
10599 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
10600 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
10601 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
10602 );
10603
10604 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
10605 }
10606
10607 /**
10608 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
10609 * l'overlay de notification des demandeurs.
10610 */
10611 function getSubFormTitle($ent) {
10612 $actionSansPath = array('411', '420', '430');
10613 if (in_array($this->getParameter('maj'), $actionSansPath)) {
10614 return '';
10615 }
10616 return parent::getSubFormTitle($ent);
10617 }
10618
10619 /**
10620 * Traitement de la notification automatique des tiers consulté.
10621 *
10622 * Récupère la liste des adresses mails des tiers notifiables. Pour chaque adresses
10623 * récupérées ajoute une notification et une tâche de notification par mail.
10624 * La création de la tâche de notification par mail déclenchera l'envoi du mail
10625 * et la mise à jour du suivi.
10626 *
10627 * Les tiers notifiables sont ceux :
10628 * - n’ayant pas un ID PLAT’AU correspondant à l’ID PLAT’AU du service consultant
10629 * - ayant une habilitation dont le type est listé dans les paramètres de
10630 * notification de l’événement,
10631 * - intervenant sur la commune ou le département du dossier
10632 * - ayant au moins une adresse mail valide
10633 *
10634 * @param evenement instance de l'événement associée à l'instruction
10635 * @param dossier instance du dossier de l'instruction
10636 * @return boolean indique si le traitement à réussi
10637 */
10638 protected function traitement_notification_automatique_tiers_consulte($evenement, $dossier) {
10639 // Récupération de l'identifiant plat'au du service consultant
10640 $consultationEntrante = $dossier->get_inst_consultation_entrante();
10641 // Récupération de la liste des types d'habilitations autorisées pour
10642 // cette notification
10643 $typesHabilitationsNotifiable = $evenement->get_types_habilitation_notifiable();
10644 // Récupération du département et de la commune du dossier
10645 $commune = $dossier->getVal('commune');
10646 // Le département est récupéré à partir de la commune du dossier donc si la
10647 // commune n'a pas pu être récupéré on ne récupère pas non plus le département.
10648 $idDepartement = null;
10649 if (! empty($commune)) {
10650 $departement = $dossier->get_inst_departement_dossier();
10651 $idDepartement = $departement->getVal($departement->clePrimaire);
10652 }
10653 // Récupération des courriels des tiers notifiables
10654 $tiersANotifier = $this->get_courriels_tiers_notifiable(
10655 $typesHabilitationsNotifiable,
10656 $consultationEntrante->getVal('service_consultant_id'),
10657 $commune,
10658 $idDepartement
10659 );
10660 // Traitement de chacune des listes de diffusion pour extraire les
10661 // courriels, vérifier la validité des courriels et envoyer la
10662 // notification
10663 $notificationSend = false;
10664 if (empty($tiersANotifier)) {
10665 $this->addToLog(
10666 sprintf(
10667 '%s() : %s %s : %s',
10668 __METHOD__,
10669 __("La récupération des tiers à échoué."),
10670 __('Paramétrage'),
10671 var_export(
10672 array(
10673 'types_habilitations_notifiable' => $typesHabilitationsNotifiable,
10674 'service_consultant' => $consultationEntrante->getVal('service_consultant_id'),
10675 'id_commune' => $commune,
10676 'id_departement' => $idDepartement
10677 ),
10678 true
10679 )
10680 ),
10681 DEBUG_MODE
10682 );
10683 return false;
10684 }
10685 foreach($tiersANotifier as $tierANotifier) {
10686 // Découpe la liste de diffusion pour stocker les adresses mails
10687 // des tiers dans un tableau
10688 $courriels =
10689 array_filter(
10690 array_map(
10691 'trim',
10692 preg_split("/\r\n|\n|\r/", $tierANotifier['liste_diffusion'])));
10693
10694 foreach ($courriels as $courriel) {
10695 // Pour chaque adresse mail vérifie si l'adresse est valide
10696 if (! $this->f->checkValidEmailAddress($courriel)) {
10697 continue;
10698 }
10699 $destinataire = array(
10700 'destinataire' => $tierANotifier['libelle'].' : '.$courriel,
10701 'courriel' => $courriel
10702 );
10703 // Si l'adresse est valide ajoute une nouvelle notification
10704 // et une tâche d'envoi de mails
10705 $idNotif = $this->ajouter_notification(
10706 $this->getVal($this->clePrimaire),
10707 $this->f->get_connected_user_login_name(),
10708 $destinataire,
10709 $this->get_dossier_instruction_om_collectivite(),
10710 array(),
10711 true
10712 );
10713 if ($idNotif === false) {
10714 $this->addToLog(
10715 __METHOD__.
10716 __("L'ajout de la notification a échoué."),
10717 DEBUG_MODE
10718 );
10719 return false;
10720 }
10721 // Création de la tache en lui donnant l'id de la notification
10722 $notification_by_task = $this->notification_by_task(
10723 $idNotif,
10724 $dossier->getVal('dossier'),
10725 'mail',
10726 'notification_tiers_consulte'
10727 );
10728 if ($notification_by_task === false) {
10729 $this->addToLog(
10730 __METHOD__.
10731 __("L'ajout de la tâche de notification a échoué."),
10732 DEBUG_MODE
10733 );
10734 $this->addToMessage(
10735 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
10736 );
10737 return false;
10738 }
10739 $notificationSend = true;
10740 }
10741 }
10742 // Si aucune notification n'a été envoyé car il n'y a pas de courriels
10743 // valide, affiche un message dans les logs pour avoir un suivi.
10744 if (! $notificationSend) {
10745 $this->addToLog(
10746 sprintf(
10747 '%s %s : %s %s : %s',
10748 __METHOD__,
10749 __("Il n'y a pas de tiers notifiable pour l'instruction"),
10750 $evenement->getVal('libelle'),
10751 __("du dossier"),
10752 $this->getVal('dossier')
10753 ),
10754 DEBUG_MODE
10755 );
10756 }
10757 return true;
10758 }
10759
10760 /**
10761 * Récupère, à l'aide d'une requête, la liste de diffusion des tiers
10762 * respectant les conditions suvantes :
10763 * - le tiers consulté dois accepté les notifications
10764 * - la liste de diffusion ne dois pas être vide
10765 * - l'uid du tiers consulté ne dois pas être celui passé en paramètre
10766 * si pas d'uid passé en paramètre alors on ne filtre pas selon l'uid
10767 * du tiers
10768 * - le type d'habilitation des tiers dois appartenir à la liste
10769 * fournie en paramètre
10770 * - le tiers dois être associé à la commune ou au département passé
10771 * en paramètre
10772 *
10773 * @param array $typesHabilitations tableau contenant la liste des types d'habilitation
10774 * pouvant être notifiée
10775 * @param integer $idPlautau uid de l'acteur plat'au du dossier qui ne dois pas être notifié
10776 * @param integer $commune identifiant de la commune du dossier
10777 * @param integer $departement identifiant du département du dossier
10778 *
10779 * @return array listes de diffusion des tiers notifiable
10780 */
10781 protected function get_courriels_tiers_notifiable(array $typesHabilitations, $idPlatau, $commune, $departement) {
10782 // Si paramètre non renseigné alors ne renvoie rien
10783 if (empty($typesHabilitations) || empty($commune) || empty($departement)) {
10784 return false;
10785 }
10786 // Si il n'y a pas d'acteur associé au dossier alors on ne filtre pas sur l'uid de l'acteur
10787 $filtreServiceConsulteDI = '';
10788 if (! empty($idPlatau)) {
10789 $filtreServiceConsulteDI = sprintf(
10790 "-- Filtre les tiers ayant une ligne correspondante a l uid platau du service
10791 -- en charge du dossier
10792 AND (tiers_consulte.uid_platau_acteur !~ ('\y' || '%s' || '\y')
10793 OR tiers_consulte.uid_platau_acteur IS NULL)",
10794 $this->f->db->escapeSimple($idPlatau)
10795 );
10796 }
10797 $rst = $this->f->get_all_results_from_db_query(
10798 sprintf(
10799 'SELECT
10800 -- Tiers notifiables lié à la commune du dossier
10801 tiers_consulte.liste_diffusion,
10802 tiers_consulte.libelle
10803 FROM
10804 %1$shabilitation_tiers_consulte
10805 LEFT JOIN %1$stiers_consulte
10806 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10807 LEFT JOIN %1$slien_habilitation_tiers_consulte_commune
10808 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_commune.habilitation_tiers_consulte
10809 -- Conservation uniquement des tiers acteur de dossiers
10810 JOIN %1$slien_dossier_tiers
10811 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
10812 WHERE
10813 tiers_consulte.accepte_notification_email IS TRUE
10814 AND tiers_consulte.liste_diffusion IS NOT NULL
10815 %3$s
10816 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10817 AND lien_habilitation_tiers_consulte_commune.commune = %4$d
10818 -- Filtre sur les tiers acteur du dossier
10819 AND lien_dossier_tiers.dossier = \'%6$s\'
10820 UNION
10821 SELECT
10822 -- Tiers notifiables lié au département du dossier
10823 tiers_consulte.liste_diffusion,
10824 tiers_consulte.libelle
10825 FROM
10826 %1$shabilitation_tiers_consulte
10827 LEFT JOIN %1$stiers_consulte
10828 ON habilitation_tiers_consulte.tiers_consulte = tiers_consulte.tiers_consulte
10829 LEFT JOIN %1$slien_habilitation_tiers_consulte_departement
10830 ON habilitation_tiers_consulte.habilitation_tiers_consulte = lien_habilitation_tiers_consulte_departement.habilitation_tiers_consulte
10831 -- Conservation uniquement des tiers acteur de dossiers
10832 JOIN %1$slien_dossier_tiers
10833 ON tiers_consulte.tiers_consulte = lien_dossier_tiers.tiers
10834 WHERE
10835 tiers_consulte.accepte_notification_email IS TRUE
10836 AND tiers_consulte.liste_diffusion IS NOT NULL
10837 %3$s
10838 AND habilitation_tiers_consulte.type_habilitation_tiers_consulte IN (%2$s)
10839 AND lien_habilitation_tiers_consulte_departement.departement = %5$d
10840 -- Filtre sur les tiers acteur du dossier
10841 AND lien_dossier_tiers.dossier = \'%6$s\'',
10842 DB_PREFIXE,
10843 implode(', ', $typesHabilitations),
10844 $filtreServiceConsulteDI,
10845 intval($commune),
10846 intval($departement),
10847 $this->f->db->escapeSimple($this->getVal('dossier'))
10848 ),
10849 array(
10850 "origin" => __METHOD__
10851 )
10852 );
10853 // Faire un order by sur un union ne fonctionne pas. A la place
10854 // c'est le tableau des résultats qui est ordonné.
10855 usort($rst['result'], function($a, $b) {
10856 return strcmp($a['libelle'], $b['libelle']);
10857 });
10858 return $rst['result'];
10859 }
10860 }

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26