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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 12433 - (show annotations)
Thu Jun 23 17:40:44 2022 UTC (2 years, 5 months ago) by softime
File size: 435853 byte(s)
Error occurred while calculating annotation data.
* Fusion de la branche d'intégration 5.11.0-develop vers 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 - 120 - edition
194 // Affiche l'édition
195 $this->class_actions[120] = array(
196 "identifier" => "edition",
197 "portlet" => array(
198 "type" => "action-blank",
199 "libelle" => _("Edition"),
200 "order" => 100,
201 "class" => "pdf-16",
202 ),
203 "view" => "view_edition",
204 "condition" => array("has_an_edition", "can_user_access_dossier_contexte_modification"),
205 "permission_suffix" => "om_fichier_instruction_telecharger",
206 );
207
208 // ACTION - 125 - modifier_suivi
209 // Suivi des dates
210 $this->class_actions[125] = array(
211 "identifier" => "modifier_suivi",
212 "portlet" => array(
213 "type" => "action-self",
214 "libelle" => _("Suivi des dates"),
215 "order" => 125,
216 "class" => "suivi-dates-16",
217 ),
218 "crud" => "update",
219 "condition" => array("can_monitoring_dates", "can_user_access_dossier_contexte_modification"),
220 "permission_suffix" => "modification_dates",
221 );
222
223 // ACTION - 130 - bible
224 // Affiche la bible
225 $this->class_actions[130] = array(
226 "identifier" => "bible",
227 "view" => "view_bible",
228 "permission_suffix" => "modifier",
229 );
230
231 // ACTION - 140 - bible_auto
232 // Active la bible automatique
233 $this->class_actions[140] = array(
234 "identifier" => "bible_auto",
235 "view" => "view_bible_auto",
236 "permission_suffix" => "modifier",
237 );
238
239 // ACTION - 150 - suivi_bordereaux
240 // Imprimer un bordereau d'envoi
241 $this->class_actions[150] = array(
242 "identifier" => "suivi_bordereaux",
243 "view" => "view_suivi_bordereaux",
244 "permission_suffix" => "consulter",
245 );
246
247 // ACTION - 160 - suivi_envoi_lettre_rar
248 // Imprimer un bordereau d'envoi
249 $this->class_actions[160] = array(
250 "identifier" => "suivi_envoi_lettre_rar",
251 "view" => "view_suivi_envoi_lettre_rar",
252 "permission_suffix" => "consulter",
253 );
254
255 // ACTION - 170 - suivi_mise_a_jour_des_dates
256 // Mettre à jour les dates de l'instruction
257 $this->class_actions[170] = array(
258 "identifier" => "suivi_mise_a_jour_des_dates",
259 "view" => "view_suivi_mise_a_jour_des_dates",
260 "permission_suffix" => "consulter",
261 );
262
263 // ACTION - 180 - pdf_lettre_rar
264 // Génère PDF sur bordereaux de lettres AR
265 $this->class_actions[180] = array(
266 "identifier" => "pdf_lettre_rar",
267 "view" => "view_pdf_lettre_rar",
268 "permission_suffix" => "consulter",
269 );
270
271 // ACTION - 190 - bordereau_envoi_maire
272 // Formulaire pour générer le bordereau d'envoi au maire
273 // Met à jour la date d'envoi à signature du maire
274 $this->class_actions[190] = array(
275 "identifier" => "bordereau_envoi_maire",
276 "view" => "view_bordereau_envoi_maire",
277 "permission_suffix" => "bordereau_envoi_maire",
278 );
279
280 // ACTION - 200 - generate_bordereau_envoi_maire
281 // Génère PDF bordereau d'envoi au maire
282 $this->class_actions[200] = array(
283 "identifier" => "generate_bordereau_envoi_maire",
284 "view" => "view_generate_bordereau_envoi_maire",
285 "permission_suffix" => "bordereau_envoi_maire",
286 );
287
288 // ACTION - 210 - notifier_commune
289 // Notifie la commune par mail d'un évément d'instruction finalisé
290 $this->class_actions[210] = array(
291 "identifier" => "notifier_commune",
292 "portlet" => array(
293 "type" => "action-direct-with-confirmation",
294 "libelle" => _("Notifier la commune par courriel"),
295 "order" => 210,
296 "class" => "notifier_commune-16",
297 ),
298 "view" => "formulaire",
299 "method" => "notifier_commune",
300 "permission_suffix" => "notifier_commune",
301 "condition" => array("is_notifiable", "can_user_access_dossier_contexte_modification"),
302 );
303
304 // ACTION - 220 - generate_suivi_bordereaux
305 // GénÚre PDF bordereaux
306 $this->class_actions[220] = array(
307 "identifier" => "generate_suivi_bordereaux",
308 "view" => "view_generate_suivi_bordereaux",
309 "permission_suffix" => "consulter",
310 );
311
312 // ACTION - 777 - pdf_temp
313 // Crée un PDF temporaire et affiche son contenu en base64
314 $this->class_actions[777] = array(
315 "identifier" => "pdf_temp",
316 "view" => "view_pdf_temp",
317 "permission_suffix" => "modifier",
318 "condition" => array("can_user_access_dossier_contexte_modification"),
319 );
320
321 // ACTION - 701
322 $this->class_actions[701] = array(
323 "identifier" => "enable-edition-integrale",
324 "portlet" => array(
325 "type" => "action-direct-with-confirmation",
326 "libelle" => _("Rédaction libre"),
327 "order" => 50,
328 "class" => "redac-libre-16",
329 ),
330 "view" => "formulaire",
331 "method" => "enable_edition_integrale",
332 "permission_suffix" => "modifier",
333 "condition" => array(
334 "is_editable",
335 "is_finalizable_without_bypass",
336 "can_user_access_dossier_contexte_modification",
337 "is_edition_integrale_not_enabled",
338 "is_option_redaction_libre_enabled",
339 "has_an_edition",
340 ),
341 );
342 // ACTION - 702
343 $this->class_actions[702] = array(
344 "identifier" => "disable-edition-integrale",
345 "portlet" => array(
346 "type" => "action-direct-with-confirmation",
347 "libelle" => _("Rédaction par compléments"),
348 "order" => 50,
349 "class" => "redac-complement-16",
350 ),
351 "view" => "formulaire",
352 "method" => "disable_edition_integrale",
353 "permission_suffix" => "modifier",
354 "condition" => array(
355 "is_editable",
356 "is_finalizable_without_bypass",
357 "can_user_access_dossier_contexte_modification",
358 "is_edition_integrale_enabled",
359 "is_option_redaction_libre_enabled",
360 "has_an_edition",
361 ),
362 );
363 // ACTION - 300 - evenement_has_an_edition_json
364 //
365 $this->class_actions[300] = array(
366 "identifier" => "evenement_has_an_edition_json",
367 "view" => "view_evenement_has_an_edition_json",
368 "permission_suffix" => "consulter",
369 );
370
371 // ACTION - 301 - evenement_has_a_commentaire
372 //
373 $this->class_actions[301] = array(
374 "identifier" => "evenement_has_a_commentaire_json",
375 "view" => "view_evenement_has_a_commentaire_json",
376 "permission_suffix" => "consulter",
377 );
378
379 // ACTION - 400 - Envoyer en signature
380 // Cet évenement permet d'envoyer le document au parapheur pour signature
381 $this->class_actions[400] = array(
382 "identifier" => "envoyer_a_signature",
383 "portlet" => array(
384 "libelle" => _("Envoyer à signature"),
385 "type" => "action-direct-with-confirmation",
386 "class" => "envoyer_a_signature-16",
387 ),
388 "view" => "formulaire",
389 "method" => "envoyer_a_signature_sans_relecture",
390 "condition" => array(
391 "can_be_signed",
392 ),
393 "permission_suffix" => "envoyer_a_signature",
394 );
395
396 // ACTION - 402 - Envoyer en signature avec relecture
397 // Cet évenement permet d'envoyer le document au parapheur pour signature
398 $this->class_actions[402] = array(
399 "identifier" => "envoyer_a_signature_relecture",
400 "portlet" => array(
401 "libelle" => __("Envoyer à signature avec relecture"),
402 "type" => "action-direct-with-confirmation",
403 "class" => "envoyer_a_signature-16",
404 ),
405 "view" => "formulaire",
406 "method" => "envoyer_a_signature_avec_relecture",
407 "condition" => array(
408 "can_be_signed",
409 "is_parapheur_relecture_parameter_enabled"
410 ),
411 "permission_suffix" => "envoyer_a_signature",
412 );
413
414 // ACTION - 404 - Annuler l'envoi en signature
415 // Cet évenement permet d'annuler l'envoi en signature du document au parapheur
416 $this->class_actions[404] = array(
417 "identifier" => "annuler_envoi_signature",
418 "portlet" => array(
419 "libelle" => __("Annuler l'envoi en signature"),
420 "type" => "action-direct-with-confirmation",
421 "class" => "annuler_envoi_signature-16",
422 ),
423 "view" => "formulaire",
424 "method" => "annuler_envoi_en_signature",
425 "condition" => array(
426 "is_sent_for_signature",
427 "is_parapheur_annulation_parameter_enabled"
428 ),
429 "permission_suffix" => "envoyer_a_signature",
430 );
431
432 //
433 $this->class_actions[401] = array(
434 "identifier" => "preview_edition",
435 "view" => "formulaire",
436 "permission_suffix" => "tab",
437 );
438
439 // ACTION - 410 - Notifier les pétitionnaires (mail ou autre)
440 $this->class_actions[410] = array(
441 "identifier" => "overlay_notification_manuelle",
442 "portlet" => array(
443 "libelle" => __("Notifier les pétitionnaires"),
444 "type" => "action-self",
445 "class" => "notifier_commune-16",
446 ),
447 "condition" => array(
448 "is_notifiable_by_task_manual",
449 "is_not_portail_notification_sans_annexe"
450 ),
451 "view" => "view_overlay_notification_manuelle",
452 "permission_suffix" => "modifier",
453 );
454
455 // ACTION - 411 - Notifier les pétitionnaires (portail citoyen)
456 $this->class_actions[411] = array(
457 "identifier" => "notification_manuelle_portal",
458 "portlet" => array(
459 "libelle" => __("Notifier les pétitionnaires"),
460 "type" => "action-direct-with-confirmation",
461 "class" => "notifier_commune-16",
462 ),
463 "condition" => array(
464 "is_notifiable_by_task_manual",
465 "is_portail_notification_sans_annexe"
466 ),
467 "method" => "notifier_demandeur_principal",
468 "permission_suffix" => "modifier",
469 );
470
471 // ACTION - 420 - Notifier les services consultés (mail)
472 $this->class_actions[420] = array(
473 "identifier" => "overlay_notification_service_consulte",
474 "portlet" => array(
475 "libelle" => __("Notifier les services consultés"),
476 "type" => "action-self",
477 "class" => "notifier_commune-16",
478 ),
479 "condition" => array(
480 "is_service_notifiable"
481 ),
482 "view" => "view_overlay_notification_service_consulte",
483 "permission_suffix" => "tab",
484 );
485
486 // ACTION - 430 - Notifier les tiers consultés (mail)
487 $this->class_actions[430] = array(
488 "identifier" => "overlay_notification_tiers_consulte",
489 "portlet" => array(
490 "libelle" => __("Notifier les tiers consultés"),
491 "type" => "action-self",
492 "class" => "notifier_commune-16",
493 ),
494 "condition" => array(
495 "is_tiers_notifiable"
496 ),
497 "view" => "view_overlay_notification_tiers_consulte",
498 "permission_suffix" => "tab",
499 );
500
501 //
502 $this->class_actions[403] = array(
503 "identifier" => "envoyer_au_controle_de_legalite",
504 "portlet" => array(
505 "libelle" => __("Envoyer au contrôle de légalité"),
506 "type" => "action-direct-with-confirmation",
507 "class" => "envoyer_au_controle_de_legalite-16",
508 ),
509 "view" => "formulaire",
510 "method" => "envoyer_au_controle_de_legalite",
511 "condition" => array(
512 "can_be_sended_to_cl"
513 ),
514 "permission_suffix" => "envoyer_au_controle_de_legalite",
515 );
516
517 //
518 $this->class_actions[998] = array(
519 "identifier" => "json_data",
520 "view" => "view_json_data",
521 "permission_suffix" => "consulter",
522 );
523 }
524
525 /**
526 * Clause select pour la requête de sélection des données de l'enregistrement.
527 *
528 * @return array
529 */
530 function get_var_sql_forminc__champs() {
531 return array(
532 "instruction",
533 "destinataire",
534 "instruction.evenement",
535 "instruction.commentaire",
536 "date_evenement",
537 "instruction.lettretype",
538 "signataire_arrete",
539 "flag_edition_integrale",
540 "om_final_instruction_utilisateur",
541 "date_finalisation_courrier",
542 "date_envoi_signature",
543 "date_envoi_rar",
544 "date_envoi_controle_legalite",
545
546 "date_retour_signature",
547 "date_retour_rar",
548 "date_retour_controle_legalite",
549
550 "numero_arrete",
551
552 "complement_om_html",
553 "'' as bible_auto",
554 "'' as bible",
555 "complement2_om_html",
556 "'' as bible2",
557 "complement3_om_html",
558 "'' as bible3",
559 "complement4_om_html",
560 "'' as bible4",
561
562 "titre_om_htmletat",
563 "corps_om_htmletatex",
564
565 "'' as btn_preview",
566 "'' as btn_redaction",
567
568 "'' as btn_refresh",
569 "'' as live_preview",
570
571 "dossier",
572 "instruction.action",
573 "instruction.delai",
574 "instruction.etat",
575 "instruction.autorite_competente",
576 "instruction.accord_tacite",
577 "instruction.delai_notification",
578 "instruction.avis_decision",
579 "archive_delai",
580 "archive_accord_tacite",
581 "archive_etat",
582 "archive_avis",
583 "archive_date_complet",
584 "archive_date_rejet",
585 "archive_date_limite",
586 "archive_date_notification_delai",
587 "archive_date_decision",
588 "archive_date_validite",
589 "archive_date_achevement",
590 "archive_date_conformite",
591 "archive_date_chantier",
592 "archive_date_dernier_depot",
593 "date_depot",
594 "date_depot_mairie",
595 "complement5_om_html",
596 "'' as bible5",
597 "complement6_om_html",
598 "'' as bible6",
599 "complement7_om_html",
600 "'' as bible7",
601 "complement8_om_html",
602 "'' as bible8",
603 "complement9_om_html",
604 "'' as bible9",
605 "complement10_om_html",
606 "'' as bible10",
607 "complement11_om_html",
608 "'' as bible11",
609 "complement12_om_html",
610 "complement13_om_html",
611 "complement14_om_html",
612 "complement15_om_html",
613 "archive_incompletude",
614 "archive_incomplet_notifie",
615 "archive_evenement_suivant_tacite",
616 "archive_evenement_suivant_tacite_incompletude",
617 "archive_etat_pendant_incompletude",
618 "archive_date_limite_incompletude",
619 "archive_delai_incompletude",
620 "archive_autorite_competente",
621 "code_barres",
622 "om_fichier_instruction",
623 "om_final_instruction",
624 "om_fichier_instruction_dossier_final",
625 "document_numerise",
626 "duree_validite_parametrage",
627 "duree_validite",
628 "created_by_commune",
629 "archive_date_cloture_instruction",
630 "archive_date_premiere_visite",
631 "archive_date_derniere_visite",
632 "archive_date_contradictoire",
633 "archive_date_retour_contradictoire",
634 "archive_date_ait",
635 "archive_date_transmission_parquet",
636 "archive_dossier_instruction_type",
637 "archive_date_affichage",
638 "pec_metier",
639 "archive_pec_metier",
640 "archive_a_qualifier",
641 "id_parapheur_signature",
642 "statut_signature",
643 "commentaire_signature",
644 "historique_signature",
645 "'' as suivi_notification",
646 "'' as suivi_notification_service",
647 "'' as suivi_notification_tiers",
648
649 "'' as preview_edition",
650 "envoye_cl_platau",
651 "'' as log_instruction"
652 );
653 }
654
655 /**
656 * CONDITION - is_edition_integrale_enabled
657 *
658 * Vérifie que la rédaction libre est activée sur l'instruction en cours.
659 *
660 * @return boolean
661 */
662 function is_edition_integrale_enabled() {
663 if ($this->getVal("flag_edition_integrale") == 't') {
664 return true;
665 }
666 return false;
667 }
668
669 /**
670 * CONDITION - is_edition_integrale_not_enabled
671 *
672 * Vérifie que la rédaction libre est désactivée sur l'instruction en cours.
673 *
674 * @return boolean
675 */
676 function is_edition_integrale_not_enabled() {
677 return !$this->is_edition_integrale_enabled();
678 }
679
680 /**
681 * CONDITION - is_option_redaction_libre_enabled
682 *
683 * Vérifie que l'option de rédaction libre est activée.
684 *
685 * @return boolean
686 */
687 function is_option_redaction_libre_enabled() {
688 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
689 return $this->f->is_option_redaction_libre_enabled($collectivite_di);
690 }
691
692 /**
693 * CONDITION - is_option_parapheur_relecture_enabled
694 *
695 * Vérifie que l'option de relecture lors de l'envoi en signature est activée.
696 *
697 * @return boolean
698 */
699 function is_parapheur_relecture_parameter_enabled() {
700 //Instanciation de la classe electronicsignature
701 $inst_es = $this->get_electronicsignature_instance();
702 if ($inst_es === false) {
703 return false;
704 }
705
706 if ($inst_es->get_conf('is_forced_view_files') !== 'true' && $inst_es->get_conf('is_forced_view_files') !== true) {
707 return false;
708 }
709
710 return true;
711 }
712
713 /**
714 * CONDITION - is_parapheur_annulation_parameter_enabled
715 *
716 * Vérifie que l'option d'annulation de l'envoi en signature est activée.
717 *
718 * @return boolean
719 */
720 function is_parapheur_annulation_parameter_enabled() {
721 //Instanciation de la classe electronicsignature
722 $inst_es = $this->get_electronicsignature_instance();
723 if ($inst_es === false) {
724 return false;
725 }
726
727 if ($inst_es->get_conf('cancel_send') !== 'true' && $inst_es->get_conf('cancel_send') !== true) {
728 return false;
729 }
730
731 return true;
732 }
733
734
735 /**
736 * CONDITION - is_sent_for_signature
737 *
738 * Vérifie que l'instruction a été envoyé à signature
739 *
740 * @return boolean
741 */
742 function is_sent_for_signature() {
743 // Si un parapheur a été configuré
744 // et que le champ id_parapheur_signature n'est pas vide
745 // que le status est différent de "canceled" ou "expired"
746 // alors l'évènement a été envoyé en signature
747 if ($this->has_connector_electronicsignature() === true
748 && empty($this->getVal("id_parapheur_signature")) === false
749 && ($this->getVal("statut_signature") != "canceled"
750 && $this->getVal("statut_signature") != "expired"
751 && $this->getVal("statut_signature") != "finished")) {
752 //
753 return true;
754 }
755
756 return false;
757 }
758
759 /**
760 * CONDITION - is_not_sent_for_signature
761 *
762 * Vérifie que l'instruction n'a pas été envoyé à signature
763 *
764 * @return boolean
765 */
766 function is_not_sent_for_signature() {
767 // Contrôle si l'utilisateur possède un bypass
768 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
769 if ($bypass == true) {
770 return true;
771 }
772
773 return !$this->is_sent_for_signature();
774 }
775
776
777 /**
778 * CONDITION - is_signed
779 *
780 * Vérifie que l'instruction a été signé
781 *
782 * @return boolean
783 */
784 function is_signed() {
785 // Si un parapheur a été configuré
786 // et que le champ id_parapheur_signature n'est pas vide
787 // et que le statut est égal à "finished"
788 // alors le document de l'instruciton à été signé
789 if ($this->has_connector_electronicsignature() === true
790 && empty($this->getVal("id_parapheur_signature")) === false
791 && $this->getVal("statut_signature") == "finished") {
792 //
793 return true;
794 }
795
796 return false;
797 }
798
799
800 /**
801 * is_sent_to_cl
802 *
803 * Vérifie que l'instruction a été envoyé au contrôle de légalité
804 *
805 * @return boolean
806 */
807 function is_sent_to_cl() {
808 // Si la case à cocher de l'instruction envoye_cl_platau est à "t"
809 if ($this->getVal('envoye_cl_platau') === 't') {
810 //
811 return true;
812 }
813 //
814 return false;
815 }
816
817 /**
818 * CONDITION - is_portail_notification
819 *
820 * Vérifie si la notification est une notification de catégorie portail
821 *
822 * @return boolean
823 */
824 function is_portail_notification_sans_annexe() {
825 $collectiviteDi = $this->get_dossier_instruction_om_collectivite();
826 $ev = $this->get_inst_evenement($this->getVal('evenement'));
827 if (($this->f->get_param_option_notification($collectiviteDi) === null ||
828 $this->f->get_param_option_notification($collectiviteDi) === 'portal')
829 && $ev->getVal('notification') != 'notification_manuelle_annexe'
830 && $ev->getVal('notification') != 'notification_manuelle_annexe_signature_requise'
831 ) {
832 return true;
833 }
834 return false;
835 }
836
837 /**
838 * CONDITION - is_not_portail_notification
839 *
840 * Vérifie si la notification n'est pas une notification de catégorie portail
841 *
842 * @return boolean
843 */
844 function is_not_portail_notification_sans_annexe() {
845 return (! $this->is_portail_notification_sans_annexe());
846 }
847
848 /**
849 * CONDITION - can_be_signed
850 *
851 * Vérifie que le document de l'instruction peut être envoyé au parapheur pour signature
852 *
853 * @return boolean
854 */
855 function can_be_signed() {
856 // Instanciation de l'objet signataire_arrete
857 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
858 "obj" => "signataire_arrete",
859 "idx" => $this->getVal("signataire_arrete"),
860 ));
861 // Si un parapheur a été configuré, que le document est finalisé, que le signataire
862 // possède une adresse email, on vérifie le champ id_parapheur_signature
863 // S'il est vide l'évènement peut être envoyé en signature
864 // S'il ne l'est pas, alors on vérifie le champ statut_signature
865 // Si la valeur de ce champ est égal à "canceled" ou "expired"
866 // alors l'évènement peut être envoyé en signature
867 if ($this->has_connector_electronicsignature() === true
868 && $this->getVal("om_final_instruction") == 't'
869 && empty($inst_signataire_arrete->getVal('email')) === false) {
870 //
871 if (empty($this->getVal("id_parapheur_signature")) === true
872 || $this->getVal("statut_signature") == "canceled"
873 || $this->getVal("statut_signature") == "expired") {
874 //
875 return true;
876 }
877 }
878
879 $this->addToLog(__METHOD__."() has_connector_electronicsignature: ".var_export($this->has_connector_electronicsignature(), true), EXTRA_VERBOSE_MODE);
880 $this->addToLog(__METHOD__."() om_final_instruction: ".var_export($this->getVal("om_final_instruction"), true), EXTRA_VERBOSE_MODE);
881 $this->addToLog(__METHOD__."() email: ".var_export($inst_signataire_arrete->getVal('email'), true), EXTRA_VERBOSE_MODE);
882 $this->addToLog(__METHOD__."() id_parapheur_signature: ".var_export($this->getVal("id_parapheur_signature"), true), EXTRA_VERBOSE_MODE);
883 $this->addToLog(__METHOD__."() statut_signature: ".var_export($this->getVal("statut_signature"), true), EXTRA_VERBOSE_MODE);
884
885 return false;
886 }
887
888 /**
889 * CONDITION - has_connector_electronicsignature
890 *
891 * Vérifie qu'un parapheur est paramétré
892 *
893 * @return boolean
894 */
895 function has_connector_electronicsignature() {
896 $inst_es = $this->get_electronicsignature_instance(false);
897 if ($inst_es === false) {
898 return false;
899 }
900 return true;
901 }
902
903 /**
904 * CONDITION - can_display_parapheur
905 *
906 * Vérifie que le fieldset "Suivi Parapheur" soit affichable
907 *
908 * @return boolean
909 */
910 function can_display_parapheur() {
911 $evenement_id = $this->getVal("evenement");
912 $inst_evenement = $this->get_inst_evenement($evenement_id);
913 if ($this->has_connector_electronicsignature() === true
914 && $inst_evenement->getVal('lettretype') !== ''
915 && $inst_evenement->getVal('lettretype') !== null
916 && (empty($this->getVal("id_parapheur_signature")) === false
917 || empty($this->getVal("historique_signature")) === false)) {
918 //
919 return true;
920 }
921
922 return false;
923 }
924
925 /**
926 * CONDITION - can_display_notification
927 *
928 * Vérifie que le champs "Suivi notification" est affichable
929 *
930 * @return boolean
931 */
932 function can_display_notification_demandeur() {
933 // Le suivi des notification est affiché si l'événement est notifiable
934 // et si des notifications ont été envoyées
935 $evenement_id = $this->getVal("evenement");
936 $inst_evenement = $this->get_inst_evenement($evenement_id);
937 if ($inst_evenement->getVal('notification') != null &&
938 $inst_evenement->getVal('notification') != '') {
939 // Des notifications ont été envoyé si il existe au moins une notification
940 // liées à l'instruction
941 $idsNotifs = $this->get_instruction_notification(
942 $this->getVal($this->clePrimaire),
943 array(
944 'notification_recepisse',
945 'notification_instruction',
946 'notification_decision',
947 ),
948 true
949 );
950 if (isset($idsNotifs) && $idsNotifs !== array()) {
951 return true;
952 }
953 }
954 return false;
955 }
956
957 /**
958 * CONDITION - can_display_notification
959 *
960 * Vérifie que le champs "suivi_notification_service" est affichable
961 *
962 * @return boolean
963 */
964 function can_display_notification_service() {
965 // Le suivi des notification est affiché si l'événement est notifiable
966 // et si des notifications ont été envoyées
967 $evenement_id = $this->getVal("evenement");
968 $inst_evenement = $this->get_inst_evenement($evenement_id);
969 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_service')) == true) {
970 // Des notifications ont été envoyé si il existe au moins une notification
971 // de type notification_service_consulte liées à l'instruction
972 $idsNotifs = $this->get_instruction_notification(
973 $this->getVal($this->clePrimaire),
974 'notification_service_consulte'
975 );
976 if (isset($idsNotifs) && $idsNotifs !== array()) {
977 return true;
978 }
979 }
980 return false;
981 }
982
983
984 /**
985 * CONDITION - can_display_notification_tiers
986 *
987 * Vérifie que le champs "suivi_notification_tiers" est affichable
988 *
989 * @return boolean
990 */
991 function can_display_notification_tiers() {
992 // Le suivi des notification est affiché si l'événement est notifiable
993 // et si des notifications ont été envoyées
994 $evenement_id = $this->getVal("evenement");
995 $inst_evenement = $this->get_inst_evenement($evenement_id);
996 if ($this->get_boolean_from_pgsql_value($inst_evenement->getVal('notification_tiers')) == true) {
997 // Des notifications ont été envoyé si il existe au moins une notification
998 // de type notification_tiers_consulte liées à l'instruction
999 $idsNotifs = $this->get_instruction_notification(
1000 $this->getVal($this->clePrimaire),
1001 'notification_tiers_consulte'
1002 );
1003 if (isset($idsNotifs) && $idsNotifs !== array()) {
1004 return true;
1005 }
1006 }
1007 return false;
1008 }
1009
1010 /**
1011 * TREATMENT - disable_edition_integrale.
1012 *
1013 * Cette methode permet de passer la consultation en "lu"
1014 *
1015 * @return boolean true si maj effectué false sinon
1016 */
1017 function disable_edition_integrale() {
1018 // Cette méthode permet d'exécuter une routine en début des méthodes
1019 // dites de TREATMENT.
1020 $this->begin_treatment(__METHOD__);
1021 $this->correct = true;
1022 $valF = array(
1023 "flag_edition_integrale" => false,
1024 "titre_om_htmletat" => null,
1025 "corps_om_htmletatex" => null,
1026 );
1027 $res = $this->f->db->autoExecute(
1028 DB_PREFIXE.$this->table,
1029 $valF,
1030 DB_AUTOQUERY_UPDATE,
1031 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1032 );
1033 if ($this->f->isDatabaseError($res, true)) {
1034 // Appel de la methode de recuperation des erreurs
1035 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1036 $this->correct = false;
1037 // Termine le traitement
1038 return $this->end_treatment(__METHOD__, false);
1039 } else {
1040 $this->addToMessage(_("Rédaction par compléments activé."));
1041 return $this->end_treatment(__METHOD__, true);
1042 }
1043
1044 // Termine le traitement
1045 return $this->end_treatment(__METHOD__, false);
1046 }
1047
1048 /**
1049 * TREATMENT - enable_edition_integrale.
1050 *
1051 * Cette methode permet de passer la consultation en "lu"
1052 *
1053 * @return boolean true si maj effectué false sinon
1054 */
1055 function enable_edition_integrale() {
1056 // Cette méthode permet d'exécuter une routine en début des méthodes
1057 // dites de TREATMENT.
1058 $this->begin_treatment(__METHOD__);
1059 $this->correct = true;
1060
1061 // Récupère la collectivite du dossier d'instruction
1062 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
1063 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
1064 //
1065 $params = array(
1066 "specific" => array(
1067 "corps" => array(
1068 "mode" => "get",
1069 )
1070 ),
1071 );
1072 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1073 $corps = $result['pdf_output'];
1074 //
1075 $params = array(
1076 "specific" => array(
1077 "titre" => array(
1078 "mode" => "get",
1079 )
1080 ),
1081 );
1082 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
1083 $titre = $result['pdf_output'];
1084 //
1085 $valF = array(
1086 "flag_edition_integrale" => true,
1087 "titre_om_htmletat" => $titre,
1088 "corps_om_htmletatex" => $corps,
1089 );
1090 $res = $this->f->db->autoExecute(
1091 DB_PREFIXE.$this->table,
1092 $valF,
1093 DB_AUTOQUERY_UPDATE,
1094 $this->clePrimaire."=".$this->getVal($this->clePrimaire)
1095 );
1096 if ($this->f->isDatabaseError($res, true)) {
1097 // Appel de la methode de recuperation des erreurs
1098 $this->erreur_db($res->getDebugInfo(), $res->getMessage(), '');
1099 $this->correct = false;
1100 // Termine le traitement
1101 return $this->end_treatment(__METHOD__, false);
1102 } else {
1103 $this->addToMessage(_("Rédaction libre activé."));
1104 return $this->end_treatment(__METHOD__, true);
1105 }
1106
1107 // Termine le traitement
1108 return $this->end_treatment(__METHOD__, false);
1109 }
1110
1111 /**
1112 * Cette méthode permet de récupérer le dossier d'autorisation d'un dossier
1113 */
1114 function getNumDemandeAutorFromDossier($id) {
1115 //
1116 if (!isset($id)) {
1117 return NULL;
1118 }
1119 //
1120 $sql = "select dossier_autorisation from ".DB_PREFIXE."dossier ";
1121 $sql .= " where dossier='".$id."'";
1122 //
1123 $dossier_autorisation = $this->f->db->getOne($sql);
1124 $this->addToLog("getNumDemandeAutorFromDossier(): db->getone(\"".$sql."\")", VERBOSE_MODE);
1125 database::isError($dossier_autorisation);
1126 //
1127 return $dossier_autorisation;
1128 }
1129
1130 // }}}
1131
1132 function setType(&$form, $maj) {
1133 // Récupération du mode de l'action
1134 $crud = $this->get_action_crud($maj);
1135 // Récupère la collectivité du dossier d'instruction
1136 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1137
1138 // Cache tous les champs
1139 foreach ($this->champs as $value) {
1140 $form->setType($value, 'hidden');
1141 }
1142
1143 // Les champs historique_signature et statut_signature ne sont pas saisissable dans tous les cas
1144 if ($this->can_display_parapheur() === true && $maj == 3) {
1145 $form->setType('statut_signature', 'selectstatic');
1146 $form->setType('historique_signature', 'jsontotab');
1147 if ($this->getVal('commentaire_signature') == null) {
1148 $form->setType('commentaire_signature', 'hidden');
1149 } else {
1150 $form->setType('commentaire_signature', 'hiddenstatic');
1151 }
1152 }
1153
1154 // Le champ de suivi des notifications des demandeurs n'est pas affichable dans tous les cas
1155 if ($this->can_display_notification_demandeur() === true && $maj == 3) {
1156 $form->setType('suivi_notification', 'jsontotab');
1157 }
1158 // Le champ de suivi des notifications des services n'est pas affichable dans tous les cas
1159 if ($this->can_display_notification_service() === true && $maj == 3) {
1160 $form->setType('suivi_notification_service', 'jsontotab');
1161 }
1162 // Le champ de suivi des notifications des tiers n'est pas affichable dans tous les cas
1163 if ($this->can_display_notification_tiers() === true && $maj == 3) {
1164 $form->setType('suivi_notification_tiers', 'jsontotab');
1165 }
1166
1167 // MODE AJOUTER
1168 if ($this->getParameter('maj') == 0) {
1169 $form->setType('commentaire', 'textareahidden');
1170 // Si l'option est active passage du champ date en lecture seule
1171 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1172 $form->setType("date_evenement", "hiddenstaticdate");
1173 } else {
1174 $form->setType("date_evenement", "date");
1175 }
1176 if ($this->is_in_context_of_foreign_key("evenement", $this->getParameter("retourformulaire"))) {
1177 $form->setType("evenement", "selecthiddenstatic");
1178 } else {
1179 $form->setType("evenement", "select");
1180 }
1181 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1182 $form->setType("signataire_arrete", "selecthiddenstatic");
1183 } else {
1184 $form->setType("signataire_arrete", "select");
1185 }
1186 if ($this->is_option_redaction_libre_enabled() === true) {
1187 $form->setType("flag_edition_integrale", "select");
1188 }
1189 }
1190
1191 // MODE MODIFIER
1192 if ($this->getParameter('maj') == 1) {
1193 // Si l'option est active passage du champ date en lecture seule
1194 if ($this->f->is_option_date_evenement_instruction_lecture_seule($collectivite_di) === true) {
1195 $form->setType("date_evenement", "hiddenstaticdate");
1196 } else {
1197 $form->setType("date_evenement", "date");
1198 }
1199 $form->setType("evenement", "selecthiddenstatic");
1200 if ($this->has_an_edition() === true) {
1201 $form->setType('lettretype', 'hiddenstatic');
1202 if ($this->is_in_context_of_foreign_key("signataire_arrete", $this->getParameter("retourformulaire"))) {
1203 $form->setType("signataire_arrete", "selecthiddenstatic");
1204 } else {
1205 $form->setType("signataire_arrete", "select");
1206 }
1207 if ($this->getVal("flag_edition_integrale") == "t") {
1208 $form->setType("titre_om_htmletat", "htmlEtat");
1209 $form->setType("corps_om_htmletatex", "htmlEtatEx");
1210 } else {
1211 $form->setType("complement_om_html", "html");
1212 $form->setType("complement2_om_html", "html");
1213 $form->setType("complement3_om_html", "html");
1214 $form->setType("complement4_om_html", "html");
1215 $form->setType('bible_auto', 'httpclick');
1216 $form->setType('bible', 'httpclick');
1217 $form->setType('bible2', 'httpclick');
1218 $form->setType('bible3', 'httpclick');
1219 $form->setType('bible4', 'httpclick');
1220 }
1221 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true) {
1222 //
1223 $form->setType('btn_refresh', 'httpclickbutton');
1224 $form->setType('btn_preview', 'httpclickbutton');
1225 $form->setType('btn_redaction', 'httpclickbutton');
1226 // /!\ le type du champs est utilisé dans un selecteur dans le jscript.js
1227 // pour identifiant le champ de prévisualisation et régler sa taille à
1228 // l'affichage du champ. En cas de modification, le selecteur doit également
1229 // être mis à jour
1230 $form->setType('live_preview', 'previsualiser_pdf');
1231 }
1232
1233 // necessaire pour calcul de date en modification
1234 //$form->setType('delai', 'hiddenstatic');
1235 // les administrateurs technique et fonctionnel peuvent
1236 // modifier tous les champs de date
1237 // si l'instruction a déjà été finalisée au moins une fois
1238 if (($this->f->isAccredited(array($this->get_absolute_class_name(), $this->get_absolute_class_name()."modification_dates"), "OR")
1239 || $this->f->isAccredited(array('instruction', 'instruction_modification_dates'), "OR"))
1240 && $this->getVal("date_finalisation_courrier") != '') {
1241 //
1242 $form->setType('date_envoi_signature', 'date');
1243 $form->setType('date_retour_signature', 'date');
1244 if ($this->is_sent_for_signature() === true
1245 && $this->is_signed() === true) {
1246 //
1247 $form->setType("date_envoi_signature", "datereadonly");
1248 $form->setType("date_retour_signature", "datereadonly");
1249 }
1250 $form->setType('date_envoi_rar', 'date');
1251 $form->setType('date_retour_rar', 'date');
1252 $form->setType('date_envoi_controle_legalite', 'date');
1253 if ($this->is_sent_to_cl() === true) {
1254 $form->setType("date_envoi_controle_legalite", "datedisabled");
1255 }
1256 $form->setType('date_retour_controle_legalite', 'date');
1257 $form->setType('date_finalisation_courrier', 'date');
1258 }
1259 }
1260 }
1261
1262 // MODE CONSULTER + SUPPRIMER + SUIVI DES DATES 125 + NOTIFICATION MANUELLE
1263 if ($this->getParameter('maj') == 3
1264 || $this->getParameter('maj') == 2
1265 || $this->getParameter('maj') == 125
1266 || $this->getParameter('maj') == 410) {
1267 //
1268 $form->setType("date_evenement", "datestatic");
1269 $form->setType("evenement", "selecthiddenstatic");
1270 if ($this->has_an_edition() === true) {
1271 $form->setType('lettretype', 'hiddenstatic');
1272 $form->setType("signataire_arrete", "selecthiddenstatic");
1273 if ($this->getVal("om_final_instruction") == 't') {
1274 $form->setType('om_final_instruction_utilisateur', 'textareastatic');
1275 } else {
1276 $form->setType('om_final_instruction_utilisateur', 'hidden');
1277 }
1278 }
1279 if ($this->evenement_has_a_commentaire($this->getVal('evenement')) === true ) {
1280 $form->setType('commentaire', 'textareastatic');
1281 }
1282 }
1283
1284 // MODE CONSULTER + SUPPRIMER + NOTIFICATION MANUELLE
1285 if ($this->getParameter('maj') == 3
1286 || $this->getParameter('maj') == 2
1287 || $this->getParameter('maj') == 410) {
1288 // Si il n'y a pas de lettre type (edition) associé à l'événement
1289 // les dates de suivi ne sont pas affichée
1290 if ($this->has_an_edition() === true) {
1291 $form->setType('date_envoi_signature', 'datestatic');
1292 $form->setType('date_retour_signature', 'datestatic');
1293 $form->setType('date_envoi_rar', 'datestatic');
1294 $form->setType('date_retour_rar', 'datestatic');
1295 $form->setType('date_envoi_controle_legalite', 'datestatic');
1296 $form->setType('date_retour_controle_legalite', 'datestatic');
1297 $form->setType('date_finalisation_courrier', 'datestatic');
1298 if ($this->getVal("flag_edition_integrale") == "t") {
1299 $form->setType("titre_om_htmletat", "htmlstatic");
1300 $form->setType("corps_om_htmletatex", "htmlstatic");
1301 } else {
1302 $form->setType("complement_om_html", "htmlstatic");
1303 $form->setType("complement2_om_html", "htmlstatic");
1304 $form->setType("complement3_om_html", "htmlstatic");
1305 $form->setType("complement4_om_html", "htmlstatic");
1306 }
1307 }
1308 }
1309
1310 // MODE SUIVI DES DATES 125
1311 if ($this->getParameter('maj') == 125) {
1312 $form->setType("date_evenement", "hiddenstaticdate");
1313 $form->setType('om_final_instruction_utilisateur', 'hiddenstatic');
1314 $form->setType('date_envoi_signature', 'date');
1315 $form->setType('date_retour_signature', 'date');
1316 if ($this->is_sent_for_signature() === true
1317 || $this->is_signed() === true) {
1318 //
1319 $form->setType("date_envoi_signature", "datereadonly");
1320 $form->setType("date_retour_signature", "datereadonly");
1321 }
1322 $form->setType('date_envoi_rar', 'date');
1323 $form->setType('date_retour_rar', 'date');
1324 $form->setType('date_envoi_controle_legalite', 'date');
1325 if ($this->is_sent_to_cl() === true) {
1326 $form->setType("date_envoi_controle_legalite", "datedisabled");
1327 }
1328 $form->setType('date_retour_controle_legalite', 'date');
1329 $form->setType('date_finalisation_courrier', 'date');
1330 }
1331
1332 if ($maj == 401) {
1333 foreach ($this->champs as $champ) {
1334 $form->setType($champ, 'hidden');
1335 }
1336 $form->setType('preview_edition', 'previsualiser');
1337 }
1338
1339 // Si l'instruction a été envoyé au contrôle de légalité et que la
1340 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1341 // l'utilisateur que l'envoi au cl est en cours de traitement.
1342 if ($this->is_sent_to_cl() === true
1343 && empty($this->getVal('date_envoi_controle_legalite'))
1344 && $maj == 3) {
1345 $form->setType("date_envoi_controle_legalite", "hiddenstatic");
1346 }
1347 }
1348
1349 function setOnchange(&$form,$maj){
1350 parent::setOnchange($form,$maj);
1351
1352 // MODE AJOUTER
1353 if ($this->getParameter('maj') == 0) {
1354 $form->setOnchange(
1355 "evenement",
1356 "manage_instruction_evenement_lettretype(this.value, '".addslashes($this->getParameter('idxformulaire'))."');
1357 manage_instruction_evenement_commentaire(this.value, '".addslashes($this->getParameter('idxformulaire'))."');"
1358 );
1359 }
1360 }
1361
1362 function evenement_has_an_edition($evenement_id) {
1363 $evenement = $this->get_inst_evenement($evenement_id);
1364 $lettretype = $evenement->getVal('lettretype');
1365 if ($lettretype !== '' && $lettretype !== null) {
1366 return true;
1367 }
1368 return false;
1369 }
1370
1371 function view_evenement_has_an_edition_json() {
1372 $json_return = array(
1373 "lettretype" => $this->evenement_has_an_edition($this->f->get_submitted_get_value('evenement_id')),
1374 "option_redaction_libre_enabled" => $this->is_option_redaction_libre_enabled(),
1375 );
1376 echo json_encode($json_return);
1377 }
1378
1379 function evenement_has_a_commentaire($evenement_id) {
1380 $evenement = $this->get_inst_evenement($evenement_id);
1381 return $this->get_boolean_from_pgsql_value($evenement->getVal('commentaire'));
1382 }
1383
1384 function view_evenement_has_a_commentaire_json() {
1385 $json_return = array(
1386 "commentaire" => $this->evenement_has_a_commentaire($this->f->get_submitted_get_value('evenement_id'))
1387 );
1388 echo json_encode($json_return);
1389 }
1390
1391
1392 /**
1393 * CONDITION - can_be_sended_to_cl
1394 *
1395 * Vérifie que le contrôle de légalité est disponible
1396 *
1397 * @return boolean
1398 */
1399 function can_be_sended_to_cl() {
1400 // Si l'instruction a une édition
1401 // et que l'événement est paramétré pour envoyer le contrôle de légalité
1402 // par Plat'AU
1403 // et que la date de retour signature est renseignée
1404 // et que la date d'envoi au contrôle légalité n'est pas renseignée
1405 // et qu'il n'existe pas de task envoi_CL en cours (!= done ou canceled)
1406 if ($this->has_an_edition() === true) {
1407 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
1408 $inst_evenement = $this->get_inst_evenement($this->getVal('evenement'));
1409 if ($inst_evenement->getVal('envoi_cl_platau') === 't'
1410 && empty($this->getVal('date_retour_signature')) === false
1411 && empty($this->getVal('date_envoi_controle_legalite')) === true
1412 && $this->getVal('envoye_cl_platau') === 'f'
1413 && $this->f->is_type_dossier_platau($inst_di->getVal('dossier_autorisation')) === true
1414 && $inst_di->getVal('etat_transmission_platau') !== 'jamais_transmissible') {
1415 //
1416 return true;
1417 }
1418 }
1419 //
1420 return false;
1421 }
1422
1423 /**
1424 *
1425 * @return string
1426 */
1427 function get_var_sql_forminc__sql_signataire_arrete() {
1428 return sprintf(
1429 "SELECT
1430 signataire_arrete.signataire_arrete,
1431 CONCAT_WS(
1432 ' - ',
1433 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1434 signataire_habilitation.libelle,
1435 signataire_arrete.description
1436 )
1437 FROM
1438 %1\$ssignataire_arrete
1439 LEFT JOIN %1\$ssignataire_habilitation
1440 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1441 WHERE
1442 ((signataire_arrete.om_validite_debut IS NULL
1443 AND (signataire_arrete.om_validite_fin IS NULL
1444 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1445 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1446 AND (signataire_arrete.om_validite_fin IS NULL
1447 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1448 ORDER BY
1449 signataire_arrete.prenom,
1450 signataire_arrete.nom",
1451 DB_PREFIXE
1452 );
1453 }
1454
1455 /**
1456 *
1457 * @return string
1458 */
1459 function get_var_sql_forminc__sql_signataire_arrete_by_id() {
1460 return sprintf(
1461 "SELECT
1462 signataire_arrete.signataire_arrete,
1463 CONCAT_WS(
1464 ' - ',
1465 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1466 signataire_habilitation.libelle,
1467 signataire_arrete.description
1468 )
1469 FROM
1470 %1\$ssignataire_arrete
1471 LEFT JOIN %1\$ssignataire_habilitation
1472 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1473 WHERE
1474 signataire_arrete.signataire_arrete = <idx>",
1475 DB_PREFIXE
1476 );
1477 }
1478
1479 /**
1480 *
1481 * @return string
1482 */
1483 function get_var_sql_forminc__sql_signataire_arrete_by_di() {
1484 return sprintf(
1485 "SELECT
1486 signataire_arrete.signataire_arrete,
1487 CONCAT_WS(
1488 ' - ',
1489 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1490 signataire_habilitation.libelle,
1491 signataire_arrete.description
1492 )
1493 FROM
1494 %1\$ssignataire_arrete
1495 LEFT JOIN %1\$som_collectivite
1496 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1497 LEFT JOIN %1\$ssignataire_habilitation
1498 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1499 WHERE
1500 ((signataire_arrete.om_validite_debut IS NULL
1501 AND (signataire_arrete.om_validite_fin IS NULL
1502 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1503 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1504 AND (signataire_arrete.om_validite_fin IS NULL
1505 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1506 AND (om_collectivite.niveau = '2'
1507 OR signataire_arrete.om_collectivite = <collectivite_di>)
1508 ORDER BY
1509 signataire_arrete.prenom, signataire_arrete.nom",
1510 DB_PREFIXE
1511 );
1512 }
1513
1514 /**
1515 *
1516 * @return string
1517 */
1518 function get_var_sql_forminc__sql_signataire_arrete_defaut() {
1519 return sprintf(
1520 "SELECT
1521 signataire_arrete.signataire_arrete,
1522 CONCAT_WS(
1523 ' - ',
1524 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1525 signataire_habilitation.libelle,
1526 signataire_arrete.description
1527 )
1528 FROM
1529 %1\$ssignataire_arrete
1530 LEFT JOIN %1\$ssignataire_habilitation
1531 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1532 WHERE
1533 ((signataire_arrete.om_validite_debut IS NULL
1534 AND (signataire_arrete.om_validite_fin IS NULL
1535 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1536 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1537 AND (signataire_arrete.om_validite_fin IS NULL
1538 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1539 AND signataire_arrete.defaut IS TRUE
1540 ORDER BY
1541 signataire_arrete.prenom, signataire_arrete.nom",
1542 DB_PREFIXE
1543 );
1544 }
1545
1546 /**
1547 *
1548 * @return string
1549 */
1550 function get_var_sql_forminc__sql_signataire_arrete_defaut_by_di() {
1551 return sprintf(
1552 "SELECT
1553 signataire_arrete.signataire_arrete,
1554 CONCAT_WS(
1555 ' - ',
1556 CONCAT_WS(' ', signataire_arrete.prenom, signataire_arrete.nom),
1557 signataire_habilitation.libelle,
1558 signataire_arrete.description
1559 )
1560 FROM
1561 %1\$ssignataire_arrete
1562 LEFT JOIN %1\$ssignataire_habilitation
1563 ON signataire_arrete.signataire_habilitation = signataire_habilitation.signataire_habilitation
1564 LEFT JOIN %1\$som_collectivite
1565 ON signataire_arrete.om_collectivite = om_collectivite.om_collectivite
1566 WHERE
1567 ((signataire_arrete.om_validite_debut IS NULL
1568 AND (signataire_arrete.om_validite_fin IS NULL
1569 OR signataire_arrete.om_validite_fin > CURRENT_DATE))
1570 OR (signataire_arrete.om_validite_debut <= CURRENT_DATE
1571 AND (signataire_arrete.om_validite_fin IS NULL
1572 OR signataire_arrete.om_validite_fin > CURRENT_DATE)))
1573 AND signataire_arrete.defaut IS TRUE
1574 AND (om_collectivite.niveau = '2'
1575 OR signataire_arrete.om_collectivite = <collectivite_di>)
1576 ORDER BY
1577 signataire_arrete.prenom,
1578 signataire_arrete.nom",
1579 DB_PREFIXE
1580 );
1581 }
1582
1583 /**
1584 * SETTER_FORM - setSelect.
1585 *
1586 * @return void
1587 */
1588 function setSelect(&$form, $maj, &$dnu1 = null, $dnu2 = null) {
1589 //parent::setSelect($form, $maj);
1590 /**
1591 * On ne surcharge pas la méthode parent car une requête sur la table
1592 * dossier est mauvaise pour les performances, car la requête qui
1593 * concerne evenement est plus complexe que celle générée et car les
1594 * champs action, avis_decision et etat ne sont pas utilisés comme des
1595 * select
1596 */
1597 //// action
1598 //$this->init_select($form, $this->f->db, $maj, null, "action",
1599 // $sql_action, $sql_action_by_id, false);
1600
1601 //// avis_decision
1602 //$this->init_select($form, $this->f->db, $maj, null, "avis_decision",
1603 // $sql_avis_decision, $sql_avis_decision_by_id, false);
1604
1605 //// dossier
1606 //$this->init_select($form, $this->f->db, $maj, null, "dossier",
1607 // $sql_dossier, $sql_dossier_by_id, false);
1608
1609 //// etat
1610 //$this->init_select($form, $this->f->db, $maj, null, "etat",
1611 // $sql_etat, $sql_etat_by_id, false);
1612
1613 //// evenement
1614 //$this->init_select($form, $this->f->db, $maj, null, "evenement",
1615 // $sql_evenement, $sql_evenement_by_id, false);
1616
1617 // signataire_arrete
1618 // si contexte DI
1619 if ($this->getParameter("retourformulaire") == "dossier"
1620 || $this->getParameter("retourformulaire") == "dossier_instruction"
1621 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1622 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1623 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1624 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1625 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1626 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1627 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1628 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1629 // on recupère les signataires de la multicollectivité et de celle du DI
1630 $di = $this->f->get_inst__om_dbform(array(
1631 "obj" => "dossier_instruction",
1632 "idx" => $this->getParameter('idxformulaire'),
1633 ));
1634 $sql_signataire_arrete_by_di = str_replace(
1635 '<collectivite_di>',
1636 $di->getVal("om_collectivite"),
1637 $this->get_var_sql_forminc__sql("signataire_arrete_by_di")
1638 );
1639 $this->init_select(
1640 $form,
1641 $this->f->db,
1642 $maj,
1643 null,
1644 "signataire_arrete",
1645 $sql_signataire_arrete_by_di,
1646 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1647 true
1648 );
1649 } else {
1650 $this->init_select(
1651 $form,
1652 $this->f->db,
1653 $maj,
1654 null,
1655 "signataire_arrete",
1656 $this->get_var_sql_forminc__sql("signataire_arrete"),
1657 $this->get_var_sql_forminc__sql("signataire_arrete_by_id"),
1658 true
1659 );
1660 }
1661
1662 /**
1663 * Gestion du filtre sur les événements de workflow disponibles
1664 * On récupère ici en fonction de l'état du dossier d'instruction en
1665 * cours et du type du dossier d'instruction en cours la liste
1666 * événements disponibles.
1667 */
1668 if ($maj == 0) {
1669 // Récupération des événements par une jointure entre la table dossier
1670 // et la table transition et la table evenement et la table
1671 // lien_dossier_instruction_type_evenement en fonction de l'identifiant
1672 // du dossier d'instruction en cours
1673 $sql = "SELECT
1674 evenement.evenement,
1675 evenement.libelle as lib
1676 FROM ".DB_PREFIXE."dossier
1677 INNER JOIN ".DB_PREFIXE."lien_dossier_instruction_type_evenement
1678 ON dossier.dossier_instruction_type=lien_dossier_instruction_type_evenement.dossier_instruction_type
1679 INNER JOIN ".DB_PREFIXE."evenement
1680 ON evenement.evenement=lien_dossier_instruction_type_evenement.evenement
1681 INNER JOIN ".DB_PREFIXE."transition
1682 ON evenement.evenement = transition.evenement
1683 AND dossier.etat=transition.etat
1684 WHERE dossier.dossier='".$this->getParameter("idxformulaire")."' ";
1685
1686 // Si changement de décision par instructeur commune
1687 if($this->f->isUserInstructeur() === true
1688 && $this->getDivisionFromDossier($this->getParameter("idxformulaire")) != $_SESSION["division"]
1689 && $this->isInstrCanChangeDecision($this->getParameter("idxformulaire")) === true) {
1690 $sql .= "AND evenement.type IN ('arrete', 'changement_decision') ";
1691 }
1692 $sql .= "ORDER BY evenement.libelle, evenement.action";
1693 $res = $this->f->db->query($sql);
1694 $this->addToLog("setSelect(): db->query(\"".$sql."\");", VERBOSE_MODE);
1695 if (database::isError($res)) {
1696 die($res->getMessage());
1697 }
1698 // Remplissage du tableau du select
1699 $contenu = array(
1700 0 => array("",),
1701 1 => array(_('choisir')." "._('evenement'),)
1702 );
1703 while ($row=& $res->fetchRow()) {
1704 $contenu[0][] = $row[0];
1705 $contenu[1][] = $row[1];
1706 }
1707 $form->setSelect("evenement", $contenu);
1708
1709 } else {
1710 $sql = "SELECT
1711 evenement.libelle as lib
1712 FROM ".DB_PREFIXE."evenement
1713 WHERE evenement.evenement=".$this->getVal("evenement")."";
1714 $res = $this->f->db->getone($sql);
1715 $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1716 if (database::isError($res)) {
1717 die($res->getMessage());
1718 }
1719 //
1720 $contenu = array(
1721 0 => array($this->getVal("evenement"),),
1722 1 => array($res,)
1723 );
1724 $form->setSelect("evenement", $contenu);
1725 }
1726
1727 /**
1728 * Gesion des liens vers la bible
1729 */
1730 // lien bible_auto
1731 $contenu = array(_("automatique"));
1732 $form->setSelect("bible_auto",$contenu);
1733 // lien bible1
1734 $contenu = array(_("bible"));
1735 $form->setSelect("bible",$contenu);
1736 // lien bible2
1737 $contenu = array(_("bible"));
1738 $form->setSelect("bible2",$contenu);
1739 // lien bible3
1740 $contenu = array(_("bible"));
1741 $form->setSelect("bible3",$contenu);
1742 // lien bible4
1743 $contenu = array(_("bible"));
1744 $form->setSelect("bible4",$contenu);
1745
1746 if ($maj == 1) {
1747 $base64 = $this->init_pdf_temp();
1748 $form->setSelect('live_preview', array('base64'=>$base64));
1749 $form->setSelect("btn_refresh", array(_('Prévisualiser')));
1750 $form->setSelect("btn_preview", array(_('Prévisualiser >>')));
1751 $form->setSelect("btn_redaction", array(_('<< Rédiger')));
1752 }
1753
1754 // Selection du type de rédaction à l'ajout
1755 $content = array(
1756 0 => array('f', 't', ),
1757 1 => array(_('Rédaction par compléments'), _('Rédaction libre'), ),
1758 );
1759 $form->setSelect('flag_edition_integrale', $content);
1760
1761 $contenu = array();
1762 foreach(array('waiting', 'in_progress', 'canceled', 'expired', 'finished') as $value) {
1763 $contenu[0][] = $value;
1764 $contenu[1][] = $this->get_trad_for_statut($value);
1765 }
1766 $form->setSelect('statut_signature', $contenu);
1767
1768
1769 if ($maj == 401) {
1770 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
1771 $form->setSelect('preview_edition', array(
1772 'base64' => base64_encode($file['file_content']),
1773 'mimetype' => $file['metadata']['mimetype'],
1774 'label' => 'instruction_'.$this->getVal($this->clePrimaire),
1775 'href' => sprintf(
1776 '../app/index.php?module=form&snippet=file&obj=instruction&champ=om_fichier_instruction&id=%1$s',
1777 $this->getVal($this->clePrimaire)
1778 )
1779 ));
1780 }
1781 }
1782
1783 function cleSecondaire($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
1784 //
1785 // Vérifie uniquementla cle secondaire : demande
1786 $this->rechercheTable($this->f->db, "demande", "instruction_recepisse", $id);
1787
1788 $id = $this->getVal($this->clePrimaire);
1789
1790
1791 //Requête de vérification que cet événement d'instruction n'est pas lié
1792 //à la création d'un dossier d'instruction
1793 $sql = "SELECT demande_type.dossier_instruction_type
1794 FROM ".DB_PREFIXE."demande_type
1795 LEFT JOIN ".DB_PREFIXE."demande
1796 ON demande.demande_type = demande_type.demande_type
1797 WHERE demande.instruction_recepisse = ".$id;
1798 $res = $this->f->db->getOne($sql);
1799 $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1800 if (database::isError($res)) {
1801 die($res->getMessage());
1802 }
1803
1804 // Aucune clé secondaire n'a été trouvée ou c'est un événement sans
1805 //création de dossier d'instruction, l'événement d'instruction peut être
1806 //supprimé
1807 if ( $this->correct !== false || $res == null || $res == ""){
1808
1809 // Requête de vérification que cet événement d'instruction est lié
1810 // à une demande
1811 $sql = "SELECT demande
1812 FROM ".DB_PREFIXE."demande
1813 WHERE instruction_recepisse = ".$id;
1814 $res = $this->f->db->getOne($sql);
1815 $this->addToLog("cleSecondaire(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1816 if (database::isError($res)) {
1817 die($res->getMessage());
1818 }
1819
1820 //Si c'est un événement d'instruction lié à une demande
1821 if ($res != null || $res != ""){
1822 $demande = $this->f->get_inst__om_dbform(array(
1823 "obj" => "demande",
1824 "idx" => $res,
1825 ));
1826
1827 //On met à jour la demande en supprimant la liaison vers
1828 //l'événement d'instruction
1829 $demande->setParameter("maj", 1);
1830 $valF = array();
1831 foreach($demande->champs as $identifiant => $champ) {
1832 $valF[$champ] = $demande->val[$identifiant];
1833 }
1834 $valF['date_demande']=$demande->dateDBToForm($valF['date_demande']);
1835 $valF['instruction_recepisse']=NULL;
1836 $ret = $demande->modifier($valF);
1837 }
1838
1839 /**
1840 * Vérification que l'élément supprimé est le dernier pour pouvoir
1841 * remodifier les données de manière itérative.
1842 */
1843 // Initialisation
1844 $dernierevenement = "";
1845 // Récupération du dernier élément de la table d'instruction qui
1846 // concerne le dossier en cours
1847 $sql = "SELECT max(instruction)
1848 FROM ".DB_PREFIXE."instruction
1849 WHERE dossier ='".$this->getParameter("idxformulaire")."'";
1850 $dernierevenement = $this->f->db->getOne($sql);
1851 $this->addToLog("setSelect(): db->getone(\"".$sql."\");", VERBOSE_MODE);
1852 if (database::isError($dernierevenement)) {
1853 die($dernierevenement->getMessage());
1854 }
1855 // Si on se trouve effectivement sur le dernier evenement d'instruction
1856 if ($dernierevenement == $id) {
1857 // Alors on valide la suppression
1858 $this->correct = true;
1859 $this->addToMessage(_('Destruction_chronologique'));
1860 } else {
1861 // Alors on annule la suppression
1862 $this->correct = false;
1863 $this->addToMessage(_("Seul le dernier evenement d'instruction peut etre supprime."));
1864 }
1865 }
1866 }
1867
1868 /**
1869 * Vérification de la possibilité ou non de modifier des dates de suivi
1870 * @param string $champ champ date à vérifier
1871 */
1872 function updateDate($champ) {
1873
1874 //Si le retourformulaire est "dossier_instruction"
1875 if ($this->getParameter("retourformulaire") == "dossier"
1876 || $this->getParameter("retourformulaire") == "dossier_instruction"
1877 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1878 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1879 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1880 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1881 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1882 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1883 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1884 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1885
1886 // Vérification de la possibilité de modifier les dates si déjà éditées
1887 if($this->valF[$champ] != "" AND !$this->f->user_is_admin) {
1888 // si l'utilisateur n'est pas un admin
1889 if($this->getVal($champ) != "" AND $this->getVal($champ) != $this->valF[$champ]) {
1890 $this->correct = false;
1891 $this->addToMessage(_("Les dates de suivis ne peuvent etre modifiees"));
1892 }
1893 }
1894 }
1895
1896 //
1897 return true;
1898 }
1899
1900 /**
1901 * SETTER_FORM - setValsousformulaire (setVal).
1902 *
1903 * @return void
1904 */
1905 function setValsousformulaire(&$form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire, &$dnu1 = null, $dnu2 = null) {
1906 // parent::setValsousformulaire($form, $maj, $validation, $idxformulaire, $retourformulaire, $typeformulaire);
1907 //
1908 $this->retourformulaire = $retourformulaire;
1909 //
1910 if ($maj == 0) {
1911 $form->setVal("destinataire", $this->getParameter("idxformulaire"));
1912 $form->setVal("dossier", $this->getParameter("idxformulaire"));
1913 }
1914
1915 // Si l'instruction a été envoyé au contrôle de légalité et que la
1916 // tâche envoi_cl lié n'a pas encore été traité il faut indiquer à
1917 // l'utilisateur que l'envoi au cl est en cours de traitement.
1918 if ($this->is_sent_to_cl() === true
1919 && empty($this->getVal('date_envoi_controle_legalite'))
1920 && $maj == 3) {
1921 $form->setVal("date_envoi_controle_legalite", __("En cours de traitement."));
1922 }
1923 //
1924 $this->set_form_default_values($form, $maj, $validation);
1925 }
1926
1927 /**
1928 * SETTER_FORM - set_form_default_values (setVal).
1929 *
1930 * @return void
1931 */
1932 function set_form_default_values(&$form, $maj, $validation) {
1933 //
1934 if ($maj == 0) {
1935 // si contexte DI
1936 if ($this->getParameter("retourformulaire") == "dossier"
1937 || $this->getParameter("retourformulaire") == "dossier_instruction"
1938 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_encours"
1939 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_encours"
1940 || $this->getParameter("retourformulaire") == "dossier_instruction_mes_clotures"
1941 || $this->getParameter("retourformulaire") == "dossier_instruction_tous_clotures"
1942 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_infractions"
1943 || $this->getParameter("retourformulaire") == "dossier_contentieux_toutes_infractions"
1944 || $this->getParameter("retourformulaire") == "dossier_contentieux_mes_recours"
1945 || $this->getParameter("retourformulaire") == "dossier_contentieux_tous_recours") {
1946 // on recupère les signataires de la multicollectivité et de celle du DI
1947 $di = $this->f->get_inst__om_dbform(array(
1948 "obj" => "dossier_instruction",
1949 "idx" => $this->getParameter("idxformulaire"),
1950 ));
1951 $sql = str_replace(
1952 "<collectivite_di>",
1953 $di->getVal("om_collectivite"),
1954 $this->get_var_sql_forminc__sql("signataire_arrete_defaut_by_di")
1955 );
1956 } else {
1957 $sql = $this->get_var_sql_forminc__sql("signataire_arrete_defaut");
1958 }
1959 $res = $this->f->db->query($sql);
1960 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
1961 $this->f->isDatabaseError($res);
1962 $row = $res->fetchrow(DB_FETCHMODE_ASSOC);
1963 if (isset($row["signataire_arrete"])
1964 && is_numeric($row["signataire_arrete"])) {
1965 //
1966 $form->setVal("signataire_arrete", $row["signataire_arrete"]);
1967 }
1968 // Date du jour
1969 $form->setVal("date_evenement", date("Y-m-d"));
1970 }
1971 //
1972 if ($maj == 0 || $maj == 1 || $maj == 125) {
1973 $form->setVal("bible_auto", "bible_auto()");
1974 $form->setVal("bible", "bible(1)");
1975 $form->setVal("bible2", "bible(2)");
1976 $form->setVal("bible3", "bible(3)");
1977 $form->setVal("bible4", "bible(4)");
1978 }
1979 //
1980 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
1981 if ($maj == 1
1982 && $this->f->is_option_preview_pdf_enabled($collectivite_di) === true
1983 && $this->has_an_edition() === true) {
1984 //
1985 $form->setVal("live_preview", $this->getVal($this->clePrimaire));
1986 $form->setVal("btn_refresh", "reload_pdf_viewer()");
1987 $form->setVal("btn_preview", "show_instr_preview()");
1988 $form->setVal("btn_redaction", "show_instr_redaction()");
1989 }
1990
1991 if ($maj == 3
1992 && $this->can_display_notification_demandeur()
1993 ) {
1994 $typeNotification = array(
1995 'notification_recepisse',
1996 'notification_instruction',
1997 'notification_decision',
1998 );
1999 $form->setVal("suivi_notification", $this->get_json_suivi_notification($typeNotification, true));
2000 }
2001 if ($maj == 3
2002 && $this->can_display_notification_service()
2003 ) {
2004 $form->setVal("suivi_notification_service", $this->get_json_suivi_notification(array('notification_service_consulte')));
2005 }
2006 if ($maj == 3
2007 && $this->can_display_notification_tiers()
2008 ) {
2009 $form->setVal("suivi_notification_tiers", $this->get_json_suivi_notification(array('notification_tiers_consulte')));
2010 }
2011 }
2012
2013 function setLayout(&$form, $maj){
2014 // En consultation, pour les dossiers qui n'ont pas été transmis par le portail
2015 // citoyen, si la notification des demandeurs est activée sur l'évenement
2016 // d'instruction et que le paramétrage du demandeur principal n'est pas
2017 // correct alors un message a destination de l'instructeur est affiché.
2018 if ($maj == 3) {
2019 // Si le dossier n'a pas été déposé sur le portail citoyen ou si
2020 // la requête permettant de savoir le type de demande à échouée, on
2021 // vérifie si il y a des erreurs de paramétrage et si c'est le cas
2022 // on affiche un message d'information
2023 if ($this->dossier_depose_sur_portail() == null ||
2024 ! $this->dossier_depose_sur_portail()) {
2025 $erreurParam = $this->get_info_notification_fail();
2026 // Récupération de l'évenement d'instruction
2027 $instEV = $this->get_inst_evenement();
2028 if (! empty($instEV->getVal('notification')) && $erreurParam != array()) {
2029 $class = 'text-info ui-state-highlight ui-state-info';
2030 $message = __("Attention l'envoi de notification automatique n'est pas possible.");
2031 $this->f->display_panel_information(
2032 $class,
2033 $message,
2034 $erreurParam,
2035 __('Veuillez corriger les informations suivantes.'),
2036 'erreur_param_notif'
2037 );
2038 }
2039 }
2040 }
2041 $form->setBloc('evenement','D',"","sousform-instruction-action-".$maj);
2042
2043 $form->setFieldset('evenement','D',_('Evenement'));
2044 $form->setFieldset('om_final_instruction_utilisateur','F','');
2045
2046 $form->setBloc('om_final_instruction_utilisateur','F');
2047
2048 $form->setBloc('date_finalisation_courrier','D',"","");
2049
2050 $form->setFieldset('date_finalisation_courrier','D',_('Dates'));
2051 $form->setBloc('date_finalisation_courrier','D',"","col_6");
2052 $form->setBloc('date_envoi_controle_legalite','F');
2053
2054 $form->setBloc('date_retour_signature','D',"","col_6");
2055 $form->setBloc('date_retour_controle_legalite','F');
2056 $form->setFieldset('date_retour_controle_legalite','F','');
2057
2058 $form->setBloc('date_retour_controle_legalite','F');
2059
2060 $form->setBloc('statut_signature','D');
2061 $form->setFieldset('statut_signature','D','Suivi Parapheur');
2062 $form->setBloc('commentaire_signature','F');
2063 $form->setBloc('historique_signature','D');
2064 $form->setFieldset('historique_signature', 'DF', __("Historique"), "collapsible, startClosed");
2065 $form->setBloc('historique_signature','F');
2066 $form->setFieldset('historique_signature','F');
2067
2068 $form->setFieldset('suivi_notification', 'D', __("Suivi notification"), "collapsible");
2069 $form->setFieldset('suivi_notification','F');
2070 $form->setFieldset('suivi_notification_service', 'D', __("Suivi notification service"), "collapsible");
2071 $form->setFieldset('suivi_notification_service','F');
2072 $form->setFieldset('suivi_notification_tiers', 'D', __("Suivi notification tiers"), "collapsible");
2073 $form->setFieldset('suivi_notification_tiers','F');
2074
2075 if ($maj == 1) {
2076 // Récupère la collectivité du dossier d'instruction
2077 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
2078
2079 //
2080 if ($this->f->is_option_preview_pdf_enabled($collectivite_di) === true
2081 && $this->has_an_edition() === true) {
2082 //
2083 $form->setBloc('complement_om_html','D',"","container_instr_edition");
2084 $form->setBloc('complement_om_html','D',"","hidelabel box_instr_edition redaction_instr_edition");
2085 $form->setBloc('complement_om_html','D',"","box_instr_edition_main");
2086 $form->setFieldset('complement_om_html','D',_('Complement'));
2087 $form->setFieldset('bible','F','');
2088 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2089 $form->setFieldset('bible2','F','');
2090 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2091 $form->setFieldset('bible3','F','');
2092 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2093 $form->setFieldset('bible4','F','');
2094 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2095 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2096 $form->setBloc('corps_om_htmletatex','F');
2097 $form->setBloc('btn_preview','DF',"","box_instr_edition_btn");
2098 $form->setBloc('btn_preview','F');
2099 $form->setBloc('btn_redaction','D', '',"hidelabel box_instr_edition preview_instr_edition");
2100 $form->setBloc('btn_redaction','DF',"","box_instr_edition_btn");
2101 $form->setFieldset('btn_refresh','D',_('Prévisualisation'), "box_instr_edition_main");
2102 $form->setFieldset('live_preview','F');
2103 $form->setBloc('live_preview','F');
2104 $form->setBloc('live_preview','F');
2105 } else {
2106 $form->setBloc('complement_om_html','D',"","hidelabel");
2107 $form->setFieldset('complement_om_html','D',_('Complement'));
2108 $form->setFieldset('bible','F','');
2109 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2110 $form->setFieldset('bible2','F','');
2111 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2112 $form->setFieldset('bible3','F','');
2113 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2114 $form->setFieldset('bible4','F','');
2115 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2116 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2117 $form->setBloc('corps_om_htmletatex','F');
2118 }
2119 } else {
2120 $form->setBloc('complement_om_html','D',"","hidelabel");
2121 $form->setFieldset('complement_om_html','D',_('Complement'));
2122 $form->setFieldset('bible','F','');
2123 $form->setFieldset('complement2_om_html','D',_('Complement 2'));
2124 $form->setFieldset('bible2','F','');
2125 $form->setFieldset('complement3_om_html','D',_('Complement 3'));
2126 $form->setFieldset('bible3','F','');
2127 $form->setFieldset('complement4_om_html','D',_('Complement 4'));
2128 $form->setFieldset('bible4','F','');
2129 $form->setFieldset('titre_om_htmletat','DF',_('Titre'), 'startClosed');
2130 $form->setFieldset('corps_om_htmletatex','DF',_('Corps'));
2131 $form->setBloc('corps_om_htmletatex','F');
2132 }
2133 }
2134
2135 function setLib(&$form, $maj) {
2136 //
2137 parent::setLib($form, $maj);
2138 //
2139 $form->setLib('bible_auto', "");
2140 $form->setLib('bible', "");
2141 $form->setLib('bible2', "");
2142 $form->setLib('bible3', "");
2143 $form->setLib('bible4', "");
2144 $form->setLib('btn_refresh', "");
2145 $form->setLib('btn_preview', "");
2146 $form->setLib('btn_redaction', "");
2147 $form->setLib('live_preview', "");
2148 $form->setLib('om_final_instruction_utilisateur', _("finalise par"));
2149 $form->setLib('date_envoi_rar', __("date_envoi_ar"));
2150 $form->setLib('date_retour_rar', __("date_notification"));
2151 $form->setLib('statut_signature', __("statut"));
2152 $form->setLib('commentaire_signature', __("commentaire"));
2153 $form->setLib('historique_signature', '');
2154 $form->setLib('suivi_notification', '');
2155 $form->setLib('suivi_notification_service', '');
2156 $form->setLib('suivi_notification_tiers', '');
2157 $form->setLib('preview_edition', "");
2158
2159 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2160 // ajout et que l'option de rédaction libre est activée sur la
2161 // collectivité du dossier
2162 if ($maj === '0' && $this->is_option_redaction_libre_enabled() === true) {
2163 //
2164 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2165 $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.");
2166 $form->setLib('flag_edition_integrale', sprintf($help_text_template, _("Type de rédaction"), $help_text));
2167 }
2168 else {
2169 $form->setLib('flag_edition_integrale', _("Type de rédaction"));
2170 }
2171
2172 // Ajout d'une infobulle d'aide lorsque le formulaire est en mode
2173 // modification et que l'option de prévisualisation de l'édition est
2174 // activée sur la collectivité du dossier
2175 if ($maj === '1'
2176 && $this->f->is_option_preview_pdf_enabled($this->get_dossier_instruction_om_collectivite()) === true) {
2177 //
2178 $help_text_template = '%s <span class="info-16" title="%s"></span>';
2179 $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.");
2180 $form->setLib('date_evenement', sprintf($help_text_template, _('date_evenement'), $help_text));
2181 $form->setLib('signataire_arrete', sprintf($help_text_template, _('signataire_arrete'), $help_text));
2182 }
2183 }
2184
2185 /**
2186 * TRIGGER - triggerajouter.
2187 *
2188 * @return boolean
2189 */
2190 function triggerajouter($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2191 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2192 /**
2193 * Le code suivant permet de récupérer des valeurs des tables evenement
2194 * et dossier pour les stocker dans l'instruction :
2195 * DEPUIS L'EVENEMENT
2196 * - action
2197 * - delai
2198 * - accord_tacite
2199 * - etat
2200 * - avis_decision
2201 * - delai_notification
2202 * - lettretype
2203 * - autorite_competente
2204 * - pec_metier
2205 * - complement_om_html
2206 * - complement2_om_html
2207 * - complement3_om_html
2208 * - complement4_om_html
2209 * - complement5_om_html
2210 * DEPUIS LE DOSSIER D'INSTRUCTION
2211 * - archive_delai
2212 * - archive_accord_tacite
2213 * - archive_etat
2214 * - archive_avis
2215 * - date_complet
2216 * - date_rejet
2217 * - date_limite
2218 * - date_notification_delai
2219 * - date_decision
2220 * - date_validite
2221 * - date_achevement
2222 * - date_chantier
2223 * - date_conformite
2224 * - avis_decision
2225 */
2226 // Récupération de tous les paramètres de l'événement sélectionné
2227 $sql = "SELECT * FROM ".DB_PREFIXE."evenement
2228 WHERE evenement=".$this->valF['evenement'];
2229 $res = $this->f->db->query($sql);
2230 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2231 if (database::isError($res)) {
2232 die($res->getMessage());
2233 }
2234 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2235 // Récupération de l'identifiant de l'action
2236 // si une action est paramétrée dans l'événement
2237 $this->valF['action'] = NULL;
2238 if (isset($row['action']) and !empty($row['action'])) {
2239 $this->valF['action']=$row['action'];
2240 }
2241 // Récupération de la valeur du délai
2242 $this->valF['delai'] = $row['delai'];
2243 // Récupération de l'identifiant de l'état
2244 // si un état est paramétré dans l'événement
2245 $this->valF['etat']=NULL;
2246 if (isset($row['etat']) and !empty($row['etat'])) {
2247 $this->valF['etat']=$row['etat'];
2248 }
2249 // Récupération de la valeur d'accord tacite
2250 $this->valF['accord_tacite']=$row['accord_tacite'];
2251 // Récupération de la valeur du délai de notification
2252 $this->valF['delai_notification']=$row['delai_notification'];
2253 // Récupération de l'identifiant de l'avis
2254 // si un avis est paramétré dans l'événement
2255 $this->valF['avis_decision'] = NULL;
2256 if(isset($row['avis_decision']) and !empty($row['avis_decision'])) {
2257 $this->valF['avis_decision']=$row['avis_decision'];
2258 }
2259 // Récupération de la valeur de l'autorité compétente
2260 // si l'autorité compétente est paramétré dans l'événement
2261 $this->valF['autorite_competente'] = NULL;
2262 if(isset($row['autorite_competente']) and !empty($row['autorite_competente'])) {
2263 $this->valF['autorite_competente']=$row['autorite_competente'];
2264 }
2265 // Récupération de la valeur de la lettre type
2266 $this->valF['lettretype']=$row['lettretype'];
2267 // Récupération de la valeur de la prise en compte métier
2268 // si la prise en compte métier est paramétrée dans l'événement
2269 $this->valF['pec_metier'] = NULL;
2270 if(isset($row['pec_metier']) === true and empty($row['pec_metier']) === false) {
2271 $this->valF['pec_metier'] = $row['pec_metier'];
2272 }
2273 }
2274 // Récupération de toutes les valeurs du dossier d'instruction en cours
2275 $sql = "SELECT * FROM ".DB_PREFIXE."dossier
2276 WHERE dossier='".$this->valF['dossier']."'";
2277 $res = $this->f->db->query($sql);
2278 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2279 if (database::isError($res)) {
2280 die($res->getMessage());
2281 }
2282 $row=& $res->fetchRow(DB_FETCHMODE_ASSOC);
2283 $this->updateArchiveData($row);
2284
2285 // Récupération de la duree de validite du dossier d'autorisation
2286 $sql = "SELECT duree_validite_parametrage
2287 FROM ".DB_PREFIXE."dossier_autorisation_type_detaille
2288 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
2289 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
2290 LEFT JOIN ".DB_PREFIXE."dossier
2291 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
2292 WHERE dossier.dossier='".$this->valF['dossier']."'";
2293 $duree_validite_parametrage = $this->f->db->getOne($sql);
2294 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
2295 database::isError($duree_validite_parametrage);
2296 if ($duree_validite_parametrage != '') {
2297 $this->valF['duree_validite_parametrage']= $duree_validite_parametrage;
2298 }
2299
2300 // Identifiant du type de courrier
2301 $idTypeCourrier = '11';
2302 $idCourrier = str_pad($this->valF["instruction"], 10, "0", STR_PAD_LEFT);
2303 // Code barres
2304 $this->valF["code_barres"] = $idTypeCourrier . $idCourrier;
2305 }
2306
2307 /**
2308 * Test si une restriction est valide.
2309 *
2310 * @return boolean
2311 */
2312 function restrictionIsValid($restriction){
2313 if($this->restriction_valid != null) {
2314 return $this->restriction_valid;
2315 }
2316 if(empty($restriction)) {
2317 $this->restriction_valid = true;
2318 return $this->restriction_valid;
2319 }
2320 // Liste des opérateurs possibles sans espace
2321 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
2322 // Liste identique mais avec le marqueur §
2323 $mark = "§";
2324 $operateurs_marked = array();
2325 foreach ($operateurs as $operateur) {
2326 $operateurs_marked[] = $mark.$operateur.$mark;
2327 }
2328
2329 // Supprime tous les espaces de la chaîne de caractère
2330 $restriction = preg_replace('/\s+/', '', $restriction);
2331
2332 // Met un marqueur avant et après les opérateurs
2333 // puis transforme la chaine en un tableau
2334 $restriction = str_replace($operateurs, $operateurs_marked,
2335 $restriction);
2336
2337 // Pour chaque opérateur logique
2338 foreach (array('&&', '||') as $operator) {
2339
2340 // S'il est absent on ne fait aucun traitement
2341 if (strpos($restriction, $mark.$operator.$mark) === false) {
2342 continue;
2343 }
2344 // Sinon on vérifie les deux conditions avec le OU/ET logique
2345 $restrictions = explode($mark.$operator.$mark, $restriction);
2346 $restrictions[0] = explode($mark, $restrictions[0]);
2347 $restrictions[1] = explode($mark, $restrictions[1]);
2348 $res_bool = false;
2349 if ($operator == '&&') {
2350 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2351 && $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2352 $res_bool = true;
2353 }
2354 }
2355 if ($operator == '||') {
2356 if ($this->is_restriction_satisfied($restrictions[0], $operateurs)
2357 || $this->is_restriction_satisfied($restrictions[1], $operateurs)) {
2358 $res_bool = true;
2359 }
2360 }
2361 return $res_bool;
2362 }
2363 $tabRestriction = explode($mark, $restriction);
2364 return $this->is_restriction_satisfied($tabRestriction, $operateurs);
2365
2366 }
2367
2368 function is_restriction_satisfied($restriction, $operateurs) {
2369 // Tableau comprenant les résultat
2370 $res = array();
2371 // Compteur pour les résultat
2372 // commence à 1 car le 0 doit rester inchangé tout au long du traitement
2373 $j = 1;
2374 // Comparateur du calcul
2375 $comparateur = '';
2376 // Booléen retourné
2377 $res_bool = true;
2378
2379 // S'il y a un comparateur
2380 if (in_array(">=", $restriction)
2381 || in_array("<=", $restriction)
2382 || in_array("==", $restriction)
2383 || in_array("!=", $restriction)) {
2384
2385 // Si le tableau n'est pas vide
2386 if (count($restriction) > 0) {
2387
2388 // Boucle dans le tableau pour récupérer seulement les valeurs
2389 foreach ($restriction as $key => $value) {
2390 //
2391 if (!in_array($value, $operateurs)) {
2392 if ($this->getRestrictionValue($value) != false) {
2393 $res[] = $this->getRestrictionValue($value);
2394 } else {
2395 // Message d'erreur
2396 $error_message = sprintf(_("Le champ %s de l'instruction %s est vide"), "<span class='bold'>".$value."</span>", "<span class='bold'>".$this->valF["instruction"]."</span>");
2397 $this->addToMessage($error_message);
2398 // Arrête le traitement
2399 return false;
2400 }
2401 }
2402 }
2403
2404 // Boucle dans le tableau
2405 // commence à 1 car le 0 doit rester inchangé tout au long du
2406 // traitement
2407 for ($i = 1; $i<count($restriction); $i++) {
2408
2409 // Récupère le comparateur
2410 if ($restriction[$i] === ">="
2411 || $restriction[$i] === "<="
2412 || $restriction[$i] === "=="
2413 || $restriction[$i] === "!=") {
2414 $comparateur = $restriction[$i];
2415 }
2416
2417 // Si l'opérateur qui suit est un "+"
2418 if ($restriction[$i] === "+") {
2419 $dateDep = $res[$j];
2420 unset($res[$j]);$j++;
2421 $duree = $res[$j];
2422 unset($res[$j]);
2423 $res[$j] = $this->f->mois_date($dateDep, $duree, "+");
2424 }
2425
2426 // Si l'opérateur qui suit est un "-"
2427 if ($restriction[$i] === "-") {
2428 $dateDep = $res[$j];
2429 unset($res[$j]);$j++;
2430 $duree = $res[$j];
2431 unset($res[$j]);
2432 $res[$j] = $this->f->mois_date($dateDep, $duree, "-");
2433 }
2434 }
2435
2436 }
2437
2438 // Si les tableau des résultats n'est pas vide
2439 if (count($res) > 0) {
2440 //
2441 $res_bool = false;
2442 // Effectue le test
2443 if ($comparateur === ">=") {
2444 //
2445 if (strtotime($res[0]) >= strtotime($res[$j])) {
2446 $res_bool = true;
2447 }
2448 }
2449 if ($comparateur === "<=") {
2450 //
2451 if (strtotime($res[0]) <= strtotime($res[$j])) {
2452 $res_bool = true;
2453 }
2454 }
2455 if ($comparateur === "==") {
2456 //
2457 if (strtotime($res[0]) == strtotime($res[$j])) {
2458 $res_bool = true;
2459 }
2460 }
2461 if ($comparateur === "!=") {
2462 //
2463 if (strtotime($res[0]) != strtotime($res[$j])) {
2464 $res_bool = true;
2465 }
2466 }
2467 }
2468 // Sinon une erreur s'affiche
2469 } else {
2470
2471 // Message d'erreur
2472 $error_message = _("Mauvais parametrage de la restriction.")." ".
2473 _("Contactez votre administrateur");
2474 $this->addToMessage($error_message);
2475 // Arrête le traitement
2476 return false;
2477 }
2478
2479 return $res_bool;
2480
2481 }
2482
2483 /**
2484 * Permet de définir si l'événement passé en paramètre est un événement retour.
2485 * @param integer $evenement événement à tester
2486 *
2487 * @return boolean retourne true si événement retour sinon false
2488 */
2489 function is_evenement_retour($evenement) {
2490 if(empty($evenement) || !is_numeric($evenement)) {
2491 return "";
2492 }
2493 $sql = "SELECT retour
2494 FROM ".DB_PREFIXE."evenement
2495 WHERE evenement = ".$evenement;
2496 $retour = $this->f->db->getOne($sql);
2497 $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
2498 if (database::isError($retour)) {
2499 die($retour->getMessage());
2500 }
2501 if ($retour == 't') {
2502 return true;
2503 } else {
2504 return false;
2505 }
2506 }
2507
2508 /**
2509 * Retourne le champ restriction de l'événement passé en paramètre.
2510 *
2511 * @param integer $evenement id de l'événement sur lequel récupérer la restriction
2512 *
2513 * @return string contenu du champ restriction
2514 */
2515 function get_restriction($evenement) {
2516 if(empty($evenement) || !is_numeric($evenement)) {
2517 return "";
2518 }
2519 //Récupère la restriction
2520 $sql= "SELECT
2521 restriction
2522 FROM
2523 ".DB_PREFIXE."evenement
2524 WHERE
2525 evenement =".$evenement;
2526
2527 $restriction = $this->f->db->getOne($sql);
2528 $this->addToLog("verifier(): db->query(\"".$sql."\");", VERBOSE_MODE);
2529 if (database::isError($restriction)) {
2530 die($restriction->getMessage());
2531 }
2532 return $restriction;
2533 }
2534
2535 /**
2536 * Récupère la valeur du champ dans la restriction
2537 * @param string $restrictionValue Nom du champ
2538 * @return mixed Valeur du champ
2539 */
2540 function getRestrictionValue($restrictionValue){
2541
2542 // Initialisation de la valeur de retour
2543 $return = false;
2544
2545 // Récupére les valeurs du dossier
2546 $value_dossier = $this->get_dossier_actual();
2547
2548 //
2549 if (is_numeric($restrictionValue)) {
2550 $return = $restrictionValue;
2551 }elseif (isset($value_dossier[$restrictionValue])) {
2552 $return = $value_dossier[$restrictionValue];
2553 }elseif (isset($this->valF[$restrictionValue])) {
2554 $return = $this->valF[$restrictionValue];
2555 }
2556
2557 // Retourne la valeur du champ
2558 return $return;
2559 }
2560
2561
2562 /**
2563 * Calcul des règle d'action selon leur type.
2564 *
2565 * Types de règle :
2566 * - date
2567 * - numeric
2568 * - text
2569 * - bool
2570 * - specific
2571 * - technical_data
2572 *
2573 * @param string $rule Règle d'action.
2574 * @param string $rule_name Nom de la règle.
2575 * @param string $type Type de la règle.
2576 *
2577 * @return mixed Résultat de la règle
2578 */
2579 public function regle($rule, $rule_name, $type = null) {
2580
2581 // Supprime tous les espaces de la chaîne de caractère
2582 $rule = str_replace(' ', '', $rule);
2583 // Coupe la chaîne au niveau de l'opérateur
2584 $operands = explode ("+", $rule);
2585 // Nombre d'opérande
2586 $nb_operands = count($operands);
2587
2588 // Règle à null
2589 if ($rule == "null") {
2590 return null;
2591 }
2592
2593 // Tableau des champs de type date
2594 $rule_type_date = array(
2595 "regle_date_limite",
2596 "regle_date_notification_delai",
2597 "regle_date_complet",
2598 "regle_date_validite",
2599 "regle_date_decision",
2600 "regle_date_chantier",
2601 "regle_date_achevement",
2602 "regle_date_conformite",
2603 "regle_date_rejet",
2604 "regle_date_dernier_depot",
2605 "regle_date_limite_incompletude",
2606 "regle_date_cloture_instruction",
2607 "regle_date_premiere_visite",
2608 "regle_date_derniere_visite",
2609 "regle_date_contradictoire",
2610 "regle_date_retour_contradictoire",
2611 "regle_date_ait",
2612 "regle_date_transmission_parquet",
2613 "regle_date_affichage",
2614 );
2615 // Tableau des champs de type numérique
2616 $rule_type_numeric = array(
2617 "regle_delai",
2618 "regle_delai_incompletude",
2619 );
2620 // Tableau des champs de type text
2621 $rule_type_text = array(
2622 );
2623 // Tableau des champs de type booléen
2624 $rule_type_bool = array(
2625 "regle_a_qualifier",
2626 "regle_incompletude",
2627 "regle_incomplet_notifie",
2628 "regle_evenement_suivant_tacite_incompletude",
2629 );
2630 // Tableau des champs spécifiques
2631 $rule_type_specific = array(
2632 "regle_autorite_competente",
2633 "regle_etat",
2634 "regle_accord_tacite",
2635 "regle_avis",
2636 "regle_pec_metier",
2637 "regle_etat_pendant_incompletude",
2638 );
2639 // Tableau des champs de données techniques
2640 $rule_type_technical_data = array(
2641 'regle_donnees_techniques1',
2642 'regle_donnees_techniques2',
2643 'regle_donnees_techniques3',
2644 'regle_donnees_techniques4',
2645 'regle_donnees_techniques5',
2646 );
2647 // Tableau des champs simple
2648 $rule_type_simple = array(
2649 "regle_dossier_instruction_type",
2650 );
2651
2652 // Définit le type du champ
2653 if (in_array($rule_name, $rule_type_date) == true) {
2654 $type = "date";
2655 }
2656 if (in_array($rule_name, $rule_type_numeric) == true) {
2657 $type = "numeric";
2658 }
2659 if (in_array($rule_name, $rule_type_text) === true) {
2660 $type = "text";
2661 }
2662 if (in_array($rule_name, $rule_type_bool) === true) {
2663 $type = "bool";
2664 }
2665 if (in_array($rule_name, $rule_type_specific) === true) {
2666 $type = "specific";
2667 }
2668 if (in_array($rule_name, $rule_type_technical_data) === true) {
2669 $type = 'text';
2670 }
2671 if (in_array($rule_name, $rule_type_simple) === true) {
2672 $type = 'simple';
2673 }
2674
2675 // Si c'est un type spécifique ou booléen alors il n'a qu'un opérande
2676 // Récupère directement la valeur de l'opérande
2677 if ($type === 'specific') {
2678 //
2679 return $this->get_value_for_rule($rule);
2680 }
2681
2682 // Initialisation des variables
2683 $key_date = 0;
2684 $total_numeric = 0;
2685 $res_text = '';
2686
2687 // Pour chaque opérande
2688 foreach ($operands as $key => $operand) {
2689
2690 // Si c'est une règle de type date
2691 if ($type == 'date') {
2692 // Vérifie si au moins une des opérandes est une date
2693 if (is_numeric($operand) === false
2694 && $this->get_value_for_rule($operand) !== null
2695 && $this->f->check_date($this->get_value_for_rule($operand)) == true) {
2696 // Récupère la position de la date
2697 $key_date = $key;
2698 }
2699 // Les autres opérandes doivent être que des numériques
2700 if (is_numeric($operand) == true) {
2701 // Ajoute l'opérande au total
2702 $total_numeric += $operand;
2703 }
2704 if (is_numeric($operand) === false
2705 && $this->get_value_for_rule($operand) !== null
2706 && is_numeric($this->get_value_for_rule($operand)) == true) {
2707 // Ajoute l'opérande au total
2708 $total_numeric += $this->get_value_for_rule($operand);
2709 }
2710 }
2711
2712 // Si c'est une règle de type numérique
2713 if ($type == 'numeric') {
2714 // Les opérandes doivent être que des numériques
2715 if (is_numeric($operand) == true) {
2716 // Ajoute l'opérande au total
2717 $total_numeric += $operand;
2718 }
2719 if (is_numeric($operand) === false
2720 && $this->get_value_for_rule($operand) !== null
2721 && is_numeric($this->get_value_for_rule($operand)) == true) {
2722 // Ajoute l'opérande au total
2723 $total_numeric += $this->get_value_for_rule($operand);
2724 }
2725 }
2726
2727 // Si c'est une règle de type text
2728 if ($type === 'text') {
2729 // Concatène toutes les chaînes de caractère
2730 $res_text .= $this->get_value_for_rule($operand);
2731 }
2732 }
2733
2734 // Résultat pour une règle de type date
2735 if ($type == 'date') {
2736 // Retourne le calcul de la date
2737 return $this->f->mois_date($this->valF[$operands[$key_date]],
2738 $total_numeric, "+");
2739 }
2740
2741 // Résultat pour une règle de type numérique
2742 if ($type == 'numeric') {
2743 // Retourne le calcul
2744 return $total_numeric;
2745 }
2746
2747 // Résultat pour une règle de type text
2748 if ($type === 'text') {
2749 // Retourne la chaîne de caractère
2750 return $res_text;
2751 }
2752 if ($type === 'simple' || $type === 'bool') {
2753 // Retourne la valeur du champs rule
2754 return $rule;
2755 }
2756 }
2757
2758
2759 /**
2760 * Récupère la valeur du champs dans l'instruction ou dans les données
2761 * techniques.
2762 * Spécifique au calcul des règles.
2763 *
2764 * @param string $field Champ
2765 *
2766 * @return mixed Valeur du champ
2767 */
2768 private function get_value_for_rule($field) {
2769 // Si le champ n'existe pas dans la table instruction
2770 if (array_key_exists($field, $this->valF) === false) {
2771 // Récupère l'instance de la classe donnees_techniques
2772 $inst_donnees_techniques = $this->get_inst_donnees_techniques();
2773 // Retourne la valeur de la donnée technique
2774 return $inst_donnees_techniques->getVal($field);
2775 }
2776
2777 //
2778 return $this->valF[$field];
2779 }
2780
2781
2782 /**
2783 * [get_inst_donnees_techniques description]
2784 *
2785 * @param [type] $donnees_techniques [description]
2786 *
2787 * @return [type] [description]
2788 */
2789 function get_inst_donnees_techniques($donnees_techniques = null) {
2790 //
2791 if (isset($this->inst_donnees_techniques) === false or
2792 $this->inst_donnees_techniques === null) {
2793 //
2794 if (is_null($donnees_techniques)) {
2795 $donnees_techniques = $this->getDonneesTechniques();
2796 }
2797 //
2798 $this->inst_donnees_techniques = $this->f->get_inst__om_dbform(array(
2799 "obj" => "donnees_techniques",
2800 "idx" => $donnees_techniques,
2801 ));
2802 }
2803 //
2804 return $this->inst_donnees_techniques;
2805 }
2806
2807
2808 /**
2809 * Retourne l'identifiant des données techniques liées du dossier
2810 * @return string L'identifiant des données techniques liées du dossier
2811 */
2812 function getDonneesTechniques() {
2813
2814 $donnees_techniques = '';
2815
2816 $sql = "SELECT donnees_techniques
2817 FROM ".DB_PREFIXE."donnees_techniques
2818 WHERE dossier_instruction ='".$this->valF["dossier"]."'";
2819 $donnees_techniques = $this->f->db->getOne($sql);
2820 $this->f->addToLog("getStatut() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
2821 if ( database::isError($donnees_techniques)){
2822 die();
2823 }
2824
2825 return $donnees_techniques;
2826 }
2827
2828 /**
2829 * TRIGGER - triggerajouterapres.
2830 *
2831 * - Mise à jour des informations liées au workflow sur le dossier
2832 * - Interface avec le référentiel ERP [105][111]
2833 * - Mise à jour du DA
2834 * - Historisation de la vie du DI
2835 *
2836 * @return boolean
2837 */
2838 function triggerajouterapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
2839 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
2840
2841 // On a besoin de l'instance du dossier lié à l'événement d'instruction
2842 $inst_di = $this->get_inst_dossier($this->valF['dossier']);
2843 // Instance de la classe evenement
2844 $inst_evenement = $this->get_inst_evenement($this->valF['evenement']);
2845 // Instance de l'état courant du dossier d'instruction
2846 $inst_current_etat = $this->f->get_inst__om_dbform(array(
2847 "obj" => "etat",
2848 "idx" => $inst_di->get_id_etat(),
2849 ));
2850
2851 /**
2852 * Mise à jour des valeurs du dossier en fonction des valeurs calculées
2853 * par l'action
2854 */
2855 // état de complétude actuel du dossier
2856 $incompletude = ($inst_di->getVal('incompletude') == 't' ? true : false);
2857 // L'événement suivant tacite paramétré est destiné à la gestion de l'incomplétude
2858 $ev_suiv_tacite_incompletude = false;
2859 // Initialisation
2860 $valF = array();
2861 $valF_dt = array();
2862 //
2863 // Récupération des paramètres de l'action
2864 $sql = "SELECT * FROM ".DB_PREFIXE."action
2865 WHERE action='".$this->valF['action']."'";
2866 $res = $this->f->db->query($sql);
2867 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
2868 if (database::isError($res)) {
2869 die($res->getMessage());
2870 }
2871 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
2872
2873 // pour chacune des regles, on applique la regle
2874 if ($row['regle_delai'] != '') {
2875 $valF['delai'] = $this->regle($row['regle_delai'], 'regle_delai');
2876 }
2877 if ($row['regle_accord_tacite'] != '') {
2878 $valF['accord_tacite'] = $this->regle($row['regle_accord_tacite'], 'regle_accord_tacite');
2879 }
2880 if ($row['regle_avis'] != '') {
2881 $valF['avis_decision'] = $this->regle($row['regle_avis'], 'regle_avis');
2882 }
2883 if ($row['regle_date_limite'] != '') {
2884 $valF['date_limite'] = $this->regle($row['regle_date_limite'], 'regle_date_limite');
2885 }
2886 if ($row['regle_date_complet'] != '') {
2887 $valF['date_complet'] = $this->regle($row['regle_date_complet'], 'regle_date_complet');
2888 }
2889 if ($row['regle_date_dernier_depot'] != '') {
2890 $valF['date_dernier_depot'] = $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
2891 }
2892 if ($row['regle_date_notification_delai'] != '') {
2893 $valF['date_notification_delai'] = $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
2894 }
2895 if ($row['regle_date_decision'] != '') {
2896 $valF['date_decision'] = $this->regle($row['regle_date_decision'], 'regle_date_decision');
2897 }
2898 if ($row['regle_date_rejet'] != '') {
2899 $valF['date_rejet'] = $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
2900 }
2901 if ($row['regle_date_validite'] != '') {
2902 $valF['date_validite'] = $this->regle($row['regle_date_validite'], 'regle_date_validite');
2903 }
2904 if ($row['regle_date_chantier'] != '') {
2905 $valF['date_chantier'] = $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
2906 }
2907 if ($row['regle_date_achevement'] != '') {
2908 $valF['date_achevement'] = $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
2909 }
2910 if ($row['regle_date_conformite'] != '') {
2911 $valF['date_conformite'] = $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
2912 }
2913 if ($row['regle_date_limite_incompletude'] != '') {
2914 $valF['date_limite_incompletude'] = $this->regle($row['regle_date_limite_incompletude'], 'regle_date_limite_incompletude');
2915 }
2916 if ($row['regle_delai_incompletude'] != '') {
2917 $valF['delai_incompletude'] = $this->regle($row['regle_delai_incompletude'], 'regle_delai_incompletude');
2918 }
2919 if ($row['regle_autorite_competente'] != '') {
2920 $valF['autorite_competente'] = $this->regle($row['regle_autorite_competente'], 'regle_autorite_competente');
2921 }
2922 if ($row['regle_etat'] != '') {
2923 $valF['etat'] = $this->regle($row['regle_etat'], 'regle_etat');
2924 }
2925 if ($row['regle_date_cloture_instruction'] !== '') {
2926 $valF['date_cloture_instruction'] = $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
2927 }
2928 if ($row['regle_date_premiere_visite'] !== '') {
2929 $valF['date_premiere_visite'] = $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
2930 }
2931 if ($row['regle_date_derniere_visite'] !== '') {
2932 $valF['date_derniere_visite'] = $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
2933 }
2934 if ($row['regle_date_contradictoire'] !== '') {
2935 $valF['date_contradictoire'] = $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
2936 }
2937 if ($row['regle_date_retour_contradictoire'] !== '') {
2938 $valF['date_retour_contradictoire'] = $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
2939 }
2940 if ($row['regle_date_ait'] !== '') {
2941 $valF['date_ait'] = $this->regle($row['regle_date_ait'], 'regle_date_ait');
2942 }
2943 if ($row['regle_donnees_techniques1'] !== '') {
2944 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
2945 }
2946 if ($row['regle_donnees_techniques2'] !== '') {
2947 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
2948 }
2949 if ($row['regle_donnees_techniques3'] !== '') {
2950 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
2951 }
2952 if ($row['regle_donnees_techniques4'] !== '') {
2953 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
2954 }
2955 if ($row['regle_donnees_techniques5'] !== '') {
2956 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
2957 }
2958 if ($row['regle_date_transmission_parquet'] !== '') {
2959 $valF['date_transmission_parquet'] = $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
2960 }
2961 if ($row['regle_dossier_instruction_type'] !== '') {
2962 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
2963 }
2964 // La date d'affichage est modifiée seulement si le champ n'est pas
2965 // renseigné
2966 if ($row['regle_date_affichage'] !== ''
2967 && ($inst_di->getVal('date_affichage') === ''
2968 || $inst_di->getVal('date_affichage') === null)) {
2969 //
2970 $valF['date_affichage'] = $this->regle($row['regle_date_affichage'], 'regle_date_affichage');
2971 }
2972 //
2973 if ($row['regle_pec_metier'] != '') {
2974 $valF['pec_metier'] = $this->regle($row['regle_pec_metier'], 'regle_pec_metier');
2975 }
2976 if ($row['regle_a_qualifier'] != '') {
2977 $valF['a_qualifier'] = $this->regle($row['regle_a_qualifier'], 'regle_a_qualifier');
2978 }
2979 //
2980 if ($row['regle_incompletude'] != '') {
2981 $valF['incompletude'] = $this->regle($row['regle_incompletude'], 'regle_incompletude');
2982 }
2983 if ($row['regle_incomplet_notifie'] != '') {
2984 $valF['incomplet_notifie'] = $this->regle($row['regle_incomplet_notifie'], 'regle_incomplet_notifie');
2985 }
2986 if ($row['regle_etat_pendant_incompletude'] != '') {
2987 $valF['etat_pendant_incompletude'] = $this->regle($row['regle_etat_pendant_incompletude'], 'regle_etat_pendant_incompletude');
2988 }
2989 if ($row['regle_evenement_suivant_tacite_incompletude'] != '') {
2990 $resti = $this->regle($row['regle_evenement_suivant_tacite_incompletude'], 'regle_evenement_suivant_tacite_incompletude');
2991 if (strtolower($resti) === 't' || strtolower($resti) === 'true') {
2992 $ev_suiv_tacite_incompletude = true;
2993 }
2994 }
2995 }
2996
2997 // Si l'événement a un événement suivant tacite
2998 if($inst_evenement->getVal('evenement_suivant_tacite') != '') {
2999 // En fonction de l'action de l'événement, l'événement suivant tacite ne sera
3000 // pas associé de le même façon au dossier d'instruction
3001 if ($ev_suiv_tacite_incompletude === false) {
3002 $valF['evenement_suivant_tacite'] = $inst_evenement->getVal('evenement_suivant_tacite');
3003 }
3004 if ($ev_suiv_tacite_incompletude === true) {
3005 $valF['evenement_suivant_tacite_incompletude'] = $inst_evenement->getVal('evenement_suivant_tacite');
3006 }
3007 }
3008 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3009 if (count($valF_dt) > 0) {
3010 $dt_id = $this->getDonneesTechniques();
3011 // On met à jour le dossier
3012 $cle = " donnees_techniques='".$dt_id."'";
3013 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3014 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
3015 if (database::isError($res1)) {
3016 die($res->getMessage());
3017 }
3018 // Affichage d'informations à l'utilisateur
3019 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3020 }
3021 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3022 if (count($valF) > 0) {
3023 //
3024 $inst_dossier = $this->f->get_inst__om_dbform(array(
3025 "obj" => "dossier",
3026 "idx" => $this->valF['dossier'],
3027 ));
3028 $valF['instruction'] = $id;
3029 $valF['crud'] = 'create';
3030 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3031 if ($update_by_instruction === false) {
3032 $this->cleanMessage();
3033 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3034 return false;
3035 }
3036 // Affichage d'informations à l'utilisateur
3037 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3038 }
3039
3040 /**
3041 * Interface avec le référentiel ERP.
3042 *
3043 * (WS->ERP)[105] Arrêté d'un dossier PC effectué -> PC qui concerne un ERP
3044 * (WS->ERP)[111] Décision de conformité effectuée -> PC qui concerne un ERP
3045 * Déclencheur :
3046 * - L'option ERP est activée
3047 * - Le dossier est marqué comme "connecté au référentiel ERP"
3048 * - Le dossier est de type PC
3049 * - Le formulaire d'ajout d'un événement d'instruction est validé
3050 * avec un événement pour lequel les services ERP doivent être
3051 * informé
3052 */
3053 //
3054 if ($this->f->is_option_referentiel_erp_enabled() === true
3055 && $inst_di->is_connected_to_referentiel_erp() === true
3056 && $this->f->getDATCode($this->valF['dossier']) == $this->f->getParameter('erp__dossier__nature__pc')
3057 && in_array($inst_evenement->getVal($inst_evenement->clePrimaire), explode(";", $this->f->getParameter('erp__evenements__decision__pc')))) {
3058 //
3059 $infos = array(
3060 "dossier_instruction" => $this->valF['dossier'],
3061 "decision" => $inst_evenement->getVal("libelle"),
3062 );
3063 //
3064 $ret = $this->f->send_message_to_referentiel_erp(105, $infos);
3065 if ($ret !== true) {
3066 $this->cleanMessage();
3067 $this->addToMessage(_("Une erreur s'est produite lors de la notification (105) du référentiel ERP. Contactez votre administrateur."));
3068 return false;
3069 }
3070 $this->addToMessage(_("Notification (105) du référentiel ERP OK."));
3071 }
3072
3073 // Si le mode en rédaction intégrale est activé
3074 if (isset($this->valF['flag_edition_integrale']) === true
3075 && $this->valF['flag_edition_integrale'] === true) {
3076 $redactionIntegraleValF = array();
3077
3078 // Récupère la collectivite du dossier d'instruction
3079 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
3080 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
3081 // Récupère le corps de la lettre type
3082 $params = array(
3083 "specific" => array(
3084 "corps" => array(
3085 "mode" => "get",
3086 )
3087 ),
3088 );
3089 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3090 $redactionIntegraleValF['corps_om_htmletatex'] = $result['pdf_output'];
3091 // Récupère le titre de la lettre type
3092 $params = array(
3093 "specific" => array(
3094 "titre" => array(
3095 "mode" => "get",
3096 )
3097 ),
3098 );
3099 $result = $this->compute_pdf_output('lettretype', $this->valF['lettretype'], $collectivite, $id, $params);
3100 $redactionIntegraleValF['titre_om_htmletat'] = $result['pdf_output'];
3101
3102 // mise à jour en base de données
3103 $res = $this->f->db->autoExecute(
3104 DB_PREFIXE.$this->table,
3105 $redactionIntegraleValF,
3106 DB_AUTOQUERY_UPDATE,
3107 $this->clePrimaire."=".$id
3108 );
3109 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($redactionIntegraleValF, true).", DB_AUTOQUERY_UPDATE, \"".$this->clePrimaire."=".$id."\");", VERBOSE_MODE);
3110 if ($this->f->isDatabaseError($res, true) === true) {
3111 return false;
3112 }
3113 }
3114
3115 /**
3116 * Finalisation automatique de l'instruction si le paramétrage de l'événement l'autorise
3117 */
3118 // Si la finalisation automatique de l'événement est activée
3119 // ET si l'instruction n'a pas déjà été finalisée
3120 // ET s'il existe une lettre type associée
3121 if ($inst_evenement->getVal('finaliser_automatiquement') === 't'
3122 && $inst_evenement->getVal('om_final_instruction') !== 't'
3123 && $inst_evenement->getVal('lettretype') !== ''
3124 && $inst_evenement->getVal('lettretype') !== null) {
3125
3126 // On instancie l'instruction
3127 $inst_instruction = $this->f->get_inst__om_dbform(array(
3128 "obj" => "instruction",
3129 "idx" => $this->valF[$this->clePrimaire],
3130 ));
3131
3132 // On finalise l'instruction dans le contexte de finalisation : action 100
3133 $inst_instruction->setParameter('maj', 100);
3134 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3135
3136 // Une erreur de finalisation renvoie 'false' : ajout dans les logs
3137 // et dans le message d'erreur
3138 if ($finalize === false) {
3139 $this->f->addToLog(__METHOD__."() : ERROR - Impossible de finaliser l'instruction.", DEBUG_MODE);
3140 $this->addToMessage(_("Erreur lors de la finalisation de l'instruction. Contactez votre administrateur."));
3141 return false;
3142 }
3143 }
3144
3145 /**
3146 * Finalisation automatique des instructions tacites ou retours.
3147 */
3148 // Si l'option de finalisation automatique des instructions tacites ou
3149 // retours est activée et l'événement d'instruction a une lettre type
3150 // associée
3151 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3152 if ($this->f->is_option_finalisation_auto_enabled($collectivite_di) === true
3153 && $inst_evenement->getVal('lettretype') !== ''
3154 && $inst_evenement->getVal('lettretype') !== null) {
3155
3156 // Rècupère l'identifiant de l'événement
3157 $evenement_id = $inst_evenement->getVal($inst_evenement->clePrimaire);
3158
3159 // Si l'événement d'instruction est identifié comme un événement
3160 // retour
3161 // OU l'événement d'instruction est l'événement suivant tacite du
3162 // dossier d'instruction (incomplétude prise en compte)
3163 // ET l'événement d'instruction n'a pas déjà été finalisé
3164 if (($inst_evenement->getVal("retour") === 't'
3165 || ($inst_di->getVal('evenement_suivant_tacite_incompletude') === $evenement_id
3166 || $inst_di->getVal('evenement_suivant_tacite') === $evenement_id))
3167 && ($inst_evenement->getVal('om_final_instruction') !== 't')) {
3168
3169 // Finalise l'instruction
3170 $inst_instruction = $this->f->get_inst__om_dbform(array(
3171 "obj" => "instruction",
3172 "idx" => $this->valF[$this->clePrimaire],
3173 ));
3174 $inst_instruction->setParameter('maj', 100);
3175 $finalize = $inst_instruction->finalize($inst_instruction->valF);
3176 if ($finalize === false) {
3177 //
3178 return false;
3179 }
3180 }
3181 }
3182
3183 /**
3184 * Mise à jour de la version de clôture *version_clos* du dossier si et
3185 * seulement si l'instruction met à jour l'état du dossier.
3186 */
3187 if (isset($valF['etat']) === true
3188 && $valF['etat'] !== null
3189 && $valF['etat'] !== '') {
3190 // Instanciation de l'état appliqué sur le dossier par l'instruction
3191 $inst_etat = $this->f->get_inst__om_dbform(array(
3192 "obj" => "etat",
3193 "idx" => $valF['etat'],
3194 ));
3195 //
3196 $update_version_clos = null;
3197 // En cas d'instruction qui clôture le dossier
3198 if ($inst_etat->getVal('statut') === 'cloture') {
3199 $update_version_clos = $inst_di->update_version_clos('up');
3200 }
3201 // En cas d'instruction qui rouvre le dossier
3202 if ($inst_current_etat->getVal('statut') === 'cloture'
3203 && $inst_etat->getVal('statut') !== 'cloture') {
3204 //
3205 $update_version_clos = $inst_di->update_version_clos('down');
3206 //
3207 $params = array(
3208 'di_reopened' => true,
3209 );
3210 }
3211 //
3212 if ($update_version_clos === false) {
3213 $this->f->addToLog(sprintf(
3214 "%s() : ERREUR - %s %s",
3215 __METHOD__,
3216 sprintf(
3217 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
3218 $inst_di->getVal($inst_di->clePrimaire)
3219 ),
3220 sprintf(
3221 __("L'instruction tente d'appliquer l'état %s."),
3222 $inst_etat->getVal($inst_etat->clePrimaire)
3223 )
3224 ));
3225 $this->addToMessage(sprintf(
3226 "%s %s",
3227 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
3228 __("Veuillez contacter votre administrateur.")
3229 ));
3230 return false;
3231 }
3232 }
3233
3234 /**
3235 * Notification automatique
3236 */
3237 // Notification automatique à l'ajout de l'instruction si la notification
3238 // automatique est choisie et qu'il n'y a pas de lettretype associée à l'événement
3239 if ($inst_evenement->getVal('notification') === 'notification_automatique' &&
3240 ($inst_evenement->getVal('lettretype') === null ||
3241 $inst_evenement->getVal('lettretype') === '')) {
3242 // Récupération de la liste des demandeurs à notifier et de la catégorie
3243 $categorie = $this->f->get_param_option_notification($collectivite_di);
3244 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
3245 $demandeursANotifie = $this->get_demandeurs_notifiable(
3246 $this->valF['dossier'],
3247 $isPortal
3248 );
3249
3250 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
3251 $demandeurPrincipalNotifie = false;
3252 foreach ($demandeursANotifie as $demandeur) {
3253 // Identifie si le demandeur principal a été notifié ou pas
3254 // et récupère ses informations
3255 if ($demandeur['petitionnaire_principal'] == 't') {
3256 $demandeurPrincipalNotifie = true;
3257 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
3258 // son paramétrage, on effectue pas le traitement et on passe à l'itération
3259 // suivante. On le considère également comme non notifié pour gérer l'envoie
3260 // des messages d'erreurs
3261 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
3262 // d'impact sur la notification
3263 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3264 if (! $this->dossier_depose_sur_portail($val['dossier']) && $erreursParam != array()) {
3265 $demandeurPrincipalNotifie = false;
3266 continue;
3267 }
3268 }
3269 // Ajout de la notif et récupération de son id
3270 $idNotif = $this->ajouter_notification(
3271 $this->valF[$this->clePrimaire],
3272 $this->f->get_connected_user_login_name(),
3273 $demandeur,
3274 $collectivite_di,
3275 array(),
3276 true
3277 );
3278 if ($idNotif === false) {
3279 return false;
3280 }
3281 // Création de la tache en lui donnant l'id de la notification
3282 $notification_by_task = $this->notification_by_task(
3283 $idNotif,
3284 $this->valF['dossier'],
3285 $categorie
3286 );
3287 if ($notification_by_task === false) {
3288 $this->addToMessage(
3289 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3290 );
3291 return false;
3292 }
3293 }
3294 // Si le demandeur principal n'est pas notifiable, on créé une nouvelle notification
3295 // en erreur avec en commentaire la raison pour laquelle le demandeur principal
3296 // n'a pas pu être notifié
3297 if (! $demandeurPrincipalNotifie) {
3298 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
3299 $erreursParam = $this->get_info_notification_fail($val['dossier']);
3300 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($val['dossier']);
3301 // Ajout de la notif et récupération de son id
3302 $idNotif = $this->ajouter_notification(
3303 $this->valF[$this->clePrimaire],
3304 $this->f->get_connected_user_login_name(),
3305 $demandeurPrincipal,
3306 $collectivite_di,
3307 array(),
3308 true,
3309 'Echec',
3310 implode(' ', $erreursParam)
3311 );
3312 if ($idNotif === false) {
3313 $this->addToMessage(
3314 __('Erreur : la création de la notification a échouée.').
3315 __("Veuillez contacter votre administrateur.")
3316 );
3317 return false;
3318 }
3319 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
3320 // de l'échec de la notification
3321 $dossier_message = $this->get_inst_dossier_message(0);
3322 $dossier_message_val = array(
3323 'dossier' => $val['dossier'],
3324 'type' => _('erreur expedition'),
3325 'emetteur' => $this->f->get_connected_user_login_name().' (automatique)',
3326 'login' => $_SESSION['login'],
3327 'date_emission' => date('Y-m-d H:i:s'),
3328 'contenu' => _('Échec lors de la notification de l\'instruction ').
3329 $inst_evenement->getVal('libelle').
3330 '.<br>'.
3331 implode("\n", $erreursParam).
3332 '<br>'.
3333 _('Veuillez corriger ces informations avant de renvoyer la notification.')
3334 );
3335 $add = $dossier_message->add_notification_message($dossier_message_val, true);
3336 // Si une erreur se produit pendant l'ajout
3337 if ($add !== true) {
3338 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
3339 return false;
3340 }
3341 }
3342 $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.")));
3343 }
3344
3345 /**
3346 * Mise à jour de la date de dernière modification du dossier
3347 */
3348 $inst_di->update_last_modification_date();
3349
3350 /**
3351 * Mise à jour des données du DA.
3352 */
3353 $inst_da = $inst_di->get_inst_dossier_autorisation();
3354 $params['di_id'] = $this->valF['dossier'];
3355 if ($inst_da->majDossierAutorisation($params) === false) {
3356 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
3357 $this->correct = false;
3358 return false;
3359 }
3360
3361 /**
3362 * Historisation de la vie du DI.
3363 */
3364 //
3365 return $this->add_log_to_dossier($id, array_merge($val, $this->valF));
3366 }
3367
3368 /**
3369 * Cette méthode vérifie si toutes les conditions de l'envoi de la notification
3370 * sont remplies.
3371 * Les conditions vérifiées sont les suivantes :
3372 * - Le petitionnaire principal doit accepter les notifications
3373 * - Le pétitionnaire principal doit avoir une adresse mail renseignée
3374 * - Le pétitionnaire principal doit avoir une adresse mail correcte
3375 * Pour chaque vérification effectué un message d'erreur est ajouté si la
3376 * condition n'est pas remplie.
3377 * Renvoie le message d'erreur en sortie.
3378 *
3379 * @param string identifiant du dossier sur lequel les notifications ont échouée
3380 * @return string
3381 */
3382 protected function get_info_notification_fail($dossier = null) {
3383 // Utilise l'identifiant du dossier passé en paramètre et si aucun dossier n'a été récupéré
3384 // utilise celui associé à l'instruction
3385 if ($dossier == null) {
3386 $dossier = $this->getVal('dossier');
3387 }
3388 // Tableau contenant la liste des messages d'erreur
3389 $errorMessage = array();
3390 // Récupère les informations du demandeurs principal
3391 $infoPetitionnaire = $this->get_info_petitionnaire_principal_dossier($dossier);
3392 // Vérifie si le pétitionnaire principal à bien la case "accepte les notification" cochée
3393 if (isset($infoPetitionnaire['notification']) && $infoPetitionnaire['notification'] != 't') {
3394 $errorMessage[] = __('Le pétitionnaire principal n\'accepte pas les notifications.');
3395 }
3396 // Vérifie si l'adresse mail du pétitionnaire principale est renseignée
3397 if (isset($infoPetitionnaire['courriel']) && ! empty($infoPetitionnaire['courriel'])) {
3398 // Vérifie si le format de l'adresse mail est pas correct et, si ce n'est pas le cas, informe l'utilisateur
3399 // qu'il doit le corriger avant de pouvoir ajouter l'nstruction
3400 if (! $this->f->checkValidEmailAddress($infoPetitionnaire['courriel'])) {
3401 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas correct : ').
3402 $infoPetitionnaire['courriel'].
3403 '.';
3404 }
3405 } else {
3406 // Si le courriel du pétitionnaire principal
3407 $errorMessage[] = __('Le courriel du pétitionnaire principal n\'est pas renseigné.');
3408 }
3409
3410 return $errorMessage;
3411 }
3412
3413 /**
3414 * Méthode servant à vérifier si un dossier a été déposé sur
3415 * le portail citoyen ou pas.
3416 * La verification se fait via une requête sql dans laquelle
3417 * on va chercher un dossier ayant pour id l'identifiant de
3418 * dossier associé à l'instruction et pour lequel la demande
3419 * associée la plus ancienne est une demande de création de
3420 * dossier via portail
3421 *
3422 * @param string identifiant du dossier. Si non renseigné c'est le dossier
3423 * associé à l'instruction qui est utilisé
3424 * @return boolean|void true : dossier déposé via portail, false : dossier
3425 * non déposé via portail et null : erreur de base de données.
3426 */
3427 protected function dossier_depose_sur_portail($dossier = null) {
3428 if (empty($dossier)) {
3429 $dossier = $this->getVal('dossier');
3430 }
3431 $sql = sprintf(
3432 'SELECT
3433 dossier
3434 FROM
3435 %1$sdossier
3436 -- Récuperation de la première demande associée au dossier
3437 LEFT JOIN (
3438 SELECT
3439 demande,
3440 dossier_instruction,
3441 source_depot
3442 FROM
3443 %1$sdemande
3444 WHERE
3445 dossier_instruction = \'%2$s\'
3446 ORDER BY
3447 demande ASC
3448 LIMIT 1
3449 ) as demande ON dossier.dossier = demande.dossier_instruction
3450 WHERE
3451 dossier.dossier = \'%2$s\'
3452 AND demande.source_depot = \'portal\'',
3453 DB_PREFIXE,
3454 $dossier
3455 );
3456 $res = $this->f->get_one_result_from_db_query($sql, true);
3457 if ($res['code'] === 'KO') {
3458 $this->addToMessage(__('Erreur : La vérification du mode de dépôt du dossier à échoué'));
3459 return;
3460 }
3461 // Si on a un résultat c'est que le dossier a été déposé via le portail
3462 return ! empty($res['result']);
3463 }
3464
3465 public function is_service_notifiable() {
3466 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3467
3468 // Si l'instruction a une édition non finalisé quel que soit
3469 // le type de notification, il n'est pas notifiable
3470 if ($this->has_an_edition() === true) {
3471 if ($this->is_unfinalizable_without_bypass() === false) {
3472 return false;
3473 }
3474 }
3475 // Vérifie si la notification des tiers est active pour l'évènement
3476 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_service'));
3477 }
3478
3479 public function is_tiers_notifiable() {
3480 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
3481
3482 // Si l'instruction a une édition non finalisé quel que soit
3483 // le type de notification, il n'est pas notifiable
3484 if ($this->has_an_edition() === true) {
3485 if ($this->is_unfinalizable_without_bypass() === false) {
3486 return false;
3487 }
3488 }
3489 // Vérifie si la notification des tiers est active pour l'évènement
3490 return $this->get_boolean_from_pgsql_value($evenement->getVal('notification_tiers'));
3491 }
3492
3493 /**
3494 * Méthode permettant de savoir si une instruction peut
3495 * être notifiée manuellement selon les différents types
3496 * de notification.
3497 *
3498 * Si l'instruction a une édition non finalisée alors elle n'est pas
3499 * manuellement notifiable.
3500 * Si l'instruction est associé à un événement de notification pour
3501 * lequel un retour signature est recquis, elle n'est notifiable que
3502 * si la date de retour de signature est remplie.
3503 * Par défaut si le type de notification n'est pas connu alors l'instruction
3504 * n'est pas notifiable.
3505 * Pour tous les autres cas l'instruction est manuellement notifiable.
3506 *
3507 * @return boolean true : notifiable | false : non notifiable
3508 */
3509 public function is_notifiable_by_task_manual() {
3510 $ev = $this->get_inst_evenement($this->getVal('evenement'));
3511
3512 // Si l'instruction a une édition non finalisé quel que soit
3513 // le type de notification, il n'est pas notifiable
3514 if ($this->has_an_edition() === true) {
3515 if ($this->is_unfinalizable_without_bypass() === false) {
3516 return false;
3517 }
3518 }
3519
3520 // Gestion des différents cas selon la valeur du champs notification
3521 if ($ev->getVal('notification') == 'notification_manuelle' ||
3522 $ev->getVal('notification') == 'notification_manuelle_annexe' ||
3523 $ev->getVal('notification') == 'notification_automatique'
3524 ) {
3525 return true;
3526 } elseif (($ev->getVal('notification') == 'notification_auto_signature_requise' ||
3527 $ev->getVal('notification') == 'notification_manuelle_signature_requise' ||
3528 $ev->getVal('notification') == 'notification_manuelle_annexe_signature_requise') &&
3529 $this->getVal('date_retour_signature') != null &&
3530 $this->getVal('date_retour_signature') != ''
3531 ) {
3532 return true ;
3533 }
3534 return false;
3535 }
3536
3537 /**
3538 * Crée une instance et une tache de notification pour le demandeur
3539 * principal.
3540 *
3541 * @return boolean true si le traitement à réussi
3542 */
3543 protected function notifier_demandeur_principal() {
3544 $this->begin_treatment(__METHOD__);
3545 $message = '';
3546 // Récupération des informations concernant le demandeur
3547 $dossier = $this->getVal('dossier');
3548 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
3549 $demandeur = $this->get_demandeurs_notifiable(
3550 $dossier,
3551 true
3552 );
3553 if ($demandeur !== array()) {
3554 $destinataire = array_values($demandeur);
3555 // Ajout de la notif et récupération de son id
3556 $idNotification = $this->ajouter_notification(
3557 $this->getVal($this->clePrimaire),
3558 $this->f->get_connected_user_login_name(),
3559 $destinataire[0],
3560 $collectivite_di,
3561 array(),
3562 true
3563 );
3564 if ($idNotification === false) {
3565 return $this->end_treatment(__METHOD__, false);
3566 }
3567 // Création de la tâche en lui donnant l'id de la notification
3568 $notification_by_task = $this->notification_by_task($idNotification, $dossier);
3569 if ($notification_by_task === false) {
3570 $this->addToMessage(
3571 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
3572 );
3573 return $this->end_treatment(__METHOD__, false);
3574 }
3575 $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.")));
3576 return $this->end_treatment(__METHOD__, true);
3577 }
3578 $this->addToMessage( __("Le demandeur principal n'est pas notifiable."));
3579 return $this->end_treatment(__METHOD__, false);
3580 }
3581
3582 public function notification_by_task($object_id, $dossier, $category = null, $type = null) {
3583 // Par défaut le type est portal
3584 if ($category === null) {
3585 $category = 'portal';
3586 }
3587 // Si le type n'est pas correctement spécifié, alors il est calculé
3588 if ($type !== 'notification_recepisse'
3589 && $type !== 'notification_instruction'
3590 && $type !== 'notification_decision'
3591 && $type !== 'notification_service_consulte'
3592 && $type !== 'notification_tiers_consulte') {
3593 //
3594 $type = 'notification_instruction';
3595 // Vérifie si l'instruction est un récépissé
3596 $trace = debug_backtrace();
3597 foreach ($trace as $key => $value) {
3598 if (isset($trace[$key]['class']) === true
3599 && empty($trace[$key]['class']) === false) {
3600 //
3601 if (strtolower($trace[$key]['class']) === 'demande') {
3602 $type = 'notification_recepisse';
3603 }
3604 }
3605 }
3606 // Vérifie si l'instruction est une décision
3607 if ($type !== 'notification_recepisse') {
3608 $avis_decision = $this->getVal('avis_decision') !== null ? $this->getVal('avis_decision') : $this->valF['avis_decision'];
3609 if ($avis_decision !== null && $avis_decision !== '') {
3610 $type = 'notification_decision';
3611 }
3612 }
3613 }
3614 // Préparation de la tache de notification
3615 $inst_task = $this->f->get_inst__om_dbform(array(
3616 "obj" => "task",
3617 "idx" => 0,
3618 ));
3619 $task_val = array(
3620 'type' => $type,
3621 'object_id' => $object_id,
3622 'dossier' => $dossier,
3623 'category' => $category,
3624 );
3625
3626 $add_task = $inst_task->add_task(array('val' => $task_val));
3627 if ($add_task === false) {
3628 return false;
3629 }
3630
3631 return true;
3632 }
3633
3634 /**
3635 * A partir des informations passée en argument ajoute un nouvel élément
3636 * dans la table instruction_notification.
3637 * Avant l'ajout vérifie en utilisant l'id de la collectivité passée en
3638 * paramètre si le paramétrage attendus est ok.
3639 * Ajoute également un nouvel élement dans instruction_notification_document
3640 * si l'instruction possède une lettretype.
3641 * Si un identifiant d'une instruction annexe est donnée ajoute un deuxième
3642 * élement dans la table instruction_notification_document qui correspondra
3643 * à l'annexe de la notification.
3644 *
3645 * @param integer identifiant de l'instruction notifiée
3646 * @param string information concernant l'emetteur
3647 * @param array tableau contenant 2 entrées
3648 * - destinatire : nom, prenom ou raison sociale, dénomination et courriel
3649 * - courriel : adresse mail de la personne à notifier
3650 * @param integer identifiant de la collectivité permettant de récupèrer les
3651 * paramètres à valider
3652 * @param boolean indique si la notification est automatique ou manuelle
3653 * @param integer identifiant d'une instruction dont l'édition sera annexé
3654 * à la notification
3655 *
3656 * @return integer|boolean identifiant de la notification créée si le traitement
3657 * a réussie, false sinon.
3658 */
3659 protected function ajouter_notification(
3660 $idInstruction,
3661 $emetteur,
3662 $destinataire,
3663 $collectiviteId,
3664 $annexes = array(),
3665 $demandeAuto = false,
3666 $statut = 'en cours d\'envoi',
3667 $commentaire = 'Notification en cours de traitement'
3668 ) {
3669 // Vérification que les paramètres nécessaires à l'envoi de la notification existe avant
3670 // de créer la notification
3671 if (! $this->is_parametrage_notification_correct($collectiviteId)) {
3672 $this->addToMessage(__("Erreur de paramétrage. L'url d'accès au(x) document(s) notifié(s) n'est pas paramétrée."));
3673 return false;
3674 }
3675 // Préparation de la notification
3676 $inst_notif = $this->f->get_inst__om_dbform(array(
3677 "obj" => "instruction_notification",
3678 "idx" => "]",
3679 ));
3680 $notif_val = array(
3681 'instruction_notification' => null,
3682 'instruction' => $idInstruction,
3683 'automatique' => $demandeAuto,
3684 'emetteur' => $emetteur,
3685 'date_envoi' => null,
3686 'destinataire' => $destinataire['destinataire'],
3687 'courriel' => $destinataire['courriel'],
3688 'date_premier_acces' => null,
3689 'statut' => $statut,
3690 'commentaire' => $commentaire
3691 );
3692
3693 // Création de la notification
3694 $add_notif = $inst_notif->ajouter($notif_val);
3695 if ($add_notif === false) {
3696 $this->addToMessage(__("Erreur lors de la génération de la notification au(x) pétitionnaire(s)."));
3697 return false;
3698 }
3699
3700 // Si il y a une lettretype finalisé stockage de la clé d'accès au documents
3701 if ($this->evenement_has_an_edition($this->getVal('evenement')) === true) {
3702 $add_notif_doc = $this->ajouter_notification_document(
3703 $inst_notif->getVal($inst_notif->clePrimaire),
3704 $this->getVal($this->clePrimaire),
3705 'instruction'
3706 );
3707 if ($add_notif_doc === false) {
3708 $this->addToMessage(__("Erreur lors de la génération de la notification du document."));
3709 return false;
3710 }
3711 }
3712 // Si une annexe a été choisie stockage de la clé d'accès à l'annexe
3713 if (! empty($annexes) && is_array($annexes)) {
3714 $add_notif_annexe = $this->ajouter_notification_document_multiple(
3715 $inst_notif->getVal($inst_notif->clePrimaire),
3716 $annexes
3717 );
3718 if ($add_notif_annexe === false) {
3719 $this->addToMessage(__("Erreur lors de la génération de la notification de l'annexe."));
3720 return false;
3721 }
3722 }
3723
3724 // Renvoie l'id de la nouvelle instance de instruction_notification
3725 return $inst_notif->getVal($inst_notif->clePrimaire);
3726 }
3727
3728 /**
3729 * Pour chaque élément du tableau passé en paramètre ajoute une nouvelle
3730 * instance dans la table instruction_notification_document lié a la
3731 * notification dont l'id est passé en paramètre.
3732 *
3733 * @param array tableau contenant les informations nécessaires pour créer les annexes
3734 *
3735 * @return integer|boolean identifiant de la notification créée si le traitement
3736 * a réussie, false sinon.
3737 */
3738 protected function ajouter_notification_document_multiple($idNotification, $listeDocument) {
3739 foreach ($listeDocument as $paramDoc) {
3740 if (! $this->ajouter_notification_document($idNotification, $paramDoc['id'], $paramDoc['tableDocument'], $paramDoc['isAnnexe'])) {
3741 $this->addToMessage(__("Erreur lors de la génération des documents à notifier."));
3742 return false;
3743 }
3744 }
3745 return true;
3746 }
3747
3748 /**
3749 * Ajoute un élément dans la table instruction_notification_document en utilisant
3750 * les éléments fourni en paramètre
3751 *
3752 * @param integer $idNotification : id de la notification à laquelle on associe le document
3753 * @param integer $idDocument : id de l'objet auquel est rattaché le document
3754 * @param string $tableDocument : nom de la table a laquelle est rattaché le document
3755 * @param boolean $isAnnexe : indique si le document est une annexe ou pas
3756 *
3757 * @return boolean indique si le traitement a réussi
3758 */
3759 protected function ajouter_notification_document($idNotification, $idDocument, $tableDocument, $isAnnexe = false) {
3760 $inst_notif_doc = $this->f->get_inst__om_dbform(array(
3761 "obj" => "instruction_notification_document",
3762 "idx" => "]",
3763 ));
3764 // l'attribut instruction doit obligatoirement être renseigné
3765 // pour éviter toutes confusion avec d'autres instruction l'id
3766 // 0 est donné au document n'appartenant pas aux instructions
3767 $notif_doc_val = array(
3768 'instruction_notification_document' => null,
3769 'instruction_notification' => $idNotification,
3770 'instruction' => $tableDocument == 'instruction' ? $idDocument : 0,
3771 'document_type' => $tableDocument,
3772 'document_id' => $idDocument,
3773 'cle' => $this->getCleAccesDocument(),
3774 'annexe' => $isAnnexe
3775 );
3776
3777 $add_notif_doc = $inst_notif_doc->ajouter($notif_doc_val);
3778 if ($add_notif_doc === false) {
3779 return false;
3780 }
3781 return true;
3782 }
3783
3784 /**
3785 * Vérifie si le paramétrage de la notification des demandeurs est correct.
3786 *
3787 * @param integer identifiant de la collectivité
3788 * @return boolean
3789 */
3790 protected function is_parametrage_notification_correct($collectiviteId) {
3791 $categorie = $this->f->get_param_option_notification($collectiviteId);
3792 $urlAccesNotif = $this->f->get_parametre_notification_url_acces($collectiviteId);
3793 if ($categorie == 'mail' && $urlAccesNotif == null) {
3794 return false;
3795 }
3796 return true;
3797 }
3798
3799 /**
3800 * TRIGGER - triggermodifierapres.
3801 *
3802 * @return boolean
3803 */
3804 function triggermodifierapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
3805 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
3806 $collectivite_di = $this->get_dossier_instruction_om_collectivite($val['dossier']);
3807 $message = '';
3808 /**
3809 * L'objectif ici est d'effectuer les recalculs de date dans le dossier
3810 * si la date de l'evenement est modifiee
3811 */
3812 // Initialisation
3813 $valF = array();
3814 $valF_dt = array();
3815 // Initialisation du type d'événement
3816 $type_evmt = "";
3817 // Récupération de l'action correspondante à l'événement
3818 $sql = "SELECT action
3819 FROM ".DB_PREFIXE."evenement
3820 WHERE evenement=".$this->valF['evenement'];
3821 $action = $this->f->db->getOne($sql);
3822 $this->addToLog(__METHOD__."(): db->getone(\"".$sql."\");", VERBOSE_MODE);
3823 if (database::isError($action)) {
3824 die($action->getMessage());
3825 }
3826
3827 // Récupération des paramètres de l'action
3828 $sql = "SELECT * FROM ".DB_PREFIXE."action
3829 WHERE action='".$action."'";
3830 $res = $this->f->db->query($sql);
3831 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3832 if (database::isError($res)) {
3833 die($res->getMessage());
3834 }
3835 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
3836 // application des regles sur le courrier + delai
3837 if(preg_match("/date_evenement/",$row['regle_date_limite'])){
3838 $valF['date_limite']= $this->regle($row['regle_date_limite'], 'regle_date_limite');
3839 }
3840 if(preg_match("/date_evenement/",$row['regle_date_complet'])){
3841 $valF['date_complet']= $this->regle($row['regle_date_complet'], 'regle_date_complet');
3842 }
3843 if(preg_match("/date_evenement/",$row['regle_date_dernier_depot'])){
3844 $valF['date_dernier_depot']= $this->regle($row['regle_date_dernier_depot'], 'regle_date_dernier_depot');
3845 }
3846 if(preg_match("/date_evenement/",$row['regle_date_notification_delai'])){
3847 $valF['date_notification_delai']= $this->regle($row['regle_date_notification_delai'], 'regle_date_notification_delai');
3848 }
3849 if(preg_match("/date_evenement/",$row['regle_date_decision'])){
3850 $valF['date_decision']= $this->regle($row['regle_date_decision'], 'regle_date_decision');
3851 }
3852 if(preg_match("/date_evenement/",$row['regle_date_rejet'])){
3853 $valF['date_rejet']= $this->regle($row['regle_date_rejet'], 'regle_date_rejet');
3854 }
3855 if(preg_match("/date_evenement/",$row['regle_date_validite'])){
3856 $valF['date_validite']= $this->regle($row['regle_date_validite'], 'regle_date_validite');
3857 }
3858 if(preg_match("/date_evenement/",$row['regle_date_chantier'])){
3859 $valF['date_chantier']= $this->regle($row['regle_date_chantier'], 'regle_date_chantier');
3860 }
3861 if(preg_match("/date_evenement/",$row['regle_date_achevement'])){
3862 $valF['date_achevement']= $this->regle($row['regle_date_achevement'], 'regle_date_achevement');
3863 }
3864 if(preg_match("/date_evenement/",$row['regle_date_conformite'])){
3865 $valF['date_conformite']= $this->regle($row['regle_date_conformite'], 'regle_date_conformite');
3866 }
3867 if(preg_match("/date_evenement/",$row['regle_date_cloture_instruction'])){
3868 $valF['date_cloture_instruction']= $this->regle($row['regle_date_cloture_instruction'], 'regle_date_cloture_instruction');
3869 }
3870 if(preg_match("/date_evenement/",$row['regle_date_premiere_visite'])){
3871 $valF['date_premiere_visite']= $this->regle($row['regle_date_premiere_visite'], 'regle_date_premiere_visite');
3872 }
3873 if(preg_match("/date_evenement/",$row['regle_date_derniere_visite'])){
3874 $valF['date_derniere_visite']= $this->regle($row['regle_date_derniere_visite'], 'regle_date_derniere_visite');
3875 }
3876 if(preg_match("/date_evenement/",$row['regle_date_contradictoire'])){
3877 $valF['date_contradictoire']= $this->regle($row['regle_date_contradictoire'], 'regle_date_contradictoire');
3878 }
3879 if(preg_match("/date_evenement/",$row['regle_date_retour_contradictoire'])){
3880 $valF['date_retour_contradictoire']= $this->regle($row['regle_date_retour_contradictoire'], 'regle_date_retour_contradictoire');
3881 }
3882 if(preg_match("/date_evenement/",$row['regle_date_ait'])){
3883 $valF['date_ait']= $this->regle($row['regle_date_ait'], 'regle_date_ait');
3884 }
3885 if(preg_match("/date_evenement/",$row['regle_date_transmission_parquet'])){
3886 $valF['date_transmission_parquet']= $this->regle($row['regle_date_transmission_parquet'], 'regle_date_transmission_parquet');
3887 }
3888 if ($row['regle_donnees_techniques1'] !== '') {
3889 $valF_dt[$row['cible_regle_donnees_techniques1']] = $this->regle($row['regle_donnees_techniques1'], 'regle_donnees_techniques1');
3890 }
3891 if ($row['regle_donnees_techniques2'] !== '') {
3892 $valF_dt[$row['cible_regle_donnees_techniques2']] = $this->regle($row['regle_donnees_techniques2'], 'regle_donnees_techniques2');
3893 }
3894 if ($row['regle_donnees_techniques3'] !== '') {
3895 $valF_dt[$row['cible_regle_donnees_techniques3']] = $this->regle($row['regle_donnees_techniques3'], 'regle_donnees_techniques3');
3896 }
3897 if ($row['regle_donnees_techniques4'] !== '') {
3898 $valF_dt[$row['cible_regle_donnees_techniques4']] = $this->regle($row['regle_donnees_techniques4'], 'regle_donnees_techniques4');
3899 }
3900 if ($row['regle_donnees_techniques5'] !== '') {
3901 $valF_dt[$row['cible_regle_donnees_techniques5']] = $this->regle($row['regle_donnees_techniques5'], 'regle_donnees_techniques5');
3902 }
3903 if ($row['regle_dossier_instruction_type'] !== '') {
3904 $valF['dossier_instruction_type'] = $this->regle($row['regle_dossier_instruction_type'], 'regle_dossier_instruction_type');
3905 }
3906 }
3907 // Si des valeurs de données techniques ont été calculées alors on met à jour l'enregistrement
3908 if (count($valF_dt) > 0) {
3909 $dt_id = $this->getDonneesTechniques();
3910 // On met à jour le dossier
3911 $cle = " donnees_techniques='".$dt_id."'";
3912 $res1 = $this->f->db->autoExecute(DB_PREFIXE.'donnees_techniques', $valF_dt, DB_AUTOQUERY_UPDATE, $cle);
3913 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE."donnees_techniques\", ".print_r($valF_dt, true).", DB_AUTOQUERY_UPDATE, \"".$cle."\");", VERBOSE_MODE);
3914 if (database::isError($res1)) {
3915 die($res->getMessage());
3916 }
3917 // Affichage d'informations à l'utilisateur
3918 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3919 }
3920 // Si des valeurs ont été calculées alors on met à jour l'enregistrement
3921 if (count($valF) > 0) {
3922 //
3923 $inst_dossier = $this->f->get_inst__om_dbform(array(
3924 "obj" => "dossier",
3925 "idx" => $this->valF['dossier'],
3926 ));
3927 $valF['instruction'] = $id;
3928 $valF['crud'] = 'update';
3929 $update_by_instruction = $inst_dossier->update_by_instruction($valF);
3930 if ($update_by_instruction === false) {
3931 $this->cleanMessage();
3932 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
3933 return false;
3934 }
3935 // Affichage d'informations à l'utilisateur
3936 $this->addToMessage(_('enregistrement')." ".$this->valF['dossier']." "._('table')." dossier [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
3937 }
3938
3939 $restriction = $this->get_restriction($val['evenement']);
3940 $this->restriction_valid = $this->restrictionIsValid($restriction);
3941
3942 if($restriction == "" || $this->restriction_valid ){
3943 // Récupération de tous les paramètres de l'événement sélectionné
3944 $sql = "SELECT * FROM ".DB_PREFIXE."evenement
3945 WHERE evenement=".$this->valF['evenement'];
3946 $res = $this->f->db->query($sql);
3947 $this->addToLog(__METHOD__."(): db->query(\"".$sql."\");", VERBOSE_MODE);
3948 if (database::isError($res)) {
3949 die($res->getMessage());
3950 }
3951 $current_id = $this->getVal($this->clePrimaire);
3952 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
3953 // Si la date de retour signature est éditée on vérifie si il existe un événement automatique
3954 if ($this->getVal('date_retour_signature') == "" AND
3955 $this->valF['date_retour_signature'] != "" AND
3956 $row['evenement_retour_signature'] != "") {
3957 $new_instruction = $this->f->get_inst__om_dbform(array(
3958 "obj" => "instruction",
3959 "idx" => "]",
3960 ));
3961 // Création d'un tableau avec la liste des champs de l'instruction
3962 foreach($new_instruction->champs as $champ) {
3963 $valNewInstr[$champ] = "";
3964 }
3965 // Définition des valeurs de la nouvelle instruction
3966 $valNewInstr["evenement"] = $row['evenement_retour_signature'];
3967 $valNewInstr["destinataire"] = $this->valF['destinataire'];
3968 $valNewInstr["dossier"] = $this->valF['dossier'];
3969 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_signature']);
3970 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
3971 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
3972 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
3973 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
3974 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
3975 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
3976 $new_instruction->setParameter("maj", 0);
3977 $new_instruction->class_actions[0]["identifier"] =
3978 "retour signature de l'instruction $current_id";
3979 $retour = $new_instruction->ajouter($valNewInstr);
3980
3981 //Si une erreur s'est produite et qu'il s'agit d'un problème
3982 //de restriction
3983 if ($retour == false && !$new_instruction->restriction_valid){
3984 $error_message = $this->get_restriction_error_message($restriction);
3985 $this->f->displayMessage("error", $error_message);
3986 $this->addToLog(__METHOD__."(): evenement retour ".
3987 "instruction ".$this->valF[$this->clePrimaire]." : ".
3988 $new_instruction->msg);
3989 }
3990 //Si une erreur s'est produite après le test de la restriction
3991 elseif ($retour == false && $new_instruction->restriction_valid){
3992 $this->correct = false ;
3993 $this->msg .= $new_instruction->msg;
3994 return false;
3995 }
3996 }
3997 // Si la date de retour AR est éditée on vérifie si il existe un événement automatique
3998 if ($this->getVal('date_retour_rar') == "" AND
3999 $this->valF['date_retour_rar'] != "") {
4000
4001 if($row['evenement_retour_ar'] != "") {
4002 $new_instruction = $this->f->get_inst__om_dbform(array(
4003 "obj" => "instruction",
4004 "idx" => "]",
4005 ));
4006 // Création d'un tableau avec la liste des champs de l'instruction
4007 foreach($new_instruction->champs as $champ) {
4008 $valNewInstr[$champ] = "";
4009 }
4010 // Définition des valeurs de la nouvelle instruction
4011 $valNewInstr["evenement"] = $row['evenement_retour_ar'];
4012 $valNewInstr["destinataire"] = $this->valF['destinataire'];
4013 $valNewInstr["dossier"] = $this->valF['dossier'];
4014 $valNewInstr["date_evenement"] = $this->f->formatDate($this->valF['date_retour_rar']);
4015 $valNewInstr["date_envoi_signature"] = $this->f->formatDate($this->valF['date_envoi_signature']);
4016 $valNewInstr["date_retour_signature"] = $this->f->formatDate($this->valF['date_retour_signature']);
4017 $valNewInstr["date_envoi_rar"] = $this->f->formatDate($this->valF['date_envoi_rar']);
4018 $valNewInstr["date_retour_rar"] = $this->f->formatDate($this->valF['date_retour_rar']);
4019 $valNewInstr["date_envoi_controle_legalite"] = $this->f->formatDate($this->valF['date_envoi_controle_legalite']);
4020 $valNewInstr["date_retour_controle_legalite"] = $this->f->formatDate($this->valF['date_retour_controle_legalite']);
4021 $new_instruction->setParameter("maj", 0);
4022 $new_instruction->class_actions[0]["identifier"] =
4023 "notification de l'instruction $current_id";
4024 $retour = $new_instruction->ajouter($valNewInstr);
4025
4026 //Si une erreur s'est produite et qu'il s'agit d'un problème
4027 //de restriction
4028 if ($retour == false && !$new_instruction->restriction_valid) {
4029 $error_message = $this->get_restriction_error_message($restriction);
4030 $this->f->displayMessage("error", $error_message);
4031 $this->addToLog(
4032 __METHOD__."(): evenement retour instruction ".
4033 $this->valF[$this->clePrimaire]." : ".
4034 $new_instruction->msg
4035 );
4036 }
4037 //Si une erreur s'est produite après le test de la restriction
4038 elseif ($retour == false && $new_instruction->restriction_valid){
4039 $this->correct = false ;
4040 $this->msg .= $new_instruction->msg;
4041 return false;
4042 }
4043 }
4044 }
4045 }
4046 }
4047
4048 /**
4049 * Mise à jour de la date de dernière modification du dossier
4050 * d'instruction
4051 */
4052 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4053 $inst_di->update_last_modification_date();
4054
4055 // Mise à jour des données du dossier d'autorisation
4056 $da = $this->f->get_inst__om_dbform(array(
4057 "obj" => "dossier_autorisation",
4058 "idx" => $this->getNumDemandeAutorFromDossier($this->valF['dossier']),
4059 ));
4060 $params = array(
4061 'di_id' => $this->getVal('dossier'),
4062 );
4063 if($da->majDossierAutorisation($params) === false) {
4064 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4065 $this->correct = false;
4066 return false;
4067 }
4068
4069 // mise à jour des métadonnées issues des dates de suivi
4070 $dateRetourSignatureModified = ($this->valF['date_retour_signature'] != $this->getVal('date_retour_signature'));
4071 $dateRetourRARModified = ($this->valF['date_retour_rar'] != $this->getVal('date_retour_rar'));
4072 if ($dateRetourSignatureModified || $dateRetourRARModified) {
4073
4074 // Calculs des nouvelles métadonnées
4075 $metadata = $this->getMetadata("om_fichier_instruction");
4076
4077 // On vérifie si l'instruction à finaliser a un événement de type arrete
4078 $sql = "SELECT type FROM ".DB_PREFIXE."evenement WHERE evenement = ".$this->getVal("evenement");
4079 $typeEvenement = $this->f->db->getOne($sql);
4080 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4081 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4082 $this->correct = false;
4083 $this->addToMessage(__("Erreur de traitement de fichier."));
4084 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($typeEvenement->getMessage(), true), DEBUG_MODE);
4085 return false;
4086 }
4087
4088 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4089 if ($typeEvenement == 'arrete'){
4090 $metadata = array_merge($metadata, $this->getMetadata("arrete"));
4091 }
4092
4093 // Filtre pour conserver uniquement les métadonnées liées aux dates
4094 $metadataToKeep = array(
4095 "statutAutorisation",
4096 "dateEvenementDocument",
4097 'date_cloture_metier',
4098 "NotificationArrete",
4099 "dateNotificationArrete",
4100 "controleLegalite",
4101 "dateSignature",
4102 "nomSignataire",
4103 "qualiteSignataire",
4104 "dateControleLegalite",
4105 );
4106 $metadata = array_filter(
4107 $metadata,
4108 function($key) use ($metadataToKeep) { return in_array($key, $metadataToKeep); },
4109 ARRAY_FILTER_USE_KEY
4110 );
4111
4112 // Mise à jour des métadonnées du document en GED
4113 $docUid = $this->getVal("om_fichier_instruction");
4114 $operationOrUID = $this->f->storage->update_metadata($docUid, $metadata);
4115 if ($operationOrUID == 'OP_FAILURE') {
4116 $this->correct = false;
4117 $this->addToMessage(__("Erreur de traitement de fichier."));
4118 $this->addToLog(__METHOD__."() failed to update metadata: ".var_export($operationOrUID, true), DEBUG_MODE);
4119 return false;
4120 }
4121
4122 // mise à jour de l'UID du document en BDD
4123 else {
4124 $valF = array('om_fichier_instruction' => $operationOrUID);
4125 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF, DB_AUTOQUERY_UPDATE, $this->getCle($id));
4126 $this->addToLog(__METHOD__.'() : db->autoExecute("'.DB_PREFIXE.$this->table.'", '.print_r($valF, true).', DB_AUTOQUERY_UPDATE, "'.$this->getCle($id).'")', VERBOSE_MODE);
4127 if ($this->f->isDatabaseError($res, true) === true) {
4128 $this->correct = false;
4129 $this->addToMessage(__("Erreur de traitement de fichier."));
4130 $this->addToLog(__METHOD__."() erreur BDD: ".var_export($res->getMessage(), true), DEBUG_MODE);
4131 return false;
4132 }
4133 $this->addToMessage(__("La mise a jour du document s'est effectuee avec succes."));
4134 }
4135 }
4136
4137 // Notification auto des demandeurs
4138 if ($dateRetourSignatureModified === true
4139 && $this->valF['date_retour_signature'] !== ''
4140 && $this->valF['date_retour_signature'] !== null) {
4141 //
4142 $ev = $this->get_inst_evenement($this->valF['evenement']);
4143 if ($ev->getVal('notification') === 'notification_auto_signature_requise') {
4144 // Récupération de la liste des demandeurs à notifier et de la catégorie
4145 $categorie = $this->f->get_param_option_notification($collectivite_di);
4146 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
4147 $demandeursANotifie = $this->get_demandeurs_notifiable(
4148 $this->valF['dossier'],
4149 $isPortal
4150 );
4151
4152 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
4153 $demandeurPrincipalNotifie = false;
4154 foreach ($demandeursANotifie as $demandeur) {
4155 // Identifie si le demandeur principal a été notifié ou pas
4156 // et récupère ses informations
4157 if ($demandeur['petitionnaire_principal'] == 't') {
4158 $demandeurPrincipalNotifie = true;
4159 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
4160 // son paramétrage, on effectue pas le traitement et on passe à l'itération
4161 // suivante. On le considère également comme non notifié pour gérer l'envoie
4162 // des messages d'erreurs
4163 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
4164 // d'impact sur la notification
4165 $erreursParam = $this->get_info_notification_fail();
4166 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
4167 $demandeurPrincipalNotifie = false;
4168 continue;
4169 }
4170 }
4171 // Ajout de la notif et récupération de son id
4172 $idNotif = $this->ajouter_notification(
4173 $this->valF[$this->clePrimaire],
4174 $this->f->get_connected_user_login_name(),
4175 $demandeur,
4176 $collectivite_di,
4177 array(),
4178 true
4179 );
4180 if ($idNotif === false) {
4181 return false;
4182 }
4183 // Création de la tache en lui donnant l'id de la notification
4184 $notification_by_task = $this->notification_by_task(
4185 $idNotif,
4186 $this->valF['dossier'],
4187 $categorie
4188 );
4189 if ($notification_by_task === false) {
4190 $this->addToMessage(
4191 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
4192 );
4193 return false;
4194 }
4195 }
4196 // Si le demandeur principal n'est pas notifiable, on créé une nouvelle notification
4197 // en erreur avec en commentaire la raison pour laquelle le demandeur principal
4198 // n'a pas pu être notifié
4199 if (! $demandeurPrincipalNotifie) {
4200 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
4201 $erreursParam = $this->get_info_notification_fail();
4202 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
4203 // Ajout de la notif et récupération de son id
4204 $idNotif = $this->ajouter_notification(
4205 $this->valF[$this->clePrimaire],
4206 $this->f->get_connected_user_login_name(),
4207 $demandeurPrincipal,
4208 $collectivite_di,
4209 array(),
4210 true,
4211 'Echec',
4212 implode(' ', $erreursParam)
4213 );
4214 if ($idNotif === false) {
4215 $this->addToMessage(
4216 __('Erreur : la création de la notification a échouée.').
4217 __("Veuillez contacter votre administrateur.")
4218 );
4219 return false;
4220 }
4221 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
4222 // de l'échec de la notification
4223 $dossier_message = $this->get_inst_dossier_message(0);
4224 $dossier_message_val = array(
4225 'dossier' => $this->getVal('dossier'),
4226 'type' => _('erreur expedition'),
4227 'emetteur' => $this->f->get_connected_user_login_name(),
4228 'login' => $_SESSION['login'],
4229 'date_emission' => date('Y-m-d H:i:s'),
4230 'contenu' => _('Échec lors de la notification de l\'instruction ').
4231 $ev->getVal('libelle').
4232 '.<br>'.
4233 implode("\n", $erreursParam).
4234 '<br>'.
4235 _('Veuillez corriger ces informations avant de renvoyer la notification.')
4236 );
4237 $add = $dossier_message->add_notification_message($dossier_message_val, true);
4238 // Si une erreur se produit pendant l'ajout
4239 if ($add !== true) {
4240 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
4241 return false;
4242 }
4243 }
4244 $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.")));
4245 }
4246 }
4247
4248 return $this->add_log_to_dossier($id, $val);
4249 }
4250
4251 /**
4252 * TRIGGER - triggersupprimer.
4253 *
4254 * @return boolean
4255 */
4256 function triggersupprimer($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4257 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4258 /**
4259 * L'objectif ici est de repositionner les valeurs récupérées en
4260 * archive dans le dossier d'instruction avant de supprimer l'événement
4261 * d'instruction si les valeurs du dossier sont différentes
4262 */
4263 $valF = array();
4264 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4265 foreach ($inst_di->champs as $key => $champ) {
4266 // Si le champ du DI à une archive dans l'instruction
4267 if (isset($val[sprintf('archive_%s', $champ)]) === true) {
4268 // Si la valeur entre le champ du DI et son archive dans instruction
4269 // est différente
4270 if ($inst_di->getVal($champ) !== $val[sprintf('archive_%s', $champ)]) {
4271 $val[sprintf('archive_%s', $champ)] === '' ? $valF[$champ] = null : $valF[$champ] = $val[sprintf('archive_%s', $champ)];
4272 }
4273 }
4274 }
4275 // Spécificité du champ avis_decision dont le champ archive est nommé
4276 // différemment
4277 if ($inst_di->getVal('avis_decision') !== $val['archive_avis']) {
4278 $val['archive_avis'] === '' ? $valF['avis_decision'] = null : $valF['avis_decision'] = $val['archive_avis'];
4279 }
4280 // Spécificité de la date d'affichage dont la valeur n'ai jamais modifiée
4281 // par l'archive
4282 unset($valF['date_affichage']);
4283
4284 /**
4285 * Mise à jour de la version de clôture *version_clos* du dossier si et
4286 * seulement si l'instruction met à jour l'état du dossier.
4287 */
4288 if (isset($valF['etat']) === true
4289 && $valF['etat'] !== null
4290 && $valF['etat'] !== '') {
4291 // Récupère l'état actuel du dossier d'instruction
4292 $inst_current_etat = $this->f->get_inst__om_dbform(array(
4293 "obj" => "etat",
4294 "idx" => $inst_di->get_id_etat(),
4295 ));
4296 // Instanciation de l'état archivé appliqué sur le dossier
4297 $inst_etat = $this->f->get_inst__om_dbform(array(
4298 "obj" => "etat",
4299 "idx" => $valF['etat'],
4300 ));
4301 //
4302 $update_version_clos = null;
4303 // En cas de clôture du dossier par l'état archivé
4304 if ($inst_etat->getVal('statut') === 'cloture') {
4305 $update_version_clos = $inst_di->update_version_clos('up');
4306 }
4307 // En cas de réouverture du dossier par l'état archivé
4308 if ($inst_current_etat->getVal('statut') === 'cloture'
4309 && $inst_etat->getVal('statut') !== 'cloture') {
4310 //
4311 $update_version_clos = $inst_di->update_version_clos('down');
4312 //
4313 $this->set_att_di_reopened(true);
4314 }
4315 //
4316 if ($update_version_clos === false) {
4317 $this->f->addToLog(sprintf(
4318 "%s() : ERREUR - %s %s",
4319 __METHOD__,
4320 sprintf(
4321 __("Impossible de mettre à jour la version de clôture du dossier d'instruction %s."),
4322 $inst_di->getVal($inst_di->clePrimaire)
4323 ),
4324 sprintf(
4325 __("L'instruction tente d'appliquer l'état %s."),
4326 $inst_etat->getVal($inst_etat->clePrimaire)
4327 )
4328 ));
4329 $this->addToMessage(sprintf(
4330 "%s %s",
4331 __("Erreur lors de la mise à jour de la version de clôture du dossier d'instruction."),
4332 __("Veuillez contacter votre administrateur.")
4333 ));
4334 return false;
4335 }
4336 }
4337 // On supprime toutes les notications liées à l'instruction
4338 $notifASupprimer = $this->get_instruction_notification($this->getVal($this->clePrimaire));
4339 foreach ($notifASupprimer as $idNotif) {
4340 $inst_notif = $this->f->get_inst__om_dbform(array(
4341 "obj" => "instruction_notification",
4342 "idx" => $idNotif,
4343 ));
4344 $val_notif = array();
4345 foreach ($inst_notif->champs as $champ) {
4346 $val_notif[$champ] = $inst_notif->getVal($champ);
4347 }
4348 // La suppression des notifications entrainera la suppression des tâches qui y sont
4349 // liées
4350 $supprNotif = $inst_notif->supprimer($val_notif);
4351 if ($supprNotif == false) {
4352 $this->addToMessage(sprintf(
4353 "%s %s",
4354 __("Erreur lors de la suppression des notifications de l'instruction."),
4355 __("Veuillez contacter votre administrateur.")
4356 ));
4357 return false;
4358 }
4359 }
4360
4361 // On met à jour le dossier
4362 $valF['instruction'] = $id;
4363 $valF['crud'] = 'delete';
4364 $update_by_instruction = $inst_di->update_by_instruction($valF);
4365 if ($update_by_instruction === false) {
4366 $this->cleanMessage();
4367 $this->addToMessage(sprintf('%s %s', __("Une erreur s'est produite lors de la mise à jour du dossier d'instruction."), __("Veuillez contacter votre administrateur.")));
4368 return false;
4369 }
4370
4371 // Affichage d'informations à l'utilisateur
4372 $this->addToMessage(_("Suppression de l'instruction")." [".$this->f->db->affectedRows()." "._('enregistrement')." "._('mis_a_jour')."]");
4373
4374 // Mise à jour de la demande si un récépissé d'instruction correspond à l'instruction à supprimer
4375 }
4376
4377 /**
4378 * TRIGGER - triggersupprimerapres.
4379 *
4380 * @return boolean
4381 */
4382 function triggersupprimerapres($id, &$dnu1 = null, $val = array(), $dnu2 = null) {
4383 $this->addToLog(__METHOD__."(): start", EXTRA_VERBOSE_MODE);
4384 /**
4385 * Mise à jour de la date de dernière modification du dossier
4386 * d'instruction
4387 */
4388 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
4389 $inst_di->update_last_modification_date();
4390
4391 /**
4392 * Mise à jour des données du dossier d'autorisation
4393 */
4394 $da = $this->f->get_inst__om_dbform(array(
4395 "obj" => "dossier_autorisation",
4396 "idx" => $this->getNumDemandeAutorFromDossier($val["dossier"]),
4397 ));
4398 $params = array(
4399 'di_id' => $this->getVal('dossier'),
4400 'di_reopened' => $this->get_att_di_reopened(),
4401 );
4402 if($da->majDossierAutorisation($params) === false) {
4403 $this->addToMessage(_("Erreur lors de la mise a jour des donnees du dossier d'autorisation. Contactez votre administrateur."));
4404 $this->correct = false;
4405 return false;
4406 }
4407
4408 /**
4409 * Gestion des tâches pour la dématérialisation
4410 */
4411 $inst_task_empty = $this->f->get_inst__om_dbform(array(
4412 "obj" => "task",
4413 "idx" => 0,
4414 ));
4415 foreach ($inst_di->task_types as $task_type) {
4416 $task_exists = $inst_task_empty->task_exists($task_type, $id);
4417 if ($task_exists !== false) {
4418 $inst_task = $this->f->get_inst__om_dbform(array(
4419 "obj" => "task",
4420 "idx" => $task_exists,
4421 ));
4422 if ($inst_task->getVal('state') === $inst_task::STATUS_NEW || $inst_task->getVal('state') === $inst_task::STATUS_DRAFT) {
4423 $task_val = array(
4424 'state' => $inst_task::STATUS_CANCELED,
4425 );
4426 $update_task = $inst_task->update_task(array('val' => $task_val));
4427 if ($update_task === false) {
4428 $this->addToMessage(sprintf('%s %s',
4429 sprintf(__("Une erreur s'est produite lors de la modification de la tâche %."), $inst_task->getVal($inst_task->clePrimaire)),
4430 __("Veuillez contacter votre administrateur.")
4431 ));
4432 $this->correct = false;
4433 return false;
4434 }
4435 }
4436 }
4437 }
4438
4439 //
4440 $val['evenement'] = $this->getVal('evenement');
4441 return $this->add_log_to_dossier($id, $val);
4442 }
4443
4444 /**
4445 * Permet de mettre la valeur passée en paramètre dans l'attribut de classe
4446 * "di_reopened".
4447 *
4448 * @param boolean $val
4449 */
4450 function set_att_di_reopened($val) {
4451 $this->di_reopened = $val;
4452 }
4453
4454 /**
4455 * Permet de récupérer la valeur de l'attribut de classe "di_reopened".
4456 *
4457 * @return boolean
4458 */
4459 function get_att_di_reopened() {
4460 return $this->di_reopened;
4461 }
4462
4463 /**
4464 * Permet de composer un message d'erreur sur restriction non valide en
4465 * fonction du contexte.
4466 *
4467 * @param string $restriction formule de la restriction
4468 *
4469 * @return string message d'erreur
4470 */
4471 function get_restriction_error_message($restriction) {
4472 // Affichage du message si la restriction s'applique
4473 // Contexte du suivi des dates (message simple)
4474 $message_restrict = _("Probleme de dates :");
4475 // Split restriction
4476 $champs_restrict = preg_split(
4477 '/(\W+)/',
4478 $restriction,
4479 null,
4480 PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE
4481 );
4482 $formated_restrict = "";
4483 // Ajout des chaînes à traduire
4484 foreach ($champs_restrict as $value) {
4485 $formated_restrict .= _($value)." ";
4486 }
4487 $formated_restrict = substr($formated_restrict, 0, -1);
4488 // Message d'erreur dans le contexte du suivi des dates
4489 if($this->getParameter("maj") == 170) {
4490 $message_restrict .= " "._("contactez l'instructeur du dossier");
4491 $message_restrict .= "<br/>(".$formated_restrict.")";
4492 } else {
4493 // Affichage du message si la restriction s'applique
4494 // Contexte instruction
4495 $message_restrict .= "<br/>".$formated_restrict;
4496 }
4497
4498 return $message_restrict;
4499 }
4500
4501 /**
4502 * Surcharge de la méthode verifier() de la classe om_dbform pour y ajouter
4503 * les vérifications suivantes :
4504 * - Si l'instruction à un événement associé et que cet événement à des restrictions :
4505 * 1. vérifie si la restriction est valide, si ce n'est pas le cas récupère et affiche
4506 * le message d'erreur associé à la restriction
4507 * 2. vérifie si les restrictions sont respectées. Si ce n'est pas le cas bloque l'ajout
4508 * et / ou la modification et affiche un message d'erreur
4509 * -
4510 * -
4511 * -
4512 * -
4513 * -
4514 * -
4515 *
4516 * @param array val : tableau contenant les valeurs issues du formulaire.
4517 * @param - dnu1 : Paramètre déprécié et non utilisé.
4518 * @param - dnu2 : Paramètre déprécié et non utilisé.
4519 *
4520 * @return void
4521 */
4522 function verifier($val = array(), &$dnu1 = null, $dnu2 = null) {
4523 parent::verifier($val);
4524 //
4525 if ( isset($val['evenement']) && is_numeric($val['evenement'])){
4526 $restriction = $this->get_restriction($val['evenement']);
4527
4528 //Test qu'une restriction est présente
4529 if ($restriction != "" ){
4530
4531 //Test si la restriction est valide
4532 $this->restriction_valid = $this->restrictionIsValid($restriction);
4533 if ( !$this->restriction_valid ){
4534
4535 // Affichage du message si la restriction s'applique
4536 $this->addToMessage(
4537 $this->get_restriction_error_message($restriction)
4538 );
4539 $this->correct=false;
4540 return false;
4541 }
4542
4543 // Liste des opérateurs possible
4544 $operateurs = array(">=", "<=", "+", "-", "&&", "||", "==", "!=");
4545 // Supprime tous les espaces de la chaîne de caractère
4546 $restriction = str_replace(' ', '', $restriction);
4547
4548 // Met des espace avant et après les opérateurs puis transforme la
4549 // chaine en un tableau
4550 $tabRestriction = str_replace($operateurs, " ", $restriction);
4551 // Tableau des champ
4552 $tabRestriction = explode(" ", $tabRestriction);
4553 // Supprime les numériques du tableau
4554 foreach ($tabRestriction as $key => $value) {
4555 if (is_numeric($value)) {
4556 unset($tabRestriction[$key]);
4557 }
4558 }
4559
4560 // Vérifie les champs utilisés pour la restriction
4561 $check_field_exist = $this->f->check_field_exist($tabRestriction, 'instruction');
4562 if ($check_field_exist !== true) {
4563
4564 // Liste des champs en erreur
4565 $string_error_fields = implode(", ", $check_field_exist);
4566
4567 // Message d'erreur
4568 $error_message = _("Le champ %s n'est pas utilisable pour le champ %s");
4569 if (count($check_field_exist) > 1) {
4570 $error_message = _("Les champs %s ne sont pas utilisable pour le champ %s");
4571 }
4572
4573 // Affiche l'erreur
4574 $this->correct=false;
4575 $this->addToMessage(sprintf($error_message, $string_error_fields, _("restriction")));
4576 $this->addToMessage(_("Veuillez contacter votre administrateur."));
4577 }
4578 }
4579
4580 }
4581 if(!$this->updateDate("date_envoi_signature")) {
4582 return false;
4583 }
4584 if(!$this->updateDate("date_retour_signature")) {
4585 return false;
4586 }
4587 if(!$this->updateDate("date_envoi_rar")) {
4588 return false;
4589 }
4590 if(!$this->updateDate("date_retour_rar")) {
4591 return false;
4592 }
4593 if(!$this->updateDate("date_envoi_controle_legalite")) {
4594 return false;
4595 }
4596 if(!$this->updateDate("date_retour_controle_legalite")) {
4597 return false;
4598 }
4599
4600 }
4601
4602 /**
4603 * Récupère et stocket dans un tableau toutes les infos du pétitionnaire
4604 * principal du dossier auquel appartiens l'instruction.
4605 * Renvoie un tableau contenant les informations du pétitionnaire principal.
4606 *
4607 * Si l'identifiant de l'instruction n'a pas pu etre récupéré renvoie false
4608 * et affiche un message dans les logs.
4609 * En cas d'erreur de base de donnée renvoie false et affiche un message d'erreur.
4610 *
4611 * @param string identifiant du dossier
4612 * @return array|boolean
4613 */
4614 protected function get_info_petitionnaire_principal_dossier($dossier = null) {
4615 // Si l'identifiant de l'instruction n'a pas été fournit on récupère celui de
4616 // l'objet courant
4617 if (empty($dossier)) {
4618 $dossier = $this->getVal('dossier');
4619 // Si la récupération de l'identifiant de l'instruction a échoué la méthode renvoie
4620 // false et on affiche un message d'erreur dans les logs
4621 if (empty($dossier)) {
4622 $this->addToLog(__METHOD__.' : L\'identifiant du dossier n\'a pas pu être récupéré');
4623 return false;
4624 }
4625 }
4626
4627 // Requête sql servant à récupérer toutes les informations relatives au demandeurs
4628 // principal
4629 $sql = sprintf(
4630 'SELECT
4631 -- Récupère toutes les informations du demandeur principal
4632 demandeur.*,
4633 CASE
4634 WHEN demandeur.qualite=\'particulier\'
4635 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
4636 ELSE
4637 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
4638 END AS destinataire
4639 FROM
4640 %1$sdossier
4641 LEFT JOIN %1$slien_dossier_demandeur
4642 ON lien_dossier_demandeur.dossier = dossier.dossier
4643 LEFT JOIN %1$sdemandeur
4644 ON demandeur.demandeur = lien_dossier_demandeur.demandeur
4645 WHERE
4646 dossier.dossier = \'%2$s\'
4647 AND lien_dossier_demandeur.petitionnaire_principal IS TRUE',
4648 DB_PREFIXE,
4649 $dossier
4650 );
4651
4652 $res = $this->f->get_one_row_result_from_db_query($sql);
4653 if ($res['code'] === 'KO') {
4654 return false;
4655 }
4656 return $res['result'];
4657 }
4658
4659
4660
4661 /**
4662 * Finalisation des documents.
4663 * @param string $champ champ du fichier à finaliser
4664 * @param booleen $status permet de définir si on finalise ou définalise
4665 * @param string $sousform permet de savoir si se trouve dans un sousformulaire (passé au javascript)
4666 */
4667 function manage_finalizing($mode = null, $val = array()) {
4668 //
4669 $this->begin_treatment(__METHOD__);
4670
4671 //
4672 $id_inst = $this->getVal($this->clePrimaire);
4673
4674 //
4675 $admin_msg_error = _("Veuillez contacter votre administrateur.");
4676 $file_msg_error = _("Erreur de traitement de fichier.")
4677 ." ".$admin_msg_error;
4678 $bdd_msg_error = _("Erreur de base de données.")
4679 ." ".$admin_msg_error;
4680 $log_msg_error = "Finalisation non enregistrée - id instruction = %s - uid fichier = %s";
4681
4682 // Si on finalise le document
4683 if ($mode == "finalize"){
4684 //
4685 $etat = _('finalisation');
4686
4687 // Récupère la collectivite du dossier d'instruction
4688 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
4689
4690 //
4691 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
4692
4693 //
4694 $params = array(
4695 "specific" => array(),
4696 );
4697 // Si la rédaction libre est activée sur l'instruction
4698 if ($this->getVal("flag_edition_integrale") == 't') {
4699 $params["specific"]["corps"] = array(
4700 "mode" => "set",
4701 "value" => $this->getVal("corps_om_htmletatex"),
4702 );
4703 $params["specific"]["titre"] = array(
4704 "mode" => "set",
4705 "value" => $this->getVal("titre_om_htmletat"),
4706 );
4707 }
4708 // Génération du PDF
4709 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
4710 $pdf_output = $result['pdf_output'];
4711
4712 //Métadonnées du document
4713 $metadata = array(
4714 'filename' => 'instruction_'.$id_inst.'.pdf',
4715 'mimetype' => 'application/pdf',
4716 'size' => strlen($pdf_output)
4717 );
4718
4719 // Récupération des métadonnées calculées après validation
4720 $spe_metadata = $this->getMetadata("om_fichier_instruction");
4721
4722 //On vérifie si l'instruction à finaliser a un événement de type arrete
4723 $sql = "SELECT type
4724 FROM ".DB_PREFIXE."evenement
4725 WHERE evenement = ".$this->getVal("evenement");
4726 $typeEvenement = $this->f->db->getOne($sql);
4727 $this->addToLog(__METHOD__."(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4728 if ($this->f->isDatabaseError($typeEvenement, true) === true) {
4729 $this->correct = false;
4730 $this->addToMessage($bdd_msg_error);
4731 return $this->end_treatment(__METHOD__, false);
4732 }
4733
4734 //Initialisation de la variable
4735 $arrete_metadata = array();
4736 // Si l'événement est de type arrete, on ajoute les métadonnées spécifiques
4737 if ( $typeEvenement === 'arrete' ){
4738 $arrete_metadata = $this->getMetadata("arrete");
4739 }
4740
4741 $metadata = array_merge($metadata, $spe_metadata, $arrete_metadata);
4742
4743 /*
4744 // transforme le tableau de métadonnées en objet
4745 $mdf = new MetadataFactory();
4746 $md = $mdf->build('Instruction', $metadata);
4747 */
4748
4749 // Si le document a déjà été finalisé on le met à jour
4750 // en conservant son UID
4751 if ($this->getVal("om_fichier_instruction") != ''){
4752 $uid = $this->f->storage->update(
4753 $this->getVal("om_fichier_instruction"), $pdf_output, $metadata);
4754 }
4755 // Sinon on crée un nouveau document et dont on récupère l'UID
4756 else {
4757 $uid = $this->f->storage->create($pdf_output, $metadata, "from_content", $this->table.".om_fichier_instruction");
4758 }
4759 }
4760
4761 // Si on définalise le document
4762 if ($mode == "unfinalize") {
4763 //
4764 $etat = _('définalisation');
4765 // Récupération de l'uid du document finalisé
4766 $uid = $this->getVal("om_fichier_instruction");
4767 }
4768
4769 // Si on définalise l'UID doit être défini
4770 // Si on finalise la création/modification du fichier doit avoir réussi
4771 if ($uid == '' || $uid == 'OP_FAILURE' ) {
4772 $this->correct = false;
4773 $this->addToMessage($file_msg_error);
4774 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4775 return $this->end_treatment(__METHOD__, false);
4776 }
4777
4778 //
4779 foreach ($this->champs as $key => $champ) {
4780 //
4781 $val[$champ] = $this->val[$key];
4782 }
4783
4784 //
4785 $val['date_evenement'] = $this->dateDBToForm($val['date_evenement']);
4786 $val['archive_date_complet'] = $this->dateDBToForm($val['archive_date_complet']);
4787 $val['archive_date_rejet'] = $this->dateDBToForm($val['archive_date_rejet']);
4788 $val['archive_date_limite'] = $this->dateDBToForm($val['archive_date_limite']);
4789 $val['archive_date_notification_delai'] = $this->dateDBToForm($val['archive_date_notification_delai']);
4790 $val['archive_date_decision'] = $this->dateDBToForm($val['archive_date_decision']);
4791 $val['archive_date_validite'] = $this->dateDBToForm($val['archive_date_validite']);
4792 $val['archive_date_achevement'] = $this->dateDBToForm($val['archive_date_achevement']);
4793 $val['archive_date_chantier'] = $this->dateDBToForm($val['archive_date_chantier']);
4794 $val['archive_date_conformite'] = $this->dateDBToForm($val['archive_date_conformite']);
4795 $val['archive_date_dernier_depot'] = $this->dateDBToForm($val['archive_date_dernier_depot']);
4796 $val['archive_date_limite_incompletude'] = $this->dateDBToForm($val['archive_date_limite_incompletude']);
4797 $val['date_finalisation_courrier'] = $this->dateDBToForm($val['date_finalisation_courrier']);
4798 $val['date_envoi_signature'] = $this->dateDBToForm($val['date_envoi_signature']);
4799 $val['date_retour_signature'] = $this->dateDBToForm($val['date_retour_signature']);
4800 $val['date_envoi_rar'] = $this->dateDBToForm($val['date_envoi_rar']);
4801 $val['date_retour_rar'] = $this->dateDBToForm($val['date_retour_rar']);
4802 $val['date_envoi_controle_legalite'] = $this->dateDBToForm($val['date_envoi_controle_legalite']);
4803 $val['date_retour_controle_legalite'] = $this->dateDBToForm($val['date_retour_controle_legalite']);
4804 $val['archive_date_cloture_instruction'] = $this->dateDBToForm($val['archive_date_cloture_instruction']);
4805 $val['archive_date_premiere_visite'] = $this->dateDBToForm($val['archive_date_premiere_visite']);
4806 $val['archive_date_derniere_visite'] = $this->dateDBToForm($val['archive_date_derniere_visite']);
4807 $val['archive_date_contradictoire'] = $this->dateDBToForm($val['archive_date_contradictoire']);
4808 $val['archive_date_retour_contradictoire'] = $this->dateDBToForm($val['archive_date_retour_contradictoire']);
4809 $val['archive_date_ait'] = $this->dateDBToForm($val['archive_date_ait']);
4810 $val['archive_date_transmission_parquet'] = $this->dateDBToForm($val['archive_date_transmission_parquet']);
4811 $val['archive_date_affichage'] = $this->dateDBToForm($val['archive_date_affichage']);
4812 $this->setvalF($val);
4813
4814 // Verification de la validite des donnees
4815 $this->verifier($this->val);
4816 // Si les verifications precedentes sont correctes, on procede a
4817 // la modification, sinon on ne fait rien et on retourne une erreur
4818 if ($this->correct === true) {
4819 //
4820 $valF = array(
4821 "om_fichier_instruction" => $uid,
4822 "date_finalisation_courrier" => date('Y-m-d')
4823 );
4824 //
4825 if($mode=="finalize") {
4826 // état finalisé vrai
4827 $valF["om_final_instruction"] = true;
4828 // ajout log utilisateur
4829 $login = $_SESSION['login'];
4830 $nom = "";
4831 $this->f->getUserInfos();
4832 if (isset($this->f->om_utilisateur["nom"])
4833 && !empty($this->f->om_utilisateur["nom"])) {
4834 $nom = $this->f->om_utilisateur["nom"];
4835 }
4836 $valF["om_final_instruction_utilisateur"] = $_SESSION['login'];
4837 if ($nom != "") {
4838 $valF["om_final_instruction_utilisateur"] .= " (".$nom.")";
4839 }
4840 } else {
4841 // état finalisé faux
4842 $valF["om_final_instruction"] = false;
4843 // suppression log utilisateur
4844 $valF["om_final_instruction_utilisateur"] = '';
4845 }
4846
4847 // Execution de la requête de modification des donnees de l'attribut
4848 // valF de l'objet dans l'attribut table de l'objet
4849 $res = $this->f->db->autoExecute(DB_PREFIXE.$this->table, $valF,
4850 DB_AUTOQUERY_UPDATE, $this->getCle($id_inst));
4851 $this->addToLog(__METHOD__."() : db->autoExecute(\"".DB_PREFIXE.$this->table."\", ".print_r($valF, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($id_inst)."\")", VERBOSE_MODE);
4852 //
4853 if ($this->f->isDatabaseError($res, true) === true) {
4854 $this->correct = false;
4855 $this->addToMessage($bdd_msg_error);
4856 return $this->end_treatment(__METHOD__, false);
4857 }
4858
4859 //
4860 $this->addToMessage(sprintf(_("La %s du document s'est effectuee avec succes."), $etat));
4861 //
4862 if ($this->add_log_to_dossier($id_inst, $val) === false) {
4863 return $this->end_treatment(__METHOD__, false);
4864 }
4865 //
4866 return $this->end_treatment(__METHOD__, true);
4867 }
4868 // L'appel de verifier() a déjà positionné correct à false
4869 // et défini un message d'erreur.
4870 $this->addToLog(sprintf($log_msg_error, $id_inst, $uid), DEBUG_MODE);
4871 return $this->end_treatment(__METHOD__, false);
4872 }
4873
4874 /**
4875 * Récupération du numéro de dossier d'instruction à ajouter aux métadonnées
4876 * @return string numéro de dossier d'instruction
4877 */
4878 protected function getDossier($champ = null) {
4879 if(empty($this->specificMetadata)) {
4880 $this->getSpecificMetadata();
4881 }
4882 return $this->specificMetadata->dossier;
4883 }
4884 /**
4885 * Récupération la version du dossier d'instruction à ajouter aux métadonnées
4886 * @return int Version
4887 */
4888 protected function getDossierVersion() {
4889 if(empty($this->specificMetadata)) {
4890 $this->getSpecificMetadata();
4891 }
4892 return $this->specificMetadata->version;
4893 }
4894 /**
4895 * Récupération du numéro de dossier d'autorisation à ajouter aux métadonnées
4896 * @return string numéro de dossier d'autorisation
4897 */
4898 protected function getNumDemandeAutor() {
4899 if(empty($this->specificMetadata)) {
4900 $this->getSpecificMetadata();
4901 }
4902 return $this->specificMetadata->dossier_autorisation;
4903 }
4904 /**
4905 * Récupération de la date de demande initiale du dossier à ajouter aux métadonnées
4906 * @return date de la demande initiale
4907 */
4908 protected function getAnneemoisDemandeAutor() {
4909 if(empty($this->specificMetadata)) {
4910 $this->getSpecificMetadata();
4911 }
4912 return $this->specificMetadata->date_demande_initiale;
4913 }
4914 /**
4915 * Récupération du type de dossier d'instruction à ajouter aux métadonnées
4916 * @return string type du dossier d'instruction
4917 */
4918 protected function getTypeInstruction() {
4919 if(empty($this->specificMetadata)) {
4920 $this->getSpecificMetadata();
4921 }
4922 return $this->specificMetadata->dossier_instruction_type;
4923 }
4924 /**
4925 * Récupération du statut du dossier d'autorisation à ajouter aux métadonnées
4926 * @return string avis
4927 */
4928 protected function getStatutAutorisation() {
4929 if(empty($this->specificMetadata)) {
4930 $this->getSpecificMetadata();
4931 }
4932 return $this->specificMetadata->statut;
4933 }
4934 /**
4935 * Récupération du type de dossier d'autorisation à ajouter aux métadonnées
4936 * @return string type du dossier d'autorisation
4937 */
4938 protected function getTypeAutorisation() {
4939 if(empty($this->specificMetadata)) {
4940 $this->getSpecificMetadata();
4941 }
4942 return $this->specificMetadata->dossier_autorisation_type;
4943 }
4944 /**
4945 * Récupération de la date d'ajout de document à ajouter aux métadonnées
4946 * @return date de l'évènement
4947 */
4948 protected function getDateEvenementDocument() {
4949 return date("Y-m-d");
4950 }
4951 /**
4952 * Récupération du groupe d'instruction à ajouter aux métadonnées
4953 * @return string Groupe d'instruction
4954 */
4955 protected function getGroupeInstruction() {
4956 if(empty($this->specificMetadata)) {
4957 $this->getSpecificMetadata();
4958 }
4959 return $this->specificMetadata->groupe_instruction;
4960 }
4961 /**
4962 * Récupération du libellé du type du document à ajouter aux métadonnées
4963 * @return string Groupe d'instruction
4964 */
4965 protected function getTitle() {
4966
4967 // Récupère le champ événement
4968 if (isset($this->valF["evenement"]) AND $this->valF["evenement"] != "") {
4969 $evenement = $this->valF["evenement"];
4970 } else {
4971 $evenement = $this->getVal("evenement");
4972 }
4973
4974 // Requête sql
4975 $sql = "SELECT libelle FROM ".DB_PREFIXE."evenement
4976 WHERE evenement=".$evenement;
4977 $evenement_libelle = $this->f->db->getOne($sql);
4978 $this->addToLog("getTitle(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
4979 if (database::isError($evenement_libelle)) {
4980 die();
4981 }
4982
4983 // Retourne le libelle de l'événement
4984 return $evenement_libelle;
4985 }
4986
4987
4988 /**
4989 * Récupération du champ ERP du dossier d'instruction.
4990 *
4991 * @return boolean
4992 */
4993 public function get_concerne_erp() {
4994 //
4995 if(empty($this->specificMetadata)) {
4996 $this->getSpecificMetadata();
4997 }
4998 //
4999 return $this->specificMetadata->erp;
5000 }
5001
5002
5003 /**
5004 * Cette méthode permet de stocker en attribut toutes les métadonnées
5005 * nécessaire à l'ajout d'un document.
5006 */
5007 public function getSpecificMetadata() {
5008 if (isset($this->valF["dossier"]) AND $this->valF["dossier"] != "") {
5009 $dossier = $this->valF["dossier"];
5010 } else {
5011 $dossier = $this->getVal("dossier");
5012 }
5013 //Requête pour récupérer les informations essentiels sur le dossier d'instruction
5014 $sql = "SELECT dossier.dossier as dossier,
5015 dossier_autorisation.dossier_autorisation as dossier_autorisation,
5016 to_char(dossier.date_demande, 'YYYY/MM') as date_demande_initiale,
5017 dossier_instruction_type.code as dossier_instruction_type,
5018 etat_dossier_autorisation.libelle as statut,
5019 dossier_autorisation_type.code as dossier_autorisation_type,
5020 groupe.code as groupe_instruction,
5021 CASE WHEN dossier.erp IS TRUE
5022 THEN 'true'
5023 ELSE 'false'
5024 END as erp
5025 FROM ".DB_PREFIXE."dossier
5026 LEFT JOIN ".DB_PREFIXE."dossier_instruction_type
5027 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
5028 LEFT JOIN ".DB_PREFIXE."dossier_autorisation
5029 ON dossier.dossier_autorisation = dossier_autorisation.dossier_autorisation
5030 LEFT JOIN ".DB_PREFIXE."etat_dossier_autorisation
5031 ON dossier_autorisation.etat_dossier_autorisation = etat_dossier_autorisation.etat_dossier_autorisation
5032 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
5033 ON dossier_autorisation.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
5034 LEFT JOIN ".DB_PREFIXE."dossier_autorisation_type
5035 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
5036 LEFT JOIN ".DB_PREFIXE."groupe
5037 ON dossier_autorisation_type.groupe = groupe.groupe
5038 WHERE dossier.dossier = '".$dossier."'";
5039 $res = $this->f->db->query($sql);
5040 $this->f->addToLog("getSpecificMetadata() : db->query(".$sql.")", VERBOSE_MODE);
5041 if ( database::isError($res)){
5042 die();
5043 }
5044
5045 //Le résultat est récupéré dans un objet
5046 $row =& $res->fetchRow(DB_FETCHMODE_OBJECT);
5047
5048 //Si il y a un résultat
5049 if ($row !== null) {
5050
5051 // Instrance de la classe dossier
5052 $inst_dossier = $this->get_inst_dossier($dossier);
5053
5054 // Insère l'attribut version à l'objet
5055 $row->version = $inst_dossier->get_dossier_instruction_version();
5056
5057 //Alors on créé l'objet dossier_instruction
5058 $this->specificMetadata = $row;
5059
5060 }
5061 }
5062
5063 /**
5064 * Retourne le statut du dossier d'instruction
5065 * @param string $idx Identifiant du dossier d'instruction
5066 * @return string Le statut du dossier d'instruction
5067 */
5068 function getStatutAutorisationDossier($idx){
5069
5070 $statut = '';
5071
5072 //Si l'identifiant du dossier d'instruction fourni est correct
5073 if ( $idx != '' ){
5074
5075 //On récupère le statut de l'état du dossier à partir de l'identifiant du
5076 //dossier
5077 $sql = "SELECT etat.statut
5078 FROM ".DB_PREFIXE."dossier
5079 LEFT JOIN
5080 ".DB_PREFIXE."etat
5081 ON
5082 dossier.etat = etat.etat
5083 WHERE dossier ='".$idx."'";
5084 $statut = $this->f->db->getOne($sql);
5085 $this->f->addToLog("getStatutAutorisationDossier() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
5086 if ( database::isError($statut)){
5087 die();
5088 }
5089 }
5090 return $statut;
5091 }
5092
5093 /**
5094 * Récupère les données du dossier
5095 * @return array
5096 */
5097 function get_dossier_actual() {
5098
5099 // Initialisation de la valeur de retour
5100 $return = array();
5101
5102 // Récupération de toutes les valeurs du dossier d'instruction en cours
5103 $sql = "SELECT * FROM ".DB_PREFIXE."dossier
5104 WHERE dossier='".$this->valF['dossier']."'";
5105 $res = $this->f->db->query($sql);
5106 $this->addToLog("get_dossier_actual(): db->query(\"".$sql."\");", VERBOSE_MODE);
5107 $this->f->isDatabaseError($res);
5108
5109 //
5110 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
5111
5112 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5113 // de l'état et de l'avis du dossier d'instruction
5114 $return['archive_delai'] = $row['delai'];
5115 $return['archive_accord_tacite'] = $row['accord_tacite'];
5116 $return['archive_etat'] = $row['etat'];
5117 $return['archive_avis'] = $row['avis_decision'];
5118 // Récupération de la valeur actuelle des dates du dossier
5119 // d'instruction
5120 $return['archive_date_complet'] = $row['date_complet'];
5121 $return['archive_date_dernier_depot'] = $row['date_dernier_depot'];
5122 $return['archive_date_rejet'] = $row['date_rejet'];
5123 $return['archive_date_limite'] = $row['date_limite'];
5124 $return['archive_date_notification_delai'] = $row['date_notification_delai'];
5125 $return['archive_date_decision'] = $row['date_decision'];
5126 $return['archive_date_validite'] = $row['date_validite'];
5127 $return['archive_date_achevement'] = $row['date_achevement'];
5128 $return['archive_date_chantier'] = $row['date_chantier'];
5129 $return['archive_date_conformite'] = $row['date_conformite'];
5130 $return['archive_incompletude'] = $row['incompletude'];
5131 $return['archive_incomplet_notifie'] = $row['incomplet_notifie'];
5132 $return['archive_evenement_suivant_tacite'] = $row['evenement_suivant_tacite'];
5133 $return['archive_evenement_suivant_tacite_incompletude'] = $row['evenement_suivant_tacite_incompletude'];
5134 $return['archive_etat_pendant_incompletude'] = $row['etat_pendant_incompletude'];
5135 $return['archive_date_limite_incompletude'] = $row['date_limite_incompletude'];
5136 $return['archive_delai_incompletude'] = $row['delai_incompletude'];
5137 $return['archive_autorite_competente'] = $row['autorite_competente'];
5138 $return['archive_dossier_instruction_type'] = $row['dossier_instruction_type'];
5139 $return['duree_validite'] = $row['duree_validite'];
5140 $return['date_depot'] = $row['date_depot'];
5141 $return['date_depot_mairie'] = $row['date_depot_mairie'];
5142 $return['archive_date_cloture_instruction'] = $row['date_cloture_instruction'];
5143 $return['archive_date_premiere_visite'] = $row['date_premiere_visite'];
5144 $return['archive_date_derniere_visite'] = $row['date_derniere_visite'];
5145 $return['archive_date_contradictoire'] = $row['date_contradictoire'];
5146 $return['archive_date_retour_contradictoire'] = $row['date_retour_contradictoire'];
5147 $return['archive_date_ait'] = $row['date_ait'];
5148 $return['archive_date_transmission_parquet'] = $row['date_transmission_parquet'];
5149 $return['archive_date_affichage'] = $row['date_affichage'];
5150 $return['archive_pec_metier'] = $row['pec_metier'];
5151 $return['archive_a_qualifier'] = $row['a_qualifier'];
5152 }
5153
5154 // Retour de la fonction
5155 return $return;
5156
5157 }
5158
5159 /**
5160 * Permet de vérifier qu'un événement est verrouillable
5161 * @param integer $idx Identifiant de l'instruction
5162 * @return boolean
5163 */
5164 function checkEvenementNonVerrouillable($idx) {
5165
5166 // Initialisation du résultat
5167 $non_verrouillable = false;
5168
5169 // Si la condition n'est pas vide
5170 if ($idx != "") {
5171
5172 // Requête SQL
5173 $sql = "SELECT evenement.non_verrouillable
5174 FROM ".DB_PREFIXE."evenement
5175 LEFT JOIN ".DB_PREFIXE."instruction
5176 ON instruction.evenement = evenement.evenement
5177 WHERE instruction.instruction = $idx";
5178 $this->f->addToLog("checkEvenementNonVerrouillable() : db->getOne(\"".$sql."\")", VERBOSE_MODE);
5179 $res = $this->f->db->getOne($sql);
5180 $this->f->isDatabaseError($res);
5181
5182 // Si le retour de la requête est true
5183 if ($res == 't') {
5184 //
5185 $non_verrouillable = true;
5186 }
5187 }
5188
5189 // Retourne résultat
5190 return $non_verrouillable;
5191 }
5192
5193 /**
5194 * Mise à jour des champs archive_*
5195 * @param mixed $row La ligne de données
5196 */
5197 public function updateArchiveData($row){
5198
5199 // Récupération de la valeur actuelle du délai, de l'accord tacite,
5200 // de l'état et de l'avis du dossier d'instruction
5201 $this->valF['archive_delai']=$row['delai'];
5202 $this->valF['archive_accord_tacite']=$row['accord_tacite'];
5203 $this->valF['archive_etat']=$row['etat'];
5204 $this->valF['archive_avis']=$row['avis_decision'];
5205 // Récupération de la valeur actuelle des 9 dates du dossier
5206 // d'instruction
5207 if ($row['date_complet'] != '') {
5208 $this->valF['archive_date_complet']=$row['date_complet'];
5209 }
5210 if ($row['date_dernier_depot'] != '') {
5211 $this->valF['archive_date_dernier_depot']=$row['date_dernier_depot'];
5212 }
5213 if ($row['date_rejet'] != '') {
5214 $this->valF['archive_date_rejet']= $row['date_rejet'];
5215 }
5216 if ($row['date_limite'] != '') {
5217 $this->valF['archive_date_limite']= $row['date_limite'];
5218 }
5219 if ($row['date_notification_delai'] != '') {
5220 $this->valF['archive_date_notification_delai']= $row['date_notification_delai'];
5221 }
5222 if ($row['date_decision'] != '') {
5223 $this->valF['archive_date_decision']= $row['date_decision'];
5224 }
5225 if ($row['date_validite'] != '') {
5226 $this->valF['archive_date_validite']= $row['date_validite'];
5227 }
5228 if ($row['date_achevement'] != '') {
5229 $this->valF['archive_date_achevement']= $row['date_achevement'];
5230 }
5231 if ($row['date_chantier'] != '') {
5232 $this->valF['archive_date_chantier']= $row['date_chantier'];
5233 }
5234 if ($row['date_conformite'] != '') {
5235 $this->valF['archive_date_conformite']= $row['date_conformite'];
5236 }
5237 if ($row['incompletude'] != '') {
5238 $this->valF['archive_incompletude']= $row['incompletude'];
5239 }
5240 if ($row['incomplet_notifie'] != '') {
5241 $this->valF['archive_incomplet_notifie']= $row['incomplet_notifie'];
5242 }
5243 if ($row['evenement_suivant_tacite'] != '') {
5244 $this->valF['archive_evenement_suivant_tacite']= $row['evenement_suivant_tacite'];
5245 }
5246 if ($row['evenement_suivant_tacite_incompletude'] != '') {
5247 $this->valF['archive_evenement_suivant_tacite_incompletude']= $row['evenement_suivant_tacite_incompletude'];
5248 }
5249 if ($row['etat_pendant_incompletude'] != '') {
5250 $this->valF['archive_etat_pendant_incompletude']= $row['etat_pendant_incompletude'];
5251 }
5252 if ($row['date_limite_incompletude'] != '') {
5253 $this->valF['archive_date_limite_incompletude']= $row['date_limite_incompletude'];
5254 }
5255 if ($row['delai_incompletude'] != '') {
5256 $this->valF['archive_delai_incompletude']= $row['delai_incompletude'];
5257 }
5258 if ($row['autorite_competente'] != '') {
5259 $this->valF['archive_autorite_competente']= $row['autorite_competente'];
5260 }
5261 if ($row['duree_validite'] != '') {
5262 $this->valF['duree_validite']= $row['duree_validite'];
5263 }
5264 if ($row['date_depot'] != '') {
5265 $this->valF['date_depot']= $row['date_depot'];
5266 }
5267 if ($row['date_depot_mairie'] != '') {
5268 $this->valF['date_depot_mairie']= $row['date_depot_mairie'];
5269 }
5270 // Dates concernant les dossiers contentieux
5271 if ($row['date_cloture_instruction'] != '') {
5272 $this->valF['archive_date_cloture_instruction']= $row['date_cloture_instruction'];
5273 }
5274 if ($row['date_premiere_visite'] != '') {
5275 $this->valF['archive_date_premiere_visite']= $row['date_premiere_visite'];
5276 }
5277 if ($row['date_derniere_visite'] != '') {
5278 $this->valF['archive_date_derniere_visite']= $row['date_derniere_visite'];
5279 }
5280 if ($row['date_contradictoire'] != '') {
5281 $this->valF['archive_date_contradictoire']= $row['date_contradictoire'];
5282 }
5283 if ($row['date_retour_contradictoire'] != '') {
5284 $this->valF['archive_date_retour_contradictoire']= $row['date_retour_contradictoire'];
5285 }
5286 if ($row['date_ait'] != '') {
5287 $this->valF['archive_date_ait']= $row['date_ait'];
5288 }
5289 if ($row['date_transmission_parquet'] != '') {
5290 $this->valF['archive_date_transmission_parquet']= $row['date_transmission_parquet'];
5291 }
5292 //
5293 if ($row['dossier_instruction_type'] != '') {
5294 $this->valF['archive_dossier_instruction_type']= $row['dossier_instruction_type'];
5295 }
5296 if ($row['date_affichage'] != '') {
5297 $this->valF['archive_date_affichage']= $row['date_affichage'];
5298 }
5299 if (isset($row['pec_metier']) === true && $row['pec_metier'] != '') {
5300 $this->valF['archive_pec_metier']= $row['pec_metier'];
5301 }
5302 if (isset($row['a_qualifier']) === true && $row['a_qualifier'] != '') {
5303 $this->valF['archive_a_qualifier']= $row['a_qualifier'];
5304 }
5305 }
5306
5307 // {{{
5308 // Méthodes de récupération des métadonnées arrêté
5309 /**
5310 * @return string Retourne le numéro d'arrêté
5311 */
5312 function getNumArrete() {
5313 return $this->getVal("numero_arrete");
5314 }
5315 /**
5316 * @return chaîne vide
5317 */
5318 function getReglementaireArrete() {
5319 return 'true';
5320 }
5321 /**
5322 * @return boolean de notification au pétitionnaire
5323 */
5324 function getNotificationArrete() {
5325 return 'true';
5326 }
5327 /**
5328 * @return date de notification au pétitionnaire
5329 */
5330 function getDateNotificationArrete() {
5331 if (empty($this->metadonneesArrete)) {
5332 $this->getArreteMetadata();
5333 }
5334 return $this->metadonneesArrete["datenotification"];
5335 }
5336 /**
5337 * @return boolean check si le document est passé au contrôle de légalité
5338 */
5339 function getControleLegalite() {
5340 return 'true';
5341 }
5342 /**
5343 * @return date de signature de l'arrêté
5344 */
5345 function getDateSignature() {
5346 if (empty($this->metadonneesArrete)) {
5347 $this->getArreteMetadata();
5348 }
5349 return $this->metadonneesArrete["datesignaturearrete"];
5350 }
5351 /**
5352 * @return string nom du signataire
5353 */
5354 function getNomSignataire() {
5355 if (empty($this->metadonneesArrete)) {
5356 $this->getArreteMetadata();
5357 }
5358 return $this->metadonneesArrete["nomsignataire"];
5359 }
5360 /**
5361 * @return string qualité du signataire
5362 */
5363 function getQualiteSignataire() {
5364 if (empty($this->metadonneesArrete)) {
5365 $this->getArreteMetadata();
5366 }
5367 return $this->metadonneesArrete["qualitesignataire"];
5368 }
5369 /**
5370 * @return string numéro du terrain
5371 */
5372 function getAp_numRue() {
5373 if (empty($this->metadonneesArrete)) {
5374 $this->getArreteMetadata();
5375 }
5376 return $this->metadonneesArrete["ap_numrue"];
5377 }
5378 /**
5379 * @return string nom de la rue du terrain
5380 */
5381 function getAp_nomDeLaVoie() {
5382 if (empty($this->metadonneesArrete)) {
5383 $this->getArreteMetadata();
5384 }
5385 return $this->metadonneesArrete["ap_nomdelavoie"];
5386 }
5387 /**
5388 * @return string code postal du terrain
5389 */
5390 function getAp_codePostal() {
5391 if (empty($this->metadonneesArrete)) {
5392 $this->getArreteMetadata();
5393 }
5394 return $this->metadonneesArrete["ap_codepostal"];
5395 }
5396 /**
5397 * @return string ville du terrain
5398 */
5399 function getAp_ville() {
5400 if (empty($this->metadonneesArrete)) {
5401 $this->getArreteMetadata();
5402 }
5403 return $this->metadonneesArrete["ap_ville"];
5404 }
5405 /**
5406 * @return string activité
5407 */
5408 function getActivite() {
5409 return "Droit du sol";
5410 }
5411 /**
5412 * @return string date du retour de controle légalité
5413 */
5414 function getDateControleLegalite() {
5415 if (empty($this->metadonneesArrete)) {
5416 $this->getArreteMetadata();
5417 }
5418 return $this->metadonneesArrete["datecontrolelegalite"];
5419 }
5420
5421 // Fin des méthodes de récupération des métadonnées
5422 // }}}
5423
5424 /**
5425 * Méthode de récupération des métadonnées arrêtés dans la base de données,
5426 * les données sont stockés dans l'attribut $this->metadonneesArrete
5427 */
5428 function getArreteMetadata() {
5429
5430 //Récupération de la dernière instruction dont l'événement est de type 'arrete'
5431 $this->metadonneesArrete = array("nomsignataire"=>"", "qualitesignataire"=>"",
5432 "decisionarrete"=>"", "datenotification"=>"", "datesignaturearrete"=>"",
5433 "datecontrolelegalite"=>"", "ap_numrue"=>"", "ap_nomdelavoie"=>"",
5434 "ap_codepostal"=>"", "ap_ville"=>"");
5435
5436 $sqlArrete = "SELECT
5437 signataire_arrete.prenom || ' ' ||signataire_arrete.nom as \"nomsignataire\",
5438 signataire_arrete.qualite as \"qualitesignataire\",
5439 instruction.etat as \"decisionarrete\",
5440 instruction.date_retour_rar as \"datenotification\",
5441 instruction.date_retour_signature as \"datesignaturearrete\",
5442 instruction.date_retour_controle_legalite as \"datecontrolelegalite\",
5443 dossier.terrain_adresse_voie_numero as \"ap_numrue\",
5444 dossier.terrain_adresse_voie as \"ap_nomdelavoie\",
5445 dossier.terrain_adresse_code_postal as \"ap_codepostal\",
5446 dossier.terrain_adresse_localite as \"ap_ville\"
5447 FROM ".DB_PREFIXE."instruction
5448 LEFT JOIN ".DB_PREFIXE."signataire_arrete ON
5449 instruction.signataire_arrete = signataire_arrete.signataire_arrete
5450 LEFT JOIN ".DB_PREFIXE."dossier ON
5451 instruction.dossier = dossier.dossier
5452 LEFT JOIN ".DB_PREFIXE."donnees_techniques ON
5453 donnees_techniques.dossier_instruction = dossier.dossier
5454 WHERE instruction.instruction = ".$this->getVal("instruction");
5455 $resArrete = $this->f->db->query($sqlArrete);
5456 $this->f->addToLog("getArreteMetadata(): db->query(\"".$sqlArrete."\");", VERBOSE_MODE);
5457 if ( database::isError($resArrete)){
5458 die();
5459 }
5460
5461 $this->metadonneesArrete = $resArrete->fetchRow(DB_FETCHMODE_ASSOC);
5462 }
5463
5464 /**
5465 * CONDITION - has_an_edition.
5466 *
5467 * Condition pour afficher le bouton de visualisation de l'édition.
5468 *
5469 * @return boolean
5470 */
5471 function has_an_edition() {
5472 // Récupère la valeur du champ lettretype
5473 $lettretype = $this->getVal("lettretype");
5474 // Si le champ est vide
5475 if ($lettretype !== '' && $lettretype !== null) {
5476 //
5477 return true;
5478 }
5479
5480 //
5481 return false;
5482 }
5483
5484 /**
5485 * CONDITION - is_modifiable.
5486 *
5487 * Controle si l'évenement est modifiable.
5488 *
5489 * @return boolean
5490 */
5491 function is_evenement_modifiable() {
5492 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5493 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_modifiable'));
5494 }
5495
5496 /**
5497 * CONDITION - is_editable.
5498 *
5499 * Condition pour la modification.
5500 *
5501 * @return boolean
5502 */
5503 function is_editable() {
5504
5505 // XXX
5506 // 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é)
5507 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5508
5509 // Contrôle si l'utilisateur possède un bypass
5510 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modifier_bypass");
5511 //
5512 if ($bypass == true) {
5513 //
5514 return true;
5515 }
5516
5517 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5518 // que l'événement n'est pas identifié comme non verrouillable
5519 if ($this->f->isUserInstructeur()
5520 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5521 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5522 //
5523 return false;
5524 }
5525
5526 // Si l'utilisateur est un intructeur qui correspond à la division du
5527 // dossier
5528 if ($this->is_instructeur_from_division_dossier() === true) {
5529 //
5530 return true;
5531 }
5532
5533 // Si l'utilisateur est instructeur de la commune du dossier et que
5534 // l'instruction est créée par un instructeur de la commune
5535 if ($this->is_instructeur_from_collectivite_dossier() === true and
5536 $this->getVal('created_by_commune') === 't') {
5537 return true;
5538 }
5539
5540 //
5541 return false;
5542 }
5543
5544 /**
5545 * Vérifie si l'événement est supprimable ou pas.
5546 *
5547 * @return boolean
5548 */
5549 function is_evenement_supprimable() {
5550 // Controle si l'évenement est supprimable
5551 $evenement = $this->get_inst_evenement($this->getVal('evenement'));
5552 return ! $this->get_boolean_from_pgsql_value($evenement->getVal('non_supprimable'));
5553 }
5554
5555 /**
5556 * CONDITION - is_deletable.
5557 *
5558 * Condition pour la suppression.
5559 *
5560 * @return boolean
5561 */
5562 function is_deletable() {
5563
5564 // XXX
5565 // 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é)
5566 // Si cette tâche identifiée est DONE alors la suppression/modification de cette intruction est impossible
5567
5568 // Contrôle si l'utilisateur possède un bypass intégral
5569 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass");
5570 //
5571 if ($bypass == true) {
5572
5573 //
5574 return true;
5575 }
5576
5577 // Si l'utilisateur est un intructeur qui ne correspond pas à la
5578 // division du dossier et si l'utilisateur n'a pas la permission bypass
5579 // de la division
5580 if ($this->is_instructeur_from_division_dossier() === false
5581 && $this->f->isAccredited($this->get_absolute_class_name()."_supprimer_bypass_division") === false) {
5582
5583 //
5584 return false;
5585 }
5586
5587 // l'événement est-il le dernier ?
5588 $dernier_evenement = false;
5589 // instanciation dossier
5590 $dossier = $this->f->get_inst__om_dbform(array(
5591 "obj" => "dossier",
5592 "idx" => $this->getVal('dossier'),
5593 ));
5594 // récupération dernier événement
5595 $id_dernier_evenement = $dossier->get_dernier_evenement();
5596 if ($id_dernier_evenement == $this->getVal($this->clePrimaire)) {
5597 $dernier_evenement = true;
5598 }
5599
5600 // Si dossier cloturé ou si pas dernier événement
5601 // ou de type retour ou si une date est renseignée
5602 // ET utilisateur non administrateur
5603 if ($this->getStatutAutorisationDossier($this->getVal('dossier')) == 'cloture'
5604 || $dernier_evenement == false
5605 || $this->is_evenement_retour($this->getVal("evenement")) == true
5606 || $this->getVal('date_envoi_signature') != ''
5607 || $this->getVal('date_retour_signature') != ''
5608 || $this->getVal('date_envoi_rar') != ''
5609 || $this->getVal('date_retour_rar') != ''
5610 || $this->getVal('date_envoi_controle_legalite') != ''
5611 || $this->getVal('date_retour_controle_legalite') != '') {
5612 // pas le droit de supprimer
5613 return false;;
5614 }
5615
5616 //
5617 return true;
5618 }
5619
5620
5621 /**
5622 * Vérifie que l'utilisateur est instructeur et qu'il est de la division du
5623 * dossier.
5624 *
5625 * @return, boolean true/false
5626 */
5627 function is_instructeur_from_collectivite_dossier() {
5628 if ($this->f->isUserInstructeur() === true and
5629 $this->f->om_utilisateur["om_collectivite"] == $this->get_dossier_instruction_om_collectivite()) {
5630 return true;
5631 }
5632 return false;
5633 }
5634
5635 /**
5636 * CONDITION - is_addable.
5637 *
5638 * Condition pour afficher les boutons modifier et supprimer.
5639 *
5640 * @return boolean
5641 */
5642 function is_addable() {
5643 // Contrôle si l'utilisateur possède un bypass
5644 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_ajouter_bypass");
5645 //
5646 if ($bypass == true) {
5647
5648 //
5649 return true;
5650 }
5651 // Si l'utilisateur est un intructeur qui correspond à la
5652 // division du dossier ou qu'il peut changer la décision
5653 if ($this->is_instructeur_from_division_dossier() === true or
5654 $this->isInstrCanChangeDecision($this->getParameter('idxformulaire')) === true) {
5655 //
5656 return true;
5657 }
5658
5659 //
5660 return false;
5661 }
5662
5663 /**
5664 * CONDITION - is_finalizable.
5665 *
5666 * Condition pour afficher le bouton.
5667 *
5668 * @return boolean
5669 */
5670 function is_finalizable() {
5671 // Contrôle si l'utilisateur possède un bypass
5672 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_finaliser_bypass");
5673 //
5674 if ($bypass == true) {
5675 //
5676 return true;
5677 }
5678
5679 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5680 // que l'événement n'est pas identifié comme non verrouillable
5681 if ($this->f->isUserInstructeur()
5682 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5683 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5684 //
5685 return false;
5686 }
5687
5688 // Si l'utilisateur est un intructeur qui correspond à la division du
5689 // dossier
5690 if ($this->is_instructeur_from_division_dossier() === true) {
5691 //
5692 return true;
5693 }
5694
5695 // Si l'utilisateur est instructeur de la commune du dossier et que
5696 // l'instruction est créée par un instructeur de la commune
5697 if ($this->is_instructeur_from_collectivite_dossier() === true and
5698 $this->getVal('created_by_commune') === 't') {
5699 return true;
5700 }
5701
5702 //
5703 return false;
5704 }
5705
5706 /**
5707 * CONDITION - is_finalize_without_bypass.
5708 *
5709 * Condition pour afficher le bouton sans le bypass.
5710 *
5711 * @return boolean [description]
5712 */
5713 function is_finalizable_without_bypass() {
5714 // Récupère la valeur du champ finalisé
5715 $om_final_instruction = $this->getVal('om_final_instruction');
5716
5717 // Si le rapport n'est pas finalisé
5718 if (empty($om_final_instruction)
5719 || $om_final_instruction == 'f') {
5720 //
5721 return true;
5722 }
5723
5724 //
5725 return false;
5726 }
5727
5728 /**
5729 * CONDITION - is_unfinalizable.
5730 *
5731 * Condition pour afficher le bouton.
5732 *
5733 * @return boolean
5734 */
5735 function is_unfinalizable(){
5736 // Contrôle si l'utilisateur possède un bypass
5737 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_definaliser_bypass");
5738 //
5739 if ($bypass == true) {
5740 //
5741 return true;
5742 }
5743
5744 // Si l'utilisateur est un instructeur, que le dossier est cloturé et
5745 // que l'événement n'est pas identifié comme non verrouillable
5746 if ($this->f->isUserInstructeur()
5747 && $this->getStatutAutorisationDossier($this->getParameter("idxformulaire")) == "cloture"
5748 && $this->checkEvenementNonVerrouillable($this->getVal("instruction")) === false) {
5749 //
5750 return false;
5751 }
5752
5753 // Si l'utilisateur est un intructeur qui correspond à la division du
5754 // dossier
5755 if ($this->is_instructeur_from_division_dossier() === true) {
5756 //
5757 return true;
5758 }
5759
5760 // Si l'utilisateur est instructeur de la commune du dossier et que
5761 // l'instruction est créée par un instructeur de la commune
5762 if ($this->is_instructeur_from_collectivite_dossier() === true and
5763 $this->getVal('created_by_commune') === 't') {
5764 return true;
5765 }
5766
5767 //
5768 return false;
5769 }
5770
5771 /**
5772 * CONDITION - is_unfinalizable_without_bypass.
5773 *
5774 * Condition pour afficher le bouton sans le bypass.
5775 *
5776 * @return boolean
5777 */
5778 function is_unfinalizable_without_bypass() {
5779 // Récupère la valeur du champ finalisé
5780 $om_final_instruction = $this->getVal('om_final_instruction');
5781
5782 // Si l'instruction est finalisée
5783 if ($om_final_instruction == 't') {
5784 //
5785 return true;
5786 }
5787
5788 //
5789 return false;
5790 }
5791
5792
5793 /**
5794 * Permet de définir si un instructeur commune peut editer une instruction
5795 *
5796 * @return boolean true si il peut
5797 */
5798 function isInstrCanChangeDecision($idx) {
5799
5800 if ($this->f->isAccredited(array("instruction", "instruction_changer_decision"), "OR") !== true or
5801 $this->f->isUserInstructeur() !== true) {
5802 return false;
5803 }
5804
5805
5806
5807 // Sinon on vérifie l'éligibilité du dossier au changement de décision
5808 // /!\ Requête lié à celles du widget indiquant les dossiers éligible au changement
5809 // de décision :
5810 // * dossier_instruction.class.php : view_widget_dossiers_evenement_retour_finalise()
5811 // * dossier_instruction.inc.php : si le paramètre filtre_decision = true
5812 $sql = sprintf(
5813 'SELECT
5814 dossier.dossier
5815 FROM
5816 %1$sdossier
5817 JOIN %1$setat
5818 ON dossier.etat = etat.etat AND etat.statut = \'encours\'
5819 JOIN %1$slien_dossier_demandeur
5820 ON dossier.dossier = lien_dossier_demandeur.dossier AND lien_dossier_demandeur.petitionnaire_principal IS TRUE
5821 JOIN %1$sdossier_instruction_type
5822 ON dossier.dossier_instruction_type=dossier_instruction_type.dossier_instruction_type
5823 JOIN %1$sinstruction
5824 -- Recherche de la dernière instruction qui ne soit pas liée à un événement retour
5825 ON instruction.instruction = (
5826 SELECT instruction
5827 FROM %1$sinstruction
5828 JOIN %1$sevenement ON instruction.evenement=evenement.evenement
5829 AND evenement.retour IS FALSE
5830 WHERE instruction.dossier = dossier.dossier
5831 ORDER BY date_evenement DESC, instruction DESC
5832 LIMIT 1
5833 )
5834 -- On ne garde que les dossiers pour lesquels la dernière instruction est finalisée
5835 -- ou alors pour laquelle l instruction a été ajouté par la commune et est
5836 -- non signée, non notifié, etc.
5837 AND (instruction.om_final_instruction IS TRUE
5838 OR instruction.created_by_commune IS TRUE)
5839 AND instruction.date_retour_signature IS NULL
5840 AND instruction.date_envoi_rar IS NULL
5841 AND instruction.date_retour_rar IS NULL
5842 AND instruction.date_envoi_controle_legalite IS NULL
5843 AND instruction.date_retour_controle_legalite IS NULL
5844 -- On vérifie que l instruction soit un arrêté ou un changement de décision
5845 JOIN %1$sevenement
5846 ON instruction.evenement=evenement.evenement
5847 AND (evenement.type = \'arrete\'
5848 OR evenement.type = \'changement_decision\')
5849 -- Recherche les informations du pétitionnaire principal pour l affichage
5850 JOIN %1$sdemandeur
5851 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
5852 -- Recherche la collectivité rattachée à l instructeur
5853 JOIN %1$sinstructeur
5854 ON dossier.instructeur=instructeur.instructeur
5855 JOIN %1$sdivision
5856 ON instructeur.division=division.division
5857 JOIN %1$sdirection
5858 ON division.direction=direction.direction
5859 JOIN %1$som_collectivite
5860 ON direction.om_collectivite=om_collectivite.om_collectivite
5861 WHERE
5862 -- Vérification que la décision a été prise par l agglo
5863 om_collectivite.niveau = \'2\'
5864 AND dossier.dossier = \'%2$s\'
5865 ',
5866 DB_PREFIXE,
5867 $idx
5868 );
5869
5870
5871 // Si collectivité de l'utilisateur niveau mono alors filtre sur celle-ci
5872 if ($this->f->isCollectiviteMono($_SESSION['collectivite']) === true) {
5873 $sql .= sprintf(
5874 ' AND dossier.om_collectivite=%1$s',
5875 $_SESSION['collectivite']
5876 );
5877 }
5878 $res = $this->f->db->getone($sql);
5879 if (database::isError($res)) {
5880 die();
5881 }
5882 // Si le dossier n'est pas sujet au changement de decision
5883 if($res == null) {
5884 return false;
5885 }
5886 return true;
5887 }
5888
5889
5890 /**
5891 * CONDITION - can_monitoring_dates.
5892 *
5893 * Condition pour afficher le bouton de suivi des dates.
5894 *
5895 * @return boolean
5896 */
5897 public function can_monitoring_dates() {
5898 // Récupère la valeur du champ finalisé
5899 $om_final_instruction = $this->getVal('om_final_instruction');
5900
5901 // Si l'instruction n'est pas finalisée
5902 if ($om_final_instruction !== 't') {
5903 //
5904 return false;
5905 }
5906
5907 // Contrôle si l'utilisateur possède un bypass
5908 $bypass = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_bypass");
5909 if ($bypass === true) {
5910 return true;
5911 }
5912
5913 // Permission de modifier le suivi des dates sur un dossier cloturé pour
5914 // un utilisateur lié à un instructeur
5915 $perm_moni_dates_d_closed = $this->f->isAccredited($this->get_absolute_class_name()."_modification_dates_cloture");
5916
5917 // On vérifie en premier lieu que le DI n'est pas clôturé et que
5918 // l'utilisateur ne possède pas la permission de modifier le suivi des
5919 // dates sur un dossier clôturé
5920 $inst_dossier = $this->get_inst_dossier();
5921 if ($inst_dossier->getStatut() === 'cloture'
5922 && $perm_moni_dates_d_closed === false) {
5923 //
5924 return false;
5925 }
5926 // On récupère ses infos
5927 $coll_di = $inst_dossier->getVal('om_collectivite');
5928 $div_di = $this->getDivisionFromDossier();
5929 // et celles de son éventuel instructeur
5930 $instr_di = $inst_dossier->getVal('instructeur');
5931
5932 // Il faut disposer d'une entrée instructeur
5933 if ($this->f->isUserInstructeur() === false) {
5934 return false;
5935 }
5936
5937 // Par défaut on prétend que l'instructeur n'est pas multi
5938 $instr_di_coll_multi = false;
5939 // Si un instructeur est affecté au dossier
5940 if ($instr_di !== '' && $instr_di !== null) {
5941 // Vérifie si l'instructeur est de la collectivité de niveau 2
5942 $instr_di_coll = $this->get_instructeur_om_collectivite($instr_di);
5943 if ($this->f->isCollectiviteMono($instr_di_coll) === false) {
5944 //
5945 $instr_di_coll_multi = true;
5946 }
5947 }
5948
5949 // Il faut qu'il instruise le dossier ou soit de la même division
5950 if ($this->f->om_utilisateur['instructeur'] === $instr_di
5951 || $this->f->om_utilisateur['division'] === $div_di) {
5952 //
5953 return true;
5954 }
5955
5956 // On donne également le droit s'il est de la même collectivité que
5957 // le dossier ET si l'instruction est déléguée à la communauté
5958 if ($this->f->isCollectiviteMono($this->f->om_utilisateur['om_collectivite']) === true
5959 && $this->f->om_utilisateur['om_collectivite'] === $coll_di
5960 && $instr_di_coll_multi === true) {
5961 //
5962 return true;
5963 }
5964
5965 // Si l'instructeur ne rentre pas dans les deux cas précédents
5966 return false;
5967 }
5968
5969
5970 /**
5971 * TREATMENT - finalize.
5972 *
5973 * Permet de finaliser un enregistrement.
5974 *
5975 * @param array $val valeurs soumises par le formulaire
5976 *
5977 * @return boolean
5978 */
5979 function finalize($val = array()) {
5980
5981 // Cette méthode permet d'exécuter une routine en début des méthodes
5982 // dites de TREATMENT.
5983 $this->begin_treatment(__METHOD__);
5984 $message = '';
5985 $ev = $this->get_inst_evenement($this->getVal('evenement'));
5986
5987 // Controle du signataire
5988 if (! $this->controle_signataire($ev)) {
5989 $this->addToMessage(__("Le document ne peut pas être finalisé car aucun signataire n'a été sélectionné."));
5990 // Termine le traitement
5991 return $this->end_treatment(__METHOD__, false);
5992 }
5993
5994 // Traitement de la finalisation
5995 $ret = $this->manage_finalizing("finalize", $val);
5996
5997 // Si le traitement retourne une erreur
5998 if ($ret !== true) {
5999
6000 // Termine le traitement
6001 return $this->end_treatment(__METHOD__, false);
6002 }
6003
6004 // Envoi des notifications aux demandeurs si la notification est automatique
6005 // et que la signature n'est pas requise
6006 if ($ev->getVal('notification') === 'notification_automatique') {
6007 // Récupération de la catégorie et envoie des notifications au(x) demandeur(s)
6008 $collectivite_di = $this->get_dossier_instruction_om_collectivite($this->getVal('dossier'));
6009 // Récupération de la liste des demandeurs à notifier et de la catégorie
6010 $categorie = $this->f->get_param_option_notification($collectivite_di);
6011 $isPortal = $categorie == null || $categorie == '' || $categorie == 'portal' ? true : false;
6012 $demandeursANotifie = $this->get_demandeurs_notifiable(
6013 $this->getVal('dossier'),
6014 $isPortal
6015 );
6016
6017 // Création d'une notification et d'une tâche pour chaque demandeur à notifier
6018 $demandeurPrincipalNotifie = false;
6019 if (count($demandeursANotifie) > 0) {
6020 foreach ($demandeursANotifie as $demandeur) {
6021 // Identifie si le demandeur principal a été notifié ou pas
6022 // et récupère ses informations
6023 if ($demandeur['petitionnaire_principal'] == 't') {
6024 $demandeurPrincipalNotifie = true;
6025 // Si le demandeur principal est notifiable mais qu'il y a des erreurs dans
6026 // son paramétrage, on effectue pas le traitement et on passe à l'itération
6027 // suivante. On le considère également comme non notifié pour gérer l'envoie
6028 // des messages d'erreurs
6029 // Si la demande a été déposée via le portail alors le paramétrage n'a pas
6030 // d'impact sur la notification
6031 $erreursParam = $this->get_info_notification_fail();
6032 if (! $this->dossier_depose_sur_portail() && $erreursParam != array()) {
6033 $demandeurPrincipalNotifie = false;
6034 continue;
6035 }
6036 }
6037 // Ajout de la notif et récupération de son id
6038 $idNotif = $this->ajouter_notification(
6039 $this->getVal($this->clePrimaire),
6040 $this->f->get_connected_user_login_name(),
6041 $demandeur,
6042 $collectivite_di,
6043 array(),
6044 true
6045 );
6046 if ($idNotif === false) {
6047 // Termine le traitement
6048 return $this->end_treatment(__METHOD__, false);
6049 }
6050 $notification_by_task = $this->notification_by_task(
6051 $idNotif,
6052 $this->getVal('dossier'),
6053 $categorie
6054 );
6055 if ($notification_by_task === false) {
6056 $this->addToMessage(
6057 __("Erreur lors de la génération de la notification au(x) pétitionnaire(s).")
6058 );
6059 // Termine le traitement
6060 return $this->end_treatment(__METHOD__, false);
6061 }
6062 $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.")));
6063 }
6064 }
6065 // Si le demandeur principal n'est pas notifiable, on créé une nouvelle notification
6066 // en erreur avec en commentaire la raison pour laquelle le demandeur principal
6067 // n'a pas pu être notifié
6068 if (! $demandeurPrincipalNotifie) {
6069 // Analyse pour savoir pourquoi le demandeur principal n'est pas notifiable
6070 $erreursParam = $this->get_info_notification_fail();
6071 $demandeurPrincipal = $this->get_info_petitionnaire_principal_dossier($this->getVal('dossier'));
6072 // Ajout de la notif et récupération de son id
6073 $idNotif = $this->ajouter_notification(
6074 $this->valF[$this->clePrimaire],
6075 $this->f->get_connected_user_login_name(),
6076 $demandeurPrincipal,
6077 $collectivite_di,
6078 array(),
6079 true,
6080 'Echec',
6081 implode(' ', $erreursParam)
6082 );
6083 if ($idNotif === false) {
6084 $this->addToMessage(
6085 __('Erreur : la création de la notification a échouée.').
6086 __("Veuillez contacter votre administrateur.")
6087 );
6088 return false;
6089 }
6090 // Prépare un message d'alerte à destination de l'instructeur pour l'informer
6091 // de l'échec de la notification
6092 $dossier_message = $this->get_inst_dossier_message(0);
6093 $dossier_message_val = array(
6094 'dossier' => $this->getVal('dossier'),
6095 'type' => _('erreur expedition'),
6096 'emetteur' => $this->f->get_connected_user_login_name(),
6097 'login' => $_SESSION['login'],
6098 'date_emission' => date('Y-m-d H:i:s'),
6099 'contenu' => _('Échec lors de la notification de l\'instruction ').
6100 $ev->getVal('libelle').
6101 '.<br>'.
6102 implode("\n", $erreursParam).
6103 '<br>'.
6104 _('Veuillez corriger ces informations avant de renvoyer la notification.')
6105 );
6106 $add = $dossier_message->add_notification_message($dossier_message_val, true);
6107 // Si une erreur se produit pendant l'ajout
6108 if ($add !== true) {
6109 $this->addToLog(__METHOD__."(): Le message d'alerte concernant l'echec de l'envoi de la notification n'a pas pu être envoyé.", DEBUG_MODE);
6110 return false;
6111 }
6112 }
6113 }
6114
6115 // Termine le traitement
6116 return $this->end_treatment(__METHOD__, true);
6117 }
6118
6119 /**
6120 * Récupère l'instance de dossier message.
6121 *
6122 * @param string $dossier_message Identifiant du message.
6123 *
6124 * @return object
6125 */
6126 private function get_inst_dossier_message($dossier_message = null) {
6127 //
6128 return $this->get_inst_common("dossier_message", $dossier_message);
6129 }
6130
6131 /**
6132 * Vérifie si le signataire est obligatoire pour finaliser
6133 * le document apartir du paramétrage de l'événement.
6134 * Si c'est le cas, vérifie si il y a bien un signataire
6135 * renseigné.
6136 * Si c'est le cas renvoie true, sinon renvoie false.
6137 *
6138 * @param evenement évenement de l'instruction permettant de
6139 * récupérer le paramétrage
6140 * @return boolean
6141 */
6142 protected function controle_signataire($evenement) {
6143 // Vérifie si le signataire est obligatoire et si c'est le cas
6144 // vérifie si il y a bien un signataire pour le document
6145 if ($evenement->is_signataire_obligatoire() &&
6146 ($this->getVal('signataire_arrete') === null ||
6147 $this->getVal('signataire_arrete') === '')) {
6148 return false;
6149 }
6150 return true;
6151 }
6152
6153 /**
6154 * TREATMENT - unfinalize.
6155 *
6156 * Permet de définaliser un enregistrement.
6157 *
6158 * @param array $val valeurs soumises par le formulaire
6159 *
6160 * @return boolean
6161 */
6162 function unfinalize($val = array()) {
6163
6164 // Cette méthode permet d'exécuter une routine en début des méthodes
6165 // dites de TREATMENT.
6166 $this->begin_treatment(__METHOD__);
6167
6168 // Traitement de la finalisation
6169 $ret = $this->manage_finalizing("unfinalize", $val);
6170
6171 // Si le traitement retourne une erreur
6172 if ($ret !== true) {
6173
6174 // Termine le traitement
6175 return $this->end_treatment(__METHOD__, false);
6176 }
6177
6178 // Termine le traitement
6179 return $this->end_treatment(__METHOD__, true);
6180 }
6181
6182 /**
6183 * VIEW - view_edition
6184 *
6185 * Edite l'édition de l'instruction ou affiche celle contenue dans le stockage.
6186 *
6187 * @return null Si l'action est incorrecte
6188 */
6189 function view_edition() {
6190
6191 // Si l'instruction est finalisée
6192 if($this->getVal("om_final_instruction") == 't'
6193 && $this->getVal("om_final_instruction") != null) {
6194
6195 // Ouvre le document
6196 $lien = '../app/index.php?module=form&snippet=file&obj='.$this->table.'&'.
6197 'champ=om_fichier_instruction&id='.$this->getVal($this->clePrimaire);
6198 //
6199 header("Location: ".$lien);
6200 } else {
6201
6202 // Récupère la collectivite du dossier d'instruction
6203 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6204
6205 //
6206 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6207
6208 // Paramètre du PDF
6209 $params = array(
6210 "watermark" => true,
6211 "specific" => array(
6212 "mode" => "previsualisation",
6213 ),
6214 );
6215 // Si la rédaction libre est activée sur l'instruction
6216 if ($this->getVal("flag_edition_integrale") == 't') {
6217 $params["specific"]["corps"] = array(
6218 "mode" => "set",
6219 "value" => $this->getVal("corps_om_htmletatex"),
6220 );
6221 $params["specific"]["titre"] = array(
6222 "mode" => "set",
6223 "value" => $this->getVal("titre_om_htmletat"),
6224 );
6225 }
6226
6227 // Génération du PDF
6228 $result = $this->compute_pdf_output('lettretype', $this->getVal("lettretype"), $collectivite, null, $params);
6229 // Affichage du PDF
6230 $this->expose_pdf_output(
6231 $result['pdf_output'],
6232 $result['filename']
6233 );
6234 }
6235 }
6236
6237 /**
6238 * Récupère la collectivité du dossier d'instruction.
6239 *
6240 * @param string $dossier_instruction_id Identifiant du DI.
6241 *
6242 * @return integer
6243 */
6244 function get_dossier_instruction_om_collectivite($dossier_instruction_id = null) {
6245
6246 // Si l'identifiant n'est pas renseigné
6247 if ($dossier_instruction_id === null) {
6248 // Récupère la valeur
6249 if ($this->getVal('dossier') !== null && $this->getVal('dossier') !== '') {
6250 $dossier_instruction_id = $this->getVal('dossier');
6251 } elseif ($this->getParameter('idxformulaire') !== null
6252 && $this->getParameter('idxformulaire') !== '') {
6253 //
6254 $dossier_instruction_id = $this->getParameter('idxformulaire');
6255 } elseif ($this->f->get_submitted_get_value('idxformulaire') !== null
6256 && $this->f->get_submitted_get_value('idxformulaire') !== '') {
6257 //
6258 $dossier_instruction_id = $this->f->get_submitted_get_value('idxformulaire');
6259 }
6260 }
6261
6262 //
6263 $dossier_instruction = $this->f->get_inst__om_dbform(array(
6264 "obj" => "dossier_instruction",
6265 "idx" => $dossier_instruction_id,
6266 ));
6267
6268 //
6269 return $dossier_instruction->getVal('om_collectivite');
6270 }
6271
6272 /**
6273 * VIEW - view_bible
6274 *
6275 * Affiche la bible manuelle.
6276 *
6277 * @return void
6278 */
6279 function view_bible() {
6280 // Vérification de l'accessibilité sur l'élément
6281 $this->checkAccessibility();
6282
6283 /**
6284 * Affichage de la structure HTML
6285 */
6286 //
6287 if ($this->f->isAjaxRequest()) {
6288 //
6289 header("Content-type: text/html; charset=".HTTPCHARSET."");
6290 } else {
6291 //
6292 $this->f->setFlag("htmlonly");
6293 $this->f->display();
6294 }
6295 //
6296 $this->f->displayStartContent();
6297 //
6298 $this->f->setTitle(_("Liste des éléments de la bible en lien avec un evenement"));
6299 $this->f->displayTitle();
6300
6301 /**
6302 *
6303 */
6304 //
6305 ($this->f->get_submitted_get_value("ev") ? $evenement = $this->f->get_submitted_get_value("ev") : $evenement = "");
6306 $evenement = intval($evenement);
6307 //
6308 ($this->f->get_submitted_get_value("idx") ? $idx = $this->f->get_submitted_get_value("idx") : $idx = "");
6309 // Récupération du code du type de DA
6310 $code_da_type = '';
6311 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6312 $code_da_type = $matches[0];
6313 }
6314 //
6315 ($this->f->get_submitted_get_value("complement") ? $complement = $this->f->get_submitted_get_value("complement") : $complement = "1");
6316
6317 // Récupération de la collectivité du dossier
6318 $dossier = $this->f->get_inst__om_dbform(array(
6319 "obj" => "dossier",
6320 "idx" => $idx,
6321 ));
6322
6323 /**
6324 *
6325 */
6326 //
6327 $sql = "SELECT *, bible.libelle as bible_lib
6328 FROM ".DB_PREFIXE."bible
6329 LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6330 ON bible.dossier_autorisation_type=dossier_autorisation_type.dossier_autorisation_type
6331 LEFT JOIN ".DB_PREFIXE."om_collectivite
6332 ON bible.om_collectivite = om_collectivite.om_collectivite
6333 WHERE (evenement=".$evenement." OR evenement IS NULL)
6334 AND (complement=".$complement." OR complement IS NULL)
6335 AND (bible.dossier_autorisation_type IS NULL
6336 OR dossier_autorisation_type.code ='".$code_da_type."')
6337 AND (om_collectivite.niveau = '2'
6338 OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")
6339 ORDER BY bible_lib ASC";
6340 $res = $this->f->db->query($sql);
6341 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\");", VERBOSE_MODE);
6342 $this->f->isDatabaseError($res);
6343 //
6344 echo "<form method=\"post\" name=\"f3\" action=\"#\">\n";
6345 //
6346 if ($res->numrows() > 0) {
6347 //
6348 echo "\t<table id='tab-bible' width='100%'>\n";
6349 //
6350 echo "\t\t<tr class=\"ui-tabs-nav ui-accordion ui-state-default tab-title\">";
6351 echo "<th>"._("Choisir")."</th>";
6352 echo "<th>"._("Libelle")."</th>";
6353 echo "</tr>\n";
6354 //
6355 $i = 0;
6356 //
6357 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6358 //
6359 echo "\t\t<tr";
6360 echo " class=\"".($i % 2 == 0 ? "odd" : "even")."\"";
6361 echo ">";
6362 //
6363 echo "<td class=\"center\"><input type=\"checkbox\" name=\"choix[]\" value=\"".$i."\" id=\"checkbox".$i."\" /></td>";
6364 // XXX utilisation de l'attribut titre pour afficher une infobulle
6365 echo "<td><span class=\"content\" title=\"".htmlentities($row['contenu'])."\" id=\"content".$i."\">".$row['bible_lib']."</span></td>";
6366 //
6367 echo "</tr>\n";
6368 //
6369 $i++;
6370 }
6371 echo "\t</table>\n";
6372 //
6373 echo "<div class=\"formControls\">\n";
6374 $this->f->layout->display_form_button(array(
6375 "value" => _("Valider"),
6376 "onclick" => "bible_return('f2', 'complement".($complement == "1" ? "" : $complement)."_om_html'); return false;",
6377 ));
6378 $this->f->displayLinkJsCloseWindow();
6379 echo "</div>\n";
6380
6381 } else {
6382 //
6383 $message_class = "error";
6384 $message = _("Aucun element dans la bible pour l'evenement")." : ".$evenement;
6385 $this->f->displayMessage($message_class, $message);
6386 //
6387 echo "<div class=\"formControls\">\n";
6388 $this->f->displayLinkJsCloseWindow();
6389 echo "</div>\n";
6390 }
6391 //
6392 echo "</form>\n";
6393
6394 /**
6395 * Affichage de la structure HTML
6396 */
6397 //
6398 $this->f->displayEndContent();
6399 }
6400
6401 /**
6402 * VIEW - view_bible_auto
6403 *
6404 * Renvoie les valeurs de la bible à placer dans les compléments de l'instruction.
6405 *
6406 * @return void
6407 */
6408 function view_bible_auto() {
6409 // Vérification de l'accessibilité sur l'élément
6410 $this->checkAccessibility();
6411 //
6412 $this->f->disableLog();
6413
6414 $formatDate="AAAA-MM-JJ";
6415
6416 // Récupération des paramètres
6417 $idx = $this->f->get_submitted_get_value('idx');
6418 $evenement = $this->f->get_submitted_get_value('ev');
6419
6420 // Initialisation de la variable de retour
6421 $retour['complement_om_html'] = '';
6422 $retour['complement2_om_html'] = '';
6423 $retour['complement3_om_html'] = '';
6424 $retour['complement4_om_html'] = '';
6425 // Vérification d'une consultation liée à l'événement
6426 $consultation = $this->f->db->getOne(
6427 "select consultation from ".DB_PREFIXE."evenement where evenement=".$evenement
6428 );
6429 $this->f->isDatabaseError($consultation);
6430 // Si consultation liée, récupération du retour d'avis
6431 if($consultation=='Oui'){
6432 $sql = sprintf(
6433 '(SELECT
6434 date_retour,
6435 avis_consultation.libelle as avis_consultation,
6436 COALESCE(service.libelle, tiers_consulte.libelle) as service
6437 FROM
6438 %1$sconsultation
6439 LEFT JOIN %1$stiers_consulte ON consultation.tiers_consulte = tiers_consulte.tiers_consulte
6440 LEFT JOIN %1$sservice ON consultation.service = service.service
6441 LEFT JOIN %1$savis_consultation ON consultation.avis_consultation = avis_consultation.avis_consultation
6442 WHERE
6443 dossier = \'%2$s\'
6444 AND consultation.visible)',
6445 DB_PREFIXE,
6446 $this->f->db->escapeSimple($idx)
6447 );
6448 $res = $this->f->db->query($sql);
6449 $this->f->isDatabaseError($res);
6450 // Récupération des consultations
6451 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6452 $correct=false;
6453 // date retour
6454 if ($row['date_retour']<>""){
6455 if ($formatDate=="AAAA-MM-JJ"){
6456 $date = explode("-", $row['date_retour']);
6457 // controle de date
6458 if (count($date) == 3 and
6459 checkdate($date[1], $date[2], $date[0])) {
6460 $date_retour_f= $date[2]."/".$date[1]."/".$date[0];
6461 $correct=true;
6462 }else{
6463 $msg= $msg."<br>La date ".$row['date_retour']." n'est pas une date.";
6464 $correct=false;
6465 }
6466 }
6467 }
6468 //
6469 $temp="Vu l'avis ".$row['avis_consultation']." du service ".$row['service'];
6470 if($correct == true){
6471 $temp=$temp." du ".$date_retour_f;
6472 }
6473 // Concaténation des retours d'avis de consultation
6474 $retour['complement_om_html'] .= $temp . "<br/><br/>";
6475 } // while
6476
6477 } // consultation
6478 // Récupération des bibles automatiques pour le champ complement_om_html
6479 $retour['complement_om_html'] .= $this->getBible($evenement, $idx, '1');
6480 // Récupération des bibles automatiques pour le champ complement2_om_html
6481 $retour['complement2_om_html'] .= $this->getBible($evenement, $idx, '2');
6482 // Récupération des bibles automatiques pour le champ complement3_om_html
6483 $retour['complement3_om_html'] .= $this->getBible($evenement, $idx, '3');
6484 // Récupération des bibles automatiques pour le champ complement4_om_html
6485 $retour['complement4_om_html'] .= $this->getBible($evenement, $idx, '4');
6486
6487
6488
6489 echo json_encode($retour);
6490 }
6491
6492 /**
6493 * VIEW - view_pdf_temp
6494 *
6495 * @return void
6496 */
6497 function view_pdf_temp() {
6498 $this->checkAccessibility();
6499 // Utilisation de $_POST pour ne pas que les textes soient altérés.
6500 $this->f->set_submitted_value();
6501 $merge_fields = array();
6502 //
6503 if (array_key_exists('c1', $_POST) === true) {
6504 $merge_fields['[complement_instruction]'] = $_POST['c1'];
6505 $merge_fields['[complement1_instruction]'] = $_POST['c1'];
6506 }
6507 if (array_key_exists('c2', $_POST) === true) {
6508 $merge_fields['[complement2_instruction]'] = $_POST['c2'];
6509 }
6510 if (array_key_exists('c3', $_POST) === true) {
6511 $merge_fields['[complement3_instruction]'] = $_POST['c3'];
6512 }
6513 if (array_key_exists('c4', $_POST) === true) {
6514 $merge_fields['[complement4_instruction]'] = $_POST['c4'];
6515 }
6516 $params = array(
6517 "watermark" => true,
6518 "specific" => array(
6519 "merge_fields" => $merge_fields,
6520 ),
6521 );
6522 //
6523 if (array_key_exists('corps', $_POST) === true) {
6524 $params["specific"]["corps"] = array(
6525 "mode" => "set",
6526 "value" => $_POST['corps'],
6527 );
6528 }
6529 if (array_key_exists('titre', $_POST) === true) {
6530 $params["specific"]["titre"] = array(
6531 "mode" => "set",
6532 "value" => $_POST['titre'],
6533 );
6534 }
6535 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6536 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6537 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6538 $retour = array(
6539 'base' => base64_encode($result['pdf_output']),
6540 );
6541 echo json_encode($retour);
6542 }
6543
6544 /**
6545 * Dans le contexte de prévisualisation des éditions, génère le rendu du
6546 * PDF sans prise en compte de la valeur des compléments et le retourne en
6547 * base 64.
6548 *
6549 * @return string Rendu PDF converti en base 64.
6550 */
6551 function init_pdf_temp() {
6552 $params = array(
6553 "watermark" => true,
6554 );
6555 // Si la rédaction libre est activée sur l'instruction
6556 if ($this->getVal("flag_edition_integrale") == 't') {
6557 $params["specific"]["corps"] = array(
6558 "mode" => "set",
6559 "value" => $this->getVal("corps_om_htmletatex"),
6560 );
6561 $params["specific"]["titre"] = array(
6562 "mode" => "set",
6563 "value" => $this->getVal("titre_om_htmletat"),
6564 );
6565 }
6566 $dossier_instruction_om_collectivite = $this->get_dossier_instruction_om_collectivite();
6567 $collectivite = $this->f->getCollectivite($dossier_instruction_om_collectivite);
6568 $result = $this->compute_pdf_output('lettretype', $this->getVal('lettretype'), $collectivite, null, $params);
6569
6570 return base64_encode($result['pdf_output']);
6571 }
6572
6573 /**
6574 * Récupération des éléments de bible.
6575 *
6576 * @param integer $event id de l'événement
6577 * @param string $idx id du dossier
6578 * @param integer $compnb numéro du champ complement
6579 *
6580 * @return string Chaîne de texte à insérer dans le champ complement
6581 */
6582 function getBible($event, $idx, $compnb) {
6583 // Récupération de la collectivité du dossier
6584 $dossier = $this->f->get_inst__om_dbform(array(
6585 "obj" => "dossier",
6586 "idx" => $idx,
6587 ));
6588 // Récupération du code du type de DA
6589 $code_da_type = '';
6590 if (preg_match('/[A-Za-z]{2,3}/', $idx, $matches) !== false) {
6591 $code_da_type = $matches[0];
6592 }
6593 //
6594 $sql = "SELECT * FROM ".DB_PREFIXE."bible
6595 LEFT OUTER JOIN ".DB_PREFIXE."dossier_autorisation_type
6596 ON bible.dossier_autorisation_type=
6597 dossier_autorisation_type.dossier_autorisation_type
6598 LEFT JOIN
6599 ".DB_PREFIXE."om_collectivite
6600 ON bible.om_collectivite = om_collectivite.om_collectivite
6601 WHERE (evenement =".$event." or evenement IS NULL) and
6602 (complement=".$compnb." OR complement IS NULL) and
6603 automatique='Oui' and
6604 (dossier_autorisation_type.code ='".$code_da_type."' or
6605 bible.dossier_autorisation_type IS NULL) and
6606 (om_collectivite.niveau = '2' OR bible.om_collectivite = ".$dossier->getVal("om_collectivite").")";
6607
6608 $res = $this->f->db->query($sql);
6609 $this->f->isDatabaseError($res);
6610 $temp = "";
6611 while ($row=& $res->fetchRow(DB_FETCHMODE_ASSOC)){
6612 // Remplacement des retours à la ligne par des br
6613 $temp .= preg_replace(
6614 '#(\\\r|\\\r\\\n|\\\n)#', '<br/>', $row['contenu']
6615 );
6616 // Ajout d'un saut de ligne entre chaque bible.
6617 $temp .= '<br/>';
6618 } // fin while
6619 return $temp;
6620 }
6621
6622 /**
6623 * VIEW - view_suivi_bordereaux.
6624 *
6625 * Formulaire de choix du bordereau de suivi, permettant de générer les 4 bordereaux.
6626 * Si l'utilisateur est d'une collectivité de niveau 2 il a le choix de la
6627 * collectivité des dossiers affichés.
6628 *
6629 * @return void
6630 */
6631 function view_suivi_bordereaux() {
6632 // Vérification de l'accessibilité sur l'élément
6633 $this->checkAccessibility();
6634
6635 /**
6636 * Validation du formulaire
6637 */
6638 // Si le formulaire a été validé
6639 if ($this->f->get_submitted_post_value("validation") !== null) {
6640 // Si un bordereau à été sélectionné
6641 if ($this->f->get_submitted_post_value("bordereau") !== null && $this->f->get_submitted_post_value("bordereau") == "" ) {
6642 // Si aucun bordereau n'a été sélectionné
6643 $message_class = "error";
6644 $message = _("Veuillez selectionner un bordereau.");
6645 }
6646 // Sinon si les dates ne sont pas valide
6647 elseif (($this->f->get_submitted_post_value("date_bordereau_debut") !== null
6648 && $this->f->get_submitted_post_value("date_bordereau_debut") == "")
6649 || ($this->f->get_submitted_post_value("date_bordereau_fin") !== null
6650 && $this->f->get_submitted_post_value("date_bordereau_fin") == "")) {
6651 // Si aucune date n'a été saisie
6652 $message_class = "error";
6653 $message = _("Veuillez saisir une date valide.");
6654 }
6655 // Sinon si les dates ne sont pas valides
6656 elseif ($this->f->get_submitted_post_value("bordereau") === "bordereau_avis_maire_prefet"
6657 && $this->f->getParameter("id_evenement_bordereau_avis_maire_prefet") == null) {
6658 // Si aucune date n'a été saisie
6659 $message_class = "error";
6660 $message = _("Erreur de parametrage. Contactez votre administrateur.");
6661 }
6662 // Affiche le message de validation
6663 else {
6664 // On récupère le libellé du bordereau pour l'afficher à l'utilisateur
6665 $sql = "SELECT om_etat.libelle
6666 FROM ".DB_PREFIXE."om_etat
6667 WHERE om_etat.id = '".$this->f->get_submitted_post_value("bordereau")."'";
6668 $res = $this->f->db->getone($sql);
6669 $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6670 $this->f->isDatabaseError($res);
6671 //
6672 $message_class = "valid";
6673 $message = _("Cliquez sur le lien ci-dessous pour telecharger votre bordereau");
6674 $message .= " : <br/><br/>";
6675 $message .= "<a class='om-prev-icon pdf-16'";
6676 $message .= " title=\""._("Bordereau")."\"";
6677 $message .= "href='".OM_ROUTE_FORM."&obj=instruction";
6678 $message .= "&action=220";
6679 $message .= "&idx=0";
6680 $message .= "&type_bordereau=".$this->f->get_submitted_post_value("bordereau");
6681 $message .= "&date_bordereau_debut=".$this->f->get_submitted_post_value("date_bordereau_debut");
6682 $message .= "&date_bordereau_fin=".$this->f->get_submitted_post_value("date_bordereau_fin");
6683 // Si l'utilisateur est MULTI alors on ajoute le paramètre collectivite
6684 if ($this->f->get_submitted_post_value("om_collectivite") !== null) {
6685 $message .= "&collectivite=".$this->f->get_submitted_post_value("om_collectivite");
6686 }
6687 $message .= "'"." target='_blank'>";
6688 $message .= $res." "._("du")." ".$this->f->get_submitted_post_value("date_bordereau_debut")
6689 ." "._("au")." ".$this->f->get_submitted_post_value("date_bordereau_fin");
6690 $message .= "</a>";
6691 }
6692 }
6693
6694 /**
6695 * Affichage des messages et du formulaire
6696 */
6697 // Affichage du message de validation ou d'erreur
6698 if (isset($message) && isset($message_class) && $message != "") {
6699 $this->f->displayMessage($message_class, $message);
6700 }
6701 // Ouverture du formulaire
6702 printf("\t<form");
6703 printf(" method=\"post\"");
6704 printf(" id=\"suivi_bordereaux_form\"");
6705 printf(" action=\"\"");
6706 printf(">\n");
6707 // Paramétrage des champs du formulaire
6708 $champs = array("date_bordereau_debut", "date_bordereau_fin", "bordereau");
6709 // Si l'utilisateur est d'une collectivité de niveau 2 on affiche un select
6710 // collectivité dans le formulaire
6711 if ($_SESSION["niveau"] == 2) {
6712 array_push($champs, "om_collectivite");
6713 }
6714 // Création d'un nouvel objet de type formulaire
6715 $form = $this->f->get_inst__om_formulaire(array(
6716 "validation" => 0,
6717 "maj" => 0,
6718 "champs" => $champs,
6719 ));
6720 // Paramétrage du champ date_bordereau_debut
6721 $form->setLib("date_bordereau_debut", _("date_bordereau_debut"));
6722 $form->setType("date_bordereau_debut", "date");
6723 $form->setTaille("date_bordereau_debut", 12);
6724 $form->setMax("date_bordereau_debut", 12);
6725 $form->setRequired("date_bordereau_debut");
6726 $form->setOnchange("date_bordereau_debut", "fdate(this)");
6727 $form->setVal("date_bordereau_debut", date("d/m/Y"));
6728 // Paramétrage du champ date_bordereau_fin
6729 $form->setLib("date_bordereau_fin", _("date_bordereau_fin"));
6730 $form->setType("date_bordereau_fin", "date");
6731 $form->setTaille("date_bordereau_fin", 12);
6732 $form->setMax("date_bordereau_fin", 12);
6733 $form->setRequired("date_bordereau_fin");
6734 $form->setOnchange("date_bordereau_fin", "fdate(this)");
6735 $form->setVal("date_bordereau_fin", date("d/m/Y"));
6736 // Paramétrage du champ bordereau
6737 $form->setLib("bordereau", _("bordereau"));
6738 $form->setType("bordereau", "select");
6739 $form->setRequired("bordereau");
6740 // Valeurs des champs
6741 if ($this->f->get_submitted_post_value("validation") !== null) {
6742 $form->setVal("date_bordereau_debut", $this->f->get_submitted_post_value("date_bordereau_debut"));
6743 $form->setVal("date_bordereau_fin", $this->f->get_submitted_post_value("date_bordereau_fin"));
6744 $form->setVal("bordereau", $this->f->get_submitted_post_value("bordereau"));
6745 $form->setVal("om_collectivite", $this->f->get_submitted_post_value("om_collectivite"));
6746 }
6747 // Données du select - On récupère ici la liste de tous les états disponibles
6748 // dans la table om_etat qui ont un id qui commence par la cahine de caractères
6749 // 'bordereau_'
6750 $sql = "SELECT om_etat.id, om_etat.libelle
6751 FROM ".DB_PREFIXE."om_etat
6752 WHERE om_etat.id LIKE 'bordereau_%'
6753 ORDER BY om_etat.id";
6754 $res = $this->f->db->query($sql);
6755 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6756 $this->f->isDatabaseError($res);
6757 // Données du select
6758 $contenu = array(
6759 0 => array("", ),
6760 1 => array(_("choisir bordereau")),
6761 );
6762 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6763 $contenu[0][] = $row['id'];
6764 $contenu[1][] = $row['libelle'];
6765 }
6766 $form->setSelect("bordereau", $contenu);
6767 //
6768 if ($_SESSION["niveau"] == 2) {
6769 $form->setLib("om_collectivite", _("collectivite"));
6770 $form->setType("om_collectivite", "select");
6771
6772 // Données du select - On récupère ici la liste de tous toutes les collectivités
6773 // de niveau 1
6774 $sql = "SELECT om_collectivite, libelle
6775 FROM ".DB_PREFIXE."om_collectivite
6776 WHERE niveau = '1' ORDER BY libelle";
6777 $res = $this->f->db->query($sql);
6778 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6779 $this->f->isDatabaseError($res);
6780 // La valeur par défaut du select est Toutes
6781 $list_collectivites = array(
6782 0 => array("", ),
6783 1 => array(_("toutes"))
6784 );
6785
6786 $id_colls = "";
6787 // On stocke dans $id_colls l'id de toutes les collectivités de niveau 1 séparées
6788 // par des virgules, pour un traitement plus facile dans la requête de sous-état
6789 while ($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
6790 if ($id_colls != "") {
6791 $id_colls .= ",";
6792 }
6793 $id_colls .= $row['om_collectivite'];
6794 $list_collectivites[0][] = $row['om_collectivite'];
6795 $list_collectivites[1][] = $row['libelle'];
6796 }
6797 // On affecte la liste d'identifiants à l'option Toutes
6798 $list_collectivites[0][0] = $id_colls ;
6799 $form->setSelect("om_collectivite", $list_collectivites);
6800 }
6801 // Affichage du formulaire
6802 $form->entete();
6803 $form->afficher($champs, 0, false, false);
6804 $form->enpied();
6805 // Affichage du bouton
6806 printf("\t<div class=\"formControls\">\n");
6807 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
6808 printf("\t</div>\n");
6809 // Fermeture du formulaire
6810 printf("\t</form>\n");
6811 }
6812
6813
6814 /**
6815 * VIEW - view_generate_suivi_bordereaux.
6816 *
6817 * Génère et affiche les bordereaux de suivi.
6818 *
6819 * @return [void]
6820 */
6821 function view_generate_suivi_bordereaux() {
6822 // Vérification de l'accessibilité sur l'élément
6823 $this->checkAccessibility();
6824 // Récupération du type de bordereau
6825 $bordereau = $this->f->get_submitted_get_value('type_bordereau');
6826 // Génération du PDF
6827 $result = $this->compute_pdf_output('etat', $bordereau, null, $this->getVal($this->clePrimaire));
6828 // Affichage du PDF
6829 $this->expose_pdf_output(
6830 $result['pdf_output'],
6831 $result['filename']
6832 );
6833 }
6834
6835
6836 /**
6837 * VIEW - view_suivi_envoi_lettre_rar.
6838 *
6839 * Vue pour imprimer les AR.
6840 *
6841 * @return void
6842 */
6843 function view_suivi_envoi_lettre_rar() {
6844 // Vérification de l'accessibilité sur l'élément
6845 $this->checkAccessibility();
6846
6847 //
6848 if ($this->f->get_submitted_post_value("date") !== null) {
6849 $date = $this->f->get_submitted_post_value("date");
6850 } else {
6851 $date = "";
6852 }
6853 //
6854 if ($this->f->get_submitted_post_value("liste_code_barres_instruction") !== null) {
6855 $liste_code_barres_instruction = $this->f->get_submitted_post_value("liste_code_barres_instruction");
6856 } else {
6857 $liste_code_barres_instruction = "";
6858 }
6859
6860 // Compteur du nombre de page générées
6861 $nbLettres = 0;
6862 // Liste d'id des instructions
6863 $id4Gen = array();
6864 //
6865 $error = "";
6866
6867 // Initialisation du tableau qui va contenir les DI pour lister les liens
6868 $dossierTab = array();
6869 // On vérifie que l'utilisateur ait les droits pour afficher des consultations
6870 $isAccredited = $this->f->isAccredited(array("dossier_instruction","dossier_instruction_consulter"), "OR");
6871 $hasHidden = true;
6872 // S'il ne peut pas les consulter il aura des dossiers caché
6873 if ($isAccredited === true) {
6874 $hasHidden = false;
6875 }
6876
6877 /**
6878 * Validation du formulaire
6879 */
6880 // Si le formulaire a été validé
6881 if ($this->f->get_submitted_post_value('validation') !== null) {
6882 //
6883 if (empty($date) || empty($liste_code_barres_instruction)) {
6884 //
6885 $message_class = "error";
6886 $message = _("Tous les champs doivent etre remplis.");
6887 } else {
6888 // Création d'un tableau d'instruction
6889 $liste = explode("\r\n", $this->f->get_submitted_post_value("liste_code_barres_instruction"));
6890 //
6891 foreach ($liste as $code_barres) {
6892 // On enlève les éventuels espaces saisis
6893 $code_barres = trim($code_barres);
6894 // Vérification de l'existence de l'instruction
6895 if ($code_barres != "") {
6896 // Si la valeur transmise est numérique
6897 if (is_numeric($code_barres)) {
6898 //
6899 $sql = "SELECT count(*)
6900 FROM ".DB_PREFIXE."instruction
6901 INNER JOIN ".DB_PREFIXE."dossier
6902 ON dossier.dossier=instruction.dossier
6903 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
6904 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
6905 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
6906 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
6907 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
6908 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
6909 INNER JOIN ".DB_PREFIXE."groupe
6910 ON dossier_autorisation_type.groupe = groupe.groupe
6911 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
6912
6913 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
6914 $group_clause = array();
6915 foreach ($_SESSION["groupe"] as $key => $value) {
6916 $group_clause[$key] = "(groupe.code = '".$key."'";
6917 if($value["confidentiel"] !== true) {
6918 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
6919 }
6920 $group_clause[$key] .= ")";
6921 }
6922 $conditions = implode(" OR ", $group_clause);
6923 $sql .= " AND (" . $conditions . ")";
6924
6925 $nbInstr = $this->f->db->getone($sql);
6926 $this->f->addToLog(__METHOD__.": db->getone(\"".$sql."\")", VERBOSE_MODE);
6927 $this->f->isDatabaseError($nbInstr);
6928 //
6929 if ($nbInstr == "1") {
6930 // Récupération de la date d'envoi de l'instruction bippé
6931 $sql = "SELECT to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar, instruction FROM ".DB_PREFIXE."instruction WHERE code_barres='".$code_barres."'";
6932 $res = $this->f->db->query($sql);
6933 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
6934 $this->f->isDatabaseError($res);
6935 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
6936 // Si pas de date ou correspond à la date du formulaire on
6937 // effectue le traitement
6938 if ($row["date_envoi_rar"] == "" || $row["date_envoi_rar"] == $date) {
6939 $instr = $this->f->get_inst__om_dbform(array(
6940 "obj" => "instruction",
6941 "idx" => $row['instruction'],
6942 ));
6943 $valF = array();
6944 foreach($instr->champs as $id => $champ) {
6945 $valF[$champ] = $instr->val[$id];
6946 }
6947
6948 # Si on peut consulter les dossiers et que le dossier n'existe pas déjà dans la liste
6949 if ($isAccredited === true
6950 && array_key_exists($instr->getVal("dossier"), $dossierTab) === false) {
6951 $dossier = $this->f->get_inst__om_dbform(array(
6952 "obj" => "dossier",
6953 "idx" => $instr->getVal("dossier"),
6954 ));
6955 if ($dossier->is_user_from_allowed_collectivite()){
6956 $dossierTab[$instr->getVal("dossier")] = $dossier;
6957 } else {
6958 $hasHidden = true;
6959 }
6960 }
6961
6962 $valF['date_evenement']=
6963 $instr->dateDBToForm($valF['date_evenement']);
6964 $valF['archive_date_complet']=
6965 $instr->dateDBToForm($valF['archive_date_complet']);
6966 $valF['archive_date_rejet']=
6967 $instr->dateDBToForm($valF['archive_date_rejet']);
6968 $valF['archive_date_limite']=
6969 $instr->dateDBToForm($valF['archive_date_limite']);
6970 $valF['archive_date_notification_delai']=
6971 $instr->dateDBToForm($valF['archive_date_notification_delai']);
6972 $valF['archive_date_decision']=
6973 $instr->dateDBToForm($valF['archive_date_decision']);
6974 $valF['archive_date_validite']=
6975 $instr->dateDBToForm($valF['archive_date_validite']);
6976 $valF['archive_date_achevement']=
6977 $instr->dateDBToForm($valF['archive_date_achevement']);
6978 $valF['archive_date_chantier']=
6979 $instr->dateDBToForm($valF['archive_date_chantier']);
6980 $valF['archive_date_conformite']=
6981 $instr->dateDBToForm($valF['archive_date_conformite']);
6982 $valF['archive_date_dernier_depot']=
6983 $instr->dateDBToForm($valF['archive_date_dernier_depot']);
6984 $valF['archive_date_limite_incompletude']=
6985 $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
6986 $valF['date_finalisation_courrier']=
6987 $instr->dateDBToForm($valF['date_finalisation_courrier']);
6988 $valF['date_envoi_signature']=
6989 $instr->dateDBToForm($valF['date_envoi_signature']);
6990 $valF['date_retour_signature']=
6991 $instr->dateDBToForm($valF['date_retour_signature']);
6992 $valF['date_envoi_rar']=
6993 $instr->dateDBToForm($valF['date_envoi_rar']);
6994 $valF['date_retour_rar']=
6995 $instr->dateDBToForm($valF['date_retour_rar']);
6996 $valF['date_envoi_controle_legalite']=
6997 $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
6998 $valF['date_retour_controle_legalite']=
6999 $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7000 $valF['date_envoi_rar'] = $date;
7001
7002 // Vérification de la finalisation du document
7003 // correspondant au code barres
7004 if($instr->getVal("om_final_instruction") === 't') {
7005 $instr->setParameter('maj', 1);
7006 $instr->class_actions[1]["identifier"] =
7007 "envoi lettre RAR (depuis le menu suivi des pièces)";
7008 if ($instr->modifier($valF) == true) {
7009 $id4Gen[] = $code_barres;
7010 $nbLettres ++;
7011 } else {
7012 //
7013 if ($error != "") {
7014 $error .= "<br/>";
7015 }
7016 $error .= sprintf(_("Une erreur s'est produite lors de la modification de l'instruction %s."),
7017 $code_barres);
7018 $error .= " ";
7019 $error .= _("Veuillez contacter votre administrateur.");
7020 }
7021 } else {
7022 //
7023 if ($error != "") {
7024 $error .= "<br/>";
7025 }
7026 $error .= sprintf(_("Le document correspondant au
7027 code barres %s n'est pas finalise,
7028 le bordereau ne sera pas genere."),
7029 $code_barres);
7030 }
7031
7032 } else {
7033 //
7034 if ($error != "") {
7035 $error .= "<br/>";
7036 }
7037 $error .= _("Une lettre correspondante a l'instruction ayant pour code barres")." ".$code_barres." "._("a deja ete envoyee, le bordereau ne sera pas genere.");
7038 }
7039 } else {
7040 //
7041 if ($error != "") {
7042 $error .= "<br/>";
7043 }
7044 $error .= _("Le numero")." ".$code_barres." "._("ne correspond a aucun code barres d'instruction.");
7045 }
7046 } else {
7047 //
7048 if ($error != "") {
7049 $error .= "<br/>";
7050 }
7051 $error .= _("Le code barres d'instruction")." ".$code_barres." "._("n'est pas valide.");
7052 }
7053 }
7054 }
7055 }
7056 }
7057
7058 /**
7059 * Affichage des messages et du formulaire
7060 */
7061 // Affichage du message de validation ou d'erreur
7062 if (isset($message) && isset($message_class) && $message != "") {
7063 $this->f->displayMessage($message_class, $message);
7064 }
7065 // Affichage du message d'erreur
7066 if(!empty($error)) {
7067 $this->f->displayMessage("error", $error);
7068 }
7069 // Affichage du message de validation de la saisie
7070 if ($nbLettres > 0) {
7071 //
7072 echo "\n<div class=\"message ui-widget ui-corner-all ui-state-highlight ui-state-valid\" >";
7073 echo "\n<p>";
7074 echo "\n<span class=\"ui-icon ui-icon-info\"></span>";
7075 echo "\n<span class=\"text\">";
7076 echo _("Cliquez sur le lien ci-dessous pour telecharger votre document");
7077 echo " : \n<br/><br/>";
7078 echo "\n<a class='om-prev-icon pdf-16'";
7079 echo "\n title=\""._("imprimer les AR")."\"";
7080 echo "\n href=\"".OM_ROUTE_FORM."&obj=instruction&action=180&idx=0&liste=".implode(",",$id4Gen)."\"";
7081 echo "\n target='_blank'>";
7082 echo _("Telecharger le document pour")." ".$nbLettres." "._("AR");
7083 echo "\n</a>";
7084 echo "\n</span>";
7085 echo "\n</p>";
7086 echo "\n<br/>\n";
7087 if ($isAccredited === true) {
7088 echo '<fieldset id="fieldset-form-rar-lien_di" class="cadre ui-corner-all startClosed" style="background-color: inherite;">';
7089 echo "\n<legend class=\"ui-corner-all ui-widget-content ui-state-active\" style=\"background-color: transparent; color: inherit;\">\n";
7090 echo _('Dossiers concernés par ce traitement');
7091 echo "\n</legend>";
7092 echo "\n<div class=\"fieldsetContent\" style=\"display: none;background-color: inherite\">";
7093
7094 if ($hasHidden === true) {
7095 echo "\n<br/>";
7096 echo "\n<p>";
7097 echo "\n<span class='text'>";
7098 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.");
7099 echo "</span>";
7100 echo "\n</p>";
7101 echo "\n<br/>";
7102 }
7103 foreach ($dossierTab as $dossier) {
7104
7105 $inst_da = $this->get_inst_common("dossier_autorisation", $dossier->getVal('dossier_autorisation'));
7106 $inst_datd = $this->get_inst_common("dossier_autorisation_type_detaille", $inst_da->getVal('dossier_autorisation_type_detaille'));
7107 $code_datd = $inst_datd->getVal('code');
7108
7109 $obj = "dossier_instruction";
7110 if ($code_datd === 'REC' OR $code_datd === 'REG') {
7111 $obj = "dossier_contentieux_tous_recours";
7112 }
7113 if ($code_datd === 'IN') {
7114 $obj = "dossier_contentieux_toutes_infractions";
7115 }
7116
7117 echo "\n<div class=\"bloc group\">";
7118 echo "\n<div class=\"field field-type-text\">";
7119
7120 echo "\n<p>";
7121 echo "\n<span class='text'>";
7122 echo "\n<a class=\"om-icon om-icon-16 consult-16\" title=\"" . _('Consulter') . "\"";
7123 echo "\n href=\"".OM_ROUTE_FORM."&obj=dossier_instruction&action=3&idx=";
7124 echo $dossier->getVal("dossier");
7125 echo "\">";
7126 echo "\n</a>";
7127
7128 echo "\n<a title=\""._("Consulter")."\" style=\"vertical-align:middle;\"";
7129 echo " href=\"".OM_ROUTE_FORM."&obj=";
7130 echo $obj;
7131 echo "&action=3&idx=";
7132 echo $dossier->getVal("dossier");
7133 echo "\">";
7134 echo $dossier->getVal("dossier_libelle");
7135 echo "\n</a>";
7136 echo "\n</span>";
7137 echo "\n</p>";
7138
7139 echo "\n</div>";
7140 echo "\n</div>";
7141 }
7142 echo "\n</div>";
7143 echo "\n</fieldset>";
7144 }
7145 echo "\n</div>";
7146 echo "\n</div>";
7147 }
7148 // Ouverture du formulaire
7149 echo "\t<form";
7150 echo " method=\"post\"";
7151 echo " id=\"suivi_envoi_lettre_rar_form\"";
7152 echo " action=\"\"";
7153 echo ">\n";
7154 // Paramétrage des champs du formulaire
7155 $champs = array("date", "liste_code_barres_instruction");
7156 // Création d'un nouvel objet de type formulaire
7157 $form = $this->f->get_inst__om_formulaire(array(
7158 "validation" => 0,
7159 "maj" => 0,
7160 "champs" => $champs,
7161 ));
7162 // Paramétrage du champ date du formulaire
7163 $form->setLib("date", _("Date")."* :");
7164 $form->setType("date", "date");
7165 $form->setOnchange("date", "fdate(this)");
7166 $form->setVal("date", ($date == "" ? date("d/m/Y") : $date));
7167 $form->setTaille("date", 10);
7168 $form->setMax("date", 10);
7169 // Paramétrage du champ liste_code_barres_instruction du formulaire
7170 $form->setLib("liste_code_barres_instruction", _("Liste des codes barres d'instructions scannes")."* :");
7171 $form->setType("liste_code_barres_instruction", "textarea");
7172 $form->setVal("liste_code_barres_instruction", $liste_code_barres_instruction);
7173 $form->setTaille("liste_code_barres_instruction", 20);
7174 $form->setMax("liste_code_barres_instruction", 20);
7175 // Affichage du formulaire
7176 $form->entete();
7177 $form->afficher($champs, 0, false, false);
7178 $form->enpied();
7179 // Affichage du bouton
7180 echo "\t<div class=\"formControls\">\n";
7181 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7182 echo "\t</div>\n";
7183 // Fermeture du formulaire
7184 echo "\t</form>\n";
7185 }
7186
7187 /**
7188 * VIEW - view_suivi_mise_a_jour_des_dates.
7189 *
7190 * Vu pour mettre à jour les dates de suivi de l'instruction.
7191 *
7192 * @return void
7193 */
7194 function view_suivi_mise_a_jour_des_dates() {
7195 // Vérification de l'accessibilité sur l'élément
7196 $this->checkAccessibility();
7197
7198 // Récupération des valeur passées en POST ou GET
7199 if($this->f->get_submitted_post_value("type_mise_a_jour") !== null) {
7200 $type_mise_a_jour = $this->f->get_submitted_post_value("type_mise_a_jour");
7201 } elseif($this->f->get_submitted_get_value('type_mise_a_jour') !== null) {
7202 $type_mise_a_jour = $this->f->get_submitted_get_value('type_mise_a_jour');
7203 } else {
7204 $type_mise_a_jour = "";
7205 }
7206 if($this->f->get_submitted_post_value('date') !== null) {
7207 $date = $this->f->get_submitted_post_value('date');
7208 } elseif($this->f->get_submitted_get_value('date') !== null) {
7209 $date = $this->f->get_submitted_get_value('date');
7210 } else {
7211 $date = "";
7212 }
7213 if($this->f->get_submitted_post_value('code_barres') !== null) {
7214 $code_barres = $this->f->get_submitted_post_value('code_barres');
7215 } elseif($this->f->get_submitted_get_value('code_barres') !== null) {
7216 $code_barres = $this->f->get_submitted_get_value('code_barres');
7217 } else {
7218 $code_barres = "";
7219 }
7220 // Booléen permettant de définir si un enregistrement à eu lieu
7221 $correct = false;
7222 // Booléen permettant de définir si les dates peuvent êtres enregistrées
7223 $date_error = false;
7224 // Champs date à mettre à jour
7225 $liste_champs=array();
7226
7227 // Si le formulaire a été validé
7228 if ($this->f->get_submitted_post_value('validation') !== null) {
7229 if(!empty($type_mise_a_jour) and !empty($date) and !empty($code_barres)) {
7230
7231 // Vérification de l'existence de l'instruction
7232 $sql = "SELECT instruction
7233 FROM ".DB_PREFIXE."instruction
7234 INNER JOIN ".DB_PREFIXE."dossier
7235 ON dossier.dossier=instruction.dossier
7236 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
7237 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
7238 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
7239 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
7240 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
7241 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
7242 INNER JOIN ".DB_PREFIXE."groupe
7243 ON dossier_autorisation_type.groupe = groupe.groupe
7244 WHERE code_barres='".$this->f->db->escapesimple($code_barres)."'";
7245
7246 // Ajout d'un filtre sur les groupes auxquels l'utilisateur a accès
7247 $group_clause = array();
7248 foreach ($_SESSION["groupe"] as $key => $value) {
7249 $group_clause[$key] = "(groupe.code = '".$key."'";
7250 if($value["confidentiel"] !== true) {
7251 $group_clause[$key] .= " AND dossier_autorisation_type.confidentiel IS NOT TRUE";
7252 }
7253 $group_clause[$key] .= ")";
7254 }
7255 $conditions = implode(" OR ", $group_clause);
7256 $sql .= " AND (" . $conditions . ")";
7257
7258
7259 $res = $this->f->db->query($sql);
7260 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7261 $this->f->isDatabaseError($res);
7262
7263 if($res->numrows() == 1) {
7264 $liste_champs = explode(";", $type_mise_a_jour);
7265 $row =& $res->fetchRow(DB_FETCHMODE_ASSOC);
7266 $instr = $this->f->get_inst__om_dbform(array(
7267 "obj" => "instruction",
7268 "idx" => $row['instruction'],
7269 ));
7270 // Mise à jour des dates après l'écran de verification
7271 if($this->f->get_submitted_post_value('is_valid') !== null and $this->f->get_submitted_post_value('is_valid') == "true") {
7272 $valF = array();
7273 foreach($instr->champs as $id => $champ) {
7274 $valF[$champ] = $instr->val[$id];
7275 }
7276 $valF['date_evenement'] = $instr->dateDBToForm($valF['date_evenement']);
7277 $valF['archive_date_complet'] = $instr->dateDBToForm($valF['archive_date_complet']);
7278 $valF['archive_date_rejet'] = $instr->dateDBToForm($valF['archive_date_rejet']);
7279 $valF['archive_date_limite'] = $instr->dateDBToForm($valF['archive_date_limite']);
7280 $valF['archive_date_notification_delai'] = $instr->dateDBToForm($valF['archive_date_notification_delai']);
7281 $valF['archive_date_decision'] = $instr->dateDBToForm($valF['archive_date_decision']);
7282 $valF['archive_date_validite'] = $instr->dateDBToForm($valF['archive_date_validite']);
7283 $valF['archive_date_achevement'] = $instr->dateDBToForm($valF['archive_date_achevement']);
7284 $valF['archive_date_chantier'] = $instr->dateDBToForm($valF['archive_date_chantier']);
7285 $valF['archive_date_conformite'] = $instr->dateDBToForm($valF['archive_date_conformite']);
7286 $valF['archive_date_dernier_depot'] = $instr->dateDBToForm($valF['archive_date_dernier_depot']);
7287 $valF['archive_date_limite_incompletude'] = $instr->dateDBToForm($valF['archive_date_limite_incompletude']);
7288 $valF['date_finalisation_courrier'] = $instr->dateDBToForm($valF['date_finalisation_courrier']);
7289 $valF['date_envoi_signature'] = $instr->dateDBToForm($valF['date_envoi_signature']);
7290 $valF['date_retour_signature'] = $instr->dateDBToForm($valF['date_retour_signature']);
7291 $valF['date_envoi_rar'] = $instr->dateDBToForm($valF['date_envoi_rar']);
7292 $valF['date_retour_rar'] = $instr->dateDBToForm($valF['date_retour_rar']);
7293 $valF['date_envoi_controle_legalite'] = $instr->dateDBToForm($valF['date_envoi_controle_legalite']);
7294 $valF['date_retour_controle_legalite'] = $instr->dateDBToForm($valF['date_retour_controle_legalite']);
7295 $valF['archive_date_cloture_instruction'] = $instr->dateDBToForm($valF['archive_date_cloture_instruction']);
7296 $valF['archive_date_premiere_visite'] = $instr->dateDBToForm($valF['archive_date_premiere_visite']);
7297 $valF['archive_date_derniere_visite'] = $instr->dateDBToForm($valF['archive_date_derniere_visite']);
7298 $valF['archive_date_contradictoire'] = $instr->dateDBToForm($valF['archive_date_contradictoire']);
7299 $valF['archive_date_retour_contradictoire'] = $instr->dateDBToForm($valF['archive_date_retour_contradictoire']);
7300 $valF['archive_date_ait'] = $instr->dateDBToForm($valF['archive_date_ait']);
7301 $valF['archive_date_transmission_parquet'] = $instr->dateDBToForm($valF['archive_date_transmission_parquet']);
7302
7303 foreach(explode(";", $type_mise_a_jour) as $maj_date) {
7304 $valF[$maj_date]=$date;
7305 }
7306
7307 // Vérification de la finalisation du document
7308 // correspondant au code barres
7309 if($valF["om_final_instruction"] === 't' or
7310 $valF["lettretype"] == '') {
7311 $code_barres = "";
7312
7313 //Désactivation de l'autocommit
7314 $this->f->db->autoCommit(false);
7315
7316 //On modifie les valeurs de l'instruction
7317 $instr->setParameter('maj', 170);
7318 $instr->class_actions[170]["identifier"] =
7319 "mise à jour des dates (depuis le menu suivi des pièces)";
7320 $retour = $instr->modifier($valF);
7321
7322 //Si une erreur s'est produite, on défait les modifications
7323 //qui ont été faites
7324 if (!$retour){
7325 $instr->undoValidation();
7326 }
7327 //Sinon, on valide en base de données les modifications
7328 else {
7329 $this->f->db->commit();
7330 }
7331
7332 // Variable correct retourné depuis la classe instruction
7333 $correct = $instr->correct;
7334
7335 // Si la modification sur l'instruction a échoué
7336 if ($correct === false) {
7337
7338 // Message d'erreur de la classe instruction
7339 $error = $instr->msg;
7340 }
7341
7342 } else {
7343 // Indique que le traitement est en erreur
7344 $correct = false;
7345 // Message d'erreur
7346 $error = sprintf(_("Le document n'est pas finalise."),
7347 "<span class='bold'>".$code_barres."</span>");
7348 }
7349 } else {
7350 // Récupération des infos du dossier
7351 $sqlInfo = "SELECT dossier.dossier_libelle,
7352 evenement.libelle as evenement,
7353 autorite_competente.code as autorite_competente_code,
7354 autorite_competente.libelle as autorite_competente,
7355 evenement.type as evenement_type,
7356 to_char(date_envoi_signature,'DD/MM/YYYY') as date_envoi_signature,
7357 to_char(date_retour_signature,'DD/MM/YYYY') as date_retour_signature,
7358 to_char(date_envoi_controle_legalite,'DD/MM/YYYY') as date_envoi_controle_legalite,
7359 to_char(date_retour_controle_legalite,'DD/MM/YYYY') as date_retour_controle_legalite,
7360 to_char(date_envoi_rar,'DD/MM/YYYY') as date_envoi_rar,
7361 to_char(date_retour_rar,'DD/MM/YYYY') as date_retour_rar
7362 FROM ".DB_PREFIXE."instruction
7363 INNER JOIN ".DB_PREFIXE."dossier ON
7364 dossier.dossier=instruction.dossier
7365 LEFT JOIN ".DB_PREFIXE."autorite_competente ON
7366 dossier.autorite_competente=autorite_competente.autorite_competente
7367 INNER JOIN ".DB_PREFIXE."evenement ON
7368 instruction.evenement=evenement.evenement
7369 WHERE code_barres='".$code_barres."'";
7370 $resInfo = $this->f->db->query($sqlInfo);
7371 $this->f->isDatabaseError($resInfo);
7372 $infos = $resInfo->fetchRow(DB_FETCHMODE_ASSOC);
7373
7374 // Vérification de la non modification des dates de suivi
7375 foreach(explode(";", $type_mise_a_jour) as $champ) {
7376 if ($champ === 'date_envoi_controle_legalite') {
7377 if ($instr->is_sent_to_cl() === true) {
7378 $error = __("Les dates de suivis ne peuvent etre modifiees");
7379 $date_error = true;
7380 break;
7381 }
7382 }
7383 if($infos[$champ] != "" AND $infos[$champ] != $date) {
7384 $error = _("Les dates de suivis ne peuvent etre modifiees");
7385 $date_error = true;
7386 break;
7387 }
7388 }
7389 }
7390 } else {
7391 $error = _("Le numero saisi ne correspond a aucun code barres d'instruction.");
7392 }
7393
7394 } else {
7395 $error = _("Tous les champs doivent etre remplis.");
7396 }
7397 }
7398
7399 /**
7400 * Affichage des messages et du formulaire
7401 */
7402 // Affichage du message de validation ou d'erreur
7403 if (isset($message) && isset($message_class) && $message != "") {
7404 $this->f->displayMessage($message_class, $message);
7405 }
7406 // Affichage du message d'erreur
7407 if(!empty($error)) {
7408 $this->f->displayMessage("error", $error);
7409 }
7410
7411 // Affichage du message de validation de la saisie
7412 if($correct === true) {
7413 $this->f->displayMessage("ok", _("Saisie enregistree"));
7414 }
7415 // Ouverture du formulaire
7416 echo "\t<form";
7417 echo " method=\"post\"";
7418 echo " id=\"suivi_mise_a_jour_des_dates_form\"";
7419 echo " action=\"\"";
7420 echo ">\n";
7421 // Paramétrage des champs du formulaire
7422 if(isset($infos)) {
7423 $champs = array("type_mise_a_jour", "date", "code_barres", "dossier_libelle", "evenement"
7424 , "autorite_competente", "date_envoi_signature",
7425 "date_retour_signature", "date_envoi_controle_legalite",
7426 "date_retour_controle_legalite", "date_envoi_rar",
7427 "date_retour_rar", "is_valid");
7428 } else {
7429 $champs = array("type_mise_a_jour", "date", "code_barres");
7430 }
7431 // Création d'un nouvel objet de type formulaire
7432 $form = $this->f->get_inst__om_formulaire(array(
7433 "validation" => 0,
7434 "maj" => 0,
7435 "champs" => $champs,
7436 ));
7437 // Paramétrage des champs du formulaire
7438 // Parametrage du champ type_mise_a_jour
7439 $form->setLib("type_mise_a_jour", _("Date a mettre a jour")."* :");
7440 if(isset($infos)) {
7441 $form->setType("type_mise_a_jour", "selecthiddenstatic");
7442
7443 } else {
7444 $form->setType("type_mise_a_jour", "select");
7445
7446 }
7447 $form->setVal("type_mise_a_jour", $type_mise_a_jour);
7448 $contenu = array();
7449
7450 $contenu[0][0] = "date_envoi_signature";
7451 $contenu[1][0] = _("date d'envoi pour signature Mairie/Prefet");
7452
7453 $contenu[0][1] = "date_retour_signature";
7454 $contenu[1][1] = _("date de retour de signature Mairie/Prefet");
7455
7456 $contenu[0][2] = "date_retour_signature;date_envoi_controle_legalite";
7457 $contenu[1][2] = _("date de retour de signature + Envoi controle legalite");
7458
7459 $contenu[0][3] = "date_envoi_controle_legalite";
7460 $contenu[1][3] = _("date d'envoi au controle de legalite");
7461
7462 $contenu[0][4] = "date_retour_controle_legalite";
7463 $contenu[1][4] = _("date de retour de controle de legalite");
7464
7465 $contenu[0][5] = "date_retour_rar";
7466 $contenu[1][5] = __("date de notification du correspondant");
7467
7468 $form->setSelect("type_mise_a_jour", $contenu);
7469
7470 // Parametrage du champ date
7471 $form->setLib("date", _("Date")."* :");
7472 if(isset($infos)) {
7473 $form->setType("date", "hiddenstaticdate");
7474
7475 } else {
7476 $form->setType("date", "date");
7477 }
7478 $form->setVal("date", $date);
7479 $form->setTaille("date", 10);
7480 $form->setMax("date", 10);
7481
7482 // Parametrage du champ code_barres
7483 $form->setLib("code_barres", _("Code barres d'instruction")."* :");
7484 if(isset($infos)) {
7485 $form->setType("code_barres", "hiddenstatic");
7486 } else {
7487 $form->setType("code_barres", "text");
7488 }
7489 $form->setVal("code_barres", $code_barres);
7490 $form->setTaille("code_barres", 20);
7491 $form->setMax("code_barres", 20);
7492
7493 // Ajout des infos du dossier correspondantes à l'instruction séléctionnée
7494 if(isset($infos)) {
7495
7496 // Tous les champs sont défini par defaut à static
7497 foreach ($infos as $key => $value) {
7498 $form->setType($key, "static");
7499 if(in_array($key, $liste_champs)) {
7500 $form->setVal($key, $date);
7501 } else {
7502 $form->setVal($key, $value);
7503 }
7504 }
7505
7506 // Les champs dont on viens de définir la valeur sont en gras
7507 foreach ($liste_champs as $value) {
7508 $form->setBloc($value,'DF',"",'bold');
7509 }
7510
7511 // Parametrage du champ dossier
7512 $form->setLib("dossier_libelle", _("dossier_libelle")." :");
7513 $form->setType("dossier_libelle", "static");
7514 $form->setVal("dossier_libelle", $infos['dossier_libelle']);
7515
7516 // Parametrage du champ evenement
7517 $form->setLib("evenement", _("evenement")." :");
7518 $form->setType("evenement", "static");
7519 $form->setVal("evenement", $infos['evenement']);
7520
7521 // Parametrage du champ autorite_competente
7522 $form->setLib("autorite_competente", _("Autorite competente")." :");
7523 $form->setType("autorite_competente", "static");
7524 $form->setVal("autorite_competente", $infos['autorite_competente']);
7525
7526 // Parametrage des libellés d'envoi avec AR
7527 $form->setLib("date_envoi_rar", __("date_envoi_ar")." :");
7528 $form->setLib("date_retour_rar", __("date_notification")." :");
7529
7530 $form->setLib("date_envoi_signature", _("date_envoi_signature")." :");
7531 $form->setLib("date_retour_signature", _("date_retour_signature")." :");
7532 $form->setLib("date_envoi_controle_legalite", _("date_envoi_controle_legalite")." :");
7533 $form->setLib("date_retour_controle_legalite", _("date_retour_controle_legalite")." :");
7534 // Configuration des libellé en fonction de l'autorité compétente
7535 if($infos['autorite_competente_code'] == 'ETAT') {
7536 $form->setType("date_envoi_controle_legalite", "hiddendate");
7537 $form->setType("date_retour_controle_legalite", "hiddendate");
7538 }
7539
7540 // Ajout d'un champ hidden permettant de savoir que le formulaire précédant est celui de vérification
7541 $form->setLib("is_valid", _("Valide")." :");
7542 $form->setType("is_valid", "hidden");
7543 $form->setVal("is_valid", 'true');
7544
7545 $form->setFieldset('dossier_libelle','D',_('Synthese'));
7546 $form->setFieldset('is_valid','F');
7547
7548 }
7549
7550
7551 // Création du fieldset regroupant les champs permettant la mise à jour des date
7552 $form->setFieldset('type_mise_a_jour','D',_('Mise a jour'));
7553 $form->setFieldset('code_barres','F');
7554 // Affichage du formulaire
7555 $form->entete();
7556 $form->afficher($champs, 0, false, false);
7557 $form->enpied();
7558 // Affichage du bouton
7559 echo "\t<div class=\"formControls\">\n";
7560 //
7561 if(!$date_error) {
7562 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7563 }
7564 // Si pas sur l'écran de validation
7565 if(isset($infos)) {
7566 echo "<a class=\"retour\" href=\"".OM_ROUTE_FORM."&obj=instruction_suivi_mise_a_jour_des_dates&action=170&idx=0";
7567 echo "&amp;type_mise_a_jour=".$type_mise_a_jour."&amp;date=".$date."&amp;code_barres=".$code_barres;
7568 echo "\">Retour</a>";
7569 }
7570 echo "\t</div>\n";
7571 // Fermeture du formulaire
7572 echo "\t</form>\n";
7573 }
7574
7575 /**
7576 * [view_pdf_lettre_rar description]
7577 *
7578 * @return [type] [description]
7579 */
7580 function view_pdf_lettre_rar() {
7581 // Vérification de l'accessibilité sur l'élément
7582 $this->checkAccessibility();
7583 //
7584 $this->f->disableLog();
7585
7586 if($this->f->get_submitted_get_value('liste') != null) {
7587 $listeCodeBarres = explode(',',$this->f->get_submitted_get_value('liste'));
7588
7589 // Classe permettant la mise en page de l'édition pdf
7590 require_once "../obj/pdf_lettre_rar.class.php";
7591 $pdf_lettre_rar = new pdf_lettre_rar('P', 'mm', 'A4');
7592 // Initialisation de la mise en page
7593 $pdf_lettre_rar->init($this->f);
7594
7595 foreach ($listeCodeBarres as $code_barres) {
7596
7597 // On récupère le dossier
7598 $sql = "SELECT dossier
7599 FROM " . DB_PREFIXE . "instruction
7600 WHERE code_barres = '" . $code_barres . "'";
7601 $dossier = $this->f->db->getOne($sql);
7602 $this->f->addToLog(__METHOD__."(): db->getOne(\"".$sql."\")", VERBOSE_MODE);
7603 $this->f->isDatabaseError($dossier);
7604 $inst_dossier = $this->f->get_inst__om_dbform(array(
7605 "obj" => "dossier",
7606 "idx" => $dossier,
7607 ));
7608
7609 // En fonction du type de dossier, on récupère un demandeur différent dans les requêtes
7610 $groupe = $inst_dossier->get_type_affichage_formulaire();
7611 switch ($groupe) {
7612 case 'CTX IN':
7613 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='plaignant')";
7614 break;
7615 case 'CTX RE':
7616 $sql_demandeur = "(lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='requerant')";
7617 break;
7618 case 'ADS':
7619 case 'DPC':
7620 case 'CONSULTATION ENTRANTE':
7621 default:
7622 $sql_demandeur = "((lien_dossier_demandeur.petitionnaire_principal IS TRUE AND demandeur.type_demandeur='petitionnaire') OR demandeur.type_demandeur='delegataire')";
7623 break;
7624 }
7625
7626 // Test si l'evenement est de type arrete et si un délégataire a été nommé
7627 $sql = "SELECT
7628 dossier.dossier_libelle,
7629 evenement.type,
7630 count(lien_dossier_demandeur) as nbdemandeur,
7631 CASE
7632 WHEN division.libelle IS NOT NULL AND phase.code IS NOT NULL
7633 THEN CONCAT(phase.code, ' - ', division.libelle)
7634 ELSE
7635 phase.code
7636 END AS code_phase
7637 FROM ".DB_PREFIXE."instruction
7638 LEFT JOIN ".DB_PREFIXE."dossier
7639 ON instruction.dossier = dossier.dossier
7640 LEFT JOIN ".DB_PREFIXE."division
7641 ON dossier.division = division.division
7642 INNER JOIN ".DB_PREFIXE."evenement ON
7643 instruction.evenement=evenement.evenement
7644 LEFT JOIN ".DB_PREFIXE."phase
7645 ON evenement.phase = phase.phase
7646 inner JOIN ".DB_PREFIXE."lien_dossier_demandeur ON
7647 instruction.dossier=lien_dossier_demandeur.dossier
7648 inner join ".DB_PREFIXE."demandeur on
7649 demandeur.demandeur=lien_dossier_demandeur.demandeur
7650 WHERE code_barres='".$code_barres."'
7651 AND " . $sql_demandeur . "
7652 GROUP BY dossier.dossier_libelle, evenement.type, phase.code, division.libelle";
7653
7654 $res = $this->f->db->query($sql);
7655 $this->f->addToLog(__METHOD__.": db->query(\"".$sql."\")", VERBOSE_MODE);
7656 $this->f->isDatabaseError($res);
7657 $testDemandeur = $res->fetchrow(DB_FETCHMODE_ASSOC);
7658
7659
7660 // Recuperation de l'adresse de destination
7661 $sqlAdresse = "SELECT
7662 CASE WHEN demandeur.qualite='particulier'
7663 THEN TRIM(CONCAT_WS(' ', pc.libelle, demandeur.particulier_nom, demandeur.particulier_prenom))
7664 ELSE TRIM(demandeur.personne_morale_denomination)
7665 END as ligne1,
7666 CASE WHEN demandeur.qualite='personne_morale'
7667 THEN TRIM(demandeur.personne_morale_raison_sociale)
7668 ELSE ''
7669 END as ligne1_1,
7670 CASE WHEN demandeur.qualite='personne_morale' AND (demandeur.personne_morale_nom IS NOT NULL OR demandeur.personne_morale_prenom IS NOT NULL)
7671 THEN TRIM(CONCAT_WS(' ', 'rep. par', demandeur.personne_morale_nom, demandeur.personne_morale_prenom))
7672 ELSE ''
7673 END as ligne1_2,
7674 trim(concat(demandeur.numero,' ',demandeur.voie)) as ligne2,
7675 CASE demandeur.complement
7676 WHEN null THEN ''
7677 ELSE trim(demandeur.complement)
7678 END as ligne3,
7679 CASE demandeur.lieu_dit
7680 WHEN null THEN ''
7681 ELSE trim(demandeur.lieu_dit)
7682 END as ligne4,
7683 CONCAT_WS(' ', demandeur.code_postal, demandeur.localite,
7684 (CASE WHEN demandeur.bp IS NOT NULL
7685 THEN CONCAT_WS(' ', 'BP', demandeur.bp)
7686 ELSE ''
7687 END),
7688 (CASE WHEN demandeur.cedex IS NOT NULL
7689 THEN CONCAT_WS(' ', 'CEDEX', demandeur.cedex)
7690 ELSE ''
7691 END))
7692 as ligne5,
7693 code_barres as code_barres
7694 FROM ".DB_PREFIXE."instruction
7695 INNER JOIN ".DB_PREFIXE."dossier ON dossier.dossier = instruction.dossier
7696 INNER JOIN ".DB_PREFIXE."lien_dossier_demandeur ON dossier.dossier = lien_dossier_demandeur.dossier
7697 INNER JOIN ".DB_PREFIXE."demandeur ON lien_dossier_demandeur.demandeur = demandeur.demandeur
7698 LEFT OUTER JOIN ".DB_PREFIXE."civilite as pc ON demandeur.particulier_civilite = pc.civilite OR demandeur.personne_morale_civilite = pc.civilite
7699 WHERE instruction.code_barres ='".$code_barres."'";
7700
7701 // Envoi pour delegataire ou petitionnaire principal selon le type d'evenement
7702 if($testDemandeur['type'] != 'arrete' AND $testDemandeur['nbdemandeur'] > 1) {
7703 $sqlAdresse .= " AND demandeur.type_demandeur='delegataire'";
7704 } else {
7705 $sqlAdresse .= " AND demandeur.type_demandeur='petitionnaire' AND lien_dossier_demandeur.petitionnaire_principal IS TRUE";
7706 }
7707
7708 $resAdresse = $this->f->db->query($sqlAdresse);
7709 $adresse_dest = $resAdresse->fetchrow(DB_FETCHMODE_ASSOC);
7710 $this->f->addToLog(__METHOD__.": db->query(\"".$sqlAdresse."\")", VERBOSE_MODE);
7711 $this->f->isDatabaseError($resAdresse);
7712
7713 // Création adresse destinataire sans ligne vide
7714 $adresse_destinataire = array();
7715 if (!empty($adresse_dest['ligne1'])) {
7716 $adresse_destinataire[] = $adresse_dest['ligne1'];
7717 }
7718 if (!empty($adresse_dest['ligne1_1'])) {
7719 $adresse_destinataire[] = $adresse_dest['ligne1_1'];
7720 }
7721 if (!empty($adresse_dest['ligne1_2'])) {
7722 $adresse_destinataire[] = $adresse_dest['ligne1_2'];
7723 }
7724 $adresse_destinataire[] = $adresse_dest['ligne2'];
7725 if (!empty($adresse_dest['ligne3'])) {
7726 $adresse_destinataire[] = $adresse_dest['ligne3'];
7727 }
7728 if (!empty($adresse_dest['ligne4'])) {
7729 $adresse_destinataire[] = $adresse_dest['ligne4'];
7730 }
7731 $adresse_destinataire[] = $adresse_dest['ligne5'];
7732
7733 // Création du champ specifique
7734 $specifique_content = array();
7735 $specifique_content[] = $adresse_dest['ligne1'];
7736 $specifique_content[] = $adresse_dest['ligne1_1'];
7737 $specifique_content[] = $adresse_dest['ligne1_2'];
7738 $specifique_content[] = $testDemandeur['dossier_libelle'];
7739 $specifique_content[] = "|||||".$adresse_dest['code_barres']."|||||";
7740 unset($adresse_dest['code_barres']);
7741 // Ajout d'une page aux pdf
7742 $pdf_lettre_rar->addLetter($adresse_destinataire, $specifique_content, $testDemandeur['code_phase']);
7743
7744 }
7745 $pdf_output = $pdf_lettre_rar->output("lettre_rar".date("dmYHis").".pdf","S");
7746 $om_edition = $this->f->get_inst__om_edition();
7747 $om_edition->expose_pdf_output($pdf_output, "lettre_rar".date("dmYHis").".pdf");
7748 }
7749 }
7750
7751 /**
7752 * VIEW - view_bordereau_envoi_maire.
7753 *
7754 * Formulaire demandant :
7755 * - le code-barres de l'événement d'instruction
7756 * - la date d'envoi du courrier pour signature par le maire
7757 *
7758 * Lors de la validation :
7759 * => met à jour cette date dans l'événement d'instruction
7760 * => crée un lien permettant de générer en PDF le bordereau
7761 *
7762 * @return void
7763 */
7764 function view_bordereau_envoi_maire() {
7765 // Vérification de l'accessibilité sur l'élément
7766 $this->checkAccessibility();
7767
7768 // Récupération des valeur passées en POST ou GET
7769 $code_barres = "";
7770 if($this->f->get_submitted_post_value('code_barres') !== null) {
7771 $code_barres = $this->f->get_submitted_post_value('code_barres');
7772 } elseif($this->f->get_submitted_get_value('code_barres')!==null) {
7773 $code_barres = $this->f->get_submitted_get_value('code_barres');
7774 }
7775 $date = "";
7776 if($this->f->get_submitted_post_value('date') !== null) {
7777 $date = $this->f->get_submitted_post_value('date');
7778 } elseif($this->f->get_submitted_get_value('date') !== null) {
7779 $date = $this->f->get_submitted_get_value('date');
7780 }
7781 $validation = 0;
7782 if($this->f->get_submitted_post_value('validation') !== null) {
7783 $validation = $this->f->get_submitted_post_value('validation');
7784 } elseif($this->f->get_submitted_get_value('validation') !== null) {
7785 $validation = $this->f->get_submitted_get_value('validation');
7786 }
7787
7788 // Si le formulaire a été validé
7789 if ($this->f->get_submitted_post_value('validation') !== null) {
7790 // Tous les champs doivent obligatoirement être remplis
7791 if (!empty($date) && !empty($code_barres)) {
7792 $date_en = $this->dateDB($date);
7793 // Si date valide
7794 if ($date_en != "") {
7795 $id_instruction = $this->get_instruction_by_barcode($code_barres);
7796 // Si un événement d'instruction a été trouvé pour ce code-barres
7797 if ($id_instruction !== null) {
7798 $ret = $this->update_date_envoi_signature($id_instruction, $date_en);
7799 // Si mise à jour réussie de la date d'envoi du courrier
7800 // pour signature par l'autorité compétente
7801 if($ret === true) {
7802 // Message de validation avec lien PDF
7803 $message_class = "valid";
7804 $message = '&bullet; '._("Veuillez cliquer sur le lien ci-dessous pour telecharger votre bordereau");
7805 $message .= " : <br/><br/>";
7806 $message .= "<a class='om-prev-icon pdf-16'";
7807 $message .= " id=\"generer_bordereau_envoi_maire\"";
7808 $message .= " title=\""._("Bordereau")."\"";
7809 $message .= " href='".OM_ROUTE_FORM."&obj=instruction";
7810 $message .= "&action=200";
7811 $message .= "&idx=".$id_instruction."'";
7812 $message .= " target='_blank'>";
7813 $message .= _("Bordereau d'envoi au maire");
7814 $message .= "</a><br/><br/>";
7815 $message .= '&bullet; '._("Rappel des informations saisies")." :<br/><br/>";
7816 $message .= _("Code du courrier")." : ".$code_barres."<br/>";
7817 $message .= _("Date d'envoi du courrier pour signature par le maire")." : ".$date;
7818
7819 } else {
7820 // Message d'erreur
7821 $message_class = "error";
7822 $message = sprintf(_("Erreur lors de la mise a jour de l'evenement d'instruction correspondant au code barres %s."),
7823 $code_barres);
7824 }
7825 }
7826 else {
7827 $message_class = "error";
7828 $message = _("Le numero saisi ne correspond a aucun code-barres d'evenement d'instruction.");
7829 }
7830 }
7831 else {
7832 $message_class = "error";
7833 $message = _("La date est invalide.");
7834 }
7835 } else {
7836 $message_class = "error";
7837 $message = _("Tous les champs doivent etre remplis.");
7838 }
7839 }
7840
7841 /**
7842 * Affichage des messages et du formulaire
7843 */
7844
7845 // Affichage du message de validation ou d'erreur
7846 if (isset($message) && isset($message_class) && $message != "") {
7847 $this->f->displayMessage($message_class, $message);
7848 }
7849
7850 // Ouverture du formulaire
7851 $datasubmit = $this->getDataSubmit();
7852 echo "\n<!-- ########## START DBFORM ########## -->\n";
7853 echo "<form";
7854 echo " id=\"bordereau_envoi_maire\"";
7855 echo " method=\"post\"";
7856 echo " name=\"f1\"";
7857 echo " action=\"";
7858 echo $datasubmit;
7859 echo "\"";
7860 echo ">\n";
7861
7862 // Paramétrage des champs du formulaire
7863 $champs = array("code_barres","date");
7864
7865 // Création d'un nouvel objet de type formulaire
7866 $form = $this->f->get_inst__om_formulaire(array(
7867 "validation" => 0,
7868 "maj" => 0,
7869 "champs" => $champs,
7870 ));
7871
7872 $template_required_label = '%s *';
7873 // Parametrage du champ code_barres
7874 $form->setLib("code_barres", sprintf($template_required_label,_("Code du courrier")));
7875 $form->setType("code_barres", "text");
7876 $form->setVal("code_barres", $code_barres);
7877 $form->setTaille("code_barres", 20);
7878 $form->setMax("code_barres", 20);
7879 // Parametrage du champ date
7880 $form->setLib("date", sprintf($template_required_label,_("Date d'envoi du courrier pour signature par le maire")));
7881 $form->setType("date", "date") ;
7882 if (empty($date)) {
7883 $date = date('d/m/Y');
7884 }
7885 $form->setVal("date", $date);
7886 $form->setTaille("date", 10);
7887 $form->setMax("date", 10);
7888
7889 // Création du bloc regroupant les champs
7890 $form->setBloc('code_barres','D');
7891 $form->setBloc('date','F');
7892 // Affichage du formulaire
7893 $form->entete();
7894 $form->afficher($champs, 0, false, false);
7895 $form->enpied();
7896 // Affichage du bouton
7897 printf("\t<div class=\"formControls\">\n");
7898 //
7899 $this->f->layout->display_form_button(array("value" => _("Valider"), "name" => "validation"));
7900 printf("\t</div>\n");
7901 // Fermeture du formulaire
7902 printf("\t</form>\n");
7903 }
7904
7905 /**
7906 * VIEW - view_bordereau_envoi_maire.
7907 *
7908 * PDF de bordereau d'envoi au maire pour l'événement d'instruction instancié
7909 *
7910 * @return [void]
7911 */
7912 function view_generate_bordereau_envoi_maire() {
7913 // Vérification de l'accessibilité sur l'élément
7914 $this->checkAccessibility();
7915 // Récupération de la collectivité du dossier d'instruction
7916 $collectivite_di = $this->get_dossier_instruction_om_collectivite();
7917 // Récupération de ses paramètres
7918 $collectivite = $this->f->getCollectivite($collectivite_di);
7919 // Génération du PDF
7920 $result = $this->compute_pdf_output('etat', 'communaute_bordereau_envoi_maire', $collectivite, $this->getVal(($this->clePrimaire)));
7921 // Affichage du PDF
7922 $this->expose_pdf_output(
7923 $result['pdf_output'],
7924 $result['filename']
7925 );
7926 }
7927
7928 /**
7929 * VIEW - view_rapport_instruction.
7930 *
7931 * Ouvre le sous-formulaire en ajaxIt dans un overlay.
7932 * Cette action est bindée pour utiliser la fonction popUpIt.
7933 *
7934 * @return void
7935 */
7936 function view_overlay_notification_manuelle() {
7937
7938 // Vérification de l'accessibilité sur l'élément
7939 $this->checkAccessibility();
7940
7941 printf(
7942 '<script type="text/javascript" >
7943 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=411&idx=%3$s\', 1);
7944 </script>',
7945 'instruction_notification_manuelle',
7946 OM_ROUTE_SOUSFORM,
7947 $this->getVal($this->clePrimaire),
7948 $this->getVal('dossier')
7949 );
7950 }
7951
7952 /**
7953 * VIEW - view_overlay_notification_service_consulte.
7954 *
7955 * Ouvre le sous-formulaire de notification des services consulte
7956 * en ajaxIt dans un overlay.
7957 * Cette action est bindée pour utiliser la fonction popUpIt.
7958 *
7959 * @return void
7960 */
7961 function view_overlay_notification_service_consulte() {
7962
7963 // Vérification de l'accessibilité sur l'élément
7964 $this->checkAccessibility();
7965
7966 printf(
7967 '<script type="text/javascript" >
7968 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=420&idx=%3$s\', 1);
7969 </script>',
7970 'instruction_notification_manuelle',
7971 OM_ROUTE_SOUSFORM,
7972 $this->getVal($this->clePrimaire),
7973 $this->getVal('dossier')
7974 );
7975 }
7976
7977 /**
7978 * VIEW - overlay_notification_tiers_consulte.
7979 *
7980 * Ouvre le sous-formulaire de notification des tiers consulte
7981 * en ajaxIt dans un overlay.
7982 * Cette action est bindée pour utiliser la fonction popUpIt.
7983 *
7984 * @return void
7985 */
7986 function view_overlay_notification_tiers_consulte() {
7987
7988 // Vérification de l'accessibilité sur l'élément
7989 $this->checkAccessibility();
7990
7991 printf(
7992 '<script type="text/javascript" >
7993 overlayIt(\'%1$s\',\'%2$s&objsf=%1$s&idxformulaire=%4$s&retourformulaire=dossier_instruction&obj=%1$s&action=430&idx=%3$s\', 1);
7994 </script>',
7995 'instruction_notification_manuelle',
7996 OM_ROUTE_SOUSFORM,
7997 $this->getVal($this->clePrimaire),
7998 $this->getVal('dossier')
7999 );
8000 }
8001 /**
8002 * Retourne l'événement d'instruction dont on donne le code-barres, avec un filtre
8003 * pour exclure les dossiers du groupe contentieux.
8004 *
8005 * @param [string] $barcode numéro du code-barres
8006 * @return [mixed] ID de son instruction ou null si aucun code
8007 */
8008 function get_instruction_by_barcode($barcode) {
8009 // Begin
8010 $this->begin_treatment(__METHOD__);
8011 // Vérification de l'existence de l'événement d'instruction
8012 // pour le code-barres donné, en excluant les dossiers liés au groupe CTX
8013 $sql = "SELECT instruction
8014 FROM ".DB_PREFIXE."instruction
8015 INNER JOIN ".DB_PREFIXE."dossier
8016 ON dossier.dossier=instruction.dossier
8017 INNER JOIN ".DB_PREFIXE."dossier_instruction_type
8018 ON dossier.dossier_instruction_type = dossier_instruction_type.dossier_instruction_type
8019 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type_detaille
8020 ON dossier_instruction_type.dossier_autorisation_type_detaille = dossier_autorisation_type_detaille.dossier_autorisation_type_detaille
8021 INNER JOIN ".DB_PREFIXE."dossier_autorisation_type
8022 ON dossier_autorisation_type_detaille.dossier_autorisation_type = dossier_autorisation_type.dossier_autorisation_type
8023 INNER JOIN ".DB_PREFIXE."groupe
8024 ON dossier_autorisation_type.groupe = groupe.groupe
8025 AND groupe.code != 'CTX'
8026 WHERE code_barres = '".$this->f->db->escapesimple($barcode)."'";
8027 $res = $this->f->db->getOne($sql);
8028 $this->f->addToLog(__METHOD__." : db->getOne(\"".$sql."\")", VERBOSE_MODE);
8029 $this->f->isDatabaseError($res);
8030 // Retourne résultat
8031 return $this->end_treatment(__METHOD__, $res);
8032 }
8033
8034 /**
8035 * Met à jour le champ date d'envoi signature
8036 * avec la date fournie et pour l'instruction donnée
8037 *
8038 * @param [string] $id ID de l'événement d'instruction
8039 * @param [string] $date date au format EN
8040 * @return [boolean] true si mise à jour avec succès
8041 */
8042 function update_date_envoi_signature($id, $date) {
8043 // Préparation du tableau
8044 $valF = array();
8045 $valF['date_envoi_signature'] = $date;
8046 // Begin
8047 $this->begin_treatment(__METHOD__);
8048 // Requête
8049 $res = $this->f->db->autoExecute(
8050 DB_PREFIXE.$this->table,
8051 $valF,
8052 DB_AUTOQUERY_UPDATE,
8053 $this->getCle($id)
8054 );
8055 // S'il y a eu une erreur
8056 if (database::isError($res, true)) {
8057 $this->end_treatment(__METHOD__, false);
8058 }
8059 //
8060 return $this->end_treatment(__METHOD__, true);
8061 }
8062
8063 /**
8064 * Méthode permettant de définir des valeurs à envoyer en base après
8065 * validation du formulaire d'ajout.
8066 * @param array $val tableau des valeurs retournées par le formulaire
8067 */
8068 function setValFAjout($val = array()) {
8069 // Mise à jour du flag created_by_commune lors d'un changement de décision
8070 // par un utilisateur de commune sur un dossier instruit par la comcom
8071 if ($this->isInstrCanChangeDecision($this->valF["dossier"])) {
8072 $this->valF['created_by_commune'] = true;
8073 }
8074
8075 //
8076 if ($this->evenement_has_an_edition($this->valF['evenement']) === false) {
8077 if (isset($this->valF['flag_edition_integrale']) === true) {
8078 unset($this->valF['flag_edition_integrale']);
8079 }
8080 if (isset($this->valF['signataire_arrete']) === true) {
8081 unset($this->valF['signataire_arrete']);
8082 }
8083 }
8084 }
8085
8086
8087 /**
8088 * Récupère l'instance d'un événement de workflow.
8089 *
8090 * @param mixed $evenement Identifiant de l'événement.
8091 *
8092 * @return object
8093 */
8094 function get_inst_evenement($evenement = null) {
8095 //
8096 return $this->get_inst_common("evenement", $evenement);
8097 }
8098
8099 /**
8100 * Logue l'action de l'instruction dans son DI.
8101 *
8102 * @param string $id Clé primaire de l'instruction.
8103 * @param array $val Valeurs de l'instruction.
8104 *
8105 * @return bool Vrai si traitement effectué avec succès
8106 */
8107 private function add_log_to_dossier($id, array $val) {
8108 $maj = $this->getParameter("maj");
8109 // Action = Trace par défaut
8110 $action = $this->get_backtrace();
8111 // Action = Identifant de l'action si contexte connu
8112 if (empty($maj) === false
8113 || (empty($maj) === true && $maj === 0)) {
8114 $action = $this->get_action_param($maj, 'identifier');
8115 if ($action === 'modifier_suivi') {
8116 $action = "modifier (via l'action suivi des dates)";
8117 }
8118 if ($action === 'notifier_commune'
8119 && isset($val['mails_destinataires']) === true) {
8120 $action = "notification de la commune (courriels : ";
8121 $action .= $val['mails_destinataires'].")";
8122 }
8123 }
8124 // Création du log
8125 $log = array(
8126 'date' => date('Y-m-d H:i:s'),
8127 'user' => $_SESSION['login'],
8128 'action' => $action,
8129 'values' => array(
8130 'date_evenement' => $this->dateDB($val['date_evenement']),
8131 'date_retour_rar' => $this->dateDB($val['date_retour_rar']),
8132 'date_retour_signature' => $this->dateDB($val['date_retour_signature']),
8133 'evenement' => $val['evenement'],
8134 'action' => $val['action'],
8135 'instruction' => $id,
8136 'etat' => $val['etat'],
8137 ),
8138 );
8139 // Ajout du log
8140 $di = $this->get_inst_dossier($val['dossier']);
8141 $ret = $di->add_log_instructions($log);
8142 if ($ret === false) {
8143 $this->correct = false;
8144 $this->msg = '';
8145 $this->addToMessage($di->msg);
8146 }
8147 return $ret;
8148 }
8149
8150
8151 /**
8152 * Retourne le contexte de déboguage formaté en HTML.
8153 *
8154 * @return string Une ligne par trace
8155 */
8156 private function get_backtrace() {
8157 $trace = debug_backtrace();
8158 $backtrace = '';
8159 $i = 1;
8160 foreach ($trace as $key => $value) {
8161 $func = $trace[$key]['function'];
8162 // On ne s'autolog pas
8163 if ($func === 'get_backtrace'
8164 || $func === 'add_log_to_dossier') {
8165 continue;
8166 }
8167 $backtrace .= $i.') ';
8168 // Si dans une classe
8169 if (isset($trace[$key]['class']) === true
8170 && empty($trace[$key]['class']) === false) {
8171 $backtrace .= $trace[$key]['class'].'->'.$func;
8172 }
8173 // Si procédural
8174 else {
8175 $file = $trace[$key]['file'];
8176 $line = $trace[$key]['line'];
8177 $truncated_file = $this->f->get_relative_path($file);
8178 if ($truncated_file !== false) {
8179 $file = $truncated_file;
8180 }
8181 $backtrace .= $func.' IN<br/>&nbsp;&nbsp;&nbsp;&nbsp; '.$file.':'.$line;
8182 }
8183 $backtrace .= '<br/>';
8184 $i++;
8185 }
8186 return $backtrace;
8187 }
8188
8189 /**
8190 * CONDITION - is_notifiable.
8191 *
8192 * Condition pour afficher l'action notifier_commune.
8193 *
8194 * @return boolean
8195 */
8196 public function is_notifiable() {
8197 // L'instruction doit être finalisée, ce qui revient à dire
8198 // définalisable sans bypass
8199 if ($this->is_unfinalizable_without_bypass() === false) {
8200 return false;
8201 }
8202 // La collectivité de l'utilisateur doit être de niveau multi
8203 if ($this->f->has_collectivite_multi() === false) {
8204 return false;
8205 }
8206 // Le paramètre multi de l'objet du courriel doit exister
8207 if ($this->f->getParameter('param_courriel_de_notification_commune_objet_depuis_instruction') === NULL) {
8208 return false;
8209 }
8210 // Le paramètre multi du modèle du courriel doit exister
8211 if ($this->f->getParameter('param_courriel_de_notification_commune_modele_depuis_instruction') === NULL) {
8212 return false;
8213 }
8214 // A ce stade toutes les conditions sont satisfaites
8215 return true;
8216 }
8217
8218 /**
8219 * TREATMENT - notifier_commune.
8220 *
8221 * Notifie aux communes et par courriel la finalisation d'une instruction.
8222 *
8223 * @return boolean
8224 */
8225 public function notifier_commune() {
8226 // Cette méthode permet d'exécuter une routine en début des méthodes
8227 // dites de TREATMENT.
8228 $this->begin_treatment(__METHOD__);
8229 // Définition des paramètres
8230 $p_objet = 'param_courriel_de_notification_commune_objet_depuis_instruction';
8231 $p_modele = 'param_courriel_de_notification_commune_modele_depuis_instruction';
8232 $p_courriel = 'param_courriel_de_notification_commune';
8233 // Définition des variables de substitution
8234 $id_di = $this->getVal('dossier');
8235 $id_inst = $this->getVal($this->clePrimaire);
8236 // Instanciation du DI
8237 $di = $this->get_inst_dossier($id_di);
8238 // Récupération du paramétrage de la collectivité du dossier
8239 $collectivite_di = $di->getVal('om_collectivite');
8240 $params_mono = $this->f->getCollectivite($collectivite_di);
8241 // Récupération du paramétrage de la collectivité multi
8242 $collectivite_multi = $this->f->get_idx_collectivite_multi();
8243 $params_multi = $this->f->getCollectivite($collectivite_multi);
8244 // Vérification de l'objet (obligatoirement multi)
8245 $objet = null;
8246 if (isset($params_multi[$p_objet]) === true
8247 && $params_multi[$p_objet] !== '') {
8248 $objet = $params_multi[$p_objet];
8249 }
8250 // Vérification du modèle mono en priorité
8251 $modele = null;
8252 if (isset($params_mono[$p_modele]) === true
8253 && $params_mono[$p_modele] !== '') {
8254 $modele = $params_mono[$p_modele];
8255
8256 }
8257 // Sinon vérification du modèle multi
8258 if ($modele === null
8259 && isset($params_multi[$p_modele]) === true
8260 && $params_multi[$p_modele] !== '') {
8261 $modele = $params_multi[$p_modele];
8262 }
8263 // Vérification des adresses de courriel mono
8264 $courriels_valides = array();
8265 $courriels_invalides = array();
8266 if (isset($params_mono[$p_courriel]) === true
8267 && $params_mono[$p_courriel] !== '') {
8268 // Un mail par ligne
8269 $adresses = explode("\n", $params_mono[$p_courriel]);
8270 // Vérification de la validité de chaque mail avec preg_match
8271 foreach ($adresses as $adresse) {
8272 $adresse = trim($adresse);
8273 if ($this->f->checkValidEmailAddress($adresse) === 1) {
8274 $courriels_valides[] = $adresse;
8275 } else {
8276 $courriels_invalides[] = $adresse;
8277 }
8278 }
8279 }
8280 // Vérification du paramétrage global :
8281 // on stoppe le traitement si au moins un paramètre est incorrect
8282 if ($objet === null
8283 || $modele === null
8284 || count($courriels_valides) === 0
8285 || count($courriels_invalides) > 0) {
8286 // On construit le message d'erreur adéquat
8287 $this->addToMessage(_('Erreur de paramétrage :'));
8288 if ($objet === null) {
8289 $this->addToMessage(_("* l'objet du courriel envoyé aux communes est vide"));
8290 }
8291 if ($modele === null) {
8292 $this->addToMessage(_("* le modèle du courriel envoyé aux communes est vide"));
8293 }
8294 if (count($courriels_valides) === 0) {
8295 $this->addToMessage(_("* aucun courriel valide de destinataire de la commune"));
8296 }
8297 if (count($courriels_invalides) > 0) {
8298 $courriels_invalides = implode(', ', $courriels_invalides);
8299 $this->addToMessage(_("* un ou plusieurs courriels des destinataires de la commune sont invalides : ").$courriels_invalides);
8300 }
8301 $this->addToMessage(_("Veuillez contacter votre administrateur."));
8302 return $this->end_treatment(__METHOD__, false);
8303 }
8304 // Remplacement des variables de substitution
8305 $objet = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $objet);
8306 $modele = $this->formater_modele($modele, $id_di, $id_inst);
8307 // Exécution du traitement d'envoi du/des mail(s)
8308 $fails = array();
8309 foreach ($courriels_valides as $email) {
8310 if ($this->f->sendMail(
8311 iconv("UTF-8", "CP1252", $objet),
8312 iconv("UTF-8", "CP1252", $modele),
8313 iconv("UTF-8", "CP1252", $email)) === false) {
8314 $fails[] = $email;
8315 }
8316 }
8317 // Si échec message d'erreur et arrêt du traitement
8318 if (count($fails) > 0) {
8319 $fails = implode(', ', $fails);
8320 $this->addToMessage(_("Erreur lors de l'envoi du courriel aux destinataires : ").$fails);
8321 $this->addToMessage(_("Veuillez contacter votre administrateur."));
8322 return $this->end_treatment(__METHOD__, false);
8323 }
8324 // Ajout du log
8325 $this->setValFFromVal();
8326 $val_inst = $this->valF;
8327 $val_inst['mails_destinataires'] = implode(', ', $courriels_valides);
8328 if ($this->add_log_to_dossier($id_inst, $val_inst) === false) {
8329 $this->addToMessage(_("Erreur lors de la notification."));
8330 $this->addToMessage(_("Veuillez contacter votre administrateur."));
8331 return $this->end_treatment(__METHOD__, false);
8332 }
8333 // Message de validation
8334 $this->addToMessage(_('La commune a été notifiée.'));
8335 return $this->end_treatment(__METHOD__, true);
8336 }
8337
8338 /**
8339 * Formatte le corps du courriel notifié aux communes
8340 *
8341 * @param string $modele template du modèle du courriel
8342 * @param string $id_di clé primaire du DI
8343 * @param string $id_inst clé primaire de l'instruction
8344 * @return string corps du mail au format HTML
8345 */
8346 public function formater_modele($modele, $id_di, $id_inst) {
8347 // Création du lien d'accès direct à l'instruction
8348 $url_inst = PATH_BASE_URL.'app/index.php?module=form&direct_link=true&obj=dossier_instruction&action=3'.
8349 '&direct_field=dossier&direct_form=instruction&direct_action=3&direct_idx='.$id_inst;
8350 $url_inst = '<a href="'.$url_inst.'">'.$url_inst.'</a>';
8351 // Remplacement des champs de fusion
8352 $modele = str_replace('<DOSSIER_INSTRUCTION>', $id_di, $modele);
8353 $modele = str_replace('<URL_INSTRUCTION>', $url_inst, $modele);
8354 $modele = str_replace('<ID_INSTRUCTION>', $id_inst, $modele);
8355 // Encodage HTML des sauts de ligne
8356 $modele = preg_replace("/\r\n|\r|\n/",'<br/>',$modele);
8357 //
8358 return $modele;
8359 }
8360
8361
8362 /**
8363 * Récupère l'instance de l'instructeur
8364 *
8365 * @param integer $instructeur Identifiant de l'instructeur.
8366 *
8367 * @return object
8368 */
8369 protected function get_inst_instructeur($instructeur) {
8370 //
8371 return $this->get_inst_common("instructeur", $instructeur);
8372 }
8373
8374
8375 /**
8376 * Récupère l'instance de l'utilisateur
8377 *
8378 * @param integer $om_utilisateur Identifiant de l'utilisateur.
8379 *
8380 * @return object
8381 */
8382 protected function get_inst_om_utilisateur($om_utilisateur) {
8383 //
8384 return $this->get_inst_common("om_utilisateur", $om_utilisateur);
8385 }
8386
8387
8388 /**
8389 * Récupère l'instance de la division.
8390 *
8391 * @param integer $division Identifiant de la division.
8392 *
8393 * @return object
8394 */
8395 protected function get_inst_division($division) {
8396 //
8397 return $this->get_inst_common("division", $division);
8398 }
8399
8400
8401 /**
8402 * Récupère l'instance de la direction.
8403 *
8404 * @param integer $direction Identifiant de la direction.
8405 *
8406 * @return object
8407 */
8408 protected function get_inst_direction($direction) {
8409 //
8410 return $this->get_inst_common("direction", $direction);
8411 }
8412
8413
8414 /**
8415 * Récupère la collectivité d'un instructeur en passant par sa division puis
8416 * par sa direction.
8417 *
8418 * @param integer $instructeur Identifiant de l'instructeur.
8419 *
8420 * @return integer
8421 */
8422 protected function get_instructeur_om_collectivite($instructeur) {
8423 // Chemin vers la collectivité d'un instructeur
8424 $inst_instr = $this->get_inst_instructeur($instructeur);
8425 $inst_division = $this->get_inst_division($inst_instr->getVal('division'));
8426 $inst_direction = $this->get_inst_direction($inst_division->getVal('direction'));
8427
8428 // Collectivité
8429 $om_collectivite = $inst_direction->getVal('om_collectivite');
8430
8431 //
8432 return $om_collectivite;
8433 }
8434
8435 /*
8436 * CONDITION - can_user_access_dossier_contexte_ajout
8437 *
8438 * Vérifie que l'utilisateur a bien accès au dossier d'instruction passé dans le
8439 * formulaire d'ajout.
8440 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8441 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8442 *
8443 */
8444 function can_user_access_dossier_contexte_ajout() {
8445
8446 ($this->f->get_submitted_get_value('idxformulaire') !== null ? $id_dossier =
8447 $this->f->get_submitted_get_value('idxformulaire') : $id_dossier = "");
8448 //
8449 if ($id_dossier !== "") {
8450 $dossier = $this->f->get_inst__om_dbform(array(
8451 "obj" => "dossier_instruction",
8452 "idx" => $id_dossier,
8453 ));
8454 //
8455 return $dossier->can_user_access_dossier();
8456 }
8457 return false;
8458 }
8459
8460 /*
8461 * CONDITION - can_user_access_dossier
8462 *
8463 * Vérifie que l'utilisateur a bien accès au dossier lié à l'instruction instanciée.
8464 * Cette méthode vérifie que l'utilisateur est lié au groupe du dossier, et si le
8465 * dossier est confidentiel qu'il a accès aux confidentiels de ce groupe.
8466 *
8467 */
8468 function can_user_access_dossier_contexte_modification() {
8469
8470 $id_dossier = $this->getVal('dossier');
8471 //
8472 if ($id_dossier !== "" && $id_dossier !== null) {
8473 $dossier = $this->f->get_inst__om_dbform(array(
8474 "obj" => "dossier_instruction",
8475 "idx" => $id_dossier,
8476 ));
8477 //
8478 return $dossier->can_user_access_dossier();
8479 }
8480 return false;
8481 }
8482
8483 /**
8484 * TREATMENT - envoyer_a_signature_sans_relecture
8485 *
8486 * Permet d'envoyer le document de l'instruction au parapheur pour signature sans relecture
8487 *
8488 * @return boolean true si l'envoi a été effectué avec succès false sinon
8489 */
8490 function envoyer_a_signature_sans_relecture() {
8491 return $this->envoyer_a_signature();
8492 }
8493
8494 /**
8495 * TREATMENT - envoyer_a_signature_avec_relecture
8496 *
8497 * Permet d'envoyer le document de l'instruction au parapheur pour signature avec relecture
8498 *
8499 * @return boolean true si l'envoi a été effectué avec succès false sinon
8500 */
8501 function envoyer_a_signature_avec_relecture() {
8502 $is_forced_view_files = true;
8503 return $this->envoyer_a_signature($is_forced_view_files);
8504 }
8505
8506 /**
8507 * TREATMENT - envoyer_a_signature
8508 *
8509 * Permet d'envoyer le document de l'instruction au parapheur pour signature
8510 *
8511 * @param boolean $is_forced_view_files Indique si il y a une relecture (true) ou non (false)
8512 *
8513 * @return boolean true si l'envoi a été effectué avec succès false sinon
8514 */
8515 function envoyer_a_signature($is_forced_view_files = false) {
8516 $this->begin_treatment(__METHOD__);
8517 $this->correct = true;
8518
8519 // Instanciation de l'objet signataire_arrete
8520 $inst_signataire_arrete = $this->f->get_inst__om_dbform(array(
8521 'obj' => 'signataire_arrete',
8522 'idx' => $this->getVal('signataire_arrete'),
8523 ));
8524
8525 // Instanciation de l'objet dossier
8526 $inst_dossier = $this->f->get_inst__om_dbform(array(
8527 'obj' => 'dossier',
8528 'idx' => $this->getVal('dossier'),
8529 ));
8530
8531 // Récupération du document à signer
8532 $file = $this->f->storage->get($this->getVal('om_fichier_instruction'));
8533 if ($file === OP_FAILURE) {
8534 $this->correct = false;
8535 $this->addToMessage(__("Une erreur est survenue lors de la récupération du contenu du document de l'instruction."));
8536 // Termine le traitement
8537 return $this->end_treatment(__METHOD__, false);
8538 }
8539
8540 // Initialisation des paramètre à passer pour l'envoi en signature
8541 $data = array(
8542 "om_utilisateur_email" => $this->f->om_utilisateur['email'],
8543 "om_utilisateur_nom" => $this->f->om_utilisateur['nom'],
8544 "signataire_arrete_email" => $inst_signataire_arrete->getVal('email'),
8545 "signataire_arrete_nom" => $inst_signataire_arrete->getVal('nom'),
8546 "signataire_arrete_prenom" => $inst_signataire_arrete->getVal('prenom'),
8547 // Permet d'envoyer en signature l'instruction le jour de la date limite
8548 "date_limite_instruction" => $this->compute_date_limite(1),
8549 "dossier" => $this->getVal('dossier'),
8550 "is_forced_view_files" => $is_forced_view_files,
8551 'commentaire_signature' => $is_forced_view_files === true ? __('relecture demandee.') : null
8552 );
8553
8554 // Initialisation des métadonnées
8555 $metadonnee_dossier = $file['metadata'];
8556 // récupération de l'extension du fichier
8557 $extension = substr($metadonnee_dossier['filename'], strrpos($metadonnee_dossier['filename'], '.'));
8558 // Modification du libellé du document transmis au parapheur
8559 // pour le mettre sous la forme : instruction_xxx_libelle_lettretype.extension
8560 $metadonnee_dossier['filename'] = $this->getDocumentLibelle().$extension;
8561 $metadonnee_dossier['titre_document'] = $this->getDocumentTitre();
8562
8563 $metadonnee_dossier['url_di'] = sprintf(
8564 '%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',
8565 $this->f->get_param_base_path_metadata_url_di() !== null ? $this->f->get_param_base_path_metadata_url_di() : PATH_BASE_URL,
8566 $this->getVal($this->clePrimaire)
8567 );
8568
8569 $optional_data = null;
8570 // Si il y a des paramètres supplémentaire spécifié dans le signataire alors on les récupère
8571 if ($inst_signataire_arrete->getVal('parametre_parapheur') !== null && $inst_signataire_arrete->getVal('parametre_parapheur') !== '') {
8572 $optional_data = json_decode($inst_signataire_arrete->getVal('parametre_parapheur'), true);
8573 if (json_last_error() !== JSON_ERROR_NONE) {
8574 $this->correct = false;
8575 $this->addToMessage(__("Les paramètres supplémentaires envoyés au parapheur ne sont pas au bon format."));
8576 $this->addToLog(__METHOD__."(): ".
8577 __("Erreur lors du décodage du format json des paramètres supplémentaires envoyé au parapheur.
8578 Tableau : ").var_export($inst_signataire_arrete->getVal('parametre_parapheur'), true)
8579 );
8580 // Termine le traitement
8581 return $this->end_treatment(__METHOD__, false);
8582 }
8583 }
8584
8585 //Instanciation de la classe electronicsignature
8586 $inst_es = $this->get_electronicsignature_instance();
8587 if ($inst_es === false) {
8588 $this->correct = false;
8589 return $this->end_treatment(__METHOD__, false);
8590 }
8591
8592 // Appel de la méthode de l'abstracteur send_for_signature()
8593 // Cette méthode doit retourner un tableau de valeur
8594 try {
8595 $result = $inst_es->send_for_signature($data, $file['file_content'], $metadonnee_dossier, $optional_data);
8596 } catch (electronicsignature_exception $e) {
8597 $this->handle_electronicsignature_exception($e);
8598 return $this->end_treatment(__METHOD__, false);
8599 }
8600
8601 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8602 $valF = array();
8603
8604 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8605 foreach($this->champs as $identifiant => $champ) {
8606 $valF[$champ] = $this->val[$identifiant];
8607 }
8608 // On fait ensuite nos modifications spécifiques
8609 $valF['id_parapheur_signature'] = $result['id_parapheur_signature'];
8610 $valF['statut_signature'] = $result['statut'];
8611 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8612 $valF['date_envoi_signature'] = date("Y-m-d", strtotime($result['date_envoi_signature']));
8613 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
8614
8615 $ret = $this->modifier($valF);
8616
8617 if ($ret === false) {
8618 $this->correct = false;
8619 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
8620 // Termine le traitement
8621 return $this->end_treatment(__METHOD__, false);
8622 }
8623
8624 // Message
8625 $this->addToMessage(__("Le document a été envoyé pour signature dans le parapheur."));
8626 if (array_key_exists('signature_page_url', $result) === true) {
8627 $this->addToMessage(sprintf(
8628 '<br> > <a href="%1$s" title="%2$s" target="_blank">%2$s</a>',
8629 $result['signature_page_url'],
8630 __("Signez directement le document")
8631 ));
8632 }
8633
8634 // Tout s'est bien passé, on termine le traitement
8635 return $this->end_treatment(__METHOD__, true);
8636 }
8637
8638 /**
8639 * Permet de récupérer la bonne date limite en fonction de si l'instruction
8640 * est en incomplet notifié ou non.
8641 * On peut ajouter des jours à cette date grâce au paramètre "delay".
8642 * Cette fonction est utilisée dans un cas spécifique où on veut envoyer
8643 * l'instruction en signature le jour de la date limite.
8644 *
8645 * @param int $delay Le nombre de jour à ajouter à la date limite.
8646 *
8647 * @return string $date_limite la date limite calculé ou false
8648 */
8649 private function compute_date_limite($delay) {
8650 // Instanciation de l'objet dossier
8651 $inst_dossier = $this->f->get_inst__om_dbform(array(
8652 'obj' => 'dossier',
8653 'idx' => $this->getVal('dossier'),
8654 ));
8655
8656 $date_to_compute = null;
8657 if ($inst_dossier->getVal('incomplet_notifie') === 't') {
8658 $date_to_compute = $inst_dossier->getVal('date_limite_incompletude');
8659 } else {
8660 $date_to_compute = $inst_dossier->getVal('date_limite');
8661 }
8662
8663 $date_limite = date("Y-m-d", strtotime($date_to_compute."+ $delay days"));
8664
8665 return $date_limite;
8666 }
8667
8668 /**
8669 * Permet de récupérer la traduction de la valeur de statut_signature
8670 *
8671 * @return string la valeur de statut_signature traduite | false
8672 */
8673 function get_trad_for_statut($value_to_trad){
8674 $statut_signature_tab = array(
8675 'waiting' => __('en préparation'),
8676 'in_progress' => __('en cours de signature'),
8677 'canceled' => __('signature annulée'),
8678 'expired' => __('délai de signature expiré'),
8679 'finished' => __('signé')
8680 );
8681 if (array_key_exists($value_to_trad, $statut_signature_tab) === true) {
8682 return $statut_signature_tab[$value_to_trad];
8683 }
8684
8685 return false;
8686 }
8687
8688 /**
8689 * Permet de mettre à jour le tableau json sotcké dans le champ historique_signature
8690 *
8691 * @return string (json) la valeur de historique_signature mis à jour | false
8692 */
8693 function get_updated_historique_signature($historique_signature_values) {
8694
8695 $historique_signature_value_tab = $this->get_historique_signature_decoded();
8696
8697 if ($historique_signature_value_tab === false) {
8698 $this->addToLog(__METHOD__."(): erreur historique signature", DEBUG_MODE);
8699 return false;
8700 }
8701
8702 $last_val_historique_signature = array();
8703
8704 // Si la tableau récupéré n'est pas vide alors
8705 // on récupère la dernière ligne du tableau
8706 if (empty($historique_signature_value_tab) === false) {
8707 $last_val_historique_signature = end($historique_signature_value_tab);
8708 }
8709
8710 $format_date = '';
8711 $format_date_hour = '';
8712 $date_converted=array();
8713
8714 $date_to_convert = array(
8715 'date_envoi_signature' => $historique_signature_values['date_envoi_signature'],
8716 'date_limite_instruction' => $this->compute_date_limite(0),
8717 'date_retour_signature' => $historique_signature_values['date_retour_signature']
8718 );
8719
8720 // Conversion des dates en fonction de leur format
8721 foreach ($date_to_convert as $key => $value) {
8722 $date_converted[$key] = null;
8723 if ($value != null) {
8724 $format_date = 'd/m/Y';
8725 $format_date_hour = 'd/m/Y H:i:s';
8726 $date_converted[$key] = empty(date_parse($value)['hour']) === false ? date($format_date_hour, strtotime($value)) : date($format_date, strtotime($value));
8727 }
8728 }
8729
8730 // Ce tableau permet de lister les colonnes de historique_signature et de les rendre traduisibles.
8731 // Il faut en effet mettre les gettext avec l'intitulé explicite au moins
8732 // une fois afin qu'il puisse être reconnu par le logiciel de traduction.
8733 $tab_for_columns_trad = array(
8734 __('entry_date'),
8735 __('id_parapheur_signature'),
8736 __('emetteur'),
8737 __('signataire'),
8738 __('date_envoi'),
8739 __('date_limite'),
8740 __('date_retour'),
8741 __('statut_signature'),
8742 __('commentaire_signature')
8743 );
8744
8745 array_push($historique_signature_value_tab, array(
8746 'entry_date' => date('d/m/Y H:i:s'),
8747 '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'],
8748 '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'],
8749 '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'],
8750 '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'],
8751 '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'],
8752 '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'],
8753 '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']),
8754 'commentaire_signature' => isset($historique_signature_values['commentaire_signature']) === false || $historique_signature_values['commentaire_signature'] == null ? null : $historique_signature_values['commentaire_signature'],
8755 ));
8756
8757 return json_encode($historique_signature_value_tab, JSON_HEX_APOS);
8758 }
8759
8760 /**
8761 * TREATMENT - annuler_envoi_en_signature
8762 *
8763 * Permet d'annuler l'envoi du document de l'instruction au parapheur pour signature
8764 *
8765 * @return boolean true si l'annulation a été effectué avec succès false sinon
8766 */
8767 function annuler_envoi_en_signature() {
8768 $this->begin_treatment(__METHOD__);
8769 $this->correct = true;
8770
8771 //Instanciation de la classe electronicsignature
8772 $inst_es = $this->get_electronicsignature_instance();
8773 if ($inst_es === false) {
8774 $this->correct = false;
8775 return $this->end_treatment(__METHOD__, false);
8776 }
8777
8778 $data = array();
8779 if (! empty($this->getVal('id_parapheur_signature'))) {
8780 $data['id_parapheur_signature'] = $this->getVal('id_parapheur_signature');
8781 } else {
8782 $this->correct = false;
8783 $this->addToMessage(__("Il n'y a pas d'identifiant de parapheur."));
8784 return $this->end_treatment(__METHOD__, false);
8785 }
8786
8787 // Appel de la méthode de l'abstracteur cancel_send_for_signature()
8788 // Cette méthode doit retourner un tableau de valeur
8789 try {
8790 $result = $inst_es->cancel_send_for_signature($data);
8791 } catch (electronicsignature_exception $e) {
8792 $this->handle_electronicsignature_exception($e);
8793 return $this->end_treatment(__METHOD__, false);
8794 }
8795
8796 // Après avoir reçu le résultat du parapheur, il faut mettre à jour les champs
8797 $valF = array();
8798
8799 // Pour appeler la fonction modifier il faut traiter tous les champs de l'objet
8800 foreach($this->champs as $identifiant => $champ) {
8801 $valF[$champ] = $this->val[$identifiant];
8802 }
8803 // On fait ensuite nos modifications spécifiques
8804 $valF['id_parapheur_signature'] = null;
8805 $valF['statut_signature'] = $result['statut'];
8806 $valF['commentaire_signature'] = isset($result['commentaire_signature']) == true ? $result['commentaire_signature'] : null;
8807 $valF['date_envoi_signature'] = null;
8808 $valF['historique_signature'] = $this->get_updated_historique_signature($result);
8809
8810 $ret = $this->modifier($valF);
8811
8812 if ($ret === false) {
8813 $this->correct = false;
8814 $this->addToMessage(__("Une erreur est survenue lors de la mise à jour des champs."));
8815 // Termine le traitement
8816 return $this->end_treatment(__METHOD__, false);
8817 }
8818
8819 // Message
8820 $this->addToMessage(__("L'annulation a été effectuée avec succès."));
8821
8822 // Tout s'est bien passé, on termine le traitement
8823 return $this->end_treatment(__METHOD__, true);
8824 }
8825
8826
8827 /**
8828 * Récupère le contenu du champ historique_signature et le converti en tableau
8829 *
8830 * @return array sinon false en cas d'erreur
8831 */
8832 protected function get_historique_signature_decoded() {
8833 $val = str_replace("'", '"', $this->getVal('historique_signature'));
8834 if ($val === '' || $val == 'false') {
8835 $val = json_encode(array());
8836 }
8837 if($this->isJson($val) === false) {
8838 return false;
8839 }
8840 return json_decode($val, true);
8841 }
8842
8843 /**
8844 * Récupère les informations à afficher dans le tableau de suivi à l'aide
8845 * d'une requête sql. Stocke ces informations dans un tableau.
8846 * Converti le tableau au format json et renvoi le json obtenu.
8847 *
8848 * Pour identifier quel suivi est affiché (notification des demandeurs, des services ou
8849 * de tiers) ce sont les tâches liées aux notifications qui sont utilisés.
8850 * La clause where de la requête est construite à partir du tableau contenant les types
8851 * de tâches fourni en paramètre.
8852 * Il est également possible d'afficher les notifications n'étant pas lié à des tâches.
8853 *
8854 * Si le suivi concerne la notification des demandeurs via le portail citoyen,
8855 * la date de premier accès ne sera pas affichée.
8856 *
8857 * @param array liste des tâches permettant d'identifier quelles notification afficher
8858 * @param boolean permet d'afficher les notifications non liées à des tâches
8859 * @return json
8860 */
8861 protected function get_json_suivi_notification($typeTache, $nonLieTache = false) {
8862 $whereTypeTache = '';
8863 $sqlTaskNull = '';
8864 $suiviDateAcces = true;
8865 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
8866 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
8867 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
8868 // paramétrage
8869 if(is_bool($nonLieTache) && $nonLieTache === true) {
8870 $sqlTaskNull = 'OR task.type is null';
8871 }
8872 // Prépare la clause where pour ne récupérer que les notifications liées à certain type de tâches
8873 // Permet de différencier les notifications des demandeurs de celle des services et de celles des
8874 // tiers consulté
8875 if (is_array($typeTache) && $typeTache != array()) {
8876 if (is_array($typeTache)) {
8877 $whereTypeTache = sprintf(
8878 'AND (task.type IN (%1$s) %2$s)',
8879 "'".implode("', '", $typeTache)."'",
8880 $sqlTaskNull
8881 );
8882 }
8883 // La date de premier accès n'a pas besoin d'être renseigné pour
8884 // les notifications des demandeurs via le portail citoyen.
8885 // Les notifications des demandeurs sont liés à 3 types de tâches
8886 // notification_recepisse, notification_instruction, notification_decision
8887 // Si le suivi de la notification concerne un de ces types de tâches on
8888 // considère que c'est une notification de demandeurs.
8889 // Dans ce cas on vérifie si cette notification est paramétrée pour passer
8890 // via le portail. Par défaut si rien n'est paramétré on considère que la
8891 // notification est faite via le portail
8892 if ((in_array('notification_recepisse', $typeTache) ||
8893 in_array('notification_instruction', $typeTache) ||
8894 in_array('notification_decision', $typeTache))) {
8895 $dossier = $this->getVal('dossier');
8896 $collectivite_di = $this->get_dossier_instruction_om_collectivite($dossier);
8897 $modeNotification = $this->f->get_param_option_notification($collectivite_di);
8898 if (empty($modeNotification) || $modeNotification == 'portal') {
8899 $suiviDateAcces = false;
8900 }
8901 }
8902 }
8903
8904 $valSuivi = array();
8905 // Liste des champs à afficher. Permet également la traduction des noms de colonnes.
8906 $listeChampsTrad = array(
8907 __('emetteur'),
8908 __('date_envoi'),
8909 __('destinataire'),
8910 __('date_premier_acces'),
8911 __('instruction'),
8912 __('annexes'),
8913 __('statut'),
8914 __('commentaire')
8915 );
8916 $listeChamps = array(
8917 'emetteur',
8918 'date_envoi',
8919 'destinataire',
8920 'date_premier_acces',
8921 'instruction',
8922 'annexes',
8923 'statut',
8924 'commentaire'
8925 );
8926 // Si la date de premier_acces n'a pas à être affiché on la supprime de la liste
8927 if (! $suiviDateAcces) {
8928 $listeChamps = array(
8929 'emetteur',
8930 'date_envoi',
8931 'destinataire',
8932 'instruction',
8933 'annexes',
8934 'statut',
8935 'commentaire'
8936 );
8937 }
8938
8939 // Récupération des infos nécessaires à l'affichage du tableau
8940 $sql = sprintf(
8941 'SELECT DISTINCT
8942 instruction_notification.instruction_notification,
8943 -- Affiche la mention automatique avec le nom de l emetteur si la notification a été envoyé automatiquement
8944 CASE WHEN instruction_notification.automatique = TRUE
8945 THEN TRIM(CONCAT(instruction_notification.emetteur, \' \', \'(automatique)\'))
8946 ELSE instruction_notification.emetteur
8947 END as emetteur,
8948 date_envoi,
8949 instruction_notification.destinataire,
8950 instruction_notification.date_premier_acces,
8951 evenement.libelle as instruction,
8952 instruction_notification.statut,
8953 instruction_notification.commentaire,
8954 annexes.instruction_annexe as annexes
8955 FROM
8956 %1$sinstruction_notification
8957 LEFT JOIN %1$sinstruction
8958 ON instruction.instruction = instruction_notification.instruction
8959 LEFT JOIN %1$sevenement
8960 ON instruction.evenement = evenement.evenement
8961 LEFT JOIN %1$sinstruction_notification_document
8962 ON instruction_notification.instruction_notification = instruction_notification_document.instruction_notification
8963 AND instruction_notification_document.annexe = true
8964 -- Récupère les tâches liées au notification pour pouvoir par la suite identifier le type de notification
8965 LEFT JOIN %1$stask
8966 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
8967 -- Récupération de la liste des annexes sous la forme d une liste
8968 LEFT JOIN (
8969 SELECT
8970 instruction_notification,
8971 -- Récupère la liste des annexes de la notification
8972 -- sous la forme d un json pour récupérer toutes les informatiosn nécessaire
8973 -- à l affichage du lien vers les annexes
8974 CONCAT(
8975 \'[\',
8976 STRING_AGG(
8977 -- Affiche le nom du fichier selon le type de document/pièce
8978 CASE
8979 WHEN instruction_notification_document.document_type = \'instruction\'
8980 THEN CONCAT(
8981 \'{
8982 "obj" : "instruction",
8983 "champs" : "om_fichier_instruction",
8984 "label" : "\', evenement.libelle, \'",
8985 "id" : "\', instruction.instruction,\'"
8986 }\'
8987 )
8988 WHEN instruction_notification_document.document_type = \'consultation\'
8989 THEN CONCAT(
8990 \'{
8991 "obj" : "consultation",
8992 "champs" : "fichier",
8993 "label" : "Avis - \', service.libelle, \'",
8994 "id" : "\', consultation.consultation,\'"
8995 }\'
8996 )
8997 ELSE
8998 CONCAT(
8999 \'{
9000 "obj" : "document_numerise",
9001 "champs" : "uid",
9002 "label" : "\', document_numerise.nom_fichier, \' - \', document_numerise_type.libelle, \'",
9003 "id" : "\', document_numerise.document_numerise,\'"
9004 }\'
9005 )
9006 END,
9007 \', \'),
9008 \']\'
9009 ) AS instruction_annexe
9010 FROM
9011 %1$sinstruction_notification_document
9012 LEFT JOIN %1$sinstruction
9013 ON instruction_notification_document.instruction = instruction.instruction
9014 LEFT JOIN %1$sevenement
9015 ON instruction.evenement = evenement.evenement
9016 LEFT JOIN %1$sconsultation
9017 ON instruction_notification_document.document_id = consultation.consultation
9018 LEFT JOIN %1$sservice
9019 ON consultation.service = service.service
9020 LEFT JOIN %1$sdocument_numerise
9021 ON instruction_notification_document.document_id = document_numerise.document_numerise
9022 LEFT JOIN %1$sdocument_numerise_type
9023 ON document_numerise.document_numerise_type = document_numerise_type.document_numerise_type
9024 WHERE
9025 instruction_notification_document.annexe = \'t\'
9026 GROUP BY
9027 instruction_notification
9028 ) AS annexes
9029 ON
9030 annexes.instruction_notification = instruction_notification.instruction_notification
9031 WHERE
9032 instruction.instruction = %2$s
9033 %3$s
9034 ORDER BY
9035 date_envoi ASC, instruction_notification.destinataire ASC',
9036 DB_PREFIXE,
9037 $this->getVal('instruction'),
9038 $whereTypeTache
9039 );
9040 $res = $this->f->db->query($sql);
9041 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9042 $this->f->isDatabaseError($res);
9043 // Préparation du lien de téléchargement des annexes
9044 $htmlList =
9045 '<style>
9046 #content .gridjs-td a.lien_annexe {
9047 text-decoration : underline dotted 1px;
9048 }
9049 #content a.lien_annexe:hover {
9050 text-decoration : underline solid 1px;
9051 color : #46aede;
9052 }
9053 ol {padding-left : 10px;}
9054 </style>
9055 <ol>%1$s</ol>';
9056 $lienTelechargement =
9057 '<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">
9058 Annexe
9059 </a>';
9060 // Stockage des infos de chaque notification dans un tableau
9061 while( $row =& $res->fetchrow(DB_FETCHMODE_ASSOC) ) {
9062 $valNotif = array();
9063 foreach($listeChamps as $champ) {
9064 $valNotif[$champ] = $row[$champ];
9065 if (($champ === 'date_envoi'
9066 || $champ === 'date_premier_acces')
9067 && $row[$champ] !== null
9068 && $row[$champ] !== '') {
9069 //
9070 $valNotif[$champ] = date('d/m/Y H:i:s', strtotime($row[$champ]));
9071 } else if ($champ === 'annexes') {
9072 $listeAnnexe = '';
9073 $infoAnnexes = json_decode($row[$champ], true);
9074 if (! empty($infoAnnexes) && json_last_error() === JSON_ERROR_NONE) {
9075 // A partir des infos récupérées prépare le code html du lien vers chacune
9076 // des annexes et ajoute un élément de liste par annexe
9077 foreach($infoAnnexes as $annexe) {
9078 $listeAnnexe .= sprintf(
9079 '<li>%s</li>',
9080 sprintf($lienTelechargement,
9081 $annexe['obj'],
9082 $annexe['champs'],
9083 $annexe['id'],
9084 $annexe['label']
9085 )
9086 );
9087 }
9088 // Construction de la liste des annexes
9089 $valNotif[$champ] = sprintf(
9090 $htmlList,
9091 $listeAnnexe
9092 );
9093 }
9094 }
9095 }
9096 array_push($valSuivi, $valNotif);
9097 }
9098
9099 // Passage du tableau au format json
9100 return json_encode($valSuivi, JSON_HEX_APOS);
9101 }
9102
9103 /**
9104 * Traitement des erreurs retournées par l'abstracteur electronicsignature.
9105 *
9106 * @param electronicsignature_exception $exception Exception retournée par l'abstracteur.
9107 *
9108 * @return void
9109 */
9110 public function handle_electronicsignature_exception(electronicsignature_exception $exception) {
9111 $this->f->displayMessage('error', $exception->getMessage());
9112 }
9113
9114
9115 /**
9116 * Retourne une instance du connecteur electronicsignature, et la créer si elle n'existe pas.
9117 *
9118 * @param boolean $with_handle_error Flag pour afficher ou non le message d'erreur à l'utilisateur.
9119 * @return electronicsignature Instance de l'abstracteur.
9120 */
9121 public function get_electronicsignature_instance($with_handle_error = true) {
9122 if(isset($this->electronicsignature_instance)) {
9123 return $this->electronicsignature_instance;
9124 }
9125 // Instanciation du connecteur electronicsignature
9126 try {
9127 require_once "electronicsignature.class.php";
9128 $collectivites = array("collectivite_idx" => $this->get_dossier_instruction_om_collectivite(), "collectivite_multi_idx" => $this->f->get_idx_collectivite_multi());
9129 $this->electronicsignature_instance = new electronicsignature($collectivites);
9130 } catch (electronicsignature_exception $e) {
9131 if ($with_handle_error === true) {
9132 $this->handle_electronicsignature_exception($e);
9133 }
9134 return false;
9135 }
9136 return $this->electronicsignature_instance;
9137 }
9138
9139 /**
9140 * TREATMENT - envoyer_au_controle_de_legalite
9141 *
9142 * Ajoute la tâche envoi_CL.
9143 * C'est le traitement de la tâche qui mettra à jour la date d'envoi au contrôle de légalité.
9144 *
9145 * @return [type] [description]
9146 */
9147 function envoyer_au_controle_de_legalite() {
9148 $this->begin_treatment(__METHOD__);
9149 $this->correct = true;
9150
9151 //
9152 if ($this->can_be_sended_to_cl() === true) {
9153 // Création de la task 'envoi_CL'
9154 $inst_task = $this->f->get_inst__om_dbform(array(
9155 "obj" => "task",
9156 "idx" => 0,
9157 ));
9158 $task_val = array(
9159 'type' => 'envoi_CL',
9160 'object_id' => $this->getVal('instruction'),
9161 'dossier' => $this->getVal('dossier'),
9162 );
9163 // Change l'état de la tâche de notification en fonction de l'état de
9164 // transmission du dossier d'instruction
9165 $inst_di = $this->get_inst_dossier($this->getVal('dossier'));
9166 if ($this->f->is_option_mode_service_consulte_enabled() === false
9167 && ($inst_di->getVal('etat_transmission_platau') == 'non_transmissible'
9168 || $inst_di->getVal('etat_transmission_platau') == 'transmis_mais_non_transmissible')) {
9169 //
9170 $task_val['state'] = $inst_task::STATUS_DRAFT;
9171 }
9172 $add_task = $inst_task->add_task(array('val' => $task_val));
9173 if ($add_task === false) {
9174 $this->addToMessage(sprintf('%s %s',
9175 __("Une erreur s'est produite lors de la création tâche."),
9176 __("Veuillez contacter votre administrateur.")
9177 ));
9178 $this->correct = false;
9179 return $this->end_treatment(__METHOD__, false);
9180 }
9181 // Mise à jour du champs 'envoye_cl_platau'
9182 $instr_val = array(
9183 'envoye_cl_platau' => 't',
9184 );
9185 $res = $this->f->db->autoExecute(
9186 DB_PREFIXE.$this->table,
9187 $instr_val,
9188 DB_AUTOQUERY_UPDATE,
9189 $this->getCle($this->getVal($this->clePrimaire))
9190 );
9191 $this->addToLog(__METHOD__."(): db->autoexecute(\"".DB_PREFIXE.'.'.$this->table."\", ".print_r($instr_val, true).", DB_AUTOQUERY_UPDATE, \"".$this->getCle($this->clePrimaire)."\");", VERBOSE_MODE);
9192 if ($this->f->isDatabaseError($res, true) === true) {
9193 $this->addToMessage(sprintf('%s %s',
9194 __("Une erreur s'est produite lors de la mise à jour de l'instruction."),
9195 __("Veuillez contacter votre administrateur.")
9196 ));
9197 $this->correct = false;
9198 return $this->end_treatment(__METHOD__, false);
9199 }
9200 // Message de validation à l'utilisateur
9201 $this->addToMessage(__('Votre demande de transfert au contrôle de légalité à bien été prise en compte.'));
9202 $this->addToMessage(__("La date d'envoi au contrôle de légalité sera mise à jour ultérieurement."));
9203 }
9204 //
9205 return $this->end_treatment(__METHOD__, true);
9206 }
9207
9208
9209 /**
9210 * Retourne le lien de retour (VIEW formulaire et VIEW sousformulaire).
9211 *
9212 * @param string $view Appel dans le contexte de la vue 'formulaire' ou de
9213 * la vue 'sousformulaire'.
9214 *
9215 * @return string
9216 */
9217 function get_back_link($view = "formulaire") {
9218 //
9219 $href = parent::get_back_link($view);
9220 //
9221 $crud = $this->get_action_crud();
9222
9223 // Redirection vers le formulaire de modification à la validation du
9224 // formulaire d'ajout si l'événement associé possède une lettre type
9225 if (($crud === 'create'
9226 || ($crud === null
9227 && $this->getParameter('maj') == 0))
9228 && $this->correct == true
9229 && $this->evenement_has_an_edition($this->valF['evenement']) === true) {
9230
9231 // On instancie l'instruction
9232 $inst_instruction = $this->f->get_inst__om_dbform(array(
9233 "obj" => "instruction",
9234 "idx" => $this->valF[$this->clePrimaire],
9235 ));
9236
9237 // Si l'instruction n'est pas finalisée automatiquement
9238 if ($inst_instruction->getVal('om_final_instruction') !== 't') {
9239 $href = str_replace("&action=3", "&action=1", $href);
9240 //
9241 if (strpos($href, "&retour=tab") !== false) {
9242 $href = str_replace("&retour=tab", "&retour= form", $href);
9243 } else {
9244 $href .= "&retour=form";
9245 }
9246 }
9247 }
9248
9249 //
9250 return $href;
9251 }
9252
9253 public function view_json_data() {
9254 $this->checkAccessibility();
9255 $this->f->disableLog();
9256 $view = $this->get_json_data();
9257 printf(json_encode($view));
9258 }
9259
9260 public function get_json_data() {
9261 $val = array_combine($this->champs, $this->val);
9262 foreach ($val as $key => $value) {
9263 $val[$key] = strip_tags($value);
9264 }
9265 $val['tacite'] = 'f';
9266 $inst_ad = $this->f->get_inst__om_dbform(array(
9267 "obj" => "avis_decision",
9268 "idx" => $val['avis_decision'],
9269 ));
9270 if (preg_match('/[tT]acite/', $inst_ad->getVal('libelle')) === 1) {
9271 $val['tacite'] = 't';
9272 }
9273 return $val;
9274 }
9275
9276 public function get_related_instructions_next($next_type = 'retour_signature', $instruction = null) {
9277 if (in_array($next_type, array('retour_signature', 'retour_ar', 'suivant_tacite', )) === false) {
9278 return false;
9279 }
9280 $result = array();
9281 $evenements = array();
9282 if ($instruction === null) {
9283 $instruction = $this->getVal($this->clePrimaire);
9284 $evenement = $this->getVal('evenement');
9285 $dossier = $this->getVal('dossier');
9286 } else {
9287 $inst = $this->f->get_inst__om_dbform(array(
9288 "obj" => "instruction",
9289 "idx" => $instruction,
9290 ));
9291 $evenement = $inst->getVal('evenement');
9292 $dossier = $inst->getVal('dossier');
9293 }
9294 //
9295 $query = sprintf('
9296 SELECT evenement_%3$s
9297 FROM %1$sevenement
9298 WHERE evenement = %2$s
9299 ',
9300 DB_PREFIXE,
9301 $evenement,
9302 $next_type
9303 );
9304 $res = $this->f->get_one_result_from_db_query($query, true);
9305 if ($res['code'] === 'KO') {
9306 return false;
9307 }
9308 $ev_next = $res['result'];
9309 //
9310 $query = sprintf('
9311 SELECT MAX(instruction.instruction) as instruction
9312 FROM %1$sinstruction
9313 WHERE dossier = \'%3$s\'
9314 AND evenement = %2$s
9315 ',
9316 DB_PREFIXE,
9317 $ev_next,
9318 $dossier
9319 );
9320 $res = $this->f->get_one_result_from_db_query($query, true);
9321 if ($res['code'] === 'KO') {
9322 return false;
9323 }
9324 //
9325 return $res['result'];
9326 }
9327
9328 public function get_related_instructions($instruction = null) {
9329 $result = array();
9330 $evenements = array();
9331 if ($instruction === null) {
9332 $instruction = $this->getVal($this->clePrimaire);
9333 $evenement = $this->getVal('evenement');
9334 $dossier = $this->getVal('dossier');
9335 } else {
9336 $inst = $this->f->get_inst__om_dbform(array(
9337 "obj" => "instruction",
9338 "idx" => $instruction,
9339 ));
9340 $evenement = $inst->getVal('evenement');
9341 $dossier = $inst->getVal('dossier');
9342 }
9343 //
9344 $query = sprintf('
9345 SELECT evenement
9346 FROM %1$sevenement
9347 WHERE evenement_retour_ar = %2$s
9348 OR evenement_retour_signature = %2$s
9349 ',
9350 DB_PREFIXE,
9351 $evenement
9352 );
9353 $res = $this->f->get_one_result_from_db_query($query, true);
9354 if ($res['code'] === 'KO') {
9355 return false;
9356 }
9357 $ev_parent = $res['result'];
9358 //
9359 $query = sprintf('
9360 SELECT MAX(instruction.instruction) as instruction
9361 FROM %1$sinstruction
9362 WHERE dossier = \'%3$s\'
9363 AND evenement = %2$s
9364 ',
9365 DB_PREFIXE,
9366 $ev_parent,
9367 $dossier
9368 );
9369 $res = $this->f->get_one_result_from_db_query($query, true);
9370 if ($res['code'] === 'KO') {
9371 return false;
9372 }
9373 $result[] = $res['result'];
9374 //
9375 $query = sprintf('
9376 SELECT evenement_retour_ar
9377 FROM %1$sevenement
9378 WHERE evenement = %2$s
9379 AND evenement_retour_ar != %3$s
9380 ',
9381 DB_PREFIXE,
9382 $ev_parent,
9383 $evenement
9384 );
9385 $res = $this->f->get_one_result_from_db_query($query, true);
9386 if ($res['code'] === 'KO') {
9387 return false;
9388 }
9389 $evenements[] = $res['result'];
9390 //
9391 $query = sprintf('
9392 SELECT evenement_retour_signature
9393 FROM %1$sevenement
9394 WHERE evenement = %2$s
9395 AND evenement_retour_signature != %3$s
9396 ',
9397 DB_PREFIXE,
9398 $ev_parent,
9399 $evenement
9400 );
9401 $res = $this->f->get_one_result_from_db_query($query, true);
9402 if ($res['code'] === 'KO') {
9403 return false;
9404 }
9405 $evenements[] = $res['result'];
9406 foreach ($evenements as $value) {
9407 if ($value !== null) {
9408 $query = sprintf('
9409 SELECT MAX(instruction.instruction) as instruction
9410 FROM %1$sinstruction
9411 WHERE dossier = \'%3$s\'
9412 AND evenement = %2$s
9413 ',
9414 DB_PREFIXE,
9415 $value,
9416 $dossier
9417 );
9418 $res = $this->f->get_one_result_from_db_query($query, true);
9419 if ($res['code'] === 'KO') {
9420 return false;
9421 }
9422 $result[] = $res['result'];
9423 }
9424 }
9425 return $result;
9426 }
9427
9428 protected function getDocumentType($champ = null) {
9429 $evenementId = $this->getVal('evenement');
9430 if (! empty($evenementId)) {
9431 $evenement = $this->f->findObjectById('evenement', $evenementId);
9432 if (! empty($evenement)) {
9433 return __("Instruction").':'.$evenement->getVal('libelle');
9434 }
9435 }
9436 return parent::getDocumentType();
9437 }
9438
9439 /**
9440 * Récupère à l'aide d'une requête sql la liste des demandeurs
9441 * pouvant être notifié. C'est à dire les demandeurs acceptant
9442 * les notifications et pour lesquels une adresse mail existe.
9443 *
9444 * Dans le cas, d'une notification pour le portail citoyen, seul
9445 * le pétitionnaire principal doit être notifier et uniquement si
9446 * il a une adress mail et qu'il accepte les notifications.
9447 *
9448 * @param string identifiant du dossier
9449 * @param boolean true si il faut récupérer la liste des demandeurs notifiable
9450 * pour une notification de categorie portail
9451 * @return array liste des demandeurs pouvant être notifié
9452 */
9453 protected function get_demandeurs_notifiable($idDossier = null, $portail = false) {
9454 if ($idDossier === null) {
9455 $idDossier = $this->getVal('dossier');
9456 }
9457 // Ajoute une condition sur le where pour ne récupérer que le pétitionnaire principal
9458 // pour une notification depuis le portail citoyen
9459 $sqlPetitionnairePrincipal = '';
9460 // Gestion des champs nécessaires pour la notification d'un demandeur
9461 $condition_demandeur = "AND demandeur.notification = 't'
9462 AND demandeur.courriel IS NOT NULL";
9463 if ($portail === true) {
9464 $sqlPetitionnairePrincipal = 'AND lien_dossier_demandeur.petitionnaire_principal = true';
9465 $condition_demandeur = "AND (
9466 (notification = 't' AND courriel IS NOT NULL)
9467 OR demande.source_depot = 'portal'
9468 )";
9469 }
9470
9471 $listeDemandeursNotifiable = array();
9472
9473 // Requête de récupération des demandeurs
9474 $sql = sprintf(
9475 'SELECT
9476 demandeur.demandeur,
9477 CASE
9478 WHEN demandeur.qualite=\'particulier\'
9479 THEN TRIM(CONCAT(demandeur.particulier_nom, \' \', demandeur.particulier_prenom, \' \', demandeur.courriel))
9480 ELSE
9481 TRIM(CONCAT(demandeur.personne_morale_raison_sociale, \' \', demandeur.personne_morale_denomination, \' \', demandeur.courriel))
9482 END AS destinataire,
9483 demandeur.courriel,
9484 petitionnaire_principal
9485 FROM
9486 %1$sdossier
9487 INNER JOIN %1$slien_dossier_demandeur
9488 ON dossier.dossier = lien_dossier_demandeur.dossier
9489 INNER JOIN %1$sdemandeur
9490 ON lien_dossier_demandeur.demandeur = demandeur.demandeur
9491 -- Récupération de la plus ancienne demande associée au dossier (la demande
9492 -- de création du dossier)
9493 INNER JOIN (
9494 SELECT
9495 demande,
9496 dossier_instruction,
9497 source_depot
9498 FROM
9499 %1$sdemande
9500 WHERE
9501 dossier_instruction = \'%2$s\'
9502 ORDER BY
9503 demande ASC
9504 LIMIT 1
9505 ) as demande
9506 ON dossier.dossier = demande.dossier_instruction
9507 WHERE
9508 dossier.dossier = \'%2$s\'
9509 %3$s
9510 %4$s',
9511 DB_PREFIXE,
9512 $idDossier,
9513 $condition_demandeur,
9514 $sqlPetitionnairePrincipal
9515 );
9516 $res = $this->f->db->query($sql);
9517 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9518 $this->f->isDatabaseError($res);
9519 // Récupération des infos des demandeurs et stockage dans un tableau
9520 // ayant pour clé les id des demandeurs
9521 while($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9522 $listeDemandeursNotifiable[$row['demandeur']] = $row;
9523 }
9524
9525 return $listeDemandeursNotifiable;
9526 }
9527
9528 /**
9529 * Renvoie la liste des notifications liées à l'instruction
9530 *
9531 * @param integer id de l'instruction dont on cherche les notifications
9532 * @return array liste des instruction_notification liés à l'instruction
9533 */
9534 public function get_instruction_notification($id_instruction, $typeNotification = null, $nonLieTache = false) {
9535 $whereTypeTache = '';
9536 $sqlTaskNull = '';
9537 // Défini si on veux que la requête récupère également les notifications qui n'ont pas
9538 // de tâches associées. C'est le cas pour les notifications de demandeurs lorsque la
9539 // notification du demandeur principal n'a pas pu être envoyée à cause d'un mauvais
9540 // paramétrage
9541 if(is_bool($nonLieTache) && $nonLieTache === true) {
9542 $sqlTaskNull = 'OR task.type is null';
9543 }
9544 if ($typeNotification != null) {
9545 if (is_array($typeNotification)) {
9546 $whereTypeTache = sprintf(
9547 'AND (task.type IN (%1$s) %2$s)',
9548 "'".implode("', '", $typeNotification)."'",
9549 $sqlTaskNull
9550 );
9551 } else {
9552 $whereTypeTache = sprintf(
9553 'AND (task.type = \'%1$s\' %2$s)',
9554 $typeNotification,
9555 $sqlTaskNull
9556 );
9557 }
9558 }
9559 $listeInstrNotif = array();
9560 $sql = sprintf('
9561 SELECT
9562 instruction_notification.instruction_notification
9563 FROM
9564 %1$sinstruction_notification
9565 LEFT JOIN %1$stask
9566 ON instruction_notification.instruction_notification::CHARACTER VARYING = task.object_id
9567 WHERE
9568 instruction = %2$s
9569 %3$s',
9570 DB_PREFIXE,
9571 $id_instruction,
9572 $whereTypeTache
9573 );
9574 $res = $this->f->db->query($sql);
9575 $this->f->addToLog(__METHOD__."(): db->query(\"".$sql."\")", VERBOSE_MODE);
9576 $this->f->isDatabaseError($res);
9577 while ($row = $res->fetchrow(DB_FETCHMODE_ASSOC)) {
9578 $listeInstrNotif[] = $row['instruction_notification'];
9579 }
9580 return $listeInstrNotif;
9581 }
9582
9583 /**
9584 * Crée une clé d'accès unique permettant à un utilisateur
9585 * anonyme de récupérer le document.
9586 *
9587 * @return string clé d'accès du document
9588 */
9589 protected function getCleAccesDocument() {
9590 // Initialisation d'un tableau
9591 $number_list = array();
9592
9593 // Génération aléatoire d'un nombre sur 4 caractères, 4 fois
9594 for ($i = 0; $i < 4; $i++) {
9595 $number_list[] = str_pad(mt_rand(0, 9999), 4, 0, STR_PAD_LEFT);
9596 }
9597
9598 // Transformation en chaîne tout en séparant les nombres par un "-"
9599 $result = implode('-', $number_list);
9600
9601 // Vérifie si la clé existe déjà et si c'est le cas génére une nouvelle clé
9602 if ($this->getUidDocumentInstructionWithKey($result) != null) {
9603 return $this->getCleAccesDocument();
9604 }
9605
9606 //
9607 return $result;
9608 }
9609
9610 /**
9611 * Récupère une clé et renvoie l'uid du document liée à cette
9612 * clé. Si la clé n'existe pas renvoie null.
9613 *
9614 * @param string $cleGen clé dont on cherche l'instruction
9615 * @return integer|null
9616 */
9617 protected function getUidDocumentInstructionWithKey($cleGen) {
9618 $query = sprintf(
9619 'SELECT
9620 instruction.om_fichier_instruction
9621 FROM
9622 %1$sinstruction_notification_document
9623 LEFT JOIN %1$sinstruction ON instruction_notification_document.instruction = instruction.instruction
9624 WHERE
9625 instruction_notification_document.cle = \'%2$s\'',
9626 DB_PREFIXE,
9627 $this->f->db->escapeSimple($cleGen)
9628 );
9629
9630 $res = $this->f->db->getOne($query);
9631 $this->addToLog(__METHOD__.": db->getOne(\"".$query."\");", VERBOSE_MODE);
9632 $this->f->isDatabaseError($res);
9633 return $res;
9634 }
9635
9636 /**
9637 * Récupère une clé, fait une requête pour récupérer l'id de la notification liée a cette clé.
9638 * Récupère l'instance de instruction_notification dont l'id a été récupéré et la renvoie.
9639 *
9640 * @param string $cleGen
9641 * @return instruction_notification
9642 */
9643 protected function getInstanceNotificationWithKey($key) {
9644 $sql = sprintf(
9645 "SELECT
9646 instruction_notification
9647 FROM
9648 %1\$sinstruction_notification_document
9649 WHERE
9650 cle = '%2\$s'",
9651 DB_PREFIXE,
9652 $this->f->db->escapeSimple($key)
9653 );
9654 $res = $this->f->db->getOne($sql);
9655 $this->addToLog(__METHOD__.": db->getOne(\"".$sql."\");", VERBOSE_MODE);
9656 $this->f->isDatabaseError($res);
9657
9658 // Récupération de l'instance de notification
9659 $instNotif = $this->f->get_inst__om_dbform(array(
9660 "obj" => "instruction_notification",
9661 "idx" => $res,
9662 ));
9663 return $instNotif;
9664 }
9665
9666
9667 /**
9668 * Affiche la page de téléchargement du document de la notification.
9669 *
9670 * @param boolean $content_only Affiche le contenu seulement.
9671 *
9672 * @return void
9673 */
9674 public function view_telecharger_document_anonym() {
9675 // Par défaut on considère qu'on va afficher le formulaire
9676 $idx = 0;
9677 // Flag d'erreur
9678 $error = false;
9679 // Message d'erreur
9680 $message = '';
9681
9682 // Paramètres GET : récupération de la clé d'accès
9683 $cle_acces_document = $this->f->get_submitted_get_value('key');
9684 $cle_acces_document = $this->f->db->escapeSimple($cle_acces_document);
9685 // Vérification de l'existence de la clé et récupération de l'uid du fichier
9686 $uidFichier = $this->getUidDocumentInstructionWithKey($cle_acces_document);
9687 if ($uidFichier != null) {
9688 // Récupération du document
9689 $file = $this->f->storage->get($uidFichier);
9690
9691 // Headers
9692 header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
9693 header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date dans le passé
9694 header("Content-Type: ".$file['metadata']['mimetype']);
9695 header("Accept-Ranges: bytes");
9696 header("Content-Disposition: inline; filename=\"".$file['metadata']['filename']."\";" );
9697 // Affichage du document
9698 echo $file['file_content'];
9699
9700 // Récupération de la date de premier accès et maj du suivi uniquement
9701 // si la date de 1er accès n'a pas encore été remplis
9702 $inst_notif = $this->getInstanceNotificationWithKey($cle_acces_document);
9703 if ($inst_notif->getVal('date_premier_acces') == null ||
9704 $inst_notif->getVal('date_premier_acces') == '') {
9705 $notif_val = array();
9706 foreach ($inst_notif->champs as $champ) {
9707 $notif_val[$champ] = $inst_notif->getVal($champ);
9708 }
9709 $notif_val['date_premier_acces'] = date("d/m/Y H:i:s");
9710 $notif_val['statut'] = 'vu';
9711 $notif_val['commentaire'] = 'Le document a été vu';
9712 $suivi_notif = $inst_notif->modifier($notif_val);
9713 }
9714
9715 } else {
9716 // Page vide 404
9717 printf('Ressource inexistante');
9718 header('HTTP/1.0 404 Not Found');
9719 }
9720 }
9721
9722 /**
9723 * Récupère le titre du document envoyé au parapheur
9724 */
9725 protected function getDocumentTitre($champ = null) {
9726 $title = $this->getTitle();
9727 $dossier = $this->getDossier();
9728 return $dossier.' '.$title;
9729 }
9730
9731 /**
9732 * Compose le nom du document à transmettre au parapheur.
9733 * Le nom ets composé de cette manière :
9734 * instruction_xxx_libelle_de_la_lettre_type_associee
9735 * ou xxx correspond au numéro de l'instruction
9736 */
9737 protected function getDocumentLibelle() {
9738 // Récupère le champ instruction
9739 $instruction = $this->getVal("instruction");
9740
9741 // Requête sql servant à récupérer le titre du document
9742 // TO_CHAR() introduit un espace avant l'affichage du nombre
9743 // comme les espaces sont remplacé par des '_' dans le retour de la fonction
9744 // il n'est pas nécessaire de mettre un '_' après le mot instruction.
9745 $sql = sprintf(
9746 'SELECT
9747 CONCAT(
9748 \'instruction\',
9749 TO_CHAR(instruction.instruction, \'000\'),
9750 \'_\',
9751 LOWER(om_lettretype.libelle)
9752 ) as nom_fichier
9753 FROM
9754 %1$sinstruction
9755 LEFT JOIN %1$som_lettretype ON om_lettretype.id = instruction.lettretype
9756 WHERE
9757 instruction = %2$s',
9758 DB_PREFIXE,
9759 $instruction
9760 );
9761 $documentLibelle = $this->f->db->getOne($sql);
9762 $this->addToLog("getDocumentTitre(): db->getOne(\"".$sql."\");", VERBOSE_MODE);
9763 if (database::isError($documentLibelle)) {
9764 die();
9765 }
9766
9767 // Transforamtion des ' ' en '_', des accents en lettres sans accents et des
9768 // caractères spéciaux en '_'
9769 // La méthode normalize_string est utilisé pour gérer les accents
9770 $documentLibelle = $this->f->normalize_string($documentLibelle);
9771 // TODO : comparer cette liste et celle de la méthode normalize_string
9772 // pour éviter les doublons + vérifier qu'il n'y a pas de doublons dans cette
9773 // liste
9774 $invalid = array('Œ'=>'oe', 'œ'=>'oe', 'Ÿ'=>'y', 'ü'=>'u',
9775 '¢' => '_', 'ß' => '_', '¥' => '_', '£' => '_', '™' => '_', '©' => '_',
9776 '®' => '_', 'ª' => '_', '×' => '_', '÷' => '_', '±' => '_', '²' => '_',
9777 '³' => '_', '¼' => '_', '½' => '_', '¾' => '_', 'µ' => '_', '¿' => '_',
9778 '¶' => '_', '·' => '_', '¸' => '_', 'º' => '_', '°' => '_', '¯' => '_',
9779 '§' => '_', '…' => '_', '¤' => '_', '¦' => '_', '≠' => '_', '¬' => '_',
9780 'ˆ' => '_', '¨' => '_', '‰' => '_', '¤' => '_', '€' => '_', '$' => '_',
9781 '«' => '_', '»' => '_', '‹' => '_', '›' => '_', 'ƒ' => '_', '¥' => '_',
9782 '‘‘' => '_', '‚' => '_', '!' => '_', '¡' => '_', '¢' => '_', '£' => '_',
9783 '?' => '_', '[' => '_', ']' => '_', '´' => '_', '`' => '_', '^' => '_',
9784 '~' => '_', '˜' => '_', '#' => '_', '*' => '_', '.' => '_', ':' => '_',
9785 ';' => '_', '•' => '_', '¯' => '_', '‾' => '_', '–' => '_', '–' => '_',
9786 '—' => '_', '_' => '_', '|' => '_', '¦‌' => '_', '‡' => '_', '§' => '_',
9787 '¶' => '_', '©' => '_', '®' => '_', '™' => '_', '&' => '_', '@' => '_',
9788 '/' => '_', '\\' => '_', '◊' => '_', '♠' => '_', '♣' => '_', '♥' => '_',
9789 '♦' => '_', '←' => '_', '↑' => '_', '→' => '_', '↓' => '_', '↔' => '_',
9790 '°' => '_', 'µ' => '_', '<' => '_', '>' => '_', '≤' => '_', '≥' => '_',
9791 '=' => '_', '≈' => '_', '≠' => '_', '≡' => '_', '±' => '_', '−' => '_',
9792 '+' => '_', '×' => '_', '÷' => '_', '⁄' => '_', '%' => '_', '‰' => '_',
9793 '¼' => '_', '½' => '_', '¾' => '_', '¹' => '_', '²' => '_', '³' => '_',
9794 '' => '_', 'º' => '_', 'ª' => '_', 'ƒ' => '_', '′' => '_', '″' => '_',
9795 '∂' => '_', '∏' => '_', '∑' => '_', '√' => '_', '∞' => '_', '¬' => '_',
9796 '∩' => '_', '∫' => '_', 'α' => '_', 'Α' => '_', 'β' => '_', 'Β' => '_',
9797 'γ' => '_', 'Γ' => '_', 'δ' => '_', 'Δ' => '_', 'ε' => '_', 'Ε' => '_',
9798 'ζ' => '_', 'Ζ' => '_', 'η' => '_', 'Η' => '_', 'θ' => '_', 'Θ' => '_',
9799 'ι' => '_', 'Ι' => '_', 'κ' => '_', 'Κ' => '_', 'λ' => '_', 'Λ' => '_',
9800 'μ' => '_', 'Μ' => '_', 'ν' => '_', 'Ν' => '_', 'ξ' => '_', 'Ξ' => '_',
9801 'ο' => '_', 'Ο' => '_', 'π' => '_', 'Π' => '_', 'ρ' => '_', 'Ρ' => '_',
9802 'σ' => '_', 'ς' => '_', 'Σ' => '_', 'τ' => '_', 'Τ' => '_', 'υ' => '_',
9803 'Υ' => '_', 'φ' => '_', 'Φ' => '_', 'χ' => '_', 'Χ' => '_', 'ψ' => '_',
9804 'Ψ' => '_', 'ω' => '_', 'Ω' => '_', ',' => '_', ' ' => '_'
9805 );
9806
9807 return str_replace(array_keys($invalid), array_values($invalid), $documentLibelle);
9808 }
9809
9810 /**
9811 * Surcharge permettant de ne pas afficher le fil d'Ariane dans
9812 * l'overlay de notification des demandeurs.
9813 */
9814 function getSubFormTitle($ent) {
9815 $actionSansPath = array('411', '420', '430');
9816 if (in_array($this->getParameter('maj'), $actionSansPath)) {
9817 return '';
9818 }
9819 return parent::getSubFormTitle($ent);
9820 }
9821 }// fin classe

Properties

Name Value
svn:keywords "Id"

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26